claude-presentation-master 4.1.0 → 4.2.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.
package/bin/cli.js CHANGED
@@ -20,7 +20,7 @@ const args = process.argv.slice(2);
20
20
 
21
21
  // Help text
22
22
  const helpText = `
23
- Claude Presentation Master v4.1.0
23
+ Claude Presentation Master v4.2.0
24
24
  Generate world-class presentations using expert methodologies
25
25
 
26
26
  100% FREE • Zero API Keys • Runs Locally
@@ -85,7 +85,7 @@ For more information: https://github.com/Stuinfla/claude-presentation-master
85
85
  `;
86
86
 
87
87
  // Version
88
- const version = '4.1.0';
88
+ const version = '4.2.0';
89
89
 
90
90
  // Parse arguments
91
91
  function parseArgs(args) {
package/dist/index.d.mts CHANGED
@@ -787,26 +787,37 @@ declare class SlideGeneratorV2 {
787
787
  declare function createSlideGeneratorV2(type?: PresentationType): SlideGeneratorV2;
788
788
 
789
789
  /**
790
- * Renderer V2 - Clean, Professional, No Garbage
790
+ * Renderer V2 - KB-Driven Visual Excellence
791
791
  *
792
792
  * Renders slides to HTML and PDF with:
793
793
  * - Tables as actual tables (not mangled metrics)
794
794
  * - Complete bullets (never truncated)
795
795
  * - Clean professional CSS (no random stock photos)
796
- * - McKinsey/BCG consulting style (WHITE background, strong hierarchy)
796
+ * - Color palettes loaded from Knowledge Base per presentation type
797
+ * - Typography and spacing from KB
797
798
  * - Automatic PDF generation alongside HTML
798
799
  */
799
800
 
800
- type ThemeStyle = 'mckinsey' | 'dark' | 'minimal' | 'corporate' | 'startup';
801
+ type ThemeStyle = 'light' | 'dark';
801
802
  declare class RendererV2 {
802
803
  private theme;
803
804
  private presentationType;
805
+ private kb;
806
+ /**
807
+ * Create renderer with theme loaded from Knowledge Base.
808
+ * @param presentationType - The type of deck being created (determines palette)
809
+ * @param kb - Knowledge Base gateway (optional, will use global if not provided)
810
+ */
811
+ constructor(presentationType?: PresentationType, kb?: KnowledgeGateway);
812
+ /**
813
+ * Load theme configuration from Knowledge Base.
814
+ * Falls back to hardcoded values only if KB fails.
815
+ */
816
+ private loadThemeFromKB;
804
817
  /**
805
- * Create renderer with theme based on presentation type.
806
- * @param presentationType - The type of deck being created (determines theme)
807
- * @param themeOverride - Optional explicit theme override
818
+ * Default palette mapping per presentation type (used if KB doesn't specify).
808
819
  */
809
- constructor(presentationType?: PresentationType, themeOverride?: ThemeStyle);
820
+ private getDefaultPaletteName;
810
821
  /**
811
822
  * Render slides to complete HTML document.
812
823
  */
@@ -829,9 +840,9 @@ declare class RendererV2 {
829
840
  */
830
841
  private renderForPrint;
831
842
  /**
832
- * McKinsey-style print HTML (white background, professional).
843
+ * Light theme print HTML (professional, white background).
833
844
  */
834
- private getMcKinseyPrintHTML;
845
+ private getLightPrintHTML;
835
846
  /**
836
847
  * Dark theme print HTML (legacy).
837
848
  */
@@ -889,17 +900,25 @@ declare class RendererV2 {
889
900
  */
890
901
  private escapeHtml;
891
902
  /**
892
- * Professional CSS - McKinsey/BCG consulting style.
903
+ * Generate CSS with colors from Knowledge Base.
893
904
  */
894
905
  private getCSS;
895
906
  /**
896
- * McKinsey/BCG Consulting Style - WHITE background, professional hierarchy.
907
+ * Generate CSS variables from KB palette.
908
+ */
909
+ private getCSSVariables;
910
+ /**
911
+ * Lighten or darken a hex color.
912
+ */
913
+ private lightenColor;
914
+ /**
915
+ * Light theme CSS (consulting style) with KB palette colors.
897
916
  */
898
- private getMcKinseyCSS;
917
+ private getLightThemeCSS;
899
918
  /**
900
- * Dark theme CSS (legacy).
919
+ * Dark theme CSS with KB palette colors.
901
920
  */
902
- private getDarkCSS;
921
+ private getDarkThemeCSS;
903
922
  }
904
923
  /**
905
924
  * Create a renderer with theme matched to the presentation type.
@@ -914,7 +933,7 @@ declare class RendererV2 {
914
933
  * - product_demo, investor_pitch → Startup (modern dark)
915
934
  * - executive_briefing → Corporate (professional)
916
935
  */
917
- declare function createRendererV2(presentationType?: PresentationType, themeOverride?: ThemeStyle): RendererV2;
936
+ declare function createRendererV2(presentationType?: PresentationType, kb?: KnowledgeGateway): RendererV2;
918
937
 
919
938
  /**
920
939
  * PresentationEngineV2 - Knowledge-Driven Excellence
@@ -1786,7 +1805,7 @@ declare function runCodeQualityCheck(srcDir: string): Promise<boolean>;
1786
1805
  * ALL decisions come from the Knowledge Base. NO hardcoded fallbacks.
1787
1806
  */
1788
1807
 
1789
- declare const VERSION = "4.1.0";
1808
+ declare const VERSION = "4.2.0";
1790
1809
  interface GenerateOptions {
1791
1810
  /** Input content (Markdown, text, etc.) */
1792
1811
  content: string;
package/dist/index.d.ts CHANGED
@@ -787,26 +787,37 @@ declare class SlideGeneratorV2 {
787
787
  declare function createSlideGeneratorV2(type?: PresentationType): SlideGeneratorV2;
788
788
 
789
789
  /**
790
- * Renderer V2 - Clean, Professional, No Garbage
790
+ * Renderer V2 - KB-Driven Visual Excellence
791
791
  *
792
792
  * Renders slides to HTML and PDF with:
793
793
  * - Tables as actual tables (not mangled metrics)
794
794
  * - Complete bullets (never truncated)
795
795
  * - Clean professional CSS (no random stock photos)
796
- * - McKinsey/BCG consulting style (WHITE background, strong hierarchy)
796
+ * - Color palettes loaded from Knowledge Base per presentation type
797
+ * - Typography and spacing from KB
797
798
  * - Automatic PDF generation alongside HTML
798
799
  */
799
800
 
800
- type ThemeStyle = 'mckinsey' | 'dark' | 'minimal' | 'corporate' | 'startup';
801
+ type ThemeStyle = 'light' | 'dark';
801
802
  declare class RendererV2 {
802
803
  private theme;
803
804
  private presentationType;
805
+ private kb;
806
+ /**
807
+ * Create renderer with theme loaded from Knowledge Base.
808
+ * @param presentationType - The type of deck being created (determines palette)
809
+ * @param kb - Knowledge Base gateway (optional, will use global if not provided)
810
+ */
811
+ constructor(presentationType?: PresentationType, kb?: KnowledgeGateway);
812
+ /**
813
+ * Load theme configuration from Knowledge Base.
814
+ * Falls back to hardcoded values only if KB fails.
815
+ */
816
+ private loadThemeFromKB;
804
817
  /**
805
- * Create renderer with theme based on presentation type.
806
- * @param presentationType - The type of deck being created (determines theme)
807
- * @param themeOverride - Optional explicit theme override
818
+ * Default palette mapping per presentation type (used if KB doesn't specify).
808
819
  */
809
- constructor(presentationType?: PresentationType, themeOverride?: ThemeStyle);
820
+ private getDefaultPaletteName;
810
821
  /**
811
822
  * Render slides to complete HTML document.
812
823
  */
@@ -829,9 +840,9 @@ declare class RendererV2 {
829
840
  */
830
841
  private renderForPrint;
831
842
  /**
832
- * McKinsey-style print HTML (white background, professional).
843
+ * Light theme print HTML (professional, white background).
833
844
  */
834
- private getMcKinseyPrintHTML;
845
+ private getLightPrintHTML;
835
846
  /**
836
847
  * Dark theme print HTML (legacy).
837
848
  */
@@ -889,17 +900,25 @@ declare class RendererV2 {
889
900
  */
890
901
  private escapeHtml;
891
902
  /**
892
- * Professional CSS - McKinsey/BCG consulting style.
903
+ * Generate CSS with colors from Knowledge Base.
893
904
  */
894
905
  private getCSS;
895
906
  /**
896
- * McKinsey/BCG Consulting Style - WHITE background, professional hierarchy.
907
+ * Generate CSS variables from KB palette.
908
+ */
909
+ private getCSSVariables;
910
+ /**
911
+ * Lighten or darken a hex color.
912
+ */
913
+ private lightenColor;
914
+ /**
915
+ * Light theme CSS (consulting style) with KB palette colors.
897
916
  */
898
- private getMcKinseyCSS;
917
+ private getLightThemeCSS;
899
918
  /**
900
- * Dark theme CSS (legacy).
919
+ * Dark theme CSS with KB palette colors.
901
920
  */
902
- private getDarkCSS;
921
+ private getDarkThemeCSS;
903
922
  }
904
923
  /**
905
924
  * Create a renderer with theme matched to the presentation type.
@@ -914,7 +933,7 @@ declare class RendererV2 {
914
933
  * - product_demo, investor_pitch → Startup (modern dark)
915
934
  * - executive_briefing → Corporate (professional)
916
935
  */
917
- declare function createRendererV2(presentationType?: PresentationType, themeOverride?: ThemeStyle): RendererV2;
936
+ declare function createRendererV2(presentationType?: PresentationType, kb?: KnowledgeGateway): RendererV2;
918
937
 
919
938
  /**
920
939
  * PresentationEngineV2 - Knowledge-Driven Excellence
@@ -1786,7 +1805,7 @@ declare function runCodeQualityCheck(srcDir: string): Promise<boolean>;
1786
1805
  * ALL decisions come from the Knowledge Base. NO hardcoded fallbacks.
1787
1806
  */
1788
1807
 
1789
- declare const VERSION = "4.1.0";
1808
+ declare const VERSION = "4.2.0";
1790
1809
  interface GenerateOptions {
1791
1810
  /** Input content (Markdown, text, etc.) */
1792
1811
  content: string;
package/dist/index.js CHANGED
@@ -94205,69 +94205,112 @@ function createSlideGeneratorV2(type = "consulting_deck") {
94205
94205
 
94206
94206
  // src/output/RendererV2.ts
94207
94207
  var import_fs8 = require("fs");
94208
- var THEMES = {
94209
- mckinsey: {
94210
- style: "mckinsey",
94211
- primaryColor: "#003366",
94212
- // McKinsey blue
94213
- accentColor: "#0066cc",
94214
- description: "White background, professional hierarchy - for consulting/analysis decks"
94208
+ var FALLBACK_PALETTES = {
94209
+ consulting_classic: {
94210
+ background: "#FAFAF9",
94211
+ primary: "#0F172A",
94212
+ secondary: "#475569",
94213
+ accent: "#0369A1",
94214
+ text: "#18181B",
94215
+ name: "Consulting Classic"
94215
94216
  },
94216
- dark: {
94217
- style: "dark",
94218
- primaryColor: "#1a1a2e",
94219
- accentColor: "#4a9eff",
94220
- description: "Dark dramatic theme - for keynotes and tech presentations"
94217
+ dark_executive: {
94218
+ background: "#18181B",
94219
+ primary: "#FAFAFA",
94220
+ secondary: "#A1A1AA",
94221
+ accent: "#F59E0B",
94222
+ text: "#F4F4F5",
94223
+ name: "Dark Executive"
94221
94224
  },
94222
- minimal: {
94223
- style: "minimal",
94224
- primaryColor: "#333333",
94225
- accentColor: "#0066cc",
94226
- description: "Clean minimal white - for training and documentation"
94225
+ modern_business: {
94226
+ background: "#F8FAFC",
94227
+ primary: "#1E293B",
94228
+ secondary: "#64748B",
94229
+ accent: "#0891B2",
94230
+ text: "#0F172A",
94231
+ name: "Modern Business"
94227
94232
  },
94228
- corporate: {
94229
- style: "mckinsey",
94230
- // Uses McKinsey CSS but with different branding potential
94231
- primaryColor: "#1a365d",
94232
- accentColor: "#3182ce",
94233
- description: "Professional corporate - for executive presentations"
94233
+ executive_professional: {
94234
+ background: "#F5F5F4",
94235
+ primary: "#1E3A5F",
94236
+ secondary: "#64748B",
94237
+ accent: "#D97706",
94238
+ text: "#1F2937",
94239
+ name: "Executive Professional"
94234
94240
  },
94235
- startup: {
94236
- style: "dark",
94237
- primaryColor: "#0d1117",
94238
- accentColor: "#58a6ff",
94239
- description: "Modern dark - for pitch decks and product demos"
94241
+ strategy_growth: {
94242
+ background: "#FAF9F7",
94243
+ primary: "#292524",
94244
+ secondary: "#78716C",
94245
+ accent: "#059669",
94246
+ text: "#1C1917",
94247
+ name: "Strategy Growth"
94240
94248
  }
94241
94249
  };
94242
- var PRESENTATION_TYPE_TO_THEME = {
94243
- // Keynotes Dark dramatic style (TED talks, big stage)
94244
- ted_keynote: "dark",
94245
- // Sales → Dark dramatic style (persuasion, impact)
94246
- sales_pitch: "dark",
94247
- // Consulting/Analysis decks → McKinsey white style (data-heavy, professional)
94248
- consulting_deck: "mckinsey",
94249
- // Investment Banking → McKinsey style (financial, dense data)
94250
- investment_banking: "mckinsey",
94251
- // Investor Pitch → Startup dark style (modern, VC audiences)
94252
- investor_pitch: "startup",
94253
- // Technical → Dark style (engineering audiences like dark mode)
94254
- technical_presentation: "dark",
94255
- // All Hands → Minimal clean style (readable, accessible)
94256
- all_hands: "minimal"
94257
- };
94250
+ function getPaletteStyle(paletteName) {
94251
+ return paletteName === "dark_executive" ? "dark" : "light";
94252
+ }
94258
94253
  var RendererV2 = class {
94259
94254
  theme;
94260
94255
  presentationType;
94256
+ kb;
94261
94257
  /**
94262
- * Create renderer with theme based on presentation type.
94263
- * @param presentationType - The type of deck being created (determines theme)
94264
- * @param themeOverride - Optional explicit theme override
94258
+ * Create renderer with theme loaded from Knowledge Base.
94259
+ * @param presentationType - The type of deck being created (determines palette)
94260
+ * @param kb - Knowledge Base gateway (optional, will use global if not provided)
94265
94261
  */
94266
- constructor(presentationType = "consulting_deck", themeOverride) {
94262
+ constructor(presentationType = "consulting_deck", kb) {
94267
94263
  this.presentationType = presentationType;
94268
- const themeStyle = themeOverride || PRESENTATION_TYPE_TO_THEME[presentationType] || "mckinsey";
94269
- this.theme = THEMES[themeStyle] || THEMES.mckinsey;
94270
- console.log(`[RendererV2] Using "${this.theme.style}" theme for "${presentationType}" deck`);
94264
+ this.kb = kb || getKB();
94265
+ this.theme = this.loadThemeFromKB(presentationType);
94266
+ console.log(`[RendererV2] Using "${this.theme.paletteName}" palette (${this.theme.style} style) for "${presentationType}" deck`);
94267
+ }
94268
+ /**
94269
+ * Load theme configuration from Knowledge Base.
94270
+ * Falls back to hardcoded values only if KB fails.
94271
+ */
94272
+ loadThemeFromKB(type) {
94273
+ try {
94274
+ const paletteName = this.kb.queryOptional(`presentation_types.${type}.color_palette`).value || this.getDefaultPaletteName(type);
94275
+ const kbPalette = this.kb.queryOptional(`color_palettes.${paletteName}`).value;
94276
+ if (kbPalette) {
94277
+ console.log(`[RendererV2] Loaded "${paletteName}" palette from KB: bg=${kbPalette.background}, accent=${kbPalette.accent}`);
94278
+ return {
94279
+ style: getPaletteStyle(paletteName),
94280
+ palette: kbPalette,
94281
+ paletteName
94282
+ };
94283
+ }
94284
+ const fallback = FALLBACK_PALETTES[paletteName] ?? FALLBACK_PALETTES.consulting_classic;
94285
+ console.log(`[RendererV2] Using fallback "${paletteName}" palette`);
94286
+ return {
94287
+ style: getPaletteStyle(paletteName),
94288
+ palette: fallback,
94289
+ paletteName
94290
+ };
94291
+ } catch {
94292
+ const defaultPalette = FALLBACK_PALETTES.consulting_classic;
94293
+ return {
94294
+ style: "light",
94295
+ palette: defaultPalette,
94296
+ paletteName: "consulting_classic"
94297
+ };
94298
+ }
94299
+ }
94300
+ /**
94301
+ * Default palette mapping per presentation type (used if KB doesn't specify).
94302
+ */
94303
+ getDefaultPaletteName(type) {
94304
+ const defaults = {
94305
+ ted_keynote: "dark_executive",
94306
+ sales_pitch: "modern_business",
94307
+ consulting_deck: "consulting_classic",
94308
+ investment_banking: "executive_professional",
94309
+ investor_pitch: "modern_business",
94310
+ technical_presentation: "dark_executive",
94311
+ all_hands: "strategy_growth"
94312
+ };
94313
+ return defaults[type] || "consulting_classic";
94271
94314
  }
94272
94315
  /**
94273
94316
  * Render slides to complete HTML document.
@@ -94357,15 +94400,15 @@ ${slidesHtml}
94357
94400
  const content = this.renderSlideContent(slide);
94358
94401
  return `<div class="slide slide-${slide.type}">${content}</div>`;
94359
94402
  }).join("\n");
94360
- if (this.theme.style === "mckinsey") {
94361
- return this.getMcKinseyPrintHTML(title, slidesHtml);
94403
+ if (this.theme.style === "light") {
94404
+ return this.getLightPrintHTML(title, slidesHtml);
94362
94405
  }
94363
94406
  return this.getDarkPrintHTML(title, slidesHtml);
94364
94407
  }
94365
94408
  /**
94366
- * McKinsey-style print HTML (white background, professional).
94409
+ * Light theme print HTML (professional, white background).
94367
94410
  */
94368
- getMcKinseyPrintHTML(title, slidesHtml) {
94411
+ getLightPrintHTML(title, slidesHtml) {
94369
94412
  return `<!DOCTYPE html>
94370
94413
  <html lang="en">
94371
94414
  <head>
@@ -95021,34 +95064,59 @@ ${content}
95021
95064
  return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
95022
95065
  }
95023
95066
  /**
95024
- * Professional CSS - McKinsey/BCG consulting style.
95067
+ * Generate CSS with colors from Knowledge Base.
95025
95068
  */
95026
95069
  getCSS() {
95027
- if (this.theme.style === "mckinsey") {
95028
- return this.getMcKinseyCSS();
95070
+ if (this.theme.style === "light") {
95071
+ return this.getLightThemeCSS();
95029
95072
  }
95030
- return this.getDarkCSS();
95073
+ return this.getDarkThemeCSS();
95031
95074
  }
95032
95075
  /**
95033
- * McKinsey/BCG Consulting Style - WHITE background, professional hierarchy.
95076
+ * Generate CSS variables from KB palette.
95034
95077
  */
95035
- getMcKinseyCSS() {
95078
+ getCSSVariables() {
95079
+ const p = this.theme.palette;
95080
+ const isLight = this.theme.style === "light";
95081
+ const bgSecondary = isLight ? this.lightenColor(p.background, -5) : this.lightenColor(p.background, 10);
95082
+ const bgAccent = isLight ? this.lightenColor(p.background, -10) : this.lightenColor(p.background, 15);
95083
+ const textMuted = isLight ? this.lightenColor(p.text, 40) : this.lightenColor(p.text, -30);
95036
95084
  return `
95037
- /* McKinsey Consulting Theme - Clean White, Strong Hierarchy */
95085
+ /* ${this.theme.paletteName} Theme - Loaded from Knowledge Base */
95038
95086
  :root {
95039
- --bg-primary: #ffffff;
95040
- --bg-secondary: #f8f9fa;
95041
- --bg-accent: #e9ecef;
95042
- --text-primary: #1a1a1a;
95043
- --text-secondary: #333333;
95044
- --text-muted: #666666;
95045
- --mckinsey-blue: #003366;
95046
- --accent-blue: #0066cc;
95087
+ --kb-palette: "${this.theme.paletteName}";
95088
+ --bg-primary: ${p.background};
95089
+ --bg-secondary: ${bgSecondary};
95090
+ --bg-accent: ${bgAccent};
95091
+ --text-primary: ${p.text};
95092
+ --text-secondary: ${p.secondary};
95093
+ --text-muted: ${textMuted};
95094
+ --color-primary: ${p.primary};
95095
+ --color-accent: ${p.accent};
95096
+ --accent-blue: ${p.accent};
95047
95097
  --accent-green: #28a745;
95048
95098
  --accent-red: #dc3545;
95049
- --border-color: #dee2e6;
95050
- --header-bar: #003366;
95051
- }
95099
+ --border-color: ${isLight ? "#dee2e6" : "rgba(255,255,255,0.1)"};
95100
+ --header-bar: ${p.primary};
95101
+ }`;
95102
+ }
95103
+ /**
95104
+ * Lighten or darken a hex color.
95105
+ */
95106
+ lightenColor(hex, percent) {
95107
+ const num = parseInt(hex.replace("#", ""), 16);
95108
+ const amt = Math.round(2.55 * percent);
95109
+ const R = Math.max(0, Math.min(255, (num >> 16) + amt));
95110
+ const G = Math.max(0, Math.min(255, (num >> 8 & 255) + amt));
95111
+ const B = Math.max(0, Math.min(255, (num & 255) + amt));
95112
+ return `#${(16777216 + R * 65536 + G * 256 + B).toString(16).slice(1)}`;
95113
+ }
95114
+ /**
95115
+ * Light theme CSS (consulting style) with KB palette colors.
95116
+ */
95117
+ getLightThemeCSS() {
95118
+ return `
95119
+ ${this.getCSSVariables()}
95052
95120
 
95053
95121
  .reveal {
95054
95122
  font-family: 'Georgia', 'Times New Roman', serif;
@@ -95319,23 +95387,11 @@ ${content}
95319
95387
  `;
95320
95388
  }
95321
95389
  /**
95322
- * Dark theme CSS (legacy).
95390
+ * Dark theme CSS with KB palette colors.
95323
95391
  */
95324
- getDarkCSS() {
95392
+ getDarkThemeCSS() {
95325
95393
  return `
95326
- /* Professional Dark Theme - No Random Images */
95327
- :root {
95328
- --bg-primary: #1a1a2e;
95329
- --bg-secondary: #16213e;
95330
- --bg-accent: #0f3460;
95331
- --text-primary: #ffffff;
95332
- --text-secondary: rgba(255, 255, 255, 0.85);
95333
- --text-muted: rgba(255, 255, 255, 0.6);
95334
- --accent-blue: #4a9eff;
95335
- --accent-green: #00d4aa;
95336
- --accent-orange: #ff9f43;
95337
- --border-color: rgba(255, 255, 255, 0.1);
95338
- }
95394
+ ${this.getCSSVariables()}
95339
95395
 
95340
95396
  .reveal {
95341
95397
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
@@ -95546,18 +95602,18 @@ ${content}
95546
95602
  `;
95547
95603
  }
95548
95604
  };
95549
- function createRendererV2(presentationType = "consulting_deck", themeOverride) {
95550
- return new RendererV2(presentationType, themeOverride);
95605
+ function createRendererV2(presentationType = "consulting_deck", kb) {
95606
+ return new RendererV2(presentationType, kb);
95551
95607
  }
95552
95608
 
95553
95609
  // src/core/PresentationEngineV2.ts
95554
95610
  var import_fs9 = require("fs");
95555
95611
  var PALETTE_TO_THEME = {
95556
95612
  dark_executive: "dark",
95557
- modern_business: "startup",
95558
- consulting_classic: "mckinsey",
95559
- executive_professional: "mckinsey",
95560
- strategy_growth: "minimal"
95613
+ modern_business: "light",
95614
+ consulting_classic: "light",
95615
+ executive_professional: "light",
95616
+ strategy_growth: "light"
95561
95617
  };
95562
95618
  async function loadDesignSpecsFromKB(kb, type) {
95563
95619
  const typeConfig = kb.queryRequired(`presentation_types.${type}`);
@@ -95568,7 +95624,7 @@ async function loadDesignSpecsFromKB(kb, type) {
95568
95624
  const typography = typeConfig.value.typography;
95569
95625
  const primaryExperts = typeConfig.value.primary_experts;
95570
95626
  const colorPalette = typeConfig.value.color_palette || "consulting_classic";
95571
- const theme = PALETTE_TO_THEME[colorPalette] || "mckinsey";
95627
+ const theme = PALETTE_TO_THEME[colorPalette] || "light";
95572
95628
  const scoringWeights = typeConfig.value.scoring_weights;
95573
95629
  let structure = "General presentation structure";
95574
95630
  if (primaryExperts.some((e) => e.includes("Minto") || e.includes("McKinsey"))) {
@@ -95705,7 +95761,7 @@ Summary: ${review.summary}`
95705
95761
  );
95706
95762
  }
95707
95763
  this.log("Step 7: Rendering output...");
95708
- const renderer = createRendererV2(presentationType, this.options.themeOverride);
95764
+ const renderer = createRendererV2(presentationType, this.kb);
95709
95765
  const html = renderer.render(slides, title || "Presentation");
95710
95766
  this.log(`
95711
95767
  SUCCESS: Generated ${slides.length} slides scoring ${review.overallScore}/100`);
@@ -99494,7 +99550,7 @@ if (typeof process !== "undefined" && process.argv[1]?.includes("CodeQualityVali
99494
99550
  }
99495
99551
 
99496
99552
  // src/index.ts
99497
- var VERSION = "4.1.0";
99553
+ var VERSION = "4.2.0";
99498
99554
  async function generate(options) {
99499
99555
  const {
99500
99556
  content,
package/dist/index.mjs CHANGED
@@ -2489,69 +2489,112 @@ function createSlideGeneratorV2(type = "consulting_deck") {
2489
2489
 
2490
2490
  // src/output/RendererV2.ts
2491
2491
  import { writeFileSync } from "fs";
2492
- var THEMES = {
2493
- mckinsey: {
2494
- style: "mckinsey",
2495
- primaryColor: "#003366",
2496
- // McKinsey blue
2497
- accentColor: "#0066cc",
2498
- description: "White background, professional hierarchy - for consulting/analysis decks"
2492
+ var FALLBACK_PALETTES = {
2493
+ consulting_classic: {
2494
+ background: "#FAFAF9",
2495
+ primary: "#0F172A",
2496
+ secondary: "#475569",
2497
+ accent: "#0369A1",
2498
+ text: "#18181B",
2499
+ name: "Consulting Classic"
2499
2500
  },
2500
- dark: {
2501
- style: "dark",
2502
- primaryColor: "#1a1a2e",
2503
- accentColor: "#4a9eff",
2504
- description: "Dark dramatic theme - for keynotes and tech presentations"
2501
+ dark_executive: {
2502
+ background: "#18181B",
2503
+ primary: "#FAFAFA",
2504
+ secondary: "#A1A1AA",
2505
+ accent: "#F59E0B",
2506
+ text: "#F4F4F5",
2507
+ name: "Dark Executive"
2505
2508
  },
2506
- minimal: {
2507
- style: "minimal",
2508
- primaryColor: "#333333",
2509
- accentColor: "#0066cc",
2510
- description: "Clean minimal white - for training and documentation"
2509
+ modern_business: {
2510
+ background: "#F8FAFC",
2511
+ primary: "#1E293B",
2512
+ secondary: "#64748B",
2513
+ accent: "#0891B2",
2514
+ text: "#0F172A",
2515
+ name: "Modern Business"
2511
2516
  },
2512
- corporate: {
2513
- style: "mckinsey",
2514
- // Uses McKinsey CSS but with different branding potential
2515
- primaryColor: "#1a365d",
2516
- accentColor: "#3182ce",
2517
- description: "Professional corporate - for executive presentations"
2517
+ executive_professional: {
2518
+ background: "#F5F5F4",
2519
+ primary: "#1E3A5F",
2520
+ secondary: "#64748B",
2521
+ accent: "#D97706",
2522
+ text: "#1F2937",
2523
+ name: "Executive Professional"
2518
2524
  },
2519
- startup: {
2520
- style: "dark",
2521
- primaryColor: "#0d1117",
2522
- accentColor: "#58a6ff",
2523
- description: "Modern dark - for pitch decks and product demos"
2525
+ strategy_growth: {
2526
+ background: "#FAF9F7",
2527
+ primary: "#292524",
2528
+ secondary: "#78716C",
2529
+ accent: "#059669",
2530
+ text: "#1C1917",
2531
+ name: "Strategy Growth"
2524
2532
  }
2525
2533
  };
2526
- var PRESENTATION_TYPE_TO_THEME = {
2527
- // Keynotes Dark dramatic style (TED talks, big stage)
2528
- ted_keynote: "dark",
2529
- // Sales → Dark dramatic style (persuasion, impact)
2530
- sales_pitch: "dark",
2531
- // Consulting/Analysis decks → McKinsey white style (data-heavy, professional)
2532
- consulting_deck: "mckinsey",
2533
- // Investment Banking → McKinsey style (financial, dense data)
2534
- investment_banking: "mckinsey",
2535
- // Investor Pitch → Startup dark style (modern, VC audiences)
2536
- investor_pitch: "startup",
2537
- // Technical → Dark style (engineering audiences like dark mode)
2538
- technical_presentation: "dark",
2539
- // All Hands → Minimal clean style (readable, accessible)
2540
- all_hands: "minimal"
2541
- };
2534
+ function getPaletteStyle(paletteName) {
2535
+ return paletteName === "dark_executive" ? "dark" : "light";
2536
+ }
2542
2537
  var RendererV2 = class {
2543
2538
  theme;
2544
2539
  presentationType;
2540
+ kb;
2545
2541
  /**
2546
- * Create renderer with theme based on presentation type.
2547
- * @param presentationType - The type of deck being created (determines theme)
2548
- * @param themeOverride - Optional explicit theme override
2542
+ * Create renderer with theme loaded from Knowledge Base.
2543
+ * @param presentationType - The type of deck being created (determines palette)
2544
+ * @param kb - Knowledge Base gateway (optional, will use global if not provided)
2549
2545
  */
2550
- constructor(presentationType = "consulting_deck", themeOverride) {
2546
+ constructor(presentationType = "consulting_deck", kb) {
2551
2547
  this.presentationType = presentationType;
2552
- const themeStyle = themeOverride || PRESENTATION_TYPE_TO_THEME[presentationType] || "mckinsey";
2553
- this.theme = THEMES[themeStyle] || THEMES.mckinsey;
2554
- console.log(`[RendererV2] Using "${this.theme.style}" theme for "${presentationType}" deck`);
2548
+ this.kb = kb || getKB();
2549
+ this.theme = this.loadThemeFromKB(presentationType);
2550
+ console.log(`[RendererV2] Using "${this.theme.paletteName}" palette (${this.theme.style} style) for "${presentationType}" deck`);
2551
+ }
2552
+ /**
2553
+ * Load theme configuration from Knowledge Base.
2554
+ * Falls back to hardcoded values only if KB fails.
2555
+ */
2556
+ loadThemeFromKB(type) {
2557
+ try {
2558
+ const paletteName = this.kb.queryOptional(`presentation_types.${type}.color_palette`).value || this.getDefaultPaletteName(type);
2559
+ const kbPalette = this.kb.queryOptional(`color_palettes.${paletteName}`).value;
2560
+ if (kbPalette) {
2561
+ console.log(`[RendererV2] Loaded "${paletteName}" palette from KB: bg=${kbPalette.background}, accent=${kbPalette.accent}`);
2562
+ return {
2563
+ style: getPaletteStyle(paletteName),
2564
+ palette: kbPalette,
2565
+ paletteName
2566
+ };
2567
+ }
2568
+ const fallback = FALLBACK_PALETTES[paletteName] ?? FALLBACK_PALETTES.consulting_classic;
2569
+ console.log(`[RendererV2] Using fallback "${paletteName}" palette`);
2570
+ return {
2571
+ style: getPaletteStyle(paletteName),
2572
+ palette: fallback,
2573
+ paletteName
2574
+ };
2575
+ } catch {
2576
+ const defaultPalette = FALLBACK_PALETTES.consulting_classic;
2577
+ return {
2578
+ style: "light",
2579
+ palette: defaultPalette,
2580
+ paletteName: "consulting_classic"
2581
+ };
2582
+ }
2583
+ }
2584
+ /**
2585
+ * Default palette mapping per presentation type (used if KB doesn't specify).
2586
+ */
2587
+ getDefaultPaletteName(type) {
2588
+ const defaults = {
2589
+ ted_keynote: "dark_executive",
2590
+ sales_pitch: "modern_business",
2591
+ consulting_deck: "consulting_classic",
2592
+ investment_banking: "executive_professional",
2593
+ investor_pitch: "modern_business",
2594
+ technical_presentation: "dark_executive",
2595
+ all_hands: "strategy_growth"
2596
+ };
2597
+ return defaults[type] || "consulting_classic";
2555
2598
  }
2556
2599
  /**
2557
2600
  * Render slides to complete HTML document.
@@ -2641,15 +2684,15 @@ ${slidesHtml}
2641
2684
  const content = this.renderSlideContent(slide);
2642
2685
  return `<div class="slide slide-${slide.type}">${content}</div>`;
2643
2686
  }).join("\n");
2644
- if (this.theme.style === "mckinsey") {
2645
- return this.getMcKinseyPrintHTML(title, slidesHtml);
2687
+ if (this.theme.style === "light") {
2688
+ return this.getLightPrintHTML(title, slidesHtml);
2646
2689
  }
2647
2690
  return this.getDarkPrintHTML(title, slidesHtml);
2648
2691
  }
2649
2692
  /**
2650
- * McKinsey-style print HTML (white background, professional).
2693
+ * Light theme print HTML (professional, white background).
2651
2694
  */
2652
- getMcKinseyPrintHTML(title, slidesHtml) {
2695
+ getLightPrintHTML(title, slidesHtml) {
2653
2696
  return `<!DOCTYPE html>
2654
2697
  <html lang="en">
2655
2698
  <head>
@@ -3305,34 +3348,59 @@ ${content}
3305
3348
  return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
3306
3349
  }
3307
3350
  /**
3308
- * Professional CSS - McKinsey/BCG consulting style.
3351
+ * Generate CSS with colors from Knowledge Base.
3309
3352
  */
3310
3353
  getCSS() {
3311
- if (this.theme.style === "mckinsey") {
3312
- return this.getMcKinseyCSS();
3354
+ if (this.theme.style === "light") {
3355
+ return this.getLightThemeCSS();
3313
3356
  }
3314
- return this.getDarkCSS();
3357
+ return this.getDarkThemeCSS();
3315
3358
  }
3316
3359
  /**
3317
- * McKinsey/BCG Consulting Style - WHITE background, professional hierarchy.
3360
+ * Generate CSS variables from KB palette.
3318
3361
  */
3319
- getMcKinseyCSS() {
3362
+ getCSSVariables() {
3363
+ const p = this.theme.palette;
3364
+ const isLight = this.theme.style === "light";
3365
+ const bgSecondary = isLight ? this.lightenColor(p.background, -5) : this.lightenColor(p.background, 10);
3366
+ const bgAccent = isLight ? this.lightenColor(p.background, -10) : this.lightenColor(p.background, 15);
3367
+ const textMuted = isLight ? this.lightenColor(p.text, 40) : this.lightenColor(p.text, -30);
3320
3368
  return `
3321
- /* McKinsey Consulting Theme - Clean White, Strong Hierarchy */
3369
+ /* ${this.theme.paletteName} Theme - Loaded from Knowledge Base */
3322
3370
  :root {
3323
- --bg-primary: #ffffff;
3324
- --bg-secondary: #f8f9fa;
3325
- --bg-accent: #e9ecef;
3326
- --text-primary: #1a1a1a;
3327
- --text-secondary: #333333;
3328
- --text-muted: #666666;
3329
- --mckinsey-blue: #003366;
3330
- --accent-blue: #0066cc;
3371
+ --kb-palette: "${this.theme.paletteName}";
3372
+ --bg-primary: ${p.background};
3373
+ --bg-secondary: ${bgSecondary};
3374
+ --bg-accent: ${bgAccent};
3375
+ --text-primary: ${p.text};
3376
+ --text-secondary: ${p.secondary};
3377
+ --text-muted: ${textMuted};
3378
+ --color-primary: ${p.primary};
3379
+ --color-accent: ${p.accent};
3380
+ --accent-blue: ${p.accent};
3331
3381
  --accent-green: #28a745;
3332
3382
  --accent-red: #dc3545;
3333
- --border-color: #dee2e6;
3334
- --header-bar: #003366;
3335
- }
3383
+ --border-color: ${isLight ? "#dee2e6" : "rgba(255,255,255,0.1)"};
3384
+ --header-bar: ${p.primary};
3385
+ }`;
3386
+ }
3387
+ /**
3388
+ * Lighten or darken a hex color.
3389
+ */
3390
+ lightenColor(hex, percent) {
3391
+ const num = parseInt(hex.replace("#", ""), 16);
3392
+ const amt = Math.round(2.55 * percent);
3393
+ const R = Math.max(0, Math.min(255, (num >> 16) + amt));
3394
+ const G = Math.max(0, Math.min(255, (num >> 8 & 255) + amt));
3395
+ const B = Math.max(0, Math.min(255, (num & 255) + amt));
3396
+ return `#${(16777216 + R * 65536 + G * 256 + B).toString(16).slice(1)}`;
3397
+ }
3398
+ /**
3399
+ * Light theme CSS (consulting style) with KB palette colors.
3400
+ */
3401
+ getLightThemeCSS() {
3402
+ return `
3403
+ ${this.getCSSVariables()}
3336
3404
 
3337
3405
  .reveal {
3338
3406
  font-family: 'Georgia', 'Times New Roman', serif;
@@ -3603,23 +3671,11 @@ ${content}
3603
3671
  `;
3604
3672
  }
3605
3673
  /**
3606
- * Dark theme CSS (legacy).
3674
+ * Dark theme CSS with KB palette colors.
3607
3675
  */
3608
- getDarkCSS() {
3676
+ getDarkThemeCSS() {
3609
3677
  return `
3610
- /* Professional Dark Theme - No Random Images */
3611
- :root {
3612
- --bg-primary: #1a1a2e;
3613
- --bg-secondary: #16213e;
3614
- --bg-accent: #0f3460;
3615
- --text-primary: #ffffff;
3616
- --text-secondary: rgba(255, 255, 255, 0.85);
3617
- --text-muted: rgba(255, 255, 255, 0.6);
3618
- --accent-blue: #4a9eff;
3619
- --accent-green: #00d4aa;
3620
- --accent-orange: #ff9f43;
3621
- --border-color: rgba(255, 255, 255, 0.1);
3622
- }
3678
+ ${this.getCSSVariables()}
3623
3679
 
3624
3680
  .reveal {
3625
3681
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
@@ -3830,18 +3886,18 @@ ${content}
3830
3886
  `;
3831
3887
  }
3832
3888
  };
3833
- function createRendererV2(presentationType = "consulting_deck", themeOverride) {
3834
- return new RendererV2(presentationType, themeOverride);
3889
+ function createRendererV2(presentationType = "consulting_deck", kb) {
3890
+ return new RendererV2(presentationType, kb);
3835
3891
  }
3836
3892
 
3837
3893
  // src/core/PresentationEngineV2.ts
3838
3894
  import { writeFileSync as writeFileSync2 } from "fs";
3839
3895
  var PALETTE_TO_THEME = {
3840
3896
  dark_executive: "dark",
3841
- modern_business: "startup",
3842
- consulting_classic: "mckinsey",
3843
- executive_professional: "mckinsey",
3844
- strategy_growth: "minimal"
3897
+ modern_business: "light",
3898
+ consulting_classic: "light",
3899
+ executive_professional: "light",
3900
+ strategy_growth: "light"
3845
3901
  };
3846
3902
  async function loadDesignSpecsFromKB(kb, type) {
3847
3903
  const typeConfig = kb.queryRequired(`presentation_types.${type}`);
@@ -3852,7 +3908,7 @@ async function loadDesignSpecsFromKB(kb, type) {
3852
3908
  const typography = typeConfig.value.typography;
3853
3909
  const primaryExperts = typeConfig.value.primary_experts;
3854
3910
  const colorPalette = typeConfig.value.color_palette || "consulting_classic";
3855
- const theme = PALETTE_TO_THEME[colorPalette] || "mckinsey";
3911
+ const theme = PALETTE_TO_THEME[colorPalette] || "light";
3856
3912
  const scoringWeights = typeConfig.value.scoring_weights;
3857
3913
  let structure = "General presentation structure";
3858
3914
  if (primaryExperts.some((e) => e.includes("Minto") || e.includes("McKinsey"))) {
@@ -3989,7 +4045,7 @@ Summary: ${review.summary}`
3989
4045
  );
3990
4046
  }
3991
4047
  this.log("Step 7: Rendering output...");
3992
- const renderer = createRendererV2(presentationType, this.options.themeOverride);
4048
+ const renderer = createRendererV2(presentationType, this.kb);
3993
4049
  const html = renderer.render(slides, title || "Presentation");
3994
4050
  this.log(`
3995
4051
  SUCCESS: Generated ${slides.length} slides scoring ${review.overallScore}/100`);
@@ -7778,7 +7834,7 @@ if (typeof process !== "undefined" && process.argv[1]?.includes("CodeQualityVali
7778
7834
  }
7779
7835
 
7780
7836
  // src/index.ts
7781
- var VERSION = "4.1.0";
7837
+ var VERSION = "4.2.0";
7782
7838
  async function generate(options) {
7783
7839
  const {
7784
7840
  content,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-presentation-master",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "Generate world-class presentations using expert methodologies from Duarte, Reynolds, Gallo, and Anderson. Enforces rigorous quality standards through real visual validation.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",