@mulmocast/slide 0.4.1 → 0.5.1
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/.claude/skills/extend/SKILL.md +6 -6
- package/.claude/skills/extend/references/extended-script-schema.md +5 -5
- package/.claude/skills/md-to-mulmo/SKILL.md +172 -0
- package/.claude/skills/narrate/SKILL.md +8 -8
- package/.claude/skills/narrate/references/extended-script-schema.md +5 -5
- package/README.md +56 -10
- package/lib/actions/extend-scaffold.d.ts +2 -2
- package/lib/actions/extend-scaffold.d.ts.map +1 -1
- package/lib/actions/extend-scaffold.js +3 -3
- package/lib/actions/extend-scaffold.js.map +1 -1
- package/lib/actions/extend-validate.js +3 -3
- package/lib/actions/extend-validate.js.map +1 -1
- package/lib/actions/md-to-extended.d.ts +54 -0
- package/lib/actions/md-to-extended.d.ts.map +1 -0
- package/lib/actions/md-to-extended.js +176 -0
- package/lib/actions/md-to-extended.js.map +1 -0
- package/lib/actions/narrate.d.ts.map +1 -1
- package/lib/actions/narrate.js +6 -6
- package/lib/actions/narrate.js.map +1 -1
- package/lib/actions/preview.js +1 -1
- package/lib/actions/preview.js.map +1 -1
- package/lib/cli.js +26 -6
- package/lib/cli.js.map +1 -1
- package/lib/convert/marp.js +1 -1
- package/lib/convert/marp.js.map +1 -1
- package/lib/convert/movie.d.ts.map +1 -1
- package/lib/convert/movie.js +2 -2
- package/lib/convert/movie.js.map +1 -1
- package/lib/utils/markdown-parser.d.ts +28 -0
- package/lib/utils/markdown-parser.d.ts.map +1 -0
- package/lib/utils/markdown-parser.js +215 -0
- package/lib/utils/markdown-parser.js.map +1 -0
- package/package.json +12 -12
- package/lib/vue/assets/index-D6am8L57.css +0 -1
- package/lib/vue/assets/index-xq-ZNfmX.js +0 -2
- package/lib/vue/index.html +0 -13
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# /extend - MulmoScript to
|
|
1
|
+
# /extend - MulmoScript to ExtendedMulmoScript Conversion
|
|
2
2
|
|
|
3
|
-
Convert a MulmoScript JSON into an
|
|
3
|
+
Convert a MulmoScript JSON into an ExtendedMulmoScript by adding `scriptMeta` and `beats[].meta` metadata fields. The metadata is used by mulmocast-preprocessor's AI features (summarize, query).
|
|
4
4
|
|
|
5
5
|
## Invocation
|
|
6
6
|
|
|
@@ -14,9 +14,9 @@ This project uses multiple CLI tools. Do NOT confuse them:
|
|
|
14
14
|
|
|
15
15
|
| Command | Package | Purpose | Input |
|
|
16
16
|
|---------|---------|---------|-------|
|
|
17
|
-
| `mulmo-slide` (or `yarn cli`) | `@mulmocast/slide` | Convert source files to MulmoScript, scaffold
|
|
17
|
+
| `mulmo-slide` (or `yarn cli`) | `@mulmocast/slide` | Convert source files to MulmoScript, scaffold ExtendedMulmoScript | Presentation files (.pdf, .pptx, .md, .key) |
|
|
18
18
|
| `mulmo` | `mulmocast` | Generate movie/PDF/audio from MulmoScript | `{basename}.json` |
|
|
19
|
-
| `mulmocast-preprocessor` | `mulmocast-preprocessor` | Convert
|
|
19
|
+
| `mulmocast-preprocessor` | `mulmocast-preprocessor` | Convert ExtendedMulmoScript → MulmoScript, query, summarize | `extended_script.json` |
|
|
20
20
|
|
|
21
21
|
**IMPORTANT**: `mulmo-slide movie` and `mulmo movie` are DIFFERENT commands. Use `npx mulmo movie` (not `mulmo-slide`) when generating video from a MulmoScript JSON.
|
|
22
22
|
|
|
@@ -101,7 +101,7 @@ Based on the analysis, generate:
|
|
|
101
101
|
- If the beat's `text` field is empty and `extracted_texts.json` is available, generate a concise narration text based on the extracted text. The narration should be a natural spoken summary of the slide content, NOT a verbatim copy of the extracted text.
|
|
102
102
|
- If the beat already has `text`, preserve it as-is.
|
|
103
103
|
|
|
104
|
-
### Step 4: Build
|
|
104
|
+
### Step 4: Build ExtendedMulmoScript
|
|
105
105
|
|
|
106
106
|
1. Start with the original MulmoScript (preserve ALL existing fields exactly)
|
|
107
107
|
2. Add `scriptMeta` at the top level
|
|
@@ -117,7 +117,7 @@ Based on the analysis, generate:
|
|
|
117
117
|
2. Write the JSON with 2-space indentation
|
|
118
118
|
3. Run `{cli} extend validate <output_path>` to validate against the schema
|
|
119
119
|
4. If validation fails, fix the errors and re-write the file, then validate again
|
|
120
|
-
5. Generate MulmoScript from
|
|
120
|
+
5. Generate MulmoScript from ExtendedMulmoScript using the preprocessor:
|
|
121
121
|
```bash
|
|
122
122
|
npx mulmocast-preprocessor scripts/{basename}/extended_script.json -o scripts/{basename}/{basename}.json
|
|
123
123
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ExtendedMulmoScript Schema Reference
|
|
2
2
|
|
|
3
|
-
This document defines the
|
|
3
|
+
This document defines the ExtendedMulmoScript format used by `mulmocast-preprocessor`.
|
|
4
4
|
Canonical source: `@mulmocast/extended-types` npm package (`mulmocast-plus/packages/mulmocast-extended-types/src/index.ts`)
|
|
5
5
|
|
|
6
6
|
## Type Definitions
|
|
@@ -33,7 +33,7 @@ Profile-specific content overrides (not generated by `/extend`).
|
|
|
33
33
|
}
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
###
|
|
36
|
+
### ExtendedMulmoBeat
|
|
37
37
|
|
|
38
38
|
A beat with optional `variants` and `meta` fields (extends MulmoBeat).
|
|
39
39
|
|
|
@@ -99,14 +99,14 @@ Profile display information (not generated by `/extend`).
|
|
|
99
99
|
}
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
###
|
|
102
|
+
### ExtendedMulmoScript
|
|
103
103
|
|
|
104
104
|
The top-level type (extends MulmoScript).
|
|
105
105
|
|
|
106
106
|
```typescript
|
|
107
107
|
{
|
|
108
108
|
// ... all MulmoScript fields preserved ...
|
|
109
|
-
beats:
|
|
109
|
+
beats: ExtendedMulmoBeat[]; // Beats with meta
|
|
110
110
|
outputProfiles?: Record<string, OutputProfile>; // Profile definitions
|
|
111
111
|
scriptMeta?: ScriptMeta; // Script-level metadata
|
|
112
112
|
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# /md-to-mulmo - Markdown to ExtendedMulmoScript Conversion
|
|
2
|
+
|
|
3
|
+
Convert a structured markdown document into an ExtendedMulmoScript with intelligent beat allocation, narration, metadata, and variant support for detailed/short output profiles.
|
|
4
|
+
|
|
5
|
+
## Invocation
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/md-to-mulmo <markdown file path>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## CLI Commands Overview
|
|
12
|
+
|
|
13
|
+
| Command | Package | Purpose | Input |
|
|
14
|
+
|---------|---------|---------|-------|
|
|
15
|
+
| `mulmo-slide` (or `yarn cli`) | `@mulmocast/slide` | Convert source files, parse markdown, assemble ExtendedMulmoScript | `.md`, `.pdf`, `.pptx`, etc. |
|
|
16
|
+
| `mulmo` | `mulmocast` | Generate movie/PDF/audio from MulmoScript | `{basename}.json` |
|
|
17
|
+
| `mulmocast-preprocessor` | `mulmocast-preprocessor` | Convert ExtendedMulmoScript → MulmoScript, query, summarize | `extended_script.json` |
|
|
18
|
+
|
|
19
|
+
### CLI prefix for mulmo-slide
|
|
20
|
+
|
|
21
|
+
Determine the correct CLI command prefix:
|
|
22
|
+
- If `package.json` exists in the project root and its `name` is `"@mulmocast/slide"` → use `yarn cli`
|
|
23
|
+
- Otherwise → use `npx mulmo-slide`
|
|
24
|
+
- NEVER create a `package.json` for this purpose
|
|
25
|
+
|
|
26
|
+
Use this prefix (referred to as `{cli}` below) for all `mulmo-slide` CLI calls.
|
|
27
|
+
|
|
28
|
+
## Instructions
|
|
29
|
+
|
|
30
|
+
### Step 1: Parse Markdown and Generate Schemas
|
|
31
|
+
|
|
32
|
+
Run the parse-md command to extract document structure and generate JSON Schemas:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
{cli} parse-md <markdown file>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This produces in `scripts/{basename}/`:
|
|
39
|
+
- `parsed_structure.json` — structured markdown sections with typed elements
|
|
40
|
+
- `extended-script.schema.json` — ExtendedMulmoScript JSON Schema (generated from Zod every run)
|
|
41
|
+
- `presentation-plan.schema.json` — intermediate format JSON Schema
|
|
42
|
+
|
|
43
|
+
### Step 2: Read Inputs
|
|
44
|
+
|
|
45
|
+
Use the Read tool to read:
|
|
46
|
+
|
|
47
|
+
1. `scripts/{basename}/parsed_structure.json`
|
|
48
|
+
2. `scripts/{basename}/presentation-plan.schema.json`
|
|
49
|
+
3. The original markdown file (for full context)
|
|
50
|
+
|
|
51
|
+
### Step 3: Create Presentation Plan
|
|
52
|
+
|
|
53
|
+
Analyze the parsed structure and create `presentation_plan.json` conforming to the plan schema.
|
|
54
|
+
|
|
55
|
+
**Key decisions to make:**
|
|
56
|
+
|
|
57
|
+
1. **Beat allocation** (sections ≠ beats):
|
|
58
|
+
- Multiple sections can be consolidated into one beat
|
|
59
|
+
- One dense section can be split across multiple beats
|
|
60
|
+
- Aim for 8-15 beats for a typical document
|
|
61
|
+
- Each beat should be a coherent, presentable unit
|
|
62
|
+
|
|
63
|
+
2. **Slide content** (`slideMarkdown`):
|
|
64
|
+
- Concise, presentation-ready markdown for the visual slide
|
|
65
|
+
- NOT a copy of the source — distill to key points, headings, bullet lists
|
|
66
|
+
- Include tables, mermaid diagrams, code blocks when they are the focus
|
|
67
|
+
- Each slide should be understandable at a glance
|
|
68
|
+
|
|
69
|
+
3. **Narration** (`narration`):
|
|
70
|
+
- Natural spoken language explaining the slide content
|
|
71
|
+
- Add context and insight beyond what's on the slide
|
|
72
|
+
- Write in the document's language (specified by `lang`)
|
|
73
|
+
|
|
74
|
+
4. **Core vs optional** (`isCore` / `shortNarration`):
|
|
75
|
+
- `isCore: true`: Essential beats included in ALL output profiles
|
|
76
|
+
- `isCore: false`: Detailed-only beats, skipped in short version
|
|
77
|
+
- `shortNarration`: Condensed narration for short profile (null = skip beat in short)
|
|
78
|
+
- Typical: 60-70% core, 30-40% optional
|
|
79
|
+
- Introduction and conclusion beats should always be core
|
|
80
|
+
|
|
81
|
+
5. **Script metadata** (`scriptMeta`):
|
|
82
|
+
- `audience`: Target audience
|
|
83
|
+
- `goals`: 2-4 learning objectives
|
|
84
|
+
- `keywords`: 5-10 main keywords
|
|
85
|
+
- `background`: Theme overview
|
|
86
|
+
- `references`: Extract URLs from source, categorize as web/code/document/video
|
|
87
|
+
- `faq`: 2-4 questions with answers
|
|
88
|
+
|
|
89
|
+
6. **Beat metadata** (`meta`):
|
|
90
|
+
- `section`: Logical section (lowercase-kebab-case, consecutive beats with same section stay grouped)
|
|
91
|
+
- `tags`: Content type tags (intro, overview, definition, example, code, diagram, data, table, comparison, summary, conclusion)
|
|
92
|
+
- `context`: Background info for AI features — most important field. Add supplementary information beyond what's in the slide.
|
|
93
|
+
- `keywords`: 2-5 beat-specific terms
|
|
94
|
+
- `expectedQuestions`: 1-3 audience questions
|
|
95
|
+
|
|
96
|
+
**Output format:**
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"lang": "ja",
|
|
101
|
+
"title": "Presentation Title",
|
|
102
|
+
"scriptMeta": {
|
|
103
|
+
"audience": "...",
|
|
104
|
+
"goals": ["..."],
|
|
105
|
+
"keywords": ["..."],
|
|
106
|
+
"background": "...",
|
|
107
|
+
"references": [{ "type": "web", "url": "...", "title": "..." }],
|
|
108
|
+
"faq": [{ "question": "...", "answer": "..." }]
|
|
109
|
+
},
|
|
110
|
+
"beats": [
|
|
111
|
+
{
|
|
112
|
+
"id": "beat-1",
|
|
113
|
+
"sourceSections": ["sec-0", "sec-1"],
|
|
114
|
+
"slideMarkdown": "# Introduction\n\n- Key point 1\n- Key point 2",
|
|
115
|
+
"narration": "Full narration text...",
|
|
116
|
+
"shortNarration": "Condensed version...",
|
|
117
|
+
"isCore": true,
|
|
118
|
+
"meta": {
|
|
119
|
+
"section": "introduction",
|
|
120
|
+
"tags": ["intro"],
|
|
121
|
+
"context": "Background info...",
|
|
122
|
+
"keywords": ["term1"],
|
|
123
|
+
"expectedQuestions": ["Why is this important?"]
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Write this to `scripts/{basename}/presentation_plan.json`.
|
|
131
|
+
|
|
132
|
+
### Step 4: Assemble and Validate
|
|
133
|
+
|
|
134
|
+
Run the assemble command to convert the plan to ExtendedMulmoScript:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
{cli} assemble-extended scripts/{basename}/presentation_plan.json
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
This:
|
|
141
|
+
- Validates the plan against the JSON Schema (z.fromJSONSchema)
|
|
142
|
+
- Converts `isCore`/`shortNarration` → `variants`/`outputProfiles`
|
|
143
|
+
- Validates the result against ExtendedMulmoScript schema
|
|
144
|
+
- Outputs `scripts/{basename}/extended_script.json`
|
|
145
|
+
|
|
146
|
+
If validation fails, fix the plan and re-run.
|
|
147
|
+
|
|
148
|
+
### Step 5: Post-processing
|
|
149
|
+
|
|
150
|
+
Generate MulmoScript from ExtendedMulmoScript:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npx mulmocast-preprocessor scripts/{basename}/extended_script.json -o scripts/{basename}/{basename}.json
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Step 6: Summary
|
|
157
|
+
|
|
158
|
+
Display to the user:
|
|
159
|
+
- Total beats, core beats, optional beats
|
|
160
|
+
- Sections identified
|
|
161
|
+
- Output profiles available (detailed, short)
|
|
162
|
+
- File paths for extended_script.json and {basename}.json
|
|
163
|
+
- Next steps (e.g., `npx mulmo movie scripts/{basename}/{basename}.json`)
|
|
164
|
+
|
|
165
|
+
## Quality Guidelines
|
|
166
|
+
|
|
167
|
+
- **slideMarkdown**: Presentation-ready, not a dump of the source. Think "what would go on a slide."
|
|
168
|
+
- **narration**: Natural spoken language. Add insight beyond the slide text.
|
|
169
|
+
- **context field**: Most important metadata. Don't restate the slide — add background, related concepts, real-world examples.
|
|
170
|
+
- **section naming**: lowercase-kebab-case, consistent across beats.
|
|
171
|
+
- **isCore judgment**: Introduction, key findings, and conclusion are always core. Examples, deep-dives, and supplementary content can be optional.
|
|
172
|
+
- **shortNarration**: If a core beat needs the same text in both profiles, omit shortNarration (it defaults to the full narration).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# /narrate - Source File to Narrated
|
|
1
|
+
# /narrate - Source File to Narrated ExtendedMulmoScript
|
|
2
2
|
|
|
3
|
-
Convert any supported source file (PDF, PPTX, Markdown, Keynote) into a validated
|
|
3
|
+
Convert any supported source file (PDF, PPTX, Markdown, Keynote) into a validated ExtendedMulmoScript with AI-generated narration and metadata. This is the main entry point for the full pipeline.
|
|
4
4
|
|
|
5
5
|
## Invocation
|
|
6
6
|
|
|
@@ -16,9 +16,9 @@ This project uses multiple CLI tools. Do NOT confuse them:
|
|
|
16
16
|
|
|
17
17
|
| Command | Package | Purpose | Input |
|
|
18
18
|
|---------|---------|---------|-------|
|
|
19
|
-
| `mulmo-slide` (or `yarn cli`) | `@mulmocast/slide` | Convert source files to MulmoScript, scaffold
|
|
19
|
+
| `mulmo-slide` (or `yarn cli`) | `@mulmocast/slide` | Convert source files to MulmoScript, scaffold ExtendedMulmoScript | Presentation files (.pdf, .pptx, .md, .key) |
|
|
20
20
|
| `mulmo` | `mulmocast` | Generate movie/PDF/audio from MulmoScript | `{basename}.json` |
|
|
21
|
-
| `mulmocast-preprocessor` | `mulmocast-preprocessor` | Convert
|
|
21
|
+
| `mulmocast-preprocessor` | `mulmocast-preprocessor` | Convert ExtendedMulmoScript → MulmoScript, query, summarize | `extended_script.json` |
|
|
22
22
|
|
|
23
23
|
**IMPORTANT**: `mulmo-slide movie` and `mulmo movie` are DIFFERENT commands. Use `npx mulmo movie` (not `mulmo-slide`) when generating video from a MulmoScript JSON.
|
|
24
24
|
|
|
@@ -35,9 +35,9 @@ Use this prefix (referred to as `{cli}` below) for `mulmo-slide` CLI calls in th
|
|
|
35
35
|
|
|
36
36
|
## Instructions
|
|
37
37
|
|
|
38
|
-
### Step 1: Scaffold
|
|
38
|
+
### Step 1: Scaffold ExtendedMulmoScript
|
|
39
39
|
|
|
40
|
-
Run the narrate CLI with `--scaffold-only` to convert the source and create the
|
|
40
|
+
Run the narrate CLI with `--scaffold-only` to convert the source and create the ExtendedMulmoScript skeleton in one step:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
43
|
{cli} narrate <file> --scaffold-only
|
|
@@ -106,7 +106,7 @@ Based on the analysis, generate:
|
|
|
106
106
|
- `context`: Background info for AI query/summarize. Be substantive — don't just restate the slide
|
|
107
107
|
- `expectedQuestions`: 1-3 natural audience questions
|
|
108
108
|
|
|
109
|
-
### Step 5: Build and Write
|
|
109
|
+
### Step 5: Build and Write ExtendedMulmoScript
|
|
110
110
|
|
|
111
111
|
1. Start with the original MulmoScript (preserve ALL existing fields)
|
|
112
112
|
2. Add `scriptMeta` at the top level
|
|
@@ -135,7 +135,7 @@ Display a summary:
|
|
|
135
135
|
Then show the user the next steps they can take:
|
|
136
136
|
|
|
137
137
|
```
|
|
138
|
-
|
|
138
|
+
ExtendedMulmoScript is ready! Here's what you can do next:
|
|
139
139
|
|
|
140
140
|
## Query the content interactively
|
|
141
141
|
npx mulmocast-preprocessor query scripts/{basename}/extended_script.json -i
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ExtendedMulmoScript Schema Reference
|
|
2
2
|
|
|
3
|
-
This document defines the
|
|
3
|
+
This document defines the ExtendedMulmoScript format used by `mulmocast-preprocessor`.
|
|
4
4
|
Canonical source: `@mulmocast/extended-types` npm package (`mulmocast-plus/packages/mulmocast-extended-types/src/index.ts`)
|
|
5
5
|
|
|
6
6
|
## Type Definitions
|
|
@@ -33,7 +33,7 @@ Profile-specific content overrides (not generated by `/extend`).
|
|
|
33
33
|
}
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
###
|
|
36
|
+
### ExtendedMulmoBeat
|
|
37
37
|
|
|
38
38
|
A beat with optional `variants` and `meta` fields (extends MulmoBeat).
|
|
39
39
|
|
|
@@ -99,14 +99,14 @@ Profile display information (not generated by `/extend`).
|
|
|
99
99
|
}
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
###
|
|
102
|
+
### ExtendedMulmoScript
|
|
103
103
|
|
|
104
104
|
The top-level type (extends MulmoScript).
|
|
105
105
|
|
|
106
106
|
```typescript
|
|
107
107
|
{
|
|
108
108
|
// ... all MulmoScript fields preserved ...
|
|
109
|
-
beats:
|
|
109
|
+
beats: ExtendedMulmoBeat[]; // Beats with meta
|
|
110
110
|
outputProfiles?: Record<string, OutputProfile>; // Profile definitions
|
|
111
111
|
scriptMeta?: ScriptMeta; // Script-level metadata
|
|
112
112
|
}
|
package/README.md
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
[](https://badge.fury.io/js/%40mulmocast%2Fslide)
|
|
1
2
|
# MulmoCast-Slides
|
|
2
3
|
|
|
3
4
|
A collection of tools to convert presentation files into MulmoScript format, enabling automated narration and processing of slide decks.
|
|
@@ -136,10 +137,12 @@ Commands:
|
|
|
136
137
|
mulmo-slide keynote <file> Convert Keynote to MulmoScript (macOS only)
|
|
137
138
|
mulmo-slide movie <file> Generate movie from presentation
|
|
138
139
|
mulmo-slide bundle <file> Generate MulmoViewer bundle from presentation
|
|
139
|
-
mulmo-slide narrate <file> Generate narrated
|
|
140
|
+
mulmo-slide narrate <file> Generate narrated ExtendedMulmoScript (full pipeline)
|
|
140
141
|
mulmo-slide extend init Install Claude Code skills (/narrate, /extend)
|
|
141
|
-
mulmo-slide extend validate Validate
|
|
142
|
-
mulmo-slide extend scaffold Create
|
|
142
|
+
mulmo-slide extend validate Validate ExtendedMulmoScript JSON against schema
|
|
143
|
+
mulmo-slide extend scaffold Create ExtendedMulmoScript skeleton from MulmoScript
|
|
144
|
+
mulmo-slide parse-md <file> Parse markdown structure for LLM presentation planning
|
|
145
|
+
mulmo-slide assemble-extended <file> Assemble ExtendedMulmoScript from presentation plan
|
|
143
146
|
```
|
|
144
147
|
|
|
145
148
|
The `convert` command auto-detects file format by extension (.pptx, .md, .key, .pdf).
|
|
@@ -561,7 +564,7 @@ mulmo-slide bundle presentation.pptx -f -g
|
|
|
561
564
|
|
|
562
565
|
## Narrate CLI
|
|
563
566
|
|
|
564
|
-
Generate a narrated
|
|
567
|
+
Generate a narrated ExtendedMulmoScript from any supported source file in one command. This automates the full pipeline: conversion to MulmoScript, LLM-based narration and metadata generation, and validation.
|
|
565
568
|
|
|
566
569
|
**Usage:**
|
|
567
570
|
|
|
@@ -581,7 +584,7 @@ yarn narrate samples/sample.pdf --scaffold-only
|
|
|
581
584
|
|
|
582
585
|
**Options:**
|
|
583
586
|
- `-l, --lang` - Language for narration (en, ja, fr, de)
|
|
584
|
-
- `--scaffold-only` - Only create
|
|
587
|
+
- `--scaffold-only` - Only create ExtendedMulmoScript skeleton (no LLM). Useful as preparation for Claude Code `/narrate` analysis
|
|
585
588
|
- `-f, --force` - Force regenerate MulmoScript even if it exists
|
|
586
589
|
- `-s, --separator` - Slide separator mode (for Markdown files)
|
|
587
590
|
- `--mermaid` - Convert mermaid code blocks (for Markdown files)
|
|
@@ -590,7 +593,7 @@ yarn narrate samples/sample.pdf --scaffold-only
|
|
|
590
593
|
|
|
591
594
|
### Extend Scaffold
|
|
592
595
|
|
|
593
|
-
Create an
|
|
596
|
+
Create an ExtendedMulmoScript skeleton from an existing MulmoScript without any LLM calls. This adds beat IDs, empty metadata fields, and imports extracted texts as notes.
|
|
594
597
|
|
|
595
598
|
```bash
|
|
596
599
|
mulmo-slide extend scaffold scripts/<basename>/<basename>.json
|
|
@@ -599,11 +602,54 @@ mulmo-slide extend scaffold scripts/<basename>/<basename>.json
|
|
|
599
602
|
yarn cli extend scaffold scripts/<basename>/<basename>.json
|
|
600
603
|
```
|
|
601
604
|
|
|
605
|
+
## Markdown to ExtendedMulmoScript (LLM-assisted)
|
|
606
|
+
|
|
607
|
+
Convert a structured markdown document into an ExtendedMulmoScript with intelligent beat allocation, narration, and metadata. This is a multi-step process using the `/md-to-mulmo` Claude Code skill.
|
|
608
|
+
|
|
609
|
+
### Pipeline Overview
|
|
610
|
+
|
|
611
|
+
1. **Parse** (`parse-md`): Extract document structure and generate JSON Schemas
|
|
612
|
+
2. **Plan** (LLM via `/md-to-mulmo` skill): Create presentation plan with beat allocation
|
|
613
|
+
3. **Assemble** (`assemble-extended`): Convert plan to ExtendedMulmoScript with variants
|
|
614
|
+
|
|
615
|
+
### Usage
|
|
616
|
+
|
|
617
|
+
```bash
|
|
618
|
+
# Step 1: Parse markdown and generate schemas
|
|
619
|
+
mulmo-slide parse-md path/to/document.md
|
|
620
|
+
|
|
621
|
+
# Step 2: Use /md-to-mulmo skill in Claude Code (creates presentation_plan.json)
|
|
622
|
+
|
|
623
|
+
# Step 3: Assemble ExtendedMulmoScript from plan
|
|
624
|
+
mulmo-slide assemble-extended scripts/{basename}/presentation_plan.json
|
|
625
|
+
|
|
626
|
+
# Step 4: Generate MulmoScript from ExtendedMulmoScript
|
|
627
|
+
npx mulmocast-preprocessor scripts/{basename}/extended_script.json -o scripts/{basename}/{basename}.json
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
**Output of `parse-md`:**
|
|
631
|
+
- `scripts/{basename}/parsed_structure.json` — structured markdown sections
|
|
632
|
+
- `scripts/{basename}/extended-script.schema.json` — ExtendedMulmoScript JSON Schema
|
|
633
|
+
- `scripts/{basename}/presentation-plan.schema.json` — intermediate plan schema
|
|
634
|
+
|
|
635
|
+
**Output of `assemble-extended`:**
|
|
636
|
+
- `scripts/{basename}/extended_script.json` — validated ExtendedMulmoScript with output profiles
|
|
637
|
+
|
|
638
|
+
### Setup
|
|
639
|
+
|
|
640
|
+
Install the Claude Code skill:
|
|
641
|
+
|
|
642
|
+
```bash
|
|
643
|
+
mulmo-slide extend init
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
Then use `/md-to-mulmo path/to/document.md` in Claude Code.
|
|
647
|
+
|
|
602
648
|
## Narrate: Source File to Narrated Video (Claude Code Skill)
|
|
603
649
|
|
|
604
650
|
> **Tip:** If you don't need interactive analysis and want a fully automated pipeline, use the [Narrate CLI](#narrate-cli) instead (`mulmo-slide narrate <file>`). It runs the full pipeline with OpenAI GPT-4o without requiring Claude Code.
|
|
605
651
|
|
|
606
|
-
The `/narrate` skill converts any supported source file into a narrated
|
|
652
|
+
The `/narrate` skill converts any supported source file into a narrated ExtendedMulmoScript in one step. It handles the full pipeline: conversion, narration generation, metadata, and validation.
|
|
607
653
|
|
|
608
654
|
### Setup
|
|
609
655
|
|
|
@@ -656,9 +702,9 @@ npx mulmocast-preprocessor scripts/{basename}/extended_script.json -o scripts/{b
|
|
|
656
702
|
npx mulmo movie scripts/{basename}/{basename}.json
|
|
657
703
|
```
|
|
658
704
|
|
|
659
|
-
### Validating
|
|
705
|
+
### Validating ExtendedMulmoScript
|
|
660
706
|
|
|
661
|
-
Validate an
|
|
707
|
+
Validate an ExtendedMulmoScript JSON file against the schema:
|
|
662
708
|
|
|
663
709
|
```bash
|
|
664
710
|
mulmo-slide extend validate scripts/simple_text/extended_script.json
|
|
@@ -698,4 +744,4 @@ scripts/<basename>/
|
|
|
698
744
|
|
|
699
745
|
## License
|
|
700
746
|
|
|
701
|
-
MIT
|
|
747
|
+
MIT
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MulmoScript } from "@mulmocast/types";
|
|
2
|
-
import type {
|
|
3
|
-
export declare const
|
|
2
|
+
import type { ExtendedMulmoScript } from "@mulmocast/extended-types";
|
|
3
|
+
export declare const scaffoldExtendedMulmoScript: (mulmoScript: MulmoScript, extractedTexts: string[] | null) => ExtendedMulmoScript;
|
|
4
4
|
export declare const runExtendScaffold: (filePath: string) => void;
|
|
5
5
|
//# sourceMappingURL=extend-scaffold.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extend-scaffold.d.ts","sourceRoot":"","sources":["../../src/actions/extend-scaffold.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"extend-scaffold.d.ts","sourceRoot":"","sources":["../../src/actions/extend-scaffold.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAA+B,MAAM,2BAA2B,CAAC;AAyBlG,eAAO,MAAM,2BAA2B,GACtC,aAAa,WAAW,EACxB,gBAAgB,MAAM,EAAE,GAAG,IAAI,KAC9B,mBAWF,CAAC;AAgCF,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,IAiBpD,CAAC"}
|
|
@@ -18,7 +18,7 @@ const addBeatMeta = (beats, extractedTexts) => {
|
|
|
18
18
|
return { ...beat, meta };
|
|
19
19
|
});
|
|
20
20
|
};
|
|
21
|
-
export const
|
|
21
|
+
export const scaffoldExtendedMulmoScript = (mulmoScript, extractedTexts) => {
|
|
22
22
|
const beats = addBeatMeta(addBeatIds(mulmoScript.beats), extractedTexts);
|
|
23
23
|
// Set defaults first so the spread preserves existing values
|
|
24
24
|
// (JSON may include scriptMeta/outputProfiles not in MulmoScript type)
|
|
@@ -36,7 +36,7 @@ const buildSummary = (mulmoScript, result, outputPath) => ({
|
|
|
36
36
|
outputPath,
|
|
37
37
|
});
|
|
38
38
|
const printSummary = (summary) => {
|
|
39
|
-
console.log(`\n✓ Scaffolded
|
|
39
|
+
console.log(`\n✓ Scaffolded ExtendedMulmoScript: ${summary.outputPath}`);
|
|
40
40
|
console.log(` Beats: ${summary.beatCount}`);
|
|
41
41
|
if (summary.idsAdded > 0) {
|
|
42
42
|
console.log(` IDs added: ${summary.idsAdded}`);
|
|
@@ -55,7 +55,7 @@ export const runExtendScaffold = (filePath) => {
|
|
|
55
55
|
const mulmoScript = readJsonFile(resolvedPath);
|
|
56
56
|
const dir = path.dirname(resolvedPath);
|
|
57
57
|
const extractedTexts = loadExtractedTexts(dir);
|
|
58
|
-
const result =
|
|
58
|
+
const result = scaffoldExtendedMulmoScript(mulmoScript, extractedTexts);
|
|
59
59
|
const outputPath = path.join(dir, "extended_script.json");
|
|
60
60
|
writeJsonFile(outputPath, result);
|
|
61
61
|
printSummary(buildSummary(mulmoScript, result, outputPath));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extend-scaffold.js","sourceRoot":"","sources":["../../src/actions/extend-scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,UAAU,GAAG,CAAC,KAAkB,
|
|
1
|
+
{"version":3,"file":"extend-scaffold.js","sourceRoot":"","sources":["../../src/actions/extend-scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
|
-
import {
|
|
3
|
+
import { extendedMulmoScriptSchema } from "@mulmocast/extended-types";
|
|
4
4
|
import { formatZodError } from "./common.js";
|
|
5
5
|
const summarizeScript = (data) => {
|
|
6
6
|
const script = data;
|
|
@@ -32,14 +32,14 @@ export const runExtendValidate = (filePath) => {
|
|
|
32
32
|
console.error(`Failed to parse JSON: ${message}`);
|
|
33
33
|
process.exit(1);
|
|
34
34
|
}
|
|
35
|
-
const result =
|
|
35
|
+
const result = extendedMulmoScriptSchema.safeParse(data);
|
|
36
36
|
if (!result.success) {
|
|
37
37
|
console.error(`\n✗ Validation failed: ${resolvedPath}\n`);
|
|
38
38
|
console.error(formatZodError(result.error));
|
|
39
39
|
process.exit(1);
|
|
40
40
|
}
|
|
41
41
|
const summary = summarizeScript(data);
|
|
42
|
-
console.log(`\n✓ Valid
|
|
42
|
+
console.log(`\n✓ Valid ExtendedMulmoScript: ${resolvedPath}`);
|
|
43
43
|
console.log(` Beats: ${summary.beatCount}`);
|
|
44
44
|
console.log(` ScriptMeta: ${summary.hasScriptMeta ? "yes" : "no"}`);
|
|
45
45
|
console.log(` Meta coverage: ${summary.metaCoverage}%`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extend-validate.js","sourceRoot":"","sources":["../../src/actions/extend-validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"extend-validate.js","sourceRoot":"","sources":["../../src/actions/extend-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown → ExtendedMulmoScript pipeline
|
|
3
|
+
*
|
|
4
|
+
* Step 1: Generate JSON Schema from Zod (every run) + parse markdown
|
|
5
|
+
* Step 3: Assemble ExtendedMulmoScript from presentation plan
|
|
6
|
+
* Step 4: Validate against ExtendedMulmoScript schema
|
|
7
|
+
*
|
|
8
|
+
* Step 2 (LLM presentation planning) is handled by the /md-to-mulmo skill.
|
|
9
|
+
*/
|
|
10
|
+
import type { ExtendedMulmoScript } from "@mulmocast/extended-types";
|
|
11
|
+
interface BeatPlan {
|
|
12
|
+
id: string;
|
|
13
|
+
sourceSections: string[];
|
|
14
|
+
slideMarkdown: string;
|
|
15
|
+
narration: string;
|
|
16
|
+
shortNarration?: string | null;
|
|
17
|
+
isCore: boolean;
|
|
18
|
+
meta: {
|
|
19
|
+
tags?: string[];
|
|
20
|
+
section?: string;
|
|
21
|
+
context?: string;
|
|
22
|
+
keywords?: string[];
|
|
23
|
+
expectedQuestions?: string[];
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
interface PresentationPlan {
|
|
27
|
+
lang: string;
|
|
28
|
+
title?: string;
|
|
29
|
+
scriptMeta: Record<string, unknown>;
|
|
30
|
+
beats: BeatPlan[];
|
|
31
|
+
}
|
|
32
|
+
export declare const generateSchemas: (outputDir: string) => {
|
|
33
|
+
extendedSchemaPath: string;
|
|
34
|
+
planSchemaPath: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const runParseMd: (inputPath: string) => void;
|
|
37
|
+
export declare const assembleExtendedMulmoScript: (plan: PresentationPlan) => ExtendedMulmoScript;
|
|
38
|
+
export declare const validateExtendedMulmoScript: (data: unknown) => {
|
|
39
|
+
success: true;
|
|
40
|
+
data: ExtendedMulmoScript;
|
|
41
|
+
} | {
|
|
42
|
+
success: false;
|
|
43
|
+
errors: string;
|
|
44
|
+
};
|
|
45
|
+
export declare const validatePresentationPlan: (data: unknown) => {
|
|
46
|
+
success: true;
|
|
47
|
+
data: PresentationPlan;
|
|
48
|
+
} | {
|
|
49
|
+
success: false;
|
|
50
|
+
errors: string;
|
|
51
|
+
};
|
|
52
|
+
export declare const runAssembleExtended: (inputPath: string) => void;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=md-to-extended.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md-to-extended.d.ts","sourceRoot":"","sources":["../../src/actions/md-to-extended.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,2BAA2B,CAAC;AAMnC,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AASD,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,KAChB;IAAE,kBAAkB,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAWtD,CAAC;AAIF,eAAO,MAAM,UAAU,GAAI,WAAW,MAAM,KAAG,IAkC9C,CAAC;AAkCF,eAAO,MAAM,2BAA2B,GAAI,MAAM,gBAAgB,KAAG,mBA+BpE,CAAC;AAIF,eAAO,MAAM,2BAA2B,GACtC,MAAM,OAAO,KACZ;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAMjF,CAAC;AASF,eAAO,MAAM,wBAAwB,GACnC,MAAM,OAAO,KACZ;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAO9E,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM,KAAG,IA+CvD,CAAC"}
|