@thanh01.pmt/curriculum-kit 1.4.12 → 1.4.14

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/dist/index.d.cts CHANGED
@@ -10,8 +10,8 @@ export { A as AutoRepairOptions, a as AutoRepairResult, B as BundleTier, G as Ge
10
10
  import { I as ICurriculumStorage, P as ProjectStatusReport, S as SmartResumeContext, Q as QualityAuditReport } from './types-BUJGYiep.cjs';
11
11
  export { b as ArtifactLifecycleInfo, A as ArtifactLifecycleState, L as LessonArtifactSummary, c as PipelineState, R as ReviewRecord, a as SotDocument, T as TaskLifecycleState } from './types-BUJGYiep.cjs';
12
12
  export { FileSystemCurriculumAdapter, FileSystemStorageOptions, STANDARD_SOT_FILES, StorageFactoryOptions, SupabaseCurriculumAdapter, SupabaseStorageConfig, computeContentHash, createCurriculumStorage } from './storage/index.cjs';
13
- import { F as FrameworkPack, C as CoverageGateReport } from './standardsCoverageGate-CwBk5P6m.cjs';
14
- export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, g as FrameworkStatement, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from './standardsCoverageGate-CwBk5P6m.cjs';
13
+ import { F as FrameworkPack, C as CoverageGateReport } from './standardsCoverageGate-DR5YTtlt.cjs';
14
+ export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, g as FrameworkStatement, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from './standardsCoverageGate-DR5YTtlt.cjs';
15
15
  import { R as ResolvedGateSettings } from './gateSettings-L3FR2-MO.cjs';
16
16
  export { A as ArtifactType, b as CurriculumArtifactType, C as CurriculumGateMode, D as DEFAULT_GATE_SETTINGS, G as GateSettings, c as ScaffoldingLevel, S as SingleArtifactRequest, a as SingleArtifactResult, g as gateModeFor, e as generateSingleArtifact, d as getArtifactMetadata, p as parseGateSettings, r as resolveGateSettings } from './gateSettings-L3FR2-MO.cjs';
17
17
  export { DeliveryPackResult, JobManifest, LocalWorkspaceManager, ParsedQuizQuestion, buildDeliveryPackages, exportAllProjectQuizzes, formatQuizzesToCsv, parseQuizMarkdown } from './publishers/index.cjs';
package/dist/index.d.ts CHANGED
@@ -10,8 +10,8 @@ export { A as AutoRepairOptions, a as AutoRepairResult, B as BundleTier, G as Ge
10
10
  import { I as ICurriculumStorage, P as ProjectStatusReport, S as SmartResumeContext, Q as QualityAuditReport } from './types-BUJGYiep.js';
11
11
  export { b as ArtifactLifecycleInfo, A as ArtifactLifecycleState, L as LessonArtifactSummary, c as PipelineState, R as ReviewRecord, a as SotDocument, T as TaskLifecycleState } from './types-BUJGYiep.js';
12
12
  export { FileSystemCurriculumAdapter, FileSystemStorageOptions, STANDARD_SOT_FILES, StorageFactoryOptions, SupabaseCurriculumAdapter, SupabaseStorageConfig, computeContentHash, createCurriculumStorage } from './storage/index.js';
13
- import { F as FrameworkPack, C as CoverageGateReport } from './standardsCoverageGate-CwBk5P6m.js';
14
- export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, g as FrameworkStatement, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from './standardsCoverageGate-CwBk5P6m.js';
13
+ import { F as FrameworkPack, C as CoverageGateReport } from './standardsCoverageGate-DR5YTtlt.js';
14
+ export { B as BloomHintSchema, a as ClassificationSchema, m as CoverageGateInput, h as FrameworkMapping, d as FrameworkMappingSchema, f as FrameworkPackManifest, b as FrameworkPackManifestSchema, e as FrameworkPackSchema, g as FrameworkStatement, c as FrameworkStatementSchema, G as GradeBandSchema, i as MappingKind, M as MappingKindSchema, P as PackLintIssue, k as PackValidationResult, j as RecordProvenance, R as RecordProvenanceSchema, S as StatementCoverageRow, n as evaluateStandardsCoverage, l as lintFrameworkPack, v as validateFrameworkPack } from './standardsCoverageGate-DR5YTtlt.js';
15
15
  import { R as ResolvedGateSettings } from './gateSettings-L3FR2-MO.js';
16
16
  export { A as ArtifactType, b as CurriculumArtifactType, C as CurriculumGateMode, D as DEFAULT_GATE_SETTINGS, G as GateSettings, c as ScaffoldingLevel, S as SingleArtifactRequest, a as SingleArtifactResult, g as gateModeFor, e as generateSingleArtifact, d as getArtifactMetadata, p as parseGateSettings, r as resolveGateSettings } from './gateSettings-L3FR2-MO.js';
17
17
  export { DeliveryPackResult, JobManifest, LocalWorkspaceManager, ParsedQuizQuestion, buildDeliveryPackages, exportAllProjectQuizzes, formatQuizzesToCsv, parseQuizMarkdown } from './publishers/index.js';
package/dist/index.mjs CHANGED
@@ -1278,7 +1278,7 @@ var init_lessonFlowParser = __esm({
1278
1278
 
1279
1279
  // src/ai/prompts/slideBlueprintPrompt.ts
1280
1280
  function buildSlideBlueprintPrompt(params) {
1281
- const { lessonFlow, targetSlideCount = 20, stylePresetName = "Blue Professional" } = params;
1281
+ const { lessonFlow, targetSlideCount, stylePresetName = "Blue Professional" } = params;
1282
1282
  const activitiesSummary = lessonFlow.activities.map(
1283
1283
  (a) => `Seq ${a.seq} [${a.phase}]: ${a.purpose} (Teacher: ${a.teacherMove} | Student: ${a.studentAction} | Time: ${a.time})`
1284
1284
  ).join("\n");
@@ -1286,9 +1286,12 @@ function buildSlideBlueprintPrompt(params) {
1286
1286
  (p) => `Phase "${p.phaseName}" (${p.timing || "Standard"}):
1287
1287
  ${p.content.slice(0, 500)}...`
1288
1288
  ).join("\n\n");
1289
+ const countGuidance = targetSlideCount ? `The target is approximately ${targetSlideCount} slides.` : `Determine the organic, optimal number of slides based directly on the canonical LESSON plan: every instructional move, concept explanation, code walkthrough, activity phase, and quiz checkpoint must receive adequate slide coverage without artificial cramming or stretching.`;
1290
+ const outputGuidance = targetSlideCount ? `Output ONLY a valid JSON array of ${targetSlideCount} objects.` : `Output ONLY a valid JSON array of objects (one object per planned slide).`;
1289
1291
  return `
1290
1292
  You are @illustrator, Chief Slide Architect for the Course Builder OS.
1291
- Your task is to analyze the canonical LESSON plan and architect an authoritative, high-fidelity **SLIDE BLUEPRINT** of EXACTLY ${targetSlideCount} slides.
1293
+ Your task is to analyze the canonical LESSON plan and architect an authoritative, high-fidelity **SLIDE BLUEPRINT**.
1294
+ ${countGuidance}
1292
1295
 
1293
1296
  ### \u{1F3DB}\uFE0F PEDAGOGICAL GROUND TRUTH (FROM CANONICAL LESSON):
1294
1297
  - Lesson Title: "${lessonFlow.lessonTitle}"
@@ -1306,17 +1309,18 @@ ${phasesSummary || lessonFlow.rawContent.slice(0, 3e3)}
1306
1309
  ---
1307
1310
 
1308
1311
  ### \u{1F3AF} ARCHITECTURAL RULES (STRICTLY INVARIANT):
1309
- 1. **PEDAGOGICAL FIDELITY (1-TO-1 PROJECTION)**:
1312
+ 1. **ORGANIC PEDAGOGICAL FIDELITY (1-TO-1 PROJECTION)**:
1310
1313
  - The slide sequence MUST follow the EXACT flow of the LESSON phases (${lessonFlow.pedagogicalModel.toUpperCase()}).
1314
+ - The number of slides is determined by the substance of the lesson \u2014 do NOT stretch thin content or cram rich multi-step labs into too few slides.
1311
1315
  - Do NOT invent artificial phases that do not exist in the lesson plan.
1312
1316
  - For example:
1313
- * If 5E: Engage (slides 1-4) -> Explore (slides 5-8) -> Explain (slides 9-13) -> Elaborate (slides 14-17) -> Evaluate (slides 18-20).
1314
- * If EDP: Ask/Problem (slides 1-4) -> Imagine & Plan (slides 5-8) -> Create & Prototype (slides 9-14) -> Test & Debug (slides 15-17) -> Improve & Share (slides 18-20).
1315
- * If PBL: Driving Question (slides 1-4) -> Inquiry (slides 5-9) -> Milestone Sprint (slides 10-15) -> Review & Exhibition (slides 16-20).
1317
+ * If 5E: Engage -> Explore -> Explain -> Elaborate -> Evaluate.
1318
+ * If EDP: Ask/Problem -> Imagine & Plan -> Create & Prototype -> Test & Debug -> Improve & Share.
1319
+ * If PBL: Driving Question -> Inquiry -> Milestone Sprint -> Review & Exhibition.
1316
1320
 
1317
- 2. **CHUNKY CLUSTERS (3 TO 4 CLUSTERS)**:
1318
- - Group the ${targetSlideCount} slides into 3 to 4 natural clusters (each cluster contains 4 to 6 slides).
1319
- - Each cluster corresponds to a major pedagogical transition in the lesson.
1321
+ 2. **CHUNKY CLUSTERS (4 TO 6 SLIDES PER CLUSTER)**:
1322
+ - Partition the slides into natural clusters corresponding to the major pedagogical transitions in the lesson.
1323
+ - Each cluster MUST contain 4 to 6 slides to ensure downstream token generation remains focused, high-fidelity, and non-repetitive.
1320
1324
 
1321
1325
  3. **SEMANTIC LAYOUT SLOTS (CHOOSE FROM VERIFIED TEMPLATES)**:
1322
1326
  Use one of these valid layoutIds for each slide:
@@ -1333,7 +1337,7 @@ ${phasesSummary || lessonFlow.rawContent.slice(0, 3e3)}
1333
1337
  ---
1334
1338
 
1335
1339
  ### \u{1F4E4} OUTPUT FORMAT:
1336
- Output ONLY a valid JSON array of ${targetSlideCount} objects. Do NOT include markdown text outside the JSON.
1340
+ ${outputGuidance} Do NOT include markdown text outside the JSON.
1337
1341
  Format:
1338
1342
  \`\`\`json
1339
1343
  [
@@ -1463,7 +1467,7 @@ async function executeSlideProductionWorkflow(options) {
1463
1467
  lessonMarkdown,
1464
1468
  lessonCode,
1465
1469
  lessonTitle,
1466
- targetSlideCount = 20,
1470
+ targetSlideCount,
1467
1471
  stylePresetId = "blue-professional",
1468
1472
  language = "Vietnamese",
1469
1473
  languageDirective = "",
@@ -1482,7 +1486,8 @@ async function executeSlideProductionWorkflow(options) {
1482
1486
  presentationKitCore = await import('@thanh01.pmt/presentation-kit');
1483
1487
  } catch {
1484
1488
  }
1485
- onProgress?.("@illustrator", `[1/4] Ph\xE2n t\xEDch m\u1EA1ch b\xE0i gi\u1EA3ng LESSON & L\u1EADp D\xE0n \xFD ${targetSlideCount} Slides...`);
1489
+ const countLabel = targetSlideCount ? `${targetSlideCount} ` : "h\u1EEFu c\u01A1 ";
1490
+ onProgress?.("@illustrator", `[1/4] Ph\xE2n t\xEDch m\u1EA1ch b\xE0i gi\u1EA3ng LESSON & L\u1EADp D\xE0n \xFD ${countLabel}Slides...`);
1486
1491
  const lessonFlow = parseLessonFlow(lessonMarkdown);
1487
1492
  const stylePreset = presentationKitSkills?.getStylePreset ? presentationKitSkills.getStylePreset(stylePresetId) : { name: "Blue Professional" };
1488
1493
  const blueprintPrompt = buildSlideBlueprintPrompt({
@@ -1506,12 +1511,13 @@ async function executeSlideProductionWorkflow(options) {
1506
1511
  blueprintItems = JSON.parse(jsonrepair(extractCleanJson(rawBlueprint)));
1507
1512
  } catch (e) {
1508
1513
  console.warn(`[SlideProductionWorkflow] Failed parsing blueprint JSON, constructing fallback:`, e);
1509
- blueprintItems = Array.from({ length: targetSlideCount }, (_, i) => ({
1514
+ const fallbackCount = targetSlideCount || Math.max(12, Math.min(24, Math.max(lessonFlow.phases.length, 4) * 4));
1515
+ blueprintItems = Array.from({ length: fallbackCount }, (_, i) => ({
1510
1516
  slideIndex: i + 1,
1511
1517
  clusterId: Math.floor(i / 5) + 1,
1512
1518
  clusterTitle: `Cluster ${Math.floor(i / 5) + 1}`,
1513
1519
  lessonPhase: lessonFlow.phases[Math.min(i, lessonFlow.phases.length - 1)]?.phaseName || "Content",
1514
- layoutId: i === 0 ? "hero-cover" : i === targetSlideCount - 1 ? "summary-takeaways" : "split-concept-code",
1520
+ layoutId: i === 0 ? "hero-cover" : i === fallbackCount - 1 ? "summary-takeaways" : "split-concept-code",
1515
1521
  title: `Slide ${i + 1}: ${lessonTitle}`,
1516
1522
  pedagogicalGoal: `Teach step ${i + 1} of ${lessonTitle}`,
1517
1523
  contentFocus: ["Key point 1", "Key point 2", "Key point 3"]
@@ -25816,7 +25822,6 @@ ${buildHeadingDirective("QUIZ", slcMarkdown, targetLang)}`;
25816
25822
  lessonMarkdown: lessonContent || "",
25817
25823
  lessonCode,
25818
25824
  lessonTitle,
25819
- targetSlideCount: 20,
25820
25825
  stylePresetId: "blue-professional",
25821
25826
  language: targetLang || "Vietnamese",
25822
25827
  languageDirective,