Novel Creator Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow. Workflow Phase 1: Story Setup Use tool to gather: | Element | Options | Default | |---------|---------|---------| | Genre | 穿越/Fantasy/Romance/Mystery | 穿越 | | Setting | Ancient palace/Modern/Fantasy world | Palace | | Protagonist | Name, background, abilities | - | | Goal | What to achieve | Survive and thrive | | Length | Chapters × words | 10 × 5000 | Load character personas from based on setting. Phase 2: Interactive RPG Run 10-15 decision points where user makes choices vi…

, content, re.MULTILINE)\n if match:\n return match.group(1).strip()\n return None\n\n\ndef find_chapter_files(path):\n \"\"\"Find and sort chapter markdown files\"\"\"\n patterns = [\n os.path.join(path, '[0-9][0-9]_*.md'),\n os.path.join(path, '第*章*.md'),\n os.path.join(path, 'chapter_*.md'),\n ]\n\n files = []\n for pattern in patterns:\n files.extend(glob.glob(pattern))\n\n # Remove duplicates and sort\n files = sorted(set(files))\n\n # Filter out non-chapter files\n excluded = ['task_plan.md', 'README.md', 'plan.md']\n files = [f for f in files if os.path.basename(f).lower() not in [e.lower() for e in excluded]]\n\n return files\n\n\ndef extract_chapter_title(filepath):\n \"\"\"Extract chapter title from filename or file content\"\"\"\n filename = os.path.basename(filepath)\n\n # Try to get title from filename: \"01_标题.md\" -> \"第一章 标题\"\n match = re.match(r'(\\d+)_(.+)\\.md', filename)\n if match:\n num = int(match.group(1))\n title = match.group(2)\n chinese_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十',\n '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十']\n if num \u003c len(chinese_nums):\n return f\"第{chinese_nums[num]}章 {title}\"\n return f\"第{num}章 {title}\"\n\n # Try to extract from file content\n with open(filepath, 'r', encoding='utf-8') as f:\n first_lines = f.read(500)\n match = re.search(r'^#\\s+(.+)

Novel Creator Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow. Workflow Phase 1: Story Setup Use tool to gather: | Element | Options | Default | |---------|---------|---------| | Genre | 穿越/Fantasy/Romance/Mystery | 穿越 | | Setting | Ancient palace/Modern/Fantasy world | Palace | | Protagonist | Name, background, abilities | - | | Goal | What to achieve | Survive and thrive | | Length | Chapters × words | 10 × 5000 | Load character personas from based on setting. Phase 2: Interactive RPG Run 10-15 decision points where user makes choices vi…

, first_lines, re.MULTILINE)\n if match:\n return match.group(1).strip()\n\n return filename.replace('.md', '')\n\n\ndef md_to_html(md_content):\n \"\"\"Convert Markdown to HTML with Chinese novel formatting\"\"\"\n html = md_content\n\n # Process headings\n html = re.sub(r'^# (.+)

Novel Creator Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow. Workflow Phase 1: Story Setup Use tool to gather: | Element | Options | Default | |---------|---------|---------| | Genre | 穿越/Fantasy/Romance/Mystery | 穿越 | | Setting | Ancient palace/Modern/Fantasy world | Palace | | Protagonist | Name, background, abilities | - | | Goal | What to achieve | Survive and thrive | | Length | Chapters × words | 10 × 5000 | Load character personas from based on setting. Phase 2: Interactive RPG Run 10-15 decision points where user makes choices vi…

