claude-presentation-master 4.0.0 → 4.1.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 v2.1.0
23
+ Claude Presentation Master v4.1.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 = '2.1.0';
88
+ const version = '4.1.0';
89
89
 
90
90
  // Parse arguments
91
91
  function parseArgs(args) {
package/dist/index.d.mts CHANGED
@@ -692,10 +692,27 @@ interface MetricData {
692
692
  label: string;
693
693
  trend?: 'up' | 'down' | 'neutral';
694
694
  }
695
+ interface ModeConfig {
696
+ maxBulletsPerSlide: number;
697
+ maxWordsPerSlide: number;
698
+ minBulletsToKeep: number;
699
+ }
695
700
  declare class SlideGeneratorV2 {
696
701
  private config;
697
702
  private presentationType;
703
+ /**
704
+ * Create a slide generator with default configs.
705
+ * For KB-driven configs, use createSlideGeneratorV2WithConfig() instead.
706
+ */
698
707
  constructor(presentationType?: PresentationType);
708
+ /**
709
+ * Override config with KB-loaded values at runtime.
710
+ */
711
+ setConfig(config: ModeConfig): void;
712
+ /**
713
+ * Get current config (useful for debugging).
714
+ */
715
+ getConfig(): ModeConfig;
699
716
  /**
700
717
  * Generate slides from markdown content.
701
718
  * Simple, correct, no garbage.
@@ -1221,6 +1238,8 @@ declare class SlideQualityReviewer {
1221
1238
  private whitespaceRules;
1222
1239
  private bulletLimit;
1223
1240
  private glanceTestSeconds;
1241
+ private assessmentWeights;
1242
+ private _loggedWeights;
1224
1243
  private hasCialdini;
1225
1244
  private hasGestalt;
1226
1245
  private hasTufteDataInk;
@@ -1767,7 +1786,7 @@ declare function runCodeQualityCheck(srcDir: string): Promise<boolean>;
1767
1786
  * ALL decisions come from the Knowledge Base. NO hardcoded fallbacks.
1768
1787
  */
1769
1788
 
1770
- declare const VERSION = "2.0.0";
1789
+ declare const VERSION = "4.1.0";
1771
1790
  interface GenerateOptions {
1772
1791
  /** Input content (Markdown, text, etc.) */
1773
1792
  content: string;
package/dist/index.d.ts CHANGED
@@ -692,10 +692,27 @@ interface MetricData {
692
692
  label: string;
693
693
  trend?: 'up' | 'down' | 'neutral';
694
694
  }
695
+ interface ModeConfig {
696
+ maxBulletsPerSlide: number;
697
+ maxWordsPerSlide: number;
698
+ minBulletsToKeep: number;
699
+ }
695
700
  declare class SlideGeneratorV2 {
696
701
  private config;
697
702
  private presentationType;
703
+ /**
704
+ * Create a slide generator with default configs.
705
+ * For KB-driven configs, use createSlideGeneratorV2WithConfig() instead.
706
+ */
698
707
  constructor(presentationType?: PresentationType);
708
+ /**
709
+ * Override config with KB-loaded values at runtime.
710
+ */
711
+ setConfig(config: ModeConfig): void;
712
+ /**
713
+ * Get current config (useful for debugging).
714
+ */
715
+ getConfig(): ModeConfig;
699
716
  /**
700
717
  * Generate slides from markdown content.
701
718
  * Simple, correct, no garbage.
@@ -1221,6 +1238,8 @@ declare class SlideQualityReviewer {
1221
1238
  private whitespaceRules;
1222
1239
  private bulletLimit;
1223
1240
  private glanceTestSeconds;
1241
+ private assessmentWeights;
1242
+ private _loggedWeights;
1224
1243
  private hasCialdini;
1225
1244
  private hasGestalt;
1226
1245
  private hasTufteDataInk;
@@ -1767,7 +1786,7 @@ declare function runCodeQualityCheck(srcDir: string): Promise<boolean>;
1767
1786
  * ALL decisions come from the Knowledge Base. NO hardcoded fallbacks.
1768
1787
  */
1769
1788
 
1770
- declare const VERSION = "2.0.0";
1789
+ declare const VERSION = "4.1.0";
1771
1790
  interface GenerateOptions {
1772
1791
  /** Input content (Markdown, text, etc.) */
1773
1792
  content: string;
package/dist/index.js CHANGED
@@ -93756,21 +93756,52 @@ async function initSlideGenerator() {
93756
93756
 
93757
93757
  // src/core/SlideGeneratorV2.ts
93758
93758
  var import_marked = require("marked");
93759
- var MODE_CONFIGS = {
93760
- // Consulting decks: 40-80 words per slide is NORMAL
93759
+ var DEFAULT_CONFIGS = {
93760
+ // Consulting decks: 40-80 words per slide is NORMAL (from KB)
93761
93761
  consulting_deck: {
93762
93762
  maxBulletsPerSlide: 7,
93763
- maxWordsPerSlide: 100,
93764
- // Not 20!
93763
+ maxWordsPerSlide: 80,
93764
+ // KB: words_per_slide.max
93765
+ minBulletsToKeep: 3
93766
+ },
93767
+ investment_banking: {
93768
+ maxBulletsPerSlide: 8,
93769
+ maxWordsPerSlide: 120,
93770
+ // KB: words_per_slide.max
93765
93771
  minBulletsToKeep: 3
93766
93772
  },
93767
- // Keynotes: fewer words, more impact
93768
- keynote: {
93773
+ // Keynotes: fewer words, more impact (from KB)
93774
+ ted_keynote: {
93769
93775
  maxBulletsPerSlide: 4,
93776
+ maxWordsPerSlide: 15,
93777
+ // KB: words_per_slide.max
93778
+ minBulletsToKeep: 2
93779
+ },
93780
+ sales_pitch: {
93781
+ maxBulletsPerSlide: 5,
93770
93782
  maxWordsPerSlide: 30,
93783
+ // KB: words_per_slide.max
93784
+ minBulletsToKeep: 2
93785
+ },
93786
+ investor_pitch: {
93787
+ maxBulletsPerSlide: 5,
93788
+ maxWordsPerSlide: 50,
93789
+ // KB: words_per_slide.max
93771
93790
  minBulletsToKeep: 2
93772
93791
  },
93773
- // Default: consulting style
93792
+ technical_presentation: {
93793
+ maxBulletsPerSlide: 6,
93794
+ maxWordsPerSlide: 100,
93795
+ // KB: words_per_slide.max
93796
+ minBulletsToKeep: 3
93797
+ },
93798
+ all_hands: {
93799
+ maxBulletsPerSlide: 5,
93800
+ maxWordsPerSlide: 40,
93801
+ // KB: words_per_slide.max
93802
+ minBulletsToKeep: 2
93803
+ },
93804
+ // Default: fallback
93774
93805
  default: {
93775
93806
  maxBulletsPerSlide: 6,
93776
93807
  maxWordsPerSlide: 80,
@@ -93780,9 +93811,25 @@ var MODE_CONFIGS = {
93780
93811
  var SlideGeneratorV2 = class {
93781
93812
  config;
93782
93813
  presentationType;
93814
+ /**
93815
+ * Create a slide generator with default configs.
93816
+ * For KB-driven configs, use createSlideGeneratorV2WithConfig() instead.
93817
+ */
93783
93818
  constructor(presentationType = "consulting_deck") {
93784
93819
  this.presentationType = presentationType;
93785
- this.config = MODE_CONFIGS[presentationType] || MODE_CONFIGS.default;
93820
+ this.config = DEFAULT_CONFIGS[presentationType] || DEFAULT_CONFIGS.default;
93821
+ }
93822
+ /**
93823
+ * Override config with KB-loaded values at runtime.
93824
+ */
93825
+ setConfig(config2) {
93826
+ this.config = config2;
93827
+ }
93828
+ /**
93829
+ * Get current config (useful for debugging).
93830
+ */
93831
+ getConfig() {
93832
+ return this.config;
93786
93833
  }
93787
93834
  /**
93788
93835
  * Generate slides from markdown content.
@@ -96014,7 +96061,7 @@ Output: ${htmlPath}`);
96014
96061
  }
96015
96062
 
96016
96063
  // src/qa/SlideQualityReviewer.ts
96017
- var ASSESSMENT_WEIGHTS = {
96064
+ var DEFAULT_ASSESSMENT_WEIGHTS = {
96018
96065
  visualImpact: 0.25,
96019
96066
  contentClarity: 0.2,
96020
96067
  layoutBalance: 0.15,
@@ -96023,6 +96070,29 @@ var ASSESSMENT_WEIGHTS = {
96023
96070
  colorHarmony: 0.1,
96024
96071
  audienceAppropriate: 0.05
96025
96072
  };
96073
+ function computeWeightsFromKB(kbWeights) {
96074
+ const totalKB = kbWeights.visual_quality + kbWeights.content_quality + kbWeights.expert_compliance + kbWeights.accessibility;
96075
+ const vq = kbWeights.visual_quality / totalKB;
96076
+ const cq = kbWeights.content_quality / totalKB;
96077
+ const ec = kbWeights.expert_compliance / totalKB;
96078
+ const ac = kbWeights.accessibility / totalKB;
96079
+ return {
96080
+ visualImpact: vq * 0.6,
96081
+ // 60% of visual_quality
96082
+ colorHarmony: vq * 0.4,
96083
+ // 40% of visual_quality
96084
+ contentClarity: cq * 0.8,
96085
+ // 80% of content_quality
96086
+ audienceAppropriate: cq * 0.2,
96087
+ // 20% of content_quality
96088
+ layoutBalance: ec * 0.5,
96089
+ // 50% of expert_compliance
96090
+ typographyHierarchy: ec * 0.5,
96091
+ // 50% of expert_compliance
96092
+ whitespaceUsage: ac
96093
+ // 100% of accessibility
96094
+ };
96095
+ }
96026
96096
  var SlideQualityReviewer = class {
96027
96097
  kb;
96028
96098
  initialized = false;
@@ -96031,6 +96101,9 @@ var SlideQualityReviewer = class {
96031
96101
  whitespaceRules;
96032
96102
  bulletLimit;
96033
96103
  glanceTestSeconds;
96104
+ // KB-loaded scoring weights (computed from KB per presentation type)
96105
+ assessmentWeights = DEFAULT_ASSESSMENT_WEIGHTS;
96106
+ _loggedWeights = null;
96034
96107
  // Expert rules from KB
96035
96108
  hasCialdini = false;
96036
96109
  hasGestalt = false;
@@ -96061,7 +96134,7 @@ var SlideQualityReviewer = class {
96061
96134
  };
96062
96135
  let totalScore = 0;
96063
96136
  for (const [key, assessment] of Object.entries(assessments)) {
96064
- const weight = ASSESSMENT_WEIGHTS[key];
96137
+ const weight = this.assessmentWeights[key];
96065
96138
  totalScore += assessment.score * weight;
96066
96139
  }
96067
96140
  const score = Math.round(totalScore);
@@ -96116,6 +96189,18 @@ var SlideQualityReviewer = class {
96116
96189
  this.wordLimits = wordLimitsResult.value;
96117
96190
  const whitespaceResult = this.kb.getWhitespaceRules(type);
96118
96191
  this.whitespaceRules = whitespaceResult.value;
96192
+ try {
96193
+ const weightsResult = this.kb.getScoringWeights(type);
96194
+ const kbWeights = weightsResult.value;
96195
+ this.assessmentWeights = computeWeightsFromKB(kbWeights);
96196
+ if (!this._loggedWeights?.has(type)) {
96197
+ console.log(`[QA] Loaded scoring weights for ${type}: visual=${kbWeights.visual_quality}%, content=${kbWeights.content_quality}%, expert=${kbWeights.expert_compliance}%, accessibility=${kbWeights.accessibility}%`);
96198
+ if (!this._loggedWeights) this._loggedWeights = /* @__PURE__ */ new Set();
96199
+ this._loggedWeights.add(type);
96200
+ }
96201
+ } catch {
96202
+ this.assessmentWeights = DEFAULT_ASSESSMENT_WEIGHTS;
96203
+ }
96119
96204
  try {
96120
96205
  const glanceResult = this.kb.getGlanceTest();
96121
96206
  this.glanceTestSeconds = 3;
@@ -99409,7 +99494,7 @@ if (typeof process !== "undefined" && process.argv[1]?.includes("CodeQualityVali
99409
99494
  }
99410
99495
 
99411
99496
  // src/index.ts
99412
- var VERSION = "2.0.0";
99497
+ var VERSION = "4.1.0";
99413
99498
  async function generate(options) {
99414
99499
  const {
99415
99500
  content,
package/dist/index.mjs CHANGED
@@ -2040,21 +2040,52 @@ async function initSlideGenerator() {
2040
2040
 
2041
2041
  // src/core/SlideGeneratorV2.ts
2042
2042
  import { marked } from "marked";
2043
- var MODE_CONFIGS = {
2044
- // Consulting decks: 40-80 words per slide is NORMAL
2043
+ var DEFAULT_CONFIGS = {
2044
+ // Consulting decks: 40-80 words per slide is NORMAL (from KB)
2045
2045
  consulting_deck: {
2046
2046
  maxBulletsPerSlide: 7,
2047
- maxWordsPerSlide: 100,
2048
- // Not 20!
2047
+ maxWordsPerSlide: 80,
2048
+ // KB: words_per_slide.max
2049
+ minBulletsToKeep: 3
2050
+ },
2051
+ investment_banking: {
2052
+ maxBulletsPerSlide: 8,
2053
+ maxWordsPerSlide: 120,
2054
+ // KB: words_per_slide.max
2049
2055
  minBulletsToKeep: 3
2050
2056
  },
2051
- // Keynotes: fewer words, more impact
2052
- keynote: {
2057
+ // Keynotes: fewer words, more impact (from KB)
2058
+ ted_keynote: {
2053
2059
  maxBulletsPerSlide: 4,
2060
+ maxWordsPerSlide: 15,
2061
+ // KB: words_per_slide.max
2062
+ minBulletsToKeep: 2
2063
+ },
2064
+ sales_pitch: {
2065
+ maxBulletsPerSlide: 5,
2054
2066
  maxWordsPerSlide: 30,
2067
+ // KB: words_per_slide.max
2068
+ minBulletsToKeep: 2
2069
+ },
2070
+ investor_pitch: {
2071
+ maxBulletsPerSlide: 5,
2072
+ maxWordsPerSlide: 50,
2073
+ // KB: words_per_slide.max
2055
2074
  minBulletsToKeep: 2
2056
2075
  },
2057
- // Default: consulting style
2076
+ technical_presentation: {
2077
+ maxBulletsPerSlide: 6,
2078
+ maxWordsPerSlide: 100,
2079
+ // KB: words_per_slide.max
2080
+ minBulletsToKeep: 3
2081
+ },
2082
+ all_hands: {
2083
+ maxBulletsPerSlide: 5,
2084
+ maxWordsPerSlide: 40,
2085
+ // KB: words_per_slide.max
2086
+ minBulletsToKeep: 2
2087
+ },
2088
+ // Default: fallback
2058
2089
  default: {
2059
2090
  maxBulletsPerSlide: 6,
2060
2091
  maxWordsPerSlide: 80,
@@ -2064,9 +2095,25 @@ var MODE_CONFIGS = {
2064
2095
  var SlideGeneratorV2 = class {
2065
2096
  config;
2066
2097
  presentationType;
2098
+ /**
2099
+ * Create a slide generator with default configs.
2100
+ * For KB-driven configs, use createSlideGeneratorV2WithConfig() instead.
2101
+ */
2067
2102
  constructor(presentationType = "consulting_deck") {
2068
2103
  this.presentationType = presentationType;
2069
- this.config = MODE_CONFIGS[presentationType] || MODE_CONFIGS.default;
2104
+ this.config = DEFAULT_CONFIGS[presentationType] || DEFAULT_CONFIGS.default;
2105
+ }
2106
+ /**
2107
+ * Override config with KB-loaded values at runtime.
2108
+ */
2109
+ setConfig(config) {
2110
+ this.config = config;
2111
+ }
2112
+ /**
2113
+ * Get current config (useful for debugging).
2114
+ */
2115
+ getConfig() {
2116
+ return this.config;
2070
2117
  }
2071
2118
  /**
2072
2119
  * Generate slides from markdown content.
@@ -4298,7 +4345,7 @@ Output: ${htmlPath}`);
4298
4345
  }
4299
4346
 
4300
4347
  // src/qa/SlideQualityReviewer.ts
4301
- var ASSESSMENT_WEIGHTS = {
4348
+ var DEFAULT_ASSESSMENT_WEIGHTS = {
4302
4349
  visualImpact: 0.25,
4303
4350
  contentClarity: 0.2,
4304
4351
  layoutBalance: 0.15,
@@ -4307,6 +4354,29 @@ var ASSESSMENT_WEIGHTS = {
4307
4354
  colorHarmony: 0.1,
4308
4355
  audienceAppropriate: 0.05
4309
4356
  };
4357
+ function computeWeightsFromKB(kbWeights) {
4358
+ const totalKB = kbWeights.visual_quality + kbWeights.content_quality + kbWeights.expert_compliance + kbWeights.accessibility;
4359
+ const vq = kbWeights.visual_quality / totalKB;
4360
+ const cq = kbWeights.content_quality / totalKB;
4361
+ const ec = kbWeights.expert_compliance / totalKB;
4362
+ const ac = kbWeights.accessibility / totalKB;
4363
+ return {
4364
+ visualImpact: vq * 0.6,
4365
+ // 60% of visual_quality
4366
+ colorHarmony: vq * 0.4,
4367
+ // 40% of visual_quality
4368
+ contentClarity: cq * 0.8,
4369
+ // 80% of content_quality
4370
+ audienceAppropriate: cq * 0.2,
4371
+ // 20% of content_quality
4372
+ layoutBalance: ec * 0.5,
4373
+ // 50% of expert_compliance
4374
+ typographyHierarchy: ec * 0.5,
4375
+ // 50% of expert_compliance
4376
+ whitespaceUsage: ac
4377
+ // 100% of accessibility
4378
+ };
4379
+ }
4310
4380
  var SlideQualityReviewer = class {
4311
4381
  kb;
4312
4382
  initialized = false;
@@ -4315,6 +4385,9 @@ var SlideQualityReviewer = class {
4315
4385
  whitespaceRules;
4316
4386
  bulletLimit;
4317
4387
  glanceTestSeconds;
4388
+ // KB-loaded scoring weights (computed from KB per presentation type)
4389
+ assessmentWeights = DEFAULT_ASSESSMENT_WEIGHTS;
4390
+ _loggedWeights = null;
4318
4391
  // Expert rules from KB
4319
4392
  hasCialdini = false;
4320
4393
  hasGestalt = false;
@@ -4345,7 +4418,7 @@ var SlideQualityReviewer = class {
4345
4418
  };
4346
4419
  let totalScore = 0;
4347
4420
  for (const [key, assessment] of Object.entries(assessments)) {
4348
- const weight = ASSESSMENT_WEIGHTS[key];
4421
+ const weight = this.assessmentWeights[key];
4349
4422
  totalScore += assessment.score * weight;
4350
4423
  }
4351
4424
  const score = Math.round(totalScore);
@@ -4400,6 +4473,18 @@ var SlideQualityReviewer = class {
4400
4473
  this.wordLimits = wordLimitsResult.value;
4401
4474
  const whitespaceResult = this.kb.getWhitespaceRules(type);
4402
4475
  this.whitespaceRules = whitespaceResult.value;
4476
+ try {
4477
+ const weightsResult = this.kb.getScoringWeights(type);
4478
+ const kbWeights = weightsResult.value;
4479
+ this.assessmentWeights = computeWeightsFromKB(kbWeights);
4480
+ if (!this._loggedWeights?.has(type)) {
4481
+ console.log(`[QA] Loaded scoring weights for ${type}: visual=${kbWeights.visual_quality}%, content=${kbWeights.content_quality}%, expert=${kbWeights.expert_compliance}%, accessibility=${kbWeights.accessibility}%`);
4482
+ if (!this._loggedWeights) this._loggedWeights = /* @__PURE__ */ new Set();
4483
+ this._loggedWeights.add(type);
4484
+ }
4485
+ } catch {
4486
+ this.assessmentWeights = DEFAULT_ASSESSMENT_WEIGHTS;
4487
+ }
4403
4488
  try {
4404
4489
  const glanceResult = this.kb.getGlanceTest();
4405
4490
  this.glanceTestSeconds = 3;
@@ -7693,7 +7778,7 @@ if (typeof process !== "undefined" && process.argv[1]?.includes("CodeQualityVali
7693
7778
  }
7694
7779
 
7695
7780
  // src/index.ts
7696
- var VERSION = "2.0.0";
7781
+ var VERSION = "4.1.0";
7697
7782
  async function generate(options) {
7698
7783
  const {
7699
7784
  content,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-presentation-master",
3
- "version": "4.0.0",
3
+ "version": "4.1.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",