specforge-mcp 0.9.0 → 0.11.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 (101) hide show
  1. package/dist/engine/actuals/backfill.d.ts +14 -0
  2. package/dist/engine/actuals/backfill.d.ts.map +1 -0
  3. package/dist/engine/actuals/backfill.js +62 -0
  4. package/dist/engine/actuals/backfill.js.map +1 -0
  5. package/dist/engine/actuals/consolidator.d.ts +12 -0
  6. package/dist/engine/actuals/consolidator.d.ts.map +1 -0
  7. package/dist/engine/actuals/consolidator.js +54 -0
  8. package/dist/engine/actuals/consolidator.js.map +1 -0
  9. package/dist/engine/actuals/git-analyzer.d.ts +23 -0
  10. package/dist/engine/actuals/git-analyzer.d.ts.map +1 -0
  11. package/dist/engine/actuals/git-analyzer.js +169 -0
  12. package/dist/engine/actuals/git-analyzer.js.map +1 -0
  13. package/dist/engine/actuals/index.d.ts +5 -0
  14. package/dist/engine/actuals/index.d.ts.map +1 -0
  15. package/dist/engine/actuals/index.js +7 -0
  16. package/dist/engine/actuals/index.js.map +1 -0
  17. package/dist/engine/actuals/wip-tracker.d.ts +25 -0
  18. package/dist/engine/actuals/wip-tracker.d.ts.map +1 -0
  19. package/dist/engine/actuals/wip-tracker.js +71 -0
  20. package/dist/engine/actuals/wip-tracker.js.map +1 -0
  21. package/dist/engine/doc-generator/executive-summary/data-extractors.d.ts +12 -0
  22. package/dist/engine/doc-generator/executive-summary/data-extractors.d.ts.map +1 -0
  23. package/dist/engine/doc-generator/executive-summary/data-extractors.js +96 -0
  24. package/dist/engine/doc-generator/executive-summary/data-extractors.js.map +1 -0
  25. package/dist/engine/doc-generator/executive-summary/executive-summary-generator.d.ts +7 -0
  26. package/dist/engine/doc-generator/executive-summary/executive-summary-generator.d.ts.map +1 -0
  27. package/dist/engine/doc-generator/executive-summary/executive-summary-generator.js +38 -0
  28. package/dist/engine/doc-generator/executive-summary/executive-summary-generator.js.map +1 -0
  29. package/dist/engine/doc-generator/executive-summary/html-template.d.ts +3 -0
  30. package/dist/engine/doc-generator/executive-summary/html-template.d.ts.map +1 -0
  31. package/dist/engine/doc-generator/executive-summary/html-template.js +53 -0
  32. package/dist/engine/doc-generator/executive-summary/html-template.js.map +1 -0
  33. package/dist/engine/doc-generator/executive-summary/index.d.ts +2 -0
  34. package/dist/engine/doc-generator/executive-summary/index.d.ts.map +1 -0
  35. package/dist/engine/doc-generator/executive-summary/index.js +3 -0
  36. package/dist/engine/doc-generator/executive-summary/index.js.map +1 -0
  37. package/dist/engine/doc-generator/executive-summary/section-builders.d.ts +18 -0
  38. package/dist/engine/doc-generator/executive-summary/section-builders.d.ts.map +1 -0
  39. package/dist/engine/doc-generator/executive-summary/section-builders.js +152 -0
  40. package/dist/engine/doc-generator/executive-summary/section-builders.js.map +1 -0
  41. package/dist/engine/doc-generator/executive-summary/svg-diagrams.d.ts +8 -0
  42. package/dist/engine/doc-generator/executive-summary/svg-diagrams.d.ts.map +1 -0
  43. package/dist/engine/doc-generator/executive-summary/svg-diagrams.js +124 -0
  44. package/dist/engine/doc-generator/executive-summary/svg-diagrams.js.map +1 -0
  45. package/dist/engine/doc-generator.d.ts.map +1 -1
  46. package/dist/engine/doc-generator.js +2 -0
  47. package/dist/engine/doc-generator.js.map +1 -1
  48. package/dist/engine/risk-analyzer/approach-analyzer.d.ts +6 -0
  49. package/dist/engine/risk-analyzer/approach-analyzer.d.ts.map +1 -0
  50. package/dist/engine/risk-analyzer/approach-analyzer.js +86 -0
  51. package/dist/engine/risk-analyzer/approach-analyzer.js.map +1 -0
  52. package/dist/engine/risk-analyzer/complexity-calculator.d.ts +6 -0
  53. package/dist/engine/risk-analyzer/complexity-calculator.d.ts.map +1 -0
  54. package/dist/engine/risk-analyzer/complexity-calculator.js +110 -0
  55. package/dist/engine/risk-analyzer/complexity-calculator.js.map +1 -0
  56. package/dist/engine/risk-analyzer/confidence-scorer.d.ts +7 -0
  57. package/dist/engine/risk-analyzer/confidence-scorer.d.ts.map +1 -0
  58. package/dist/engine/risk-analyzer/confidence-scorer.js +113 -0
  59. package/dist/engine/risk-analyzer/confidence-scorer.js.map +1 -0
  60. package/dist/engine/risk-analyzer/index.d.ts +6 -0
  61. package/dist/engine/risk-analyzer/index.d.ts.map +1 -0
  62. package/dist/engine/risk-analyzer/index.js +7 -0
  63. package/dist/engine/risk-analyzer/index.js.map +1 -0
  64. package/dist/engine/risk-analyzer/risk-generator.d.ts +6 -0
  65. package/dist/engine/risk-analyzer/risk-generator.d.ts.map +1 -0
  66. package/dist/engine/risk-analyzer/risk-generator.js +94 -0
  67. package/dist/engine/risk-analyzer/risk-generator.js.map +1 -0
  68. package/dist/engine/risk-analyzer/tradeoff-detector.d.ts +6 -0
  69. package/dist/engine/risk-analyzer/tradeoff-detector.d.ts.map +1 -0
  70. package/dist/engine/risk-analyzer/tradeoff-detector.js +128 -0
  71. package/dist/engine/risk-analyzer/tradeoff-detector.js.map +1 -0
  72. package/dist/index.js +7 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/storage/risk-store.d.ts +16 -0
  75. package/dist/storage/risk-store.d.ts.map +1 -0
  76. package/dist/storage/risk-store.js +53 -0
  77. package/dist/storage/risk-store.js.map +1 -0
  78. package/dist/tools/schemas/lifecycle.d.ts +2 -0
  79. package/dist/tools/schemas/lifecycle.d.ts.map +1 -1
  80. package/dist/tools/schemas/lifecycle.js +3 -1
  81. package/dist/tools/schemas/lifecycle.js.map +1 -1
  82. package/dist/types/actuals-tracking.d.ts +51 -0
  83. package/dist/types/actuals-tracking.d.ts.map +1 -0
  84. package/dist/types/actuals-tracking.js +2 -0
  85. package/dist/types/actuals-tracking.js.map +1 -0
  86. package/dist/types/common/tech-enums.d.ts +1 -1
  87. package/dist/types/common/tech-enums.d.ts.map +1 -1
  88. package/dist/types/docs.d.ts +44 -1
  89. package/dist/types/docs.d.ts.map +1 -1
  90. package/dist/types/index.d.ts +2 -0
  91. package/dist/types/index.d.ts.map +1 -1
  92. package/dist/types/index.js +2 -0
  93. package/dist/types/index.js.map +1 -1
  94. package/dist/types/risk.d.ts +90 -0
  95. package/dist/types/risk.d.ts.map +1 -0
  96. package/dist/types/risk.js +2 -0
  97. package/dist/types/risk.js.map +1 -0
  98. package/package.json +1 -1
  99. package/src/i18n/messages/en.json +3 -3
  100. package/src/i18n/messages/es.json +3 -3
  101. package/src/i18n/messages/pt.json +3 -3