, r'\u003ch1>\\1\u003c/h1>', html, flags=re.MULTILINE)\n html = re.sub(r'^## (.+)

Novel Creator Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow. Workflow Phase 1: Story Setup Use tool to gather: | Element | Options | Default | |---------|---------|---------| | Genre | 穿越/Fantasy/Romance/Mystery | 穿越 | | Setting | Ancient palace/Modern/Fantasy world | Palace | | Protagonist | Name, background, abilities | - | | Goal | What to achieve | Survive and thrive | | Length | Chapters × words | 10 × 5000 | Load character personas from based on setting. Phase 2: Interactive RPG Run 10-15 decision points where user makes choices vi…

, r'\u003ch2>\\1\u003c/h2>', html, flags=re.MULTILINE)\n html = re.sub(r'^### (.+)

Novel Creator Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow. Workflow Phase 1: Story Setup Use tool to gather: | Element | Options | Default | |---------|---------|---------| | Genre | 穿越/Fantasy/Romance/Mystery | 穿越 | | Setting | Ancient palace/Modern/Fantasy world | Palace | | Protagonist | Name, background, abilities | - | | Goal | What to achieve | Survive and thrive | | Length | Chapters × words | 10 × 5000 | Load character personas from based on setting. Phase 2: Interactive RPG Run 10-15 decision points where user makes choices vi…

, r'\u003ch3>\\1\u003c/h3>', html, flags=re.MULTILINE)\n\n # Process blockquotes (poetry/lyrics)\n def replace_blockquote(match):\n content = match.group(1)\n lines = content.strip().split('\\n')\n formatted_lines = []\n for line in lines:\n line = line.strip()\n if line.startswith('> '):\n line = line[2:]\n elif line.startswith('>'):\n line = line[1:]\n if line:\n formatted_lines.append(f'\u003cp class=\"quote-line\">{line}\u003c/p>')\n return '\u003cblockquote class=\"poetry\">' + '\\n'.join(formatted_lines) + '\u003c/blockquote>'\n\n html = re.sub(r'((?:^>.*\\n?)+)', replace_blockquote, html, flags=re.MULTILINE)\n\n # Process formatting\n html = re.sub(r'\\*\\*(.+?)\\*\\*', r'\u003cstrong>\\1\u003c/strong>', html)\n html = re.sub(r'\\*(.+?)\\*', r'\u003cem>\\1\u003c/em>', html)\n\n # Process horizontal rules\n html = re.sub(r'^---+

Novel Creator Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow. Workflow Phase 1: Story Setup Use tool to gather: | Element | Options | Default | |---------|---------|---------| | Genre | 穿越/Fantasy/Romance/Mystery | 穿越 | | Setting | Ancient palace/Modern/Fantasy world | Palace | | Protagonist | Name, background, abilities | - | | Goal | What to achieve | Survive and thrive | | Length | Chapters × words | 10 × 5000 | Load character personas from based on setting. Phase 2: Interactive RPG Run 10-15 decision points where user makes choices vi…

