Professional document generator for Active Directory health assessments. Creates executive-quality DOCX reports with consistent branding, proper data visualization, severity-based formatting, and actionable remediation guidance. Use when generating assessment reports from OpsIdentity JSON data or improving document output quality.
Generate professional, executive-ready DOCX assessment reports from Active Directory health data.
"The document should look like it came from a Big 4 consulting firm, not a script output."
| Trigger | Action |
|---|---|
| "Generate assessment document" | Load 📄 Document Structure |
| "Improve report formatting" | Check 🎨 Design System |
| "Fix table layouts" |
| Reference 📊 Table Templates |
| "Format findings section" | Use 🔍 Finding Cards |
| Principle | Implementation |
|---|---|
| Executive First | Lead with business impact, technical details follow |
| Visual Hierarchy | Score card → Summary table → Detailed findings |
| Actionable | Every finding includes copy-paste remediation |
| Consistent | Same styling throughout, no visual surprises |
| Error-Free | Never show undefined, null, or [object Object] |
| Severity | Fill Color | Text Color | Usage |
|---|---|---|---|
| Critical | #FEE2E2 | #991B1B | Red badge, immediate action |
| High | #FEF3C7 | #92400E | Orange badge, priority action |
| Medium | #FEF9C3 | #854D0E | Yellow badge, scheduled action |
| Low | #DBEAFE | #1E40AF | Blue badge, optimization |
| Info | #F3F4F6 | #374151 | Gray badge, informational |
| Success | #D1FAE5 | #065F46 | Green badge, compliant |
Font Family: Arial (universal compatibility)
Title: 28pt, Bold, #1E3A5F (Navy)
Heading 1: 18pt, Bold, #1E3A5F
Heading 2: 14pt, Bold, #374151 (Gray-700)
Heading 3: 12pt, Bold, #4B5563 (Gray-600)
Body: 11pt, Regular, #111827 (Gray-900)
Caption: 9pt, Regular, #6B7280 (Gray-500)
Code: 10pt, Consolas, #1F2937, Background #F3F4F6
Cover Page
Executive Summary (1 page max)
Environment Overview
Findings by Category
Detailed Remediation
Appendices
// Before generating any field, validate:
if (value === undefined || value === null || value === '') {
return 'No disponible'; // Or appropriate default
}
if (typeof value === 'object' && !Array.isArray(value)) {
return JSON.stringify(value); // Or extract specific field
}
if (value === 'undefined ms' || value === 'undefined') {
return 'N/A';
}
// Score should NEVER be 0 if systems are operational
function calculateHealthScore(findings) {
let score = 100;
findings.forEach(f => {
switch(f.severity) {
case 'CRITICAL': score -= 15; break;
case 'HIGH': score -= 10; break;
case 'MEDIUM': score -= 5; break;
case 'LOW': score -= 2; break;
}
});
return Math.max(0, score); // Floor at 0
}
function createSeverityCell(severity) {
const colors = {
'CRITICAL': { fill: 'FEE2E2', text: '991B1B' },
'HIGH': { fill: 'FEF3C7', text: '92400E' },
'MEDIUM': { fill: 'FEF9C3', text: '854D0E' },
'LOW': { fill: 'DBEAFE', text: '1E40AF' }
};
const c = colors[severity] || colors['LOW'];
return new TableCell({
shading: { fill: c.fill, type: ShadingType.CLEAR },
children: [new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({
text: severity,
bold: true,
color: c.text,
size: 20
})]
})]
});
}
function createCodeBlock(code) {
return new Paragraph({
shading: { fill: 'F3F4F6', type: ShadingType.CLEAR },
spacing: { before: 120, after: 120 },
indent: { left: 360, right: 360 },
children: [new TextRun({
text: code,
font: 'Consolas',
size: 20,
color: '1F2937'
})]
});
}
Load these for specific implementation details:
| ❌ Don't | ✅ Do Instead |
|---|---|
Show [object Object] | Extract specific property or stringify |
Use undefined in tables | Use "N/A" or "No disponible" |
| Mix languages randomly | Consistent Spanish or English throughout |
Escape PowerShell chars (\$) | Use raw code, handle escaping in generation |
| "Ver detalles en otra sección" | Include details inline or specific page ref |
| Score of 0 with operational DCs | Calculate proper weighted score |
| Inconsistent table widths | Use fixed column width templates |
| Unicode bullets in lists | Use proper docx-js numbering config |
| Version | Date | Changes |
|---|---|---|
| 1.0.0 | 2025-12-27 | Initial skill creation |