Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Offline 21-tool Chinese web-novel style, plot and continuity audits, plus per-book cleanup.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
DSH_NOVEL_WRITER_ROOT, DSH_NOVEL_WRITER_STATEต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"dsh-novel-writer": {
"command": "npx",
"args": [
"-y",
"dsh-novel-writer",
"dsh-novel-writer",
"dsh-novel-writer-mcp"
],
"env": {
"DSH_NOVEL_WRITER_ROOT": "ใส่ค่าของคุณ",
"DSH_NOVEL_WRITER_STATE": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add dsh-novel-writer --env DSH_NOVEL_WRITER_ROOT='ใส่ค่าของคุณ' --env DSH_NOVEL_WRITER_STATE='ใส่ค่าของคุณ' -- npx -y dsh-novel-writer dsh-novel-writer dsh-novel-writer-mcpเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"dsh-novel-writer": {
"command": "npx",
"args": [
"-y",
"dsh-novel-writer",
"dsh-novel-writer",
"dsh-novel-writer-mcp"
],
"env": {
"DSH_NOVEL_WRITER_ROOT": "ใส่ค่าของคุณ",
"DSH_NOVEL_WRITER_STATE": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"dsh-novel-writer": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"dsh-novel-writer",
"dsh-novel-writer",
"dsh-novel-writer-mcp"
],
"env": {
"DSH_NOVEL_WRITER_ROOT": "ใส่ค่าของคุณ",
"DSH_NOVEL_WRITER_STATE": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
DSH_NOVEL_WRITER_ROOT envDSH_NOVEL_WRITER_STATE envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 9 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub siweina ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (7.2.0) เข้า registry วันนี้
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Toggl 2.0
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Toggl 2.0 MCP server for tasks, projects, time entries, and workspace operations.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
English | 中文
21 个工具,覆盖「动笔前取材料 → 写完量化自检 → 改稿按优先级复测 → 跨章结构体检 → 收尾清理与诊断」整条流程。 动笔前一次调用取齐 16 项材料(漏读一样就漂移);改稿不再只丢给你一堆数字,而是按严重度排好的待办(带原句行号、当前值与目标值、原著锚段,只给方向不代写);跨章层面能查「线断了、人丢了、伏笔忘了」。 句式 / 情感 / 语义全部在本地算:24MB 中文模型随包分发,零 API 花费、正文不出本机。 为 DeepSeek Harness(DSH)打造;同一套能力也可作为 MCP 服务器给 Claude Desktop / Cursor 使用。
官网 · 技术文档(21 个工具的参数与示例) · 安装 · 写作流程 · 60 秒上手 · 看看输出 · 21 个工具 · MCP 服务器
完整版本变更见 CHANGELOG.md。
| 步骤 | 你说什么 | 用哪个工具 | 拿到什么 |
|---|---|---|---|
| ① 取材料 | 「给下一章取材料」 | novel_chapter_brief | 一次调用取齐 16 项输入:上一章结尾原文(承接口)/ 上一章钩子 / 本章大纲方向 / 相关人物卡 / 待回收伏笔(含埋了多久)/ 世界观用语规范与禁词 / 六维基线 / 原著锚段与句式骨架 / 上一章自检结论 / 禁用清单 / 开写清单——缺哪项、为什么、怎么补写在 degraded 里 |
| ② 动笔 | 「写第 N 章」 | novel_new_chapter · write | 新章文件(自动附基线 μ 摘要与原著锚包);锚段只用来校准语感(不照骨架造句),数字只做事后校验 |
| ③ 自检 | 「自检这一章」 | novel_style_check · novel_sentence_analysis | 相似度 + 偏差清单 + 六维对照(带内 ✓ / 出带 ⚠)。只有偏离明显(≥2 倍容差)或读起来确实别扭时才改——单一维度轻微出带属正常波动,不要为对齐数字改文 |
| ④ 改稿 | 「把这章排成改稿清单」 | novel_fix_plan | 按「严重度 → 难度 → 行号」排序的待办(默认上限 12 条),每条带原句行号、当前值/目标值、锚段与改写方向;分批改(同段同类合并),改完最多 verify 一次 |
| ⑤ 跨章体检 | 「看看全书结构」 | novel_plot { action: "graph" } | 伏笔埋设跨度 / 人物连续缺席区间 / 剧情线最大空档 / 时间线顺序 / 大纲方向与正文的偏离 |
全程本地、只读优先:开写包与结构视图不写任何文件;改稿台只写自己的清单文件、从不改正文,也不代写正文;语义检索与情感分析零 token。
| 你的困扰 | 这里给的答案 |
|---|---|
| "我续写的这段,读起来不像我自己写的" | 文笔六维基线:从句法复杂度 / 修饰密度 / 抽象度 / 动作密度 / 不确定性 / 留白指数六个维度算出原著的 μ±σ,新章逐维对照,出带标 ⚠ |
| "AI 接着往下写,几章之后文风越来越像 AI 自己,不像原著了" | 基线范围(按全书 / 按部分):基线不必再从全书取样——勾出你认作标杆的那几章(比如你亲手写的前 30 章),自检 / 开写包 / 改稿台 / 风格画像 / 建章都只用这几章当基准,正在检查的那一章永远排除在外。插件不判定「你漂移了」,只告诉你「相对你选的标杆,这章偏了多少」(回应 issue #1「风格漂移」) |
| "AI 说文风变了,但说不清哪儿变了" | 风格自检:相似度 + 偏差清单(哪类句式多了、句长偏了多少、主导情绪有没有换) |
| "动笔前要翻六七个工具,还老漏读一样" | 开写包:一次调用取齐 16 项材料;取不到的在 degraded 里说明缺什么、怎么补——漏读正是文风漂移与设定矛盾的头号来源 |
| "知道这章有问题,但不知道先改哪句" | 改稿台:按「严重度 → 难度 → 行号」排好待办,每条给原句行号 / 当前值与目标值 / 原著锚段 / 改写方向;改完可三态复测 |
| "线断了、人丢了、伏笔忘了——写到后面才崩" | 结构视图:跨章算出伏笔埋设跨度、人物连续缺席区间、剧情线最大空档、时间线顺序、大纲与正文的偏离 |
| "分析小说要花钱调 API" | 语义检索与情感分析全本地推理,零 token 花费 |
| "伏笔埋了忘了收" | 伏笔登记表:add / list / scan / done,自动记录每条伏笔在哪些章被提到 |
| "人物设定前后打架" | 设定五张表 + 连贯性审计(衔接 / OOC / 大纲走偏三件套) |
| "报告看不懂" | 全是表格化数字 + 原文锚段,可以直接截图分享 |
| "出错了只给一句话,说不清为什么反复出错" | 诊断报告(novel_diagnose):读本地事件日志 + 五处体检(书库根 / 书库内容 / 数据目录损坏 / 语义引擎 / 开关快照),聚合「工具 × 书名」反复出问题的组合、高频失败类型与可执行建议;报告走分享层(自由文本整体剔除、错误一律归类成固定 code),可安全贴进 issue——报 bug 请用面板「复制诊断包」或本工具的 report,不要直接附本机日志文件。本地日志以元数据为主(工具名 / 书名 / 章号 / 状态 / 耗时 / 计数 / 路径 / 错误 code),但自由文本字段(错误消息等)经收敛后至多保留一句(≤160 字)——所以本机日志里可能出现被错误消息回显的输入片段;日志文件不出本机,只有离开本机的内容才整体剔除自由文本 |
| "放弃一本书 / 删测试项目,却清理不干净" | 按书删除(novel_delete_book):一本书的资料散在 12 处,这里一处预览、一处清理;按「前缀 + 分隔符边界」匹配文件名(删《孤舟》不会碰到《孤舟子》)。默认只预览,执行时移入回收站(可恢复,同名文件绝不覆盖),要真省空间再 purge |
方式一:npm(推荐)
dsh plugin add dsh-novel-writer
(需要指定配置时加 --profile <名称>,如 --profile desktop。)
方式二:从 GitHub 安装
dsh plugin add github:siweina/dsh-novel-writer#main
方式三:MCP(不用 DSH 也能用) —— 见 MCP 服务器
要求 Node ≥ 22.3。安装后重启 DSH(桌面端 / Web),左栏主导航区出现「写作助手功能」入口(DSH 0.2.0+ 官方席位;更早宿主自动回退旧挂载)。
mkdir -p novels/我的小说 # 把章节文件放进去(第01章.md、第02章.md …)
然后在对话里依次说(这就是完整的一章):
novel_chapter_brief 一次给齐 16 项输入(等于替你跑了 6~8 个工具,且不会漏读)novel_new_chapter 建文件时还会附上基线 μnovel_style_check 给出相似度、偏差清单与六维对照novel_fix_plan 给出按优先级排好的待办;改完再 verify 复测三态想让基线对着你亲手写的那些章、而不是全书?面板「风格基线」里把「范围」切到 按部分、在「挑选章节」里勾出标杆章,再点「保存范围」即可:上面这条链上的自检、开写包、改稿台与风格画像都会改用这几章当基线(按书生效;默认「全书」=旧行为,不动它就跟以前完全一样)。建章(
novel_new_chapter)时附的 μ 摘要与锚段用的是同一份范围。
只想先看看家底,就说 「用 novel_style_report 给我的小说做一次风格画像」:
全书 1329 字:六维基线 μ=句法复杂度:2.3 修饰密度:35.6 抽象度:0.5 动作密度:101.7 不确定性:2.1 留白指数:7.0
推荐容差 25%/35%/100%…
开写包(novel_chapter_brief,动笔前一次调用):
目标:第 8 章《(无标题)》(尚未创建,文件名推导为 第08章.md)
【上一章结尾原文·承接口】…(上一章末尾 300 / 600 字,按 budget 档位) 【待回收伏笔】
【相关人物】- 林昭:守码头的女人,父亲失踪后回到旧宅 - 沈砚:随船出海的人 【世界观用语】欧式中世纪沿海城邦;点烛不烧香|禁用:上香、烧香、时辰、老夫 【风格基线】complexity μ=2.42 modifierDensity μ=22.2 abstractDensity μ=10.06 actionDensity μ=122.45 …(取样范围:全书除本章外的 7 章) 【原著锚段·照这个味道写】[对话] … [心理] … 【上一章自检】第 7 章六维对照:全部维度在容差带内 ✓ 【本章禁用清单】- 禁词:上香(建议改用:点烛) - 禁词:时辰(建议改用:钟点) 【开写清单】□ 先读锚段再动笔 □ 承接上一章结尾 □ …(共 8 步) 【降级/提示】- 钩子记录里没有第 7 章的钩子(上一章钩子未回填)
改稿台(novel_fix_plan,把诊断变成排好序的待办):
改稿台:共 13 项待办(严重度降序 → 难度升序)。抽象度过高 ×3、衔接缺失 ×1、禁用词 ×3、语用不符 ×5、句式偏离 ×1。
备注:留白指数 虽出带但差值 8.36 < 门槛 12,已按「无量级差异」忽略 ← 不误报的绝对量级闸
风格自检(新章 vs 全书基线):
相似度 0.946 · verdict: high
偏差清单:心理占比略多 · 对话占比略少 · 短句占比略少 · 主导情绪由 anger 变为 joy fixAnchors:3 条原著锚段(对话 / 心理 / 描写各一条,供逐句对照修正)
语义检索(自然语言,本地向量):
查询「与那盏没有点的灯有关的段落」→
第02章.md 0.619 对街那盏灯,亮了。 第01章.md 0.593 阿澈的目光越过老周的肩膀,落在对街那栋小楼上…
段落结构:共 34 段(对话 5 / 心理 0 / 混合 15 / 叙述 14)
| 本插件 | 在线 AI 写作工具 | 通用文本分析库 | |
|---|---|---|---|
| 正文是否离开本机 | 否 | 是 | 视实现 |
| 花费 | 0(本地推理) | 按 token 计费 | 自建 |
| 中文小说专用 | 是 | 通用 | 否 |
| 风格基线(μ±σ) | 有 | 少见 | 无 |
| 与 DSH 集成 | 21 个工具 + 官方席位与统一面板 | 无 | 无 |
| 非 DSH 用户可用 | 可以(MCP) | 可以 | 需自己封装 |
致非中文用户:本插件为中文小说分析写作而设计——句式、情感、意象等核心能力以及内置的语义模型,全部针对中文语料构建与调优。在深耕中文的同时兼顾英文等其他语言,确实超出了我目前的能力范围。若因此给您带来不便,我深感抱歉,恳请谅解。
novel_chapter_brief 开写包——动笔前一次调用取齐材料(上一章承接口 / 本章方向 / 相关人物 / 待回收伏笔 / 用语规范 / 风格基线 / 锚段与骨架 / 禁用清单 / 开写清单,两档 budget:compact / full),取不到的材料进 degraded 并说明原因,只读不写盘;novel_fix_plan 改稿台——把风格诊断变成按优先级排好的待办(原句行号定位 + 当前值与目标值 + 原著锚段 + 改写方向),plan / verify / mark 三态复测,只给方向、不生成正文;novel_plot { action: "graph" } 结构视图——伏笔埋设跨度 / 人物连续缺席 / 剧情线空档 / 时间线顺序 / 大纲对照。另有场景化提示词(general / writing / revising / auditing / setup,general 即旧行为)。.novel-writer/style-reports/),续写保持风格一致。novel_semantic_search 自然语言搜全书语义相关段落(带章节定位),语义级风格对比、语义隐性情感,懒加载 + 自动回退。细节密度口径(v7.0.0):动作 / 物件 / 视觉 / 听觉 / 嗅觉 / 触觉 / 温度七个通道的词表加了上下文豁免层——「一点」「根本」「一样」「痛苦」「干净」「温柔」这类虚词搭配不再计数(同一章实测降约 15%~20%),报告会多渲染一行口径说明;同一章的新旧数值不可直接比较,跨章比较只用同一口径的数值。
情感复杂度与置信度联动(v6.6.5):结论不可采信时(污染命中阈值、全文零情感词命中,或没有可用的 clean 情感计数)不再给顶格结论——complexity.level 标为 unknown,并附 reliable: false 与 reliabilityNote 说明原因,渲染文本里也会单独一行写出这句警告;score 保留数值便于跨章对比。成人向内容 / 感官描写密集的文本,情感维度本就不适用,建议改用节奏、爽点、对话密度等维度。
PreferenceRow 承载,开关本身就是状态(开着的开关不再整行变蓝、也不再贴「已开启」),描述只写「对你有什么用」,工具 ID 与参数不进主文案。颜色全走 --dsw-alias-* 语义 token(三主题与官方同源)、控件用官方 UI primitives、DeepSeek 蓝只留给「唯一主操作」与需要注意的状态,各级页面等宽。v6.7.0 面板视觉改版:lib/client.js 渲染层重写、视觉系统 CSS 4.6 KB → 19.4 KB、52 枚线图标(每个工具行一枚专属图标),文件路径 / 数据目录占用 / state.json 统一收进页面底部的「存储位置」折叠区,首页「功能与工具」的「语义模型」一行显示引擎状态;功能面完全不变(8 个视图 / 工具集 / 后端路由在 6.7.0 内零改动),设计规格见仓库内 tools/UI-REDESIGN.md。 界面底座(方案 A):源码分块 + 构建链装配(构建失败不写盘、--check 校验源与产物一致)、统一组件(PreferenceRow 单一行模式、GroupCard 分组卡、StorageDisclosure 存储位置折叠区等)、页面级 push-pop 过渡动画(零 state / 零 hook)。
novel_style_report 输出基线带,novel_style_check 对照新章偏差(带内 ✓ / 出带 ⚠);面板「风格基线」页的「文风六项指标」分区可自定义每维 ±% 容差(每维一行:指标名 + 「低于」「高于」两个百分比输入框;推荐值 = 原著章节波动的 1.5 倍 σ,自动取整、限 ±10%~100%;输入框留空即用推荐)——原创/续写时主题自由、写法保持在基线带内。基线范围(v6.5.5,按书选择):基线不必永远是全书——面板「风格基线」里选全书(默认,等于旧行为)/ 按部分,再用章节选择器勾出你认作标杆的章,基线就只用这几章(是「只用」,不是「不够再补」)。这是给「AI 续写越写越像 AI 自己」准备的:从第 2 章续写起,模型参考的其实是它自己写的上一章,而从全书取样的基线自己也在漂(书越长 AI 占比越高)。把标杆钉死在你亲手写的那些章上,插件就能回答「相对这几章,新章偏了多少」——它不判断你有没有漂移,那一项本就不可判定。正在检查的那一章永远排除(否则等于拿自己跟自己比);勾中的章少于 3 章时推荐容差自动放宽到至少 ±25%,所以单章也能当基线;取不到的章(已改名 / 已删除,或正文过短无法测量)会被跳过并如实计数,一章都取不到时自动回退「按全书」并在返回体里写明原因。范围按书保存(<书库根>/.novel-writer/baseline/<书名>.json),换书互不影响。 六维口径未变(v7.0.0):本次只换了细节密度的词表,这六维的算法与数值都没动,新旧报告可以直接比。
novel_continuity_check 扩展——①衔接检查(chapter 参数:时间硬跳/语义距离/人物延续/钩子承接四路检测,带原文引用)②OOC 检测(ooc 参数:角色情绪基线偏离)③大纲走偏(outline 参数:方向行 vs 正文关键词重合);报告工具支持 brief 精简模式。7 天未动,以及每本书旁的删除整本书…快捷入口);首页第一个分区里还有一行「删除整本书」——点进去是独立页面:选书 → 看清清理清单 → 勾选执行,页面下方就是回收站(恢复 / 彻底删除)。原来独立的「书库统计」卡已并入书库概况这一行;「记录与维护」里有体验演示(内置示例不落盘跑六项文风指标,不保存任何内容)、报告历史(已保存的句式分析与风格报告,按书分组,每份都可单独删除——删除走回收站,仍可恢复)与诊断报告(统计窗口 + 一键复制诊断包,用于贴进 issue);错误提示带解决步骤;工具说明压缩省 token。v7.0.0 修尺子:细节密度词表去噪、动作链示例改为完整句等距抽样 3 条、面板「诊断报告」页新增「度量口径」区可一键重建旧口径缓存(只删派生缓存,不动你选的基线范围)。
llm/stream 那一层会丢弃这次输出并只重试一次(重试只在系统消息尾部追加写作指令,不改你的输入);写完后:novel_style_check 给出「本章 X 处/千字 vs 原著 Y 处/千字」与一句结论(clean / new / similar / softer / much-softer / more-explicit)——干的是「有没有被绕过去」的核对,不是评分。已知边界:直白度量是启发式(只数明确的淡化写法);重试只一次且只认三类自我刹车特征;这一层依赖宿主 llm/stream,服务缺失时安静跳过并在日志留痕;效果取决于模型本身,插件不保证产出。每个工具的参数、返回结构与示例,见在线工具手册。
| 工具 | 说明 |
|---|---|
novel_books | 列出章节库全部作品 |
novel_chapters | 列出某作品章节清单 |
novel_read | 阅读某章正文(分段) |
novel_keywords | 关键词:二字组/三字组/疑似人名 |
novel_new_chapter | 创建新章节文件 |
novel_import | 原稿件批量导入/分类 |
novel_sentence_analysis | 句式模式分析(九类/情感净化/量化/曲线/指纹) |
novel_sentence_config | 查看/修改工具与功能开关(含提示词场景) |
| `nov
ตัดมาแค่ช่วงต้น อ่านต่อใน repo