, r'\u003chr/>', html, flags=re.MULTILINE)\n\n # Process paragraphs\n paragraphs = html.split('\\n\\n')\n processed = []\n for p in paragraphs:\n p = p.strip()\n if not p:\n continue\n if any(p.startswith(tag) for tag in ['\u003ch', '\u003cblockquote', '\u003chr', '\u003cp']):\n processed.append(p)\n else:\n p = p.replace('\\n', '\u003cbr/>')\n processed.append(f'\u003cp>{p}\u003c/p>')\n\n return '\\n'.join(processed)\n\n\ndef get_css_style():\n \"\"\"Return CSS for Chinese novel typography\"\"\"\n return '''\n@namespace epub \"http://www.idpf.org/2007/ops\";\n\nbody {\n font-family: \"Songti SC\", \"SimSun\", \"Noto Serif CJK SC\", serif;\n line-height: 1.8;\n padding: 20px;\n text-align: justify;\n}\n\nh1 {\n font-size: 1.8em;\n text-align: center;\n margin: 40px 0 30px 0;\n color: #333;\n font-weight: bold;\n}\n\nh2 {\n font-size: 1.4em;\n margin: 30px 0 20px 0;\n color: #444;\n}\n\nh3 {\n font-size: 1.2em;\n margin: 20px 0 15px 0;\n color: #555;\n}\n\np {\n text-indent: 2em;\n margin: 0.8em 0;\n}\n\nblockquote.poetry {\n border-left: 3px solid #c9a959;\n padding-left: 15px;\n margin: 25px 0;\n background: #faf8f0;\n padding: 15px 15px 15px 20px;\n}\n\nblockquote.poetry p.quote-line {\n font-style: italic;\n color: #666;\n text-indent: 0;\n margin: 5px 0;\n}\n\nhr {\n border: none;\n border-top: 1px solid #ddd;\n margin: 30px auto;\n width: 60%;\n}\n\n.cover-title {\n font-size: 2.5em;\n text-align: center;\n margin-top: 30%;\n color: #333;\n}\n\n.cover-subtitle {\n font-size: 1.2em;\n text-align: center;\n color: #666;\n margin-top: 20px;\n}\n\n.cover-author {\n font-size: 1em;\n text-align: center;\n color: #888;\n margin-top: 50px;\n}\n\n.chapter-end {\n text-align: center;\n margin: 40px 0;\n color: #888;\n}\n'''\n\n\ndef create_cover_page(title, subtitle, author, css_item):\n \"\"\"Create cover page HTML\"\"\"\n content = f'''\n\u003chtml xmlns=\"http://www.w3.org/1999/xhtml\">\n\u003chead>\n \u003ctitle>{title}\u003c/title>\n \u003clink rel=\"stylesheet\" type=\"text/css\" href=\"style/novel.css\"/>\n\u003c/head>\n\u003cbody>\n \u003cdiv style=\"text-align: center; padding-top: 100px;\">\n \u003ch1 class=\"cover-title\">{title}\u003c/h1>\n \u003cp class=\"cover-subtitle\">{subtitle}\u003c/p>\n \u003chr style=\"width: 200px; margin: 50px auto;\"/>\n \u003cp class=\"cover-author\">作者:{author}\u003c/p>\n \u003c/div>\n\u003c/body>\n\u003c/html>\n'''\n cover = epub.EpubHtml(title='封面', file_name='cover.xhtml', lang='zh')\n cover.content = content\n cover.add_item(css_item)\n return cover\n\n\ndef create_epub(args):\n \"\"\"Main function to create EPUB\"\"\"\n path = os.path.abspath(args.path)\n\n # Detect title\n title = args.title or detect_title_from_plan(path) or os.path.basename(path)\n author = args.author\n subtitle = args.subtitle\n description = args.description\n\n print(f\"📚 Creating EPUB: {title}\")\n print(f\" Author: {author}\")\n print(f\" Path: {path}\")\n\n # Find chapter files\n chapter_files = find_chapter_files(path)\n if not chapter_files:\n print(\"❌ No chapter files found!\")\n print(\" Looking for patterns: XX_title.md, 第X章.md, chapter_X.md\")\n return None\n\n print(f\" Found {len(chapter_files)} chapters\")\n\n # Create book\n book = epub.EpubBook()\n book.set_identifier(f'{title.replace(\" \", \"-\")}-{hash(title) % 10000:04d}')\n book.set_title(title)\n book.set_language('zh')\n book.add_author(author)\n\n if description:\n book.add_metadata('DC', 'description', description)\n\n # Add CSS\n css = epub.EpubItem(\n uid=\"style_novel\",\n file_name=\"style/novel.css\",\n media_type=\"text/css\",\n content=get_css_style()\n )\n book.add_item(css)\n\n # Create cover\n cover = create_cover_page(title, subtitle, author, css)\n book.add_item(cover)\n\n # Process chapters\n epub_chapters = [cover]\n toc_items = [epub.Link('cover.xhtml', '封面', 'cover')]\n\n for filepath in chapter_files:\n chapter_title = extract_chapter_title(filepath)\n filename = os.path.basename(filepath).replace('.md', '.xhtml')\n\n with open(filepath, 'r', encoding='utf-8') as f:\n md_content = f.read()\n\n html_content = md_to_html(md_content)\n\n chapter = epub.EpubHtml(\n title=chapter_title,\n file_name=filename,\n lang='zh'\n )\n chapter.content = f'''\n\u003chtml xmlns=\"http://www.w3.org/1999/xhtml\">\n\u003chead>\n \u003ctitle>{chapter_title}\u003c/title>\n \u003clink rel=\"stylesheet\" type=\"text/css\" href=\"style/novel.css\"/>\n\u003c/head>\n\u003cbody>\n {html_content}\n\u003c/body>\n\u003c/html>\n'''\n chapter.add_item(css)\n book.add_item(chapter)\n epub_chapters.append(chapter)\n toc_items.append(epub.Link(filename, chapter_title, filename.replace('.xhtml', '')))\n print(f\" ✓ {chapter_title}\")\n\n # Set TOC and spine\n book.toc = tuple(toc_items)\n book.add_item(epub.EpubNcx())\n book.add_item(epub.EpubNav())\n book.spine = ['nav'] + epub_chapters\n\n # Write EPUB\n output_name = args.output or f'{title}.epub'\n output_path = os.path.join(path, output_name)\n epub.write_epub(output_path, book, {})\n\n print(f\"\\n✅ EPUB created successfully!\")\n print(f\"📖 Output: {output_path}\")\n\n return output_path\n\n\nif __name__ == '__main__':\n args = parse_args()\n create_epub(args)\n","content_type":"text/x-python; charset=utf-8","language":"python","size":10129,"content_sha256":"27a361e265d6d81cc71da4fe50ead24748f1d9e887872ec418361e9a51262369"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Novel Creator","type":"text"}]},{"type":"paragraph","content":[{"text":"Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[Story Concept] → [Interactive RPG] → [Writing Plan] → [Chapters] → [EPUB]\n Phase 1 Phase 2 Phase 3 Phase 4 Phase 5","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Phase 1: Story Setup","type":"text"}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":" tool to gather:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Element","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Options","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Default","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Genre","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"穿越/Fantasy/Romance/Mystery","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"穿越","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Setting","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Ancient palace/Modern/Fantasy world","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Palace","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Protagonist","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Name, background, abilities","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Goal","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What to achieve","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Survive and thrive","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Length","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Chapters × words","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10 × 5000","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Load character personas from ","type":"text"},{"text":"references/personas.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" based on setting.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Phase 2: Interactive RPG","type":"text"}]},{"type":"paragraph","content":[{"text":"Run 10-15 decision points where user makes choices via ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"[Vivid scene description]\n↓\nAskUserQuestion with 3-4 meaningful choices\n↓\n[Consequence + next scene]","type":"text"}]},{"type":"paragraph","content":[{"text":"Required elements to weave in:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Tech/Knowledge","type":"text","marks":[{"type":"strong"}]},{"text":": Modern knowledge as \"magic\" (phone→照妖镜, chemistry→炼丹)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fantasy","type":"text","marks":[{"type":"strong"}]},{"text":": Special abilities (灵觉), artifacts (蓄雷珠), prophecies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Romance","type":"text","marks":[{"type":"strong"}]},{"text":": First meeting → mutual help → feelings → confession","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Track throughout:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Key plot points and decisions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Relationship development stages","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Items and abilities acquired","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Foreshadowing seeds planted","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Phase 3: Writing Plan","type":"text"}]},{"type":"paragraph","content":[{"text":"Create ","type":"text"},{"text":"task_plan.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" with:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# Writing Plan: [Title]\n\n## Characters\n| Name | Role | Traits | Arc |\n|------|------|--------|-----|\n\n## Foreshadowing Matrix\n| Element | Ch.1 Hint | Development | Payoff |\n|---------|-----------|-------------|--------|\n| Tech | [seed] | Ch.4 [use] | Ch.9 [climax] |\n| Fantasy | [seed] | Ch.6 [reveal] | Ch.9 [power] |\n| Romance | [meeting] | Ch.5 [feelings] | Ch.10 [love] |\n\n## Poetry Pairings (Chinese novels)\n| Ch | Ancient Poetry | Modern Lyrics | Theme |\n|----|----------------|---------------|-------|\nSee references/poetry_pairs.md for suggestions.\n\n## Chapter Outline\n- [ ] Ch.1: [title] - [key scenes, ~5000 words]\n...\n\n## Progress\n| Ch | Status | Words |\n|----|--------|-------|","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Phase 4: Chapter Writing","type":"text"}]},{"type":"paragraph","content":[{"text":"Write each chapter (~4000-5500 words) following this structure:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# 第X章:[押韵标题]\n\n> *[Ancient poetry quote]*\n> *——[Author]《[Title]》*\n\n---\n\n## 一\n[Scene 1: Setting + action]\n\n## 二\n[Scene 2: Dialogue + conflict]\n\n## 三\n[Scene 3: Resolution + hook]\n\n---\n\n(第X章完)\n\n---\n\n> *\"[Modern lyrics quote]\"*\n> *——《[Song]》*","type":"text"}]},{"type":"paragraph","content":[{"text":"Writing checklist:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Vivid sensory descriptions (sight, sound, smell, touch)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Dialogue with subtext (what's said vs. what's meant)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Internal monologue showing modern perspective","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Proper pacing (action → dialogue → reflection)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Foreshadowing elements per plan","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Chapter-end hook","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"File naming:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"[##]_[章节标题].md","type":"text","marks":[{"type":"code_inline"}]},{"text":" (e.g., ","type":"text"},{"text":"01_梦回千年惊鸿起.md","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]},{"type":"paragraph","content":[{"text":"Update ","type":"text"},{"text":"task_plan.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" progress after each chapter.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Phase 5: EPUB Generation","type":"text"}]},{"type":"paragraph","content":[{"text":"Run:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/create_epub.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Script auto-detects chapter files in current directory and generates:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cover page with title/subtitle/author","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Introduction page","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All chapters with proper formatting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Table of contents","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Chinese typography CSS","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Output: ","type":"text"},{"text":"[书名].epub","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Commands","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User says","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Action","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"写一部穿越小说\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full workflow Phase 1-5","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"根据大纲写小说\" + outline","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Phase 3-5","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"把章节转成epub\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Phase 5 only","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"继续写下一章\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Resume Phase 4","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Resources","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/create_epub.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" - EPUB generator","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/personas.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Character templates by setting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/poetry_pairs.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Poetry and lyrics pairings","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"novel-creator","author":"@skillopedia","source":{"stars":8,"repo_name":"novel-skill","origin_url":"https://github.com/mave99a/novel-skill/blob/HEAD/skills/novel-creator/SKILL.md","repo_owner":"mave99a","body_sha256":"ab104232aaa7001a35494eaf0f0e0e1a64dca94aee458f1479a98dafb9547b61","cluster_key":"b7acab098aa90ffecc7ce3ff84f5b5c0696eef61e42b85e055e11a73d452251b","clean_bundle":{"format":"clean-skill-bundle-v1","source":"mave99a/novel-skill/skills/novel-creator/SKILL.md","attachments":[{"id":"0bf69831-600e-534a-b5f5-6be82439d9f6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0bf69831-600e-534a-b5f5-6be82439d9f6/attachment.md","path":"references/personas.md","size":4395,"sha256":"d4d77f6b9cb95c8b685d6a35c13a9bb9616053dfae3db68777e3d51f9b3dab2f","contentType":"text/markdown; charset=utf-8"},{"id":"5bcb5b25-88cb-5111-bf47-e1e9a0d87476","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5bcb5b25-88cb-5111-bf47-e1e9a0d87476/attachment.md","path":"references/poetry_pairs.md","size":4764,"sha256":"81a39442c57a507f2c61e79f53ca0210bbb9bb7681582211fd200270dd1284d5","contentType":"text/markdown; charset=utf-8"},{"id":"6d9aa2e6-3142-5f24-89b7-eea3e22ebe69","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6d9aa2e6-3142-5f24-89b7-eea3e22ebe69/attachment.py","path":"scripts/create_epub.py","size":10129,"sha256":"27a361e265d6d81cc71da4fe50ead24748f1d9e887872ec418361e9a51262369","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"25991cd356a24bce9c565879207b852ba2894a29012ed7330fe865ed67dcf34c","attachment_count":3,"text_attachments":3,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/novel-creator/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"games-interactive","category_label":"Games"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"games-interactive","import_tag":"clean-skills-v1","description":"Interactive novel creation workflow combining RPG-style storytelling with professional EPUB ebook production.\nUse when users want to: (1) Create interactive stories/RPG games with branching choices, (2) Write full novels from story concepts,\n(3) Generate novels with time-travel/fantasy/romance elements, (4) Convert markdown stories to EPUB ebooks,\n(5) Create Chinese web novels with ancient poetry paired with modern lyrics, (6) Write light novels or serialized fiction.\nTriggers: \"write a novel\", \"create a story\", \"interactive fiction\", \"RPG story\", \"make an ebook\", \"穿越小说\", \"写小说\", \"创作故事\", \"制作电子书\"\n"}},"renderedAt":1782987891765}

Novel Creator Transform story ideas into complete novels with EPUB output through an interactive RPG-style workflow. Workflow Phase 1: Story Setup Use tool to gather: | Element | Options | Default | |---------|---------|---------| | Genre | 穿越/Fantasy/Romance/Mystery | 穿越 | | Setting | Ancient palace/Modern/Fantasy world | Palace | | Protagonist | Name, background, abilities | - | | Goal | What to achieve | Survive and thrive | | Length | Chapters × words | 10 × 5000 | Load character personas from based on setting. Phase 2: Interactive RPG Run 10-15 decision points where user makes choices vi…