@@ -0,0 +1,38 @@
1
+ import { buildExecutiveSummaryData } from './data-extractors.js';
2
+ import { generateArchitectureSvg, generateTimelineSvg, generateRiskDistributionSvg, } from './svg-diagrams.js';
3
+ import { wrapInHtmlDocument } from './html-template.js';
4
+ import { buildHeaderSection, buildOverviewSection, buildSpecsTableSection, buildEstimationSection, buildRiskSection, buildArchitectureSection, buildTimelineSection, buildFooterSection, } from './section-builders.js';
5
+ /**
6
+ * Generate a self-contained HTML executive summary document.
7
+ * Returns a GeneratedDocument with type 'executive-summary'.
8
+ */
9
+ export function generateExecutiveSummary(knowledge, specs, _language) {
10
+ const data = buildExecutiveSummaryData(knowledge, specs);
11
+ const archSvg = generateArchitectureSvg(data.architecture);
12
+ const timelineSvg = generateTimelineSvg(data.specs);
13
+ const riskSvg = generateRiskDistributionSvg(data.riskProfile);
14
+ const hasActuals = data.specs.some((s) => s.actualDevHours !== undefined);
15
+ const body = [
16
+ buildHeaderSection(data.projectName, data.generatedAt, data.specs.length),
17
+ buildOverviewSection(data.architecture),
18
+ buildSpecsTableSection(data.specs),
19
+ buildEstimationSection(data.estimation, hasActuals),
20
+ buildRiskSection(data.riskProfile, riskSvg),
21
+ buildArchitectureSection(data.architecture, archSvg),
22
+ buildTimelineSection(timelineSvg),
23
+ buildFooterSection(),
24
+ ].join('\n');
25
+ const title = `Executive Summary — ${data.projectName}`;
26
+ const content = wrapInHtmlDocument(title, body);
27
+ return {
28
+ type: 'executive-summary',
29
+ title,
30
+ path: 'docs/executive-summary.html',
31
+ content,
32
+ audience: 'stakeholder',
33
+ sections: [],
34
+ diagrams: [],
35
+ relatedSpecs: data.specs.map((s) => s.id),
36
+ };
37
+ }
38
+ //# sourceMappingURL=executive-summary-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executive-summary-generator.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/executive-summary-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAA2B,EAC3B,KAAa,EACb,SAAiB;IAEjB,MAAM,IAAI,GAAG,yBAAyB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC;IAE1E,MAAM,IAAI,GAAG;QACX,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACzE,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC;QACvC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC,sBAAsB,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;QACnD,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;QAC3C,wBAAwB,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;QACpD,oBAAoB,CAAC,WAAW,CAAC;QACjC,kBAAkB,EAAE;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,KAAK,GAAG,uBAAuB,IAAI,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEhD,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,KAAK;QACL,IAAI,EAAE,6BAA6B;QACnC,OAAO;QACP,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Wrap body content in a full HTML document with inline CSS. */
2
+ export declare function wrapInHtmlDocument(title: string, bodyContent: string): string;
3
+ //# sourceMappingURL=html-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-template.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/html-template.ts"],"names":[],"mappings":"AAgCA,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAa7E"}
@@ -0,0 +1,53 @@
1
+ // SpecForge — HTML document wrapper with inline CSS for executive summary
2
+ const CSS = `
3
+ @page { margin: 2cm; size: A4; }
4
+ @media print { print-color-adjust: exact; -webkit-print-color-adjust: exact; }
5
+ * { box-sizing: border-box; margin: 0; padding: 0; }
6
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-size: 14px; color: #1f2937; max-width: 900px; margin: 0 auto; padding: 24px; background: #fff; }
7
+ .header { border-bottom: 3px solid #4F46E5; padding-bottom: 16px; margin-bottom: 24px; }
8
+ .header h1 { font-size: 1.1em; color: #6b7280; font-weight: 400; margin-bottom: 4px; }
9
+ .header h2 { font-size: 1.8em; color: #111827; font-weight: 700; }
10
+ .header .meta { margin-top: 8px; font-size: 0.85em; color: #6b7280; }
11
+ .badge { display: inline-block; padding: 2px 10px; border-radius: 12px; font-size: 0.78em; font-weight: 600; }
12
+ .badge-draft { background: #e5e7eb; color: #374151; }
13
+ .badge-review { background: #dbeafe; color: #1d4ed8; }
14
+ .badge-approved { background: #d1fae5; color: #065f46; }
15
+ .badge-implementing { background: #fef3c7; color: #92400e; }
16
+ .badge-done { background: #d1fae5; color: #065f46; }
17
+ .section { margin-bottom: 28px; }
18
+ .section h2 { font-size: 1.15em; color: #4F46E5; border-left: 4px solid #4F46E5; padding-left: 10px; margin-bottom: 14px; }
19
+ .metric-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; margin-bottom: 16px; }
20
+ .metric-card { background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 8px; padding: 14px; text-align: center; }
21
+ .metric-value { font-size: 2em; font-weight: 700; color: #4F46E5; line-height: 1; }
22
+ .metric-label { font-size: 0.78em; color: #6b7280; margin-top: 4px; }
23
+ table { width: 100%; border-collapse: collapse; font-size: 0.85em; }
24
+ th { background: #4F46E5; color: white; padding: 8px 12px; text-align: left; font-weight: 600; }
25
+ td { padding: 7px 12px; border-bottom: 1px solid #e5e7eb; }
26
+ tr:nth-child(even) td { background: #f9fafb; }
27
+ .risk-highlight { border-left: 3px solid #ef4444; padding: 6px 10px; margin: 4px 0; background: #fef2f2; border-radius: 0 4px 4px 0; font-size: 0.85em; color: #374151; }
28
+ svg { max-width: 100%; height: auto; }
29
+ .footer { margin-top: 32px; padding-top: 16px; border-top: 1px solid #e5e7eb; font-size: 0.78em; color: #9ca3af; text-align: center; }
30
+ `;
31
+ /** Wrap body content in a full HTML document with inline CSS. */
32
+ export function wrapInHtmlDocument(title, bodyContent) {
33
+ return `<!DOCTYPE html>
34
+ <html lang="en">
35
+ <head>
36
+ <meta charset="UTF-8"/>
37
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
38
+ <title>${escapeHtml(title)}</title>
39
+ <style>${CSS}</style>
40
+ </head>
41
+ <body>
42
+ ${bodyContent}
43
+ </body>
44
+ </html>`;
45
+ }
46
+ function escapeHtml(str) {
47
+ return str
48
+ .replace(/&/g, '&amp;')
49
+ .replace(/</g, '&lt;')
50
+ .replace(/>/g, '&gt;')
51
+ .replace(/"/g, '&quot;');
52
+ }
53
+ //# sourceMappingURL=html-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-template.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/html-template.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BX,CAAC;AAEF,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,WAAmB;IACnE,OAAO;;;;;WAKE,UAAU,CAAC,KAAK,CAAC;WACjB,GAAG;;;EAGZ,WAAW;;QAEL,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { generateExecutiveSummary } from './executive-summary-generator.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ // SpecForge — Executive Summary module barrel
2
+ export { generateExecutiveSummary } from './executive-summary-generator.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ExecutiveSummarySpecEntry, AggregatedEstimation, RiskProfile, ArchitectureSnapshot } from '../../../types/index.js';
2
+ /** Header section: project name, spec count, generated date. */
3
+ export declare function buildHeaderSection(projectName: string, generatedAt: string, specCount: number): string;
4
+ /** Overview section: language, framework, database, layer count. */
5
+ export declare function buildOverviewSection(arch: ArchitectureSnapshot): string;
6
+ /** Specs table section. Adds actual columns if any spec has actuals. */
7
+ export declare function buildSpecsTableSection(specs: ExecutiveSummarySpecEntry[]): string;
8
+ /** Estimation section: totals, and side-by-side if actuals available. */
9
+ export declare function buildEstimationSection(est: AggregatedEstimation, hasActuals: boolean, actualEstimation?: AggregatedEstimation): string;
10
+ /** Risk section: metric cards + SVG bar + highlights. */
11
+ export declare function buildRiskSection(risk: RiskProfile, svgContent: string): string;
12
+ /** Architecture section: language/framework/DB info + SVG. */
13
+ export declare function buildArchitectureSection(arch: ArchitectureSnapshot, svgContent: string): string;
14
+ /** Timeline section: SVG only. */
15
+ export declare function buildTimelineSection(svgContent: string): string;
16
+ /** Footer section. */
17
+ export declare function buildFooterSection(): string;
18
+ //# sourceMappingURL=section-builders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-builders.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/section-builders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,WAAW,EACX,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAmCjC,gEAAgE;AAChE,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,CAWR;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAUvE;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,yBAAyB,EAAE,GAAG,MAAM,CA+BjF;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,oBAAoB,EACzB,UAAU,EAAE,OAAO,EACnB,gBAAgB,CAAC,EAAE,oBAAoB,GACtC,MAAM,CAwBR;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiB9E;AAED,8DAA8D;AAC9D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQ/F;AAED,kCAAkC;AAClC,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,sBAAsB;AACtB,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,152 @@
1
+ // ── Helpers ─────────────────────────────────────────────────────────────────
2
+ function statusToBadgeClass(status) {
3
+ switch (status) {
4
+ case 'draft':
5
+ return 'badge-draft';
6
+ case 'review':
7
+ return 'badge-review';
8
+ case 'approved':
9
+ return 'badge-approved';
10
+ case 'implementing':
11
+ return 'badge-implementing';
12
+ case 'done':
13
+ return 'badge-done';
14
+ default:
15
+ return 'badge-draft';
16
+ }
17
+ }
18
+ function formatUsd(amount) {
19
+ return amount.toLocaleString('en-US', {
20
+ style: 'currency',
21
+ currency: 'USD',
22
+ maximumFractionDigits: 0,
23
+ });
24
+ }
25
+ function metricCard(value, label) {
26
+ return `<div class="metric-card"><div class="metric-value">${value}</div><div class="metric-label">${label}</div></div>`;
27
+ }
28
+ // ── Section builders ─────────────────────────────────────────────────────────
29
+ /** Header section: project name, spec count, generated date. */
30
+ export function buildHeaderSection(projectName, generatedAt, specCount) {
31
+ const date = new Date(generatedAt).toLocaleDateString('en-US', {
32
+ year: 'numeric',
33
+ month: 'long',
34
+ day: 'numeric',
35
+ });
36
+ return `<div class="header">
37
+ <h1>SpecForge — Executive Summary</h1>
38
+ <h2>${escapeHtml(projectName)}</h2>
39
+ <div class="meta"><span class="badge badge-draft">${specCount} spec${specCount !== 1 ? 's' : ''}</span>&nbsp; Generated on ${date}</div>
40
+ </div>`;
41
+ }
42
+ /** Overview section: language, framework, database, layer count. */
43
+ export function buildOverviewSection(arch) {
44
+ return `<div class="section">
45
+ <h2>Project Overview</h2>
46
+ <div class="metric-grid">
47
+ ${metricCard(escapeHtml(arch.language), 'Language')}
48
+ ${metricCard(escapeHtml(arch.framework), 'Framework')}
49
+ ${metricCard(escapeHtml(arch.database), 'Database')}
50
+ ${metricCard(String(arch.layers.length), 'Architecture Layers')}
51
+ </div>
52
+ </div>`;
53
+ }
54
+ /** Specs table section. Adds actual columns if any spec has actuals. */
55
+ export function buildSpecsTableSection(specs) {
56
+ const hasActuals = specs.some((s) => s.actualDevHours !== undefined);
57
+ const header = `<tr>
58
+ <th>ID</th><th>Title</th><th>Status</th><th>Difficulty</th><th>Risk</th><th>Dev Hours</th><th>Cost (est.)</th>
59
+ ${hasActuals ? '<th>Actual Hours</th><th>Actual Cost</th>' : ''}
60
+ </tr>`;
61
+ const rows = specs
62
+ .map((s) => {
63
+ const badgeClass = statusToBadgeClass(s.status);
64
+ const actualCols = hasActuals
65
+ ? `<td>${s.actualDevHours !== undefined ? String(s.actualDevHours) : '—'}</td><td>${s.actualTotalCostUsd !== undefined ? formatUsd(s.actualTotalCostUsd) : '—'}</td>`
66
+ : '';
67
+ return `<tr>
68
+ <td>${escapeHtml(s.id)}</td>
69
+ <td>${escapeHtml(s.title)}</td>
70
+ <td><span class="badge ${badgeClass}">${s.status}</span></td>
71
+ <td>${s.difficulty}</td>
72
+ <td>${s.risk}</td>
73
+ <td>${s.devHours}h</td>
74
+ <td>${formatUsd(s.totalCostUsd)}</td>
75
+ ${actualCols}
76
+ </tr>`;
77
+ })
78
+ .join('');
79
+ return `<div class="section">
80
+ <h2>Specifications</h2>
81
+ <table>${header}${rows}</table>
82
+ </div>`;
83
+ }
84
+ /** Estimation section: totals, and side-by-side if actuals available. */
85
+ export function buildEstimationSection(est, hasActuals, actualEstimation) {
86
+ const cards = `<div class="metric-grid">
87
+ ${metricCard(String(est.totalDevHours) + 'h', 'Total Dev Hours')}
88
+ ${metricCard(String(est.totalReviewHours) + 'h', 'Review Hours')}
89
+ ${metricCard(formatUsd(est.totalHumanCostUsd), 'Human Cost')}
90
+ ${metricCard(formatUsd(est.totalApiCostUsd), 'API Cost')}
91
+ ${metricCard(formatUsd(est.totalCostUsd), 'Total Cost')}
92
+ </div>`;
93
+ let actualsBlock = '';
94
+ if (hasActuals && actualEstimation !== undefined) {
95
+ const delta = est.totalCostUsd > 0
96
+ ? Math.round(((actualEstimation.totalCostUsd - est.totalCostUsd) / est.totalCostUsd) * 100)
97
+ : 0;
98
+ const sign = delta >= 0 ? '+' : '';
99
+ actualsBlock = `<p style="margin-top:8px;font-size:0.85em;color:#6b7280;">Actual total: <strong>${formatUsd(actualEstimation.totalCostUsd)}</strong> — ${sign}${delta}% vs estimate</p>`;
100
+ }
101
+ return `<div class="section">
102
+ <h2>Cost Estimation</h2>
103
+ ${cards}
104
+ ${actualsBlock}
105
+ </div>`;
106
+ }
107
+ /** Risk section: metric cards + SVG bar + highlights. */
108
+ export function buildRiskSection(risk, svgContent) {
109
+ const highlights = risk.highlights.length > 0
110
+ ? risk.highlights.map((h) => `<div class="risk-highlight">${escapeHtml(h)}</div>`).join('')
111
+ : '<p style="color:#6b7280;font-size:0.85em;">No high-risk specs identified.</p>';
112
+ return `<div class="section">
113
+ <h2>Risk Assessment</h2>
114
+ <div class="metric-grid">
115
+ ${metricCard(String(risk.low), 'Low Risk')}
116
+ ${metricCard(String(risk.medium), 'Medium Risk')}
117
+ ${metricCard(String(risk.high), 'High Risk')}
118
+ ${metricCard(String(risk.critical), 'Critical Risk')}
119
+ </div>
120
+ ${svgContent}
121
+ <div style="margin-top:12px"><strong style="font-size:0.85em;color:#374151;">High &amp; Critical Specs:</strong>${highlights}</div>
122
+ </div>`;
123
+ }
124
+ /** Architecture section: language/framework/DB info + SVG. */
125
+ export function buildArchitectureSection(arch, svgContent) {
126
+ return `<div class="section">
127
+ <h2>Architecture</h2>
128
+ <p style="margin-bottom:12px;font-size:0.9em;color:#374151;">
129
+ <strong>${escapeHtml(arch.language)}</strong> project using <strong>${escapeHtml(arch.framework)}</strong> with <strong>${escapeHtml(arch.database)}</strong> — ${arch.layers.length} architecture layer${arch.layers.length !== 1 ? 's' : ''}.
130
+ </p>
131
+ ${svgContent}
132
+ </div>`;
133
+ }
134
+ /** Timeline section: SVG only. */
135
+ export function buildTimelineSection(svgContent) {
136
+ return `<div class="section">
137
+ <h2>Development Timeline</h2>
138
+ ${svgContent}
139
+ </div>`;
140
+ }
141
+ /** Footer section. */
142
+ export function buildFooterSection() {
143
+ return `<div class="footer">Generated by SpecForge &mdash; ${new Date().toUTCString()}</div>`;
144
+ }
145
+ function escapeHtml(str) {
146
+ return str
147
+ .replace(/&/g, '&amp;')
148
+ .replace(/</g, '&lt;')
149
+ .replace(/>/g, '&gt;')
150
+ .replace(/"/g, '&quot;');
151
+ }
152
+ //# sourceMappingURL=section-builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-builders.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/section-builders.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAE/E,SAAS,kBAAkB,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,gBAAgB,CAAC;QAC1B,KAAK,cAAc;YACjB,OAAO,oBAAoB,CAAC;QAC9B,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE;QACpC,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,KAAK;QACf,qBAAqB,EAAE,CAAC;KACzB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,KAAa;IAC9C,OAAO,sDAAsD,KAAK,mCAAmC,KAAK,cAAc,CAAC;AAC3H,CAAC;AAED,gFAAgF;AAEhF,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,WAAmB,EACnB,SAAiB;IAEjB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAC7D,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IACH,OAAO;;QAED,UAAU,CAAC,WAAW,CAAC;sDACuB,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,8BAA8B,IAAI;OAC5H,CAAC;AACR,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,oBAAoB,CAAC,IAA0B;IAC7D,OAAO;;;MAGH,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;MACjD,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;MACnD,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;MACjD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;;OAE5D,CAAC;AACR,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG;;MAEX,UAAU,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,EAAE;QAC3D,CAAC;IAEP,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,UAAU;YAC3B,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;YACrK,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;UACH,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;UAChB,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;6BACA,UAAU,KAAK,CAAC,CAAC,MAAM;UAC1C,CAAC,CAAC,UAAU;UACZ,CAAC,CAAC,IAAI;UACN,CAAC,CAAC,QAAQ;UACV,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;MAC7B,UAAU;QACR,CAAC;IACL,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;WAEE,MAAM,GAAG,IAAI;OACjB,CAAC;AACR,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CACpC,GAAyB,EACzB,UAAmB,EACnB,gBAAuC;IAEvC,MAAM,KAAK,GAAG;MACV,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,EAAE,iBAAiB,CAAC;MAC9D,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,GAAG,EAAE,cAAc,CAAC;MAC9D,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,YAAY,CAAC;MAC1D,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC;MACtD,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;SAClD,CAAC;IAER,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,UAAU,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GACT,GAAG,CAAC,YAAY,GAAG,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC;YAC3F,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,YAAY,GAAG,mFAAmF,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,eAAe,IAAI,GAAG,KAAK,mBAAmB,CAAC;IAC3L,CAAC;IAED,OAAO;;IAEL,KAAK;IACL,YAAY;OACT,CAAC;AACR,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,IAAiB,EAAE,UAAkB;IACpE,MAAM,UAAU,GACd,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,+BAA+B,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3F,CAAC,CAAC,+EAA+E,CAAC;IAEtF,OAAO;;;MAGH,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;MACxC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;MAC9C,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;MAC1C,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;;IAEpD,UAAU;oHACsG,UAAU;OACvH,CAAC;AACR,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,wBAAwB,CAAC,IAA0B,EAAE,UAAkB;IACrF,OAAO;;;cAGK,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,mCAAmC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,0BAA0B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,sBAAsB,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;IAE7O,UAAU;OACP,CAAC;AACR,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,OAAO;;IAEL,UAAU;OACP,CAAC;AACR,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,kBAAkB;IAChC,OAAO,sDAAsD,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;AAChG,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ArchitectureSnapshot, ExecutiveSummarySpecEntry, RiskProfile } from '../../../types/index.js';
2
+ /** Generate an SVG showing stacked architecture layers with gradient colors. */
3
+ export declare function generateArchitectureSvg(arch: ArchitectureSnapshot): string;
4
+ /** Generate an SVG timeline: horizontal bars proportional to devHours, colored by difficulty. */
5
+ export declare function generateTimelineSvg(specs: ExecutiveSummarySpecEntry[]): string;
6
+ /** Generate an SVG stacked horizontal bar for risk distribution. */
7
+ export declare function generateRiskDistributionSvg(risk: RiskProfile): string;
8
+ //# sourceMappingURL=svg-diagrams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-diagrams.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/svg-diagrams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAUjC,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAwC1E;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,yBAAyB,EAAE,GAAG,MAAM,CA8B9E;AAED,oEAAoE;AACpE,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA6CrE"}
@@ -0,0 +1,124 @@
1
+ const DIFFICULTY_COLORS = {
2
+ 1: '#10B981', // trivial — green
3
+ 2: '#3B82F6', // simple — blue
4
+ 3: '#F59E0B', // moderate — amber
5
+ 4: '#EF4444', // complex — red
6
+ 5: '#7C3AED', // expert — purple
7
+ };
8
+ /** Generate an SVG showing stacked architecture layers with gradient colors. */
9
+ export function generateArchitectureSvg(arch) {
10
+ const layers = arch.layers.length > 0 ? arch.layers : ['No layers detected'];
11
+ const boxHeight = 40;
12
+ const boxWidth = 360;
13
+ const gap = 10;
14
+ const totalHeight = layers.length * (boxHeight + gap) + gap + 40;
15
+ const svgWidth = 440;
16
+ const gradients = layers.map((_, i) => {
17
+ const ratio = layers.length > 1 ? i / (layers.length - 1) : 0;
18
+ const r = Math.round(79 + (124 - 79) * ratio);
19
+ const g = Math.round(70 + (58 - 70) * ratio);
20
+ const b = Math.round(229 + (237 - 229) * ratio);
21
+ return `rgb(${r},${g},${b})`;
22
+ });
23
+ const boxes = layers
24
+ .map((layer, i) => {
25
+ const y = gap + i * (boxHeight + gap);
26
+ const color = gradients[i] ?? '#4F46E5';
27
+ const arrowY = y + boxHeight;
28
+ const arrow = i < layers.length - 1
29
+ ? `<line x1="${svgWidth / 2}" y1="${arrowY}" x2="${svgWidth / 2}" y2="${arrowY + gap}" stroke="#94a3b8" stroke-width="2" marker-end="url(#arrow)"/>`
30
+ : '';
31
+ return `
32
+ <rect x="${(svgWidth - boxWidth) / 2}" y="${y}" width="${boxWidth}" height="${boxHeight}" rx="6" fill="${color}" opacity="0.9"/>
33
+ <text x="${svgWidth / 2}" y="${y + boxHeight / 2 + 5}" text-anchor="middle" font-family="sans-serif" font-size="13" fill="white" font-weight="600">${escapeXml(layer)}</text>
34
+ ${arrow}`;
35
+ })
36
+ .join('');
37
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svgWidth} ${totalHeight}" style="max-width:100%;font-family:sans-serif">
38
+ <defs>
39
+ <marker id="arrow" markerWidth="8" markerHeight="8" refX="4" refY="4" orient="auto">
40
+ <path d="M0,0 L8,4 L0,8 Z" fill="#94a3b8"/>
41
+ </marker>
42
+ </defs>
43
+ ${boxes}
44
+ </svg>`;
45
+ }
46
+ /** Generate an SVG timeline: horizontal bars proportional to devHours, colored by difficulty. */
47
+ export function generateTimelineSvg(specs) {
48
+ if (specs.length === 0) {
49
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 60" style="max-width:100%">
50
+ <text x="200" y="35" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#94a3b8">No specs available</text>
51
+ </svg>`;
52
+ }
53
+ const maxHours = Math.max(...specs.map((s) => s.devHours), 1);
54
+ const rowHeight = 28;
55
+ const labelWidth = 150;
56
+ const barMaxWidth = 220;
57
+ const svgWidth = labelWidth + barMaxWidth + 60;
58
+ const svgHeight = specs.length * rowHeight + 20;
59
+ const rows = specs
60
+ .map((spec, i) => {
61
+ const y = 10 + i * rowHeight;
62
+ const barWidth = Math.round((spec.devHours / maxHours) * barMaxWidth);
63
+ const color = DIFFICULTY_COLORS[spec.difficulty] ?? '#94a3b8';
64
+ const label = spec.title.length > 20 ? spec.title.slice(0, 18) + '…' : spec.title;
65
+ return `
66
+ <text x="${labelWidth - 5}" y="${y + 16}" text-anchor="end" font-family="sans-serif" font-size="11" fill="#374151">${escapeXml(label)}</text>
67
+ <rect x="${labelWidth}" y="${y + 4}" width="${barWidth}" height="18" rx="3" fill="${color}" opacity="0.85"/>
68
+ <text x="${labelWidth + barWidth + 5}" y="${y + 16}" font-family="sans-serif" font-size="10" fill="#6b7280">${spec.devHours}h</text>`;
69
+ })
70
+ .join('');
71
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svgWidth} ${svgHeight}" style="max-width:100%;font-family:sans-serif">
72
+ ${rows}
73
+ </svg>`;
74
+ }
75
+ /** Generate an SVG stacked horizontal bar for risk distribution. */
76
+ export function generateRiskDistributionSvg(risk) {
77
+ const total = risk.low + risk.medium + risk.high + risk.critical;
78
+ if (total === 0) {
79
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 60" style="max-width:100%">
80
+ <text x="200" y="35" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#94a3b8">No risk data</text>
81
+ </svg>`;
82
+ }
83
+ const barWidth = 380;
84
+ const barHeight = 30;
85
+ const svgWidth = 420;
86
+ const svgHeight = 90;
87
+ const segments = [
88
+ { count: risk.low, color: '#10B981', label: 'Low' },
89
+ { count: risk.medium, color: '#F59E0B', label: 'Medium' },
90
+ { count: risk.high, color: '#F97316', label: 'High' },
91
+ { count: risk.critical, color: '#EF4444', label: 'Critical' },
92
+ ];
93
+ let xOffset = 20;
94
+ const bars = segments
95
+ .map(({ count, color }) => {
96
+ if (count === 0) {
97
+ return '';
98
+ }
99
+ const width = Math.round((count / total) * barWidth);
100
+ const bar = `<rect x="${xOffset}" y="10" width="${width}" height="${barHeight}" fill="${color}" opacity="0.9"/><text x="${xOffset + width / 2}" y="30" text-anchor="middle" font-family="sans-serif" font-size="11" fill="white" font-weight="600">${count}</text>`;
101
+ xOffset += width;
102
+ return bar;
103
+ })
104
+ .join('');
105
+ const legend = segments
106
+ .map(({ color, label }, i) => {
107
+ const lx = 20 + i * 100;
108
+ return `<rect x="${lx}" y="52" width="12" height="12" fill="${color}" rx="2"/><text x="${lx + 16}" y="63" font-family="sans-serif" font-size="11" fill="#374151">${label}</text>`;
109
+ })
110
+ .join('');
111
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svgWidth} ${svgHeight}" style="max-width:100%;font-family:sans-serif">
112
+ ${bars}
113
+ ${legend}
114
+ </svg>`;
115
+ }
116
+ function escapeXml(str) {
117
+ return str
118
+ .replace(/&/g, '&amp;')
119
+ .replace(/</g, '&lt;')
120
+ .replace(/>/g, '&gt;')
121
+ .replace(/"/g, '&quot;')
122
+ .replace(/'/g, '&#39;');
123
+ }
124
+ //# sourceMappingURL=svg-diagrams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-diagrams.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/executive-summary/svg-diagrams.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doc-generator.d.ts","sourceRoot":"","sources":["../../src/engine/doc-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,IAAI,EACL,MAAM,mBAAmB,CAAC;AA6C3B;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,SAAS,EAAE,gBAAgB,EAC3B,KAAK,GAAE,IAAI,EAAO,EAClB,QAAQ,GAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,KAAmB,EACxE,QAAQ,SAAO,GACd,kBAAkB,CAapB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,iBAAiB,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,IAAI,EAAE,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAsCnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EACA,WAAW,GACX,UAAU,GACV,IAAI,GACJ,WAAW,GACX,cAAc,GACd,eAAe,GACf,YAAY,GACZ,YAAY,EAChB,SAAS,EAAE,gBAAgB,EAC3B,IAAI,CAAC,EAAE,IAAI,GACV,WAAW,CAqBb"}
1
+ {"version":3,"file":"doc-generator.d.ts","sourceRoot":"","sources":["../../src/engine/doc-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,IAAI,EACL,MAAM,mBAAmB,CAAC;AA8C3B;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,SAAS,EAAE,gBAAgB,EAC3B,KAAK,GAAE,IAAI,EAAO,EAClB,QAAQ,GAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,KAAmB,EACxE,QAAQ,SAAO,GACd,kBAAkB,CAapB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,iBAAiB,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,IAAI,EAAE,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAuCnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EACA,WAAW,GACX,UAAU,GACV,IAAI,GACJ,WAAW,GACX,cAAc,GACd,eAAe,GACf,YAAY,GACZ,YAAY,EAChB,SAAS,EAAE,gBAAgB,EAC3B,IAAI,CAAC,EAAE,IAAI,GACV,WAAW,CAqBb"}
@@ -6,6 +6,7 @@ import { generateChangelog, generateOnboarding, generateFaq, generateHelpArticle
6
6
  import { generateReleaseNotes, generateRunbook, generateSecurityDoc, generateDatabaseDoc, } from './doc-generator/ops-generators.js';
7
7
  import { generateArchitectureDecisionLog, generateContributing, } from './doc-generator/team-generators.js';
8
8
  import { generateMobileDistributionGuide } from './doc-generator/mobile-distribution-guide.js';
9
+ import { generateExecutiveSummary } from './doc-generator/executive-summary/index.js';
9
10
  import { generateArchitectureDiagram, generateComponentDiagram, generateDataFlowDiagram, generateSequenceDiagram, generateErDiagram, generateStateMachineDiagram, generateDependencyDiagram, generateDeploymentDiagram, } from './doc-generator/diagrams.js';
10
11
  // === Public API ===
11
12
  /**
@@ -46,6 +47,7 @@ export function generateDocument(type, knowledge, specs, audience, language) {
46
47
  'architecture-decision-log': () => generateArchitectureDecisionLog(specs, language),
47
48
  contributing: () => generateContributing(knowledge, language),
48
49
  'mobile-distribution-guide': () => generateMobileDistributionGuide(knowledge, specs, language),
50
+ 'executive-summary': () => generateExecutiveSummary(knowledge, specs, language),
49
51
  };
50
52
  const generator = generators[type];
51
53
  if (!generator) {
@@ -1 +1 @@
1
- {"version":3,"file":"doc-generator.js","sourceRoot":"","sources":["../../src/engine/doc-generator.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,8DAA8D;AAC9D,wDAAwD;AAWxD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,+BAA+B,EAC/B,oBAAoB,GACrB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,+BAA+B,EAAE,MAAM,8CAA8C,CAAC;AAE/F,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAErC,qBAAqB;AAErB;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAA0B,EAC1B,SAA2B,EAC3B,QAAgB,EAAE,EAClB,WAA6D,WAAW,EACxE,QAAQ,GAAG,IAAI;IAEf,MAAM,SAAS,GAAwB,EAAE,CAAC;IAE1C,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5E,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO;QACL,SAAS;QACT,OAAO,EAAE,aAAa,SAAS,CAAC,MAAM,iBAAiB,SAAS,EAAE;KACnE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAuB,EACvB,SAA2B,EAC3B,KAAa,EACb,QAAgB,EAChB,QAAgB;IAEhB,MAAM,UAAU,GAAgE;QAC9E,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;QACjE,eAAe,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;QACvE,MAAM,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;QACxD,aAAa,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC5D,SAAS,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC;QACnD,UAAU,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC;QACzD,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;QAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,EAAE,QAAQ,CAAC;QACtE,kBAAkB,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,EAAE,QAAQ,CAAC;QACtE,cAAc,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC9D,eAAe,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;QACvE,eAAe,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC;QACnD,cAAc,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC9D,2BAA2B,EAAE,GAAG,EAAE,CAAC,+BAA+B,CAAC,KAAK,EAAE,QAAQ,CAAC;QACnF,YAAY,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC7D,2BAA2B,EAAE,GAAG,EAAE,CAAC,+BAA+B,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;KAC/F,CAAC;IAEF,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,gBAAgB,IAAI,EAAE;YAC7B,IAAI,EAAE,QAAQ,IAAI,KAAK;YACvB,OAAO,EAAE,uBAAuB,IAAI,yBAAyB;YAC7D,QAAQ;YACR,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,EAAE;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAQgB,EAChB,SAA2B,EAC3B,IAAW;IAEX,MAAM,UAAU,GAAsC;QACpD,WAAW,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC;QACrD,QAAQ,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC;QAC7C,EAAE,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACtC,SAAS,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC;QACpD,YAAY,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,SAAS,CAAC;QAC1D,eAAe,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC;QACxD,UAAU,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,SAAS,CAAC;QACtD,UAAU,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,SAAS,CAAC;KACvD,CAAC;IAEF,OAAO,CACL,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI;QACtB,IAAI;QACJ,KAAK,EAAE,GAAG,IAAI,UAAU;QACxB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,4CAA4C,IAAI,GAAG;QAC5D,WAAW,EAAE,GAAG,IAAI,sBAAsB;KAC3C,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"doc-generator.js","sourceRoot":"","sources":["../../src/engine/doc-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RiskAnalysisContext, ApproachAnalysis } from '../../types/index.js';
2
+ /**
3
+ * Generate an approach analysis for a spec context.
4
+ */
5
+ export declare function analyzeApproach(ctx: RiskAnalysisContext): ApproachAnalysis;
6
+ //# sourceMappingURL=approach-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approach-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/risk-analyzer/approach-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAmGlF;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,GAAG,gBAAgB,CAQ1E"}
@@ -0,0 +1,86 @@
1
+ function buildChosenApproach(ctx) {
2
+ return `${ctx.type} implementation with ${ctx.scope} scope for ${ctx.language}${ctx.framework ? ` using ${ctx.framework}` : ''}`;
3
+ }
4
+ function buildAdvantages(ctx) {
5
+ const advantages = [
6
+ 'Follows SDD methodology with full traceability from spec to implementation',
7
+ 'Acceptance criteria defined upfront reduce rework',
8
+ ];
9
+ if (ctx.framework !== null) {
10
+ advantages.push(`Leverages ${ctx.framework} ecosystem and conventions`);
11
+ }
12
+ if (ctx.scope === 'trivial' || ctx.scope === 'feature') {
13
+ advantages.push('Contained scope minimizes regression risk');
14
+ }
15
+ if (ctx.difficulty <= 2) {
16
+ advantages.push('Low difficulty allows rapid delivery and early feedback');
17
+ }
18
+ if (ctx.tags.includes('performance')) {
19
+ advantages.push('Performance considerations integrated into design from the start');
20
+ }
21
+ return advantages;
22
+ }
23
+ function buildDisadvantages(ctx) {
24
+ const disadvantages = [];
25
+ if (ctx.difficulty >= 4) {
26
+ disadvantages.push('High complexity requires senior engineering involvement');
27
+ }
28
+ if (ctx.scope === 'architectural') {
29
+ disadvantages.push('Architectural changes require broad team coordination and extended review');
30
+ }
31
+ if (ctx.scope === 'cross-module') {
32
+ disadvantages.push('Cross-module changes increase regression testing surface');
33
+ }
34
+ if (ctx.framework === null) {
35
+ disadvantages.push('Absence of a defined framework increases design decisions needed');
36
+ }
37
+ if (ctx.dependencyCount > 5) {
38
+ disadvantages.push('High dependency count increases coordination and upgrade overhead');
39
+ }
40
+ if (disadvantages.length === 0) {
41
+ disadvantages.push('Standard trade-offs apply for this scope and complexity level');
42
+ }
43
+ return disadvantages;
44
+ }
45
+ function buildLimitations(ctx) {
46
+ const limitations = [
47
+ 'Does not cover runtime performance testing unless explicitly scoped',
48
+ 'Spec does not address infrastructure provisioning unless tagged as infra',
49
+ ];
50
+ if (!ctx.tags.includes('security')) {
51
+ limitations.push('Security audit is out of scope for this spec');
52
+ }
53
+ if (ctx.type !== 'docs') {
54
+ limitations.push('Documentation updates are tracked separately');
55
+ }
56
+ return limitations;
57
+ }
58
+ function buildFutureConsiderations(ctx) {
59
+ const considerations = [
60
+ 'Monitor metrics post-deployment to validate estimates',
61
+ 'Revisit approach if scope expands significantly',
62
+ ];
63
+ if (ctx.scope === 'feature') {
64
+ considerations.push('Consider extracting reusable patterns for future specs');
65
+ }
66
+ if (ctx.difficulty >= 3) {
67
+ considerations.push('Document lessons learned for estimation calibration');
68
+ }
69
+ if (ctx.tags.includes('migration')) {
70
+ considerations.push('Plan rollback strategy before migration execution');
71
+ }
72
+ return considerations;
73
+ }
74
+ /**
75
+ * Generate an approach analysis for a spec context.
76
+ */
77
+ export function analyzeApproach(ctx) {
78
+ return {
79
+ chosenApproach: buildChosenApproach(ctx),
80
+ advantages: buildAdvantages(ctx),
81
+ disadvantages: buildDisadvantages(ctx),
82
+ limitations: buildLimitations(ctx),
83
+ futureConsiderations: buildFutureConsiderations(ctx),
84
+ };
85
+ }
86
+ //# sourceMappingURL=approach-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approach-analyzer.js","sourceRoot":"","sources":["../../../src/engine/risk-analyzer/approach-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RiskAnalysisContext, ComplexityMatrix } from '../../types/index.js';
2
+ /**
3
+ * Calculate the full complexity matrix for a spec.
4
+ */
5
+ export declare function calculateComplexityMatrix(ctx: RiskAnalysisContext): ComplexityMatrix;
6
+ //# sourceMappingURL=complexity-calculator.d.ts.map