lookatstudy-mobile 0.12.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.
Files changed (77) hide show
  1. package/README.txt +19 -0
  2. package/install-termux.sh +327 -0
  3. package/package.json +10 -0
  4. package/seed-course.json +679 -0
  5. package/server.cjs +495218 -0
  6. package/sql-wasm.wasm +0 -0
  7. package/web/assets/abnfDiagram-N423BO3Z-BFNTWI49.js +1 -0
  8. package/web/assets/api-web-BSU76jU3.js +1 -0
  9. package/web/assets/app-height-D5bf5z0g.js +1 -0
  10. package/web/assets/arc-Ci0WYiAH.js +1 -0
  11. package/web/assets/architectureDiagram-T3A2C74G-DX5jRTha.js +36 -0
  12. package/web/assets/blockDiagram-VBNYF7ZC-DjzKFpxY.js +132 -0
  13. package/web/assets/c4Diagram-5PPSVZJV-CIG-Sdcg.js +10 -0
  14. package/web/assets/channel-BmMZwizg.js +1 -0
  15. package/web/assets/chunk-2GRJ4B5K-D1h0uIyK.js +1 -0
  16. package/web/assets/chunk-2Q5K7J3B-cLoZ93yC.js +1 -0
  17. package/web/assets/chunk-5RXB4S5H-CSaMcbxs.js +231 -0
  18. package/web/assets/chunk-5VM5RSS4-JLvS-B89.js +15 -0
  19. package/web/assets/chunk-6Q2QTUOP-DXM7xtsH.js +88 -0
  20. package/web/assets/chunk-GF5L2VYU-BMXbp2Lo.js +206 -0
  21. package/web/assets/chunk-JWPE2WC7-DPQPMhNL.js +1 -0
  22. package/web/assets/chunk-KBJHAD2P-Bh3aU5gZ.js +1 -0
  23. package/web/assets/chunk-RYQCIY6F-wL-LEvWn.js +1 -0
  24. package/web/assets/chunk-XXDRQBXY-BPEP-05C.js +1 -0
  25. package/web/assets/classDiagram-JCYQIIEL-vXvWKIQn.js +1 -0
  26. package/web/assets/classDiagram-v2-OCEON4UE-vXvWKIQn.js +1 -0
  27. package/web/assets/cose-bilkent-JH36ORCC-CIy59RcY.js +1 -0
  28. package/web/assets/cynefin-VYW2F7L2-jbV2BJ_V.js +178 -0
  29. package/web/assets/cynefinDiagram-MW4NZA55-Cc7aMDYj.js +62 -0
  30. package/web/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
  31. package/web/assets/dagre-VZM6K2ZE-Dsdu5Zt7.js +4 -0
  32. package/web/assets/defaultLocale-DX6XiGOO.js +1 -0
  33. package/web/assets/diagram-7IWD3JNH-DJ4Yft6o.js +30 -0
  34. package/web/assets/diagram-B4RE2ZJO-CBh3xkIP.js +3 -0
  35. package/web/assets/diagram-LBJQPF4R-C-Iljnoj.js +24 -0
  36. package/web/assets/diagram-Q27KOJAE-8HHiRyk2.js +24 -0
  37. package/web/assets/diagram-UB23O5K3-C3K2kFAQ.js +41 -0
  38. package/web/assets/ebnfDiagram-BXEA7PRR-r1mdnIKj.js +1 -0
  39. package/web/assets/erDiagram-JOGREHBK-dYLNtxz3.js +85 -0
  40. package/web/assets/flowDiagram-UKHOOZJN-BYDIRoMm.js +156 -0
  41. package/web/assets/ganttDiagram-PKOTCBZU-CnCtvDzl.js +292 -0
  42. package/web/assets/gitGraphDiagram-DS77QQ5N-rG8kwFmL.js +106 -0
  43. package/web/assets/graph-C9eacEi8.js +1 -0
  44. package/web/assets/index-132uBtFQ.css +1 -0
  45. package/web/assets/index-CG9cZjNC.js +548 -0
  46. package/web/assets/infoDiagram-6WML65LV-BTcUhfqr.js +2 -0
  47. package/web/assets/init-Gi6I4Gst.js +1 -0
  48. package/web/assets/ishikawaDiagram-WSZJBQD7-CJviqcY8.js +70 -0
  49. package/web/assets/journeyDiagram-NVQOT4AX-8JWo64Wa.js +139 -0
  50. package/web/assets/kanban-definition-27J2QSJJ-BHD0yFL_.js +89 -0
  51. package/web/assets/katex-C5jXJg4s.js +257 -0
  52. package/web/assets/layout-DEXfKzaS.js +1 -0
  53. package/web/assets/linear-CT2ADXOb.js +1 -0
  54. package/web/assets/map-Czzmt4hB.js +1 -0
  55. package/web/assets/mermaid.core-DntY_Zhl.js +314 -0
  56. package/web/assets/mindmap-definition-FAOFIHXS-B_yUIQHi.js +96 -0
  57. package/web/assets/ordinal-Cboi1Yqb.js +1 -0
  58. package/web/assets/pegDiagram-VL7TDLO6-BopqqStm.js +1 -0
  59. package/web/assets/pieDiagram-7S7Q4E2Y-Com2ypw6.js +39 -0
  60. package/web/assets/quadrantDiagram-CIZ2JOQS-G0dlgjbr.js +7 -0
  61. package/web/assets/railroadDiagram-AXF67PYL-ChpuDwPP.js +1 -0
  62. package/web/assets/requirementDiagram-LRYGKXZP-CDD5pE1Z.js +84 -0
  63. package/web/assets/sankeyDiagram-W5VNT64P-DO-0GGh4.js +40 -0
  64. package/web/assets/sequenceDiagram-SI44F4Z6-__Qnpiz7.js +162 -0
  65. package/web/assets/sizeCapture-X5ZJPWSS-BxPWVmpa.js +1 -0
  66. package/web/assets/stateDiagram-OKZ733FA-DD0m6rt6.js +1 -0
  67. package/web/assets/stateDiagram-v2-UEYNNEHI-BHOUKhEe.js +1 -0
  68. package/web/assets/swimlanes-SLNWSIFB-m5XzOcas.js +2 -0
  69. package/web/assets/swimlanesDiagram-ULZ7WXOC-Bs3hfWP0.js +8 -0
  70. package/web/assets/timeline-definition-Z64GVDOM-D19Nd7I_.js +120 -0
  71. package/web/assets/vennDiagram-T6HMQDX7-DqFIJV1L.js +34 -0
  72. package/web/assets/wardleyDiagram-T6FBY63Y-CKVK_9QD.js +78 -0
  73. package/web/assets/xychartDiagram-ELKLHX3M-B85Rr0Fa.js +7 -0
  74. package/web/icon-192.png +0 -0
  75. package/web/icon-512.png +0 -0
  76. package/web/index.html +53 -0
  77. package/web/manifest.webmanifest +31 -0
@@ -0,0 +1,679 @@
1
+ {
2
+ "version": 1,
3
+ "courseId": "seed-lookatstudy-guide",
4
+ "course": {
5
+ "id": "seed-lookatstudy-guide",
6
+ "repoUrl": null,
7
+ "repoName": "LookatStudy Guide",
8
+ "title": "LookatStudy 使用指南",
9
+ "description": "学习如何使用 LookatStudy 的全部功能——从导入课程到 AI 导师到间隔重复",
10
+ "labType": "doc"
11
+ },
12
+ "locale": "zh-CN",
13
+ "nodes": [
14
+ {
15
+ "id": "guide-sec-1",
16
+ "parentId": null,
17
+ "type": "section",
18
+ "title": "快速上手",
19
+ "sourcePath": "ch1",
20
+ "orderIdx": 0,
21
+ "content": null,
22
+ "summary": "认识 LookatStudy、导入第一个课程、三栏布局导览",
23
+ "summaryEn": "Meet LookatStudy, import your first course, and tour the three-pane layout"
24
+ },
25
+ {
26
+ "id": "guide-les-1-1",
27
+ "parentId": "guide-sec-1",
28
+ "type": "lesson",
29
+ "title": "欢迎使用 LookatStudy",
30
+ "sourcePath": "ch1/lesson-1.md",
31
+ "orderIdx": 0,
32
+ "content": "# 欢迎使用 LookatStudy\n\n**LookatStudy** 是一个本地优先、AI 驱动的桌面学习平台。它能把任意 GitHub 学习仓库或本地文件夹变成一个多邻国式的互动课程——带有技能地图、AI 导师、间隔重复和游戏化激励。\n\n## 它能帮你做什么\n\n- 📚 **把任何仓库变课程**:粘贴 GitHub URL 或选择本地文件夹,10 种文档格式(Markdown / Jupyter / RST / PDF / PPTX / HTML 等)+ 30 多种代码语言自动解析成结构化课程,图片也能带进来\n- 🗺️ **技能地图导航**:多邻国风格的气球节点地图,随滚动从清晨飘到夜晚,逐课解锁,视觉化你的学习进度\n- 🤖 **AI 个人导师**:每个知识点独立追踪掌握度(BKT),AI 根据你的理解程度动态调整教学策略,还能看见你最近的卡点\n- 📝 **康奈尔笔记本**:三区设计(理解 / 笔记 / 练习),AI 生成概念图、对比表、流程图,你画线加笔记\n- 🔁 **间隔重复**:SM-2 算法安排复习,连续打卡 + XP + 皇冠激励持续学习\n\n## 设计理念\n\n- **本地优先**:所有数据存在本地 SQLite,你的学习记录永远在你手里\n- **BYO Key**:自带 LLM API Key,你的对话不经过任何中间服务器\n- **AI 起草、人确认**:AI 永远不直接修改你的学习记录——每次状态变更都通过 Propose → Apply 协议,你审批后才生效\n\n## 从哪里开始\n\n每次启动 LookatStudy 都从「未选课程」状态开始:在左侧「导入课程」面板里选择一门已导入的课程开始学习,或者导入新课程。点开下一课「导入你的第一个课程」了解全部导入方式!",
33
+ "summary": "了解 LookatStudy 是什么、它能帮你做什么",
34
+ "summaryEn": "What LookatStudy is and what it can do for you"
35
+ },
36
+ {
37
+ "id": "guide-les-1-2",
38
+ "parentId": "guide-sec-1",
39
+ "type": "lesson",
40
+ "title": "导入你的第一个课程",
41
+ "sourcePath": "ch1/lesson-2.md",
42
+ "orderIdx": 1,
43
+ "content": "# 导入你的第一个课程\n\nLookatStudy 支持三种导入方式,覆盖几乎所有学习材料来源。\n\n## 方式一:GitHub URL\n\n在左侧「导入课程」面板粘贴 GitHub 仓库地址。智能导入管线会自动:拉取 README 识别课程大纲、扫描完整文件树(文档 + 代码 + 翻译)、AI 判断每个文件的角色、AI 设计章节结构、图片自动内联。\n\n## 方式二:本地文件夹\n\n点击本地文件夹按钮,选择一个包含学习材料的文件夹。支持递归扫描子目录,自动识别文档、代码、图片、翻译。\n\n适用场景:下载的课程包、本地 clone 的仓库、自己整理的学习笔记文件夹。\n\n## 方式三:粘贴 Markdown\n\n直接粘贴 Markdown 文本。适用场景:私有仓库、网络受限环境、快速把一段笔记变成课程。\n\n## 导入是后台任务\n\n点击导入后任务立即进入后台:进度窗口实时显示每一步和耗时,期间你可以切走继续浏览其他课程,导入完成后会弹通知提醒,不会强制跳转。中途可以随时取消。\n\n## 课程管理\n\n课程列表里悬浮课程行可以删除(就地弹确认卡片,不会跳界面);正在学习的课程也可以直接删——地图头课程名旁有删除按钮,删除后回到「未选课程」初始状态。删除会清掉该课程的全部学习记录,不可撤销。",
44
+ "summary": "三种导入方式、后台导入任务、课程删除",
45
+ "summaryEn": "Three import routes, background import jobs, and course removal"
46
+ },
47
+ {
48
+ "id": "guide-les-1-3",
49
+ "parentId": "guide-sec-1",
50
+ "type": "lesson",
51
+ "title": "三栏布局导览",
52
+ "sourcePath": "ch1/lesson-3.md",
53
+ "orderIdx": 2,
54
+ "content": "# 三栏布局导览\n\nLookatStudy 采用三栏布局,每一栏对应学习的不同环节。支持浅色 / 深色 / 跟随系统三种主题。\n\n## 左栏:课程地图与导入\n\n左栏顶部有两个标签:「导入课程」和「课程地图」。地图是多邻国风格的气球节点地图——每个气球代表一个课时,随着你向下学习,背景天空从清晨渐变到夜晚。\n\n地图标题卡显示课程名、整体掌握度百分比、待复习徽章、🌐 语言切换(多语言课程可在此切换原文/翻译)和删除当前课程按钮。\n\n## 中栏:AI 对话\n\n与 AI 导师的交互区域:顶部会话标签页(每个课时可以有多个对话线程)、对话流(AI 回复流式输出,提议卡、概念图等会持久保存)、底部输入区(含教学人设药丸、字号 A-/A+、四个巩固选择按钮)。\n\n按 Ctrl+K 打开命令面板,Ctrl+Tab 循环切换会话,Ctrl+B 折叠/展开左栏。\n\n## 右栏:康奈尔笔记本\n\n三区设计的笔记本:讲解 Tab 显示课时正文(Markdown 渲染),可以选中文字画线加笔记。笔记 Tab 包含三个区域——理解区(AI 产物)、笔记区(你的画线笔记)、练习区(测验 + 答题记录)。\n\n## 焦点锁定\n\n当 AI 正在回复时,切换课时和会话会被临时锁定——确保你不会在 AI 输出到一半时丢失上下文。",
55
+ "summary": "技能地图 · AI 对话 · 康奈尔笔记本",
56
+ "summaryEn": "Skill map, AI chat, and the Cornell notebook"
57
+ },
58
+ {
59
+ "id": "guide-exam-1",
60
+ "parentId": "guide-sec-1",
61
+ "type": "exam",
62
+ "title": "快速上手 · 章节测验",
63
+ "sourcePath": null,
64
+ "orderIdx": 3,
65
+ "content": null,
66
+ "summary": null,
67
+ "summaryEn": null
68
+ },
69
+ {
70
+ "id": "guide-sec-2",
71
+ "parentId": null,
72
+ "type": "section",
73
+ "title": "技能地图",
74
+ "sourcePath": "ch2",
75
+ "orderIdx": 1,
76
+ "content": null,
77
+ "summary": "节点状态、双线推进、知识点级掌握度、章节考试",
78
+ "summaryEn": "Node states, dual-track progression, per-knowledge-point mastery, and chapter exams"
79
+ },
80
+ {
81
+ "id": "guide-les-2-1",
82
+ "parentId": "guide-sec-2",
83
+ "type": "lesson",
84
+ "title": "气球节点与解锁机制",
85
+ "sourcePath": "ch2/lesson-1.md",
86
+ "orderIdx": 0,
87
+ "content": "# 气球节点与解锁机制\n\n技能地图上每个气球节点代表一个课时,有四种状态:\n\n| 状态 | 外观 | 含义 |\n|------|------|------|\n| 🔒 locked | 灰色半透明 | 还未解锁 |\n| 🟢 available | 彩色可点击 | 已解锁,可以开始学习 |\n| 🔵 in_progress | 彩色 + 进度环 | 正在学习中 |\n| ⭐ mastered | 金色光环 | 已掌握(短板知识点达标)|\n\n## 解锁逻辑\n\nLookatStudy 采用双线推进策略,不会让你卡死在某一个课时上:点当前章节任意一课时,同时解锁同章的下一课和下一章节的第一课。实操(practice)课时默认可学,不阻塞主线。\n\n## 掌握度看短板\n\n每节课会被拆成若干知识点(KC),每个知识点独立计算掌握概率。课时掌握度取**所有知识点中的最低值**——任何一个知识点没跟上,这节课就不算掌握(防「假毕业」)。技能球上的进度环显示的就是这个短板值。\n\n详见第三章「知识点级 BKT」。",
88
+ "summary": "locked → available → in_progress → mastered",
89
+ "summaryEn": "Locked → available → in progress → mastered"
90
+ },
91
+ {
92
+ "id": "guide-les-2-2",
93
+ "parentId": "guide-sec-2",
94
+ "type": "lesson",
95
+ "title": "双线推进策略",
96
+ "sourcePath": "ch2/lesson-2.md",
97
+ "orderIdx": 1,
98
+ "content": "# 双线推进策略\n\n传统的线性课程有一个痛点:卡在某一课就完全停滞。LookatStudy 用双线推进解决这个问题。\n\n## 什么是双线推进\n\n当你点击当前章节的任意一个课时开始学习时,系统同时解锁同章下一课(保持逐课推进感)和下一章首课(确保你总能探索新内容)。\n\n## 为什么这样设计\n\n- **防卡死**:某课太难?先去下一章换个主题,回头再战\n- **保连贯**:同章内仍然是线性的,不会跳来跳去\n- **给选择**:你可以按顺序学完一章再进下一章,也可以先广泛探索再回头深入\n\n## 实操世界不阻塞\n\n课程如果有实操(practice)内容,会出现在地图的「实操」标签世界里,默认全部可学。你可以随时动手练,不需要先学完所有理论课——边学边练。\n\n## 章节考试\n\n每个有至少 2 个讲解课时的章节会自动添加一个章节考试节点(关底 boss)。整章课时掌握度都达标后考试解锁——详见下一课。",
99
+ "summary": "同章下一课 + 下一章首课同时解锁",
100
+ "summaryEn": "The next lesson in this chapter and the first lesson of the next chapter unlock together"
101
+ },
102
+ {
103
+ "id": "guide-les-2-3",
104
+ "parentId": "guide-sec-2",
105
+ "type": "lesson",
106
+ "title": "章节考试:生成、限时与结算",
107
+ "sourcePath": "ch2/lesson-3.md",
108
+ "orderIdx": 2,
109
+ "content": "# 章节考试\n\n章节考试是每章的关底 boss:🎯 节点,考过显示 1-3 星。整章所有课时掌握度达标后解锁。\n\n## 后台生成题库\n\n点开考试节点后,AI 按本章知识点分批出题,进度显示「已覆盖 X / Y 个知识点」。生成期间你可以切去看别的课时——任务在后台继续,完成后弹通知提醒。回来后看到就绪页:N 道题、覆盖 M 个知识点、预计时长,点「开始考试」才真正开始。\n\n## 每题限时\n\n每道题独立倒计时:普通题 60 秒,长题干或含代码的题 90 秒。到时自动记录当前选择并进入下一题。\n\n## 离开即终止\n\n考试进行中切换课时或课程会弹出警告:确认离开则本次考试终止,未答的题按答错计分。\n\n## 结算页\n\n提交后看到结算:星数、正确率、**按知识点分组的成绩分解**(薄弱知识点会标注建议复习)、逐题回顾(你的答案 vs 正确答案 + 解析)。切回考试节点默认显示上次成绩,也可以看到历史最好星数和考试次数。\n\n## 重新考试\n\n可以无限次重考。重考使用同一题库,但题目顺序和选项顺序都会重新打乱——考的是理解不是记忆。\n\n## 考试不影响学习模型\n\n考试是独立检验:结果只更新星数和 XP,**不回写**知识点掌握度。你的 BKT 学习记录只由日常答题和自评驱动,不会被一次考试搅动。",
110
+ "summary": "后台按知识点出题、每题限时、星级结算与重考",
111
+ "summaryEn": "Questions generated per knowledge point in the background, a timer per question, star scoring and retakes"
112
+ },
113
+ {
114
+ "id": "guide-exam-2",
115
+ "parentId": "guide-sec-2",
116
+ "type": "exam",
117
+ "title": "技能地图 · 章节测验",
118
+ "sourcePath": null,
119
+ "orderIdx": 3,
120
+ "content": null,
121
+ "summary": null,
122
+ "summaryEn": null
123
+ },
124
+ {
125
+ "id": "guide-sec-3",
126
+ "parentId": null,
127
+ "type": "section",
128
+ "title": "AI 导师",
129
+ "sourcePath": "ch3",
130
+ "orderIdx": 2,
131
+ "content": null,
132
+ "summary": "教学人设、知识点级 BKT、Propose→Apply 协议",
133
+ "summaryEn": "Teaching personas, per-knowledge-point BKT, and the Propose→Apply protocol"
134
+ },
135
+ {
136
+ "id": "guide-les-3-1",
137
+ "parentId": "guide-sec-3",
138
+ "type": "lesson",
139
+ "title": "教学人设与对话",
140
+ "sourcePath": "ch3/lesson-1.md",
141
+ "orderIdx": 0,
142
+ "content": "# 教学人设与对话\n\nAI 导师的教学姿态由**教学人设(soul)**决定,在输入框内的人设药丸中切换。\n\n## 三种内置人设\n\n| 人设 | 风格 | 适用场景 |\n|------|------|---------|\n| 🎯 精讲 | worked-example + 费曼式直给 | 新手、低电量时友好 |\n| 🧭 引导 | 有挣扎才有成长,用问题带你自己走 | 有一定基础时 |\n| 🔧 实战 | 围绕真实世界问题做项目式学习 | 想动手应用时 |\n\n人设只影响教法,不影响知识本身——同一个知识点,精讲会直接拆解讲透,引导会追问你确定吗,实战会拉一个真实场景让你上手。\n\n## 开始学习\n\n进入课时后中栏有「🚀 开始学习」按钮。它会用一个好奇心钩子开场,再给你一个二选一小猜测——就是玩,不计分。先把人勾进来,动量起来再正式讲。\n\n## 四个巩固选择\n\n开始对话后,输入框上方常驻四个按钮:**深入这点**(精加工)、**举个例子**(具体化)、**考考我**(检索练习)、**我没太懂**(说出困惑,会顺手记下卡点)。不知道问什么时,点一个试试。",
143
+ "summary": "精讲 / 引导 / 实战三种人设,开始学习与巩固选择",
144
+ "summaryEn": "Three personas — direct, guided, hands-on — plus start-learning and consolidation picks"
145
+ },
146
+ {
147
+ "id": "guide-les-3-2",
148
+ "parentId": "guide-sec-3",
149
+ "type": "lesson",
150
+ "title": "知识点级 BKT 掌握度",
151
+ "sourcePath": "ch3/lesson-2.md",
152
+ "orderIdx": 1,
153
+ "content": "# 知识点级 BKT 掌握度\n\nLookatStudy 不用简单的正确率来衡量你的掌握程度——它用 BKT(贝叶斯知识追踪)模型,而且精确到**每个知识点**。\n\n## 什么是 BKT\n\nBKT 是教育数据挖掘领域经典的掌握度模型。它维护一个 0 到 1 之间的概率值,表示你真正掌握这个知识点的概率。\n\n每次你答题,BKT 会用贝叶斯更新来调整这个概率:答对了掌握概率上升(但不是 100%——可能猜对的),答错了下降(但不是 0%——可能手滑的)。\n\n## 知识点(KC)粒度\n\n每节课拆成若干个知识点,每个 KC 独立跑 BKT。课时掌握度 = 所有 KC 中的**最低值**——短板决定成败,任何一个知识点没跟上,这节课就不会标记为已掌握。这防止「大部分懂了就蒙混过关」的假毕业。\n\n## 两个阈值\n\n- 掌握度 ≥ 0.5:解锁后续课时(可以往下走)\n- 掌握度 ≥ 0.9:本课毕业(金色皇冠)\n\n## 哪些行为更新 BKT\n\n对话中答题、练习区测验、复习自评都会更新对应知识点的掌握度。**章节考试除外**——考试是独立检验,不回写学习模型。\n\n## AI 怎么用掌握度\n\nAI 导师能看到你对每个知识点的掌握概率和最近的卡点:低掌握度时更详细讲解多用类比,高掌握度时给出更高级的挑战,中等时检查理解确认没有误解。",
154
+ "summary": "每个知识点独立追踪,课时掌握度看短板",
155
+ "summaryEn": "Each knowledge point tracked on its own; lesson mastery follows your weakest one"
156
+ },
157
+ {
158
+ "id": "guide-les-3-3",
159
+ "parentId": "guide-sec-3",
160
+ "type": "lesson",
161
+ "title": "Propose → Apply 协议",
162
+ "sourcePath": "ch3/lesson-3.md",
163
+ "orderIdx": 2,
164
+ "content": "# Propose → Apply 协议\n\nLookatStudy 的核心设计原则之一:AI 永远不直接修改你的学习记录。\n\n## 为什么需要这个协议\n\nAI 会犯错(幻觉、误判)。如果 AI 能直接改你的掌握度、标记已掌握、调整进度——一旦出错,你的学习数据就被污染了。\n\n## 协议流程\n\n1. AI 判断需要变更,起草提案(Proposal)\n2. 你在对话流里看到提议卡——例如「AI 建议你已掌握这节课」,附带它的判断理由和采纳后果\n3. 点「确认掌握」生效,或点「再练练」拒绝\n\n提议卡有三种状态:待决(绿色卡片等你选)、已采纳(金色对勾)、已忽略(灰色划掉)。卡片会持久保存——切走再回来还在,状态不丢。\n\n## 你始终拥有最终决定权\n\n大多数学习 App 在后台静默修改你的进度数据。LookatStudy 把这个过程透明化——你能看到 AI 想改什么、为什么改,然后自己决定。",
165
+ "summary": "AI 起草状态变更,你确认后才生效",
166
+ "summaryEn": "The AI drafts state changes; they only take effect once you approve"
167
+ },
168
+ {
169
+ "id": "guide-exam-3",
170
+ "parentId": "guide-sec-3",
171
+ "type": "exam",
172
+ "title": "AI 导师 · 章节测验",
173
+ "sourcePath": null,
174
+ "orderIdx": 3,
175
+ "content": null,
176
+ "summary": null,
177
+ "summaryEn": null
178
+ },
179
+ {
180
+ "id": "guide-sec-4",
181
+ "parentId": null,
182
+ "type": "section",
183
+ "title": "康奈尔笔记本",
184
+ "sourcePath": "ch4",
185
+ "orderIdx": 3,
186
+ "content": null,
187
+ "summary": "三区设计、画线溯源、生成式 UI",
188
+ "summaryEn": "Three-zone design, highlights with source links, and generative UI artifacts"
189
+ },
190
+ {
191
+ "id": "guide-les-4-1",
192
+ "parentId": "guide-sec-4",
193
+ "type": "lesson",
194
+ "title": "三区设计:理解 / 笔记 / 练习",
195
+ "sourcePath": "ch4/lesson-1.md",
196
+ "orderIdx": 0,
197
+ "content": "# 三区设计:理解 / 笔记 / 练习\n\nLookatStudy 的右栏笔记本基于康奈尔笔记法(Cornell Notes),分为三个区域。\n\n## 🗺️ 理解区(AI 产物)\n\nAI 生成的可视化学习辅助:概念图(知识点关系网络)、对比表(相似概念异同对比)、流程图(步骤可视化)、代码讲解(逐行注释)。这些是 AI 在你学习时自动生成的。\n\n## ✏️ 笔记区(你的画线笔记)\n\n你在讲解页面上选中文字画线加笔记的所有标记:每条画线保留原始文字,可以添加批注,点击画线可以溯源跳转回原文对应位置。\n\n## 📝 练习区(测验 + 答题记录)\n\n该课时的练习题和你的答题历史:AI 生成的测验题,每次答题结果都保留,答错的题目会在间隔重复系统中安排复习。\n\n## 两个 Tab\n\n右栏顶部有两个 Tab:讲解 Tab 显示课时正文(Markdown 渲染),笔记 Tab 展示上述三区。讲解和笔记分开,让你在阅读正文时不被笔记干扰。",
198
+ "summary": "康奈尔笔记法在 LookatStudy 的实现",
199
+ "summaryEn": "How the Cornell note-taking method is realized in LookatStudy"
200
+ },
201
+ {
202
+ "id": "guide-les-4-2",
203
+ "parentId": "guide-sec-4",
204
+ "type": "lesson",
205
+ "title": "画线加笔记与溯源跳转",
206
+ "sourcePath": "ch4/lesson-2.md",
207
+ "orderIdx": 1,
208
+ "content": "# 画线加笔记与溯源跳转\n\n## 怎么画线\n\n在右栏讲解 Tab 中用鼠标选中一段文字,选中后会出现加笔记按钮,点击后选中的文字被高亮标记并可添加批注。画线会持久保存。对话中 AI 的回复也可以选中画线。\n\n## 溯源跳转\n\n每条画线笔记都带有溯源链接。在笔记 Tab 的笔记区点击任意一条画线,自动跳回讲解 Tab(或对应会话),滚动到画线对应的段落并闪烁高亮。\n\n## 技术原理\n\n画线定位不依赖 DOM 偏移量(ReactMarkdown 重渲染时 DOM 会变,偏移量不稳定)。LookatStudy 用纯文本搜索方案:记录选中文字的内容,在重渲染后重新定位。这保证了画线在 React 重新渲染后仍然准确。\n\n## 对称设计\n\n讲解页面的画线和对话中的画线是对称的——不论来自讲解还是对话,所有画线统一管理在笔记区。",
209
+ "summary": "选中文本画线,带溯源链接跳回原文",
210
+ "summaryEn": "Highlight selected text, with source links that jump back to the original"
211
+ },
212
+ {
213
+ "id": "guide-les-4-3",
214
+ "parentId": "guide-sec-4",
215
+ "type": "lesson",
216
+ "title": "生成式 UI:概念图 / 对比表 / 流程图",
217
+ "sourcePath": "ch4/lesson-3.md",
218
+ "orderIdx": 2,
219
+ "content": "# 生成式 UI\n\nLookatStudy 的 AI 导师不只会输出文字——它会生成交互式可视化组件。\n\n## 六种生成式组件\n\n| 组件 | 用途 |\n|------|------|\n| 🗺️ 概念图 | 展示知识点之间的关系 |\n| 📊 对比表 | 并列对比多个概念 |\n| 📐 流程图 | 可视化步骤或流程 |\n| 💻 代码讲解 | 逐行解释代码 |\n| 📝 测验 | 即时生成练习题 |\n| 🤔 二选一猜测 | 学习开场的无风险小猜测(不计分)|\n\n## 怎么触发\n\nAI 自动生成(判断知识点适合可视化时调用),你主动请求(在对话中说画个概念图),或点巩固选择按钮(考考我 / 举个例子)。\n\n## 生成式 UI 存在哪\n\n所有 AI 生成的组件出现在中栏对话流和右栏笔记 Tab 的理解区(持久保存)。AI 生成的概念图不是聊完就消失——它们留在你的笔记本里随时回顾。",
220
+ "summary": "AI 动态生成的可视化学习工具",
221
+ "summaryEn": "Visual learning tools the AI generates on the fly"
222
+ },
223
+ {
224
+ "id": "guide-exam-4",
225
+ "parentId": "guide-sec-4",
226
+ "type": "exam",
227
+ "title": "康奈尔笔记本 · 章节测验",
228
+ "sourcePath": null,
229
+ "orderIdx": 3,
230
+ "content": null,
231
+ "summary": null,
232
+ "summaryEn": null
233
+ },
234
+ {
235
+ "id": "guide-sec-5",
236
+ "parentId": null,
237
+ "type": "section",
238
+ "title": "记忆系统",
239
+ "sourcePath": "ch5",
240
+ "orderIdx": 4,
241
+ "content": null,
242
+ "summary": "间隔重复与复习抽屉、连续打卡、XP 与皇冠",
243
+ "summaryEn": "Spaced repetition and the review drawer, streaks, XP, and crowns"
244
+ },
245
+ {
246
+ "id": "guide-les-5-1",
247
+ "parentId": "guide-sec-5",
248
+ "type": "lesson",
249
+ "title": "SM-2 间隔重复与复习抽屉",
250
+ "sourcePath": "ch5/lesson-1.md",
251
+ "orderIdx": 0,
252
+ "content": "# SM-2 间隔重复与复习抽屉\n\n学过的知识会遗忘——这是人类的生理限制。LookatStudy 用 SM-2 算法科学地安排复习。\n\n## 什么是 SM-2\n\nSM-2(SuperMemo 2)是间隔重复的经典算法,也是 Anki 等主流记忆 App 的核心。每次答对复习题,下次复习间隔变长(1天→6天→更久…);答错则间隔重置到 1 天,安排近期重练。\n\n## BKT 与 SM-2 双向联动\n\n一次答题观测同时驱动两个模型:掌握度(BKT)判断你现在懂不懂,复习排期(SM-2)判断你什么时候会忘。答对推迟复习、答错近期重练;复习自评也会反向校准掌握度。\n\n## 复习抽屉\n\n地图标题卡上的待复习徽章打开复习抽屉:SM-2 四象限(逾期 / 短期间隔 / 长期间隔 / 未激活)、章节掌握度手风琴、你最近反复卡住的课时。「交错复习」按钮随机挑一节学过的课——换个脑子也保持检索练习。\n\n## 复习自评\n\n从复习抽屉选课复习时,讲解底部出现自评卡:**忘了 / 记得 / 很熟**。诚实的自评决定下次间隔——说忘了不丢人,它让系统更快把这块补上。",
253
+ "summary": "科学算法安排复习,复习抽屉统一入口",
254
+ "summaryEn": "An algorithm schedules your reviews; the review drawer is the single entry point"
255
+ },
256
+ {
257
+ "id": "guide-les-5-2",
258
+ "parentId": "guide-sec-5",
259
+ "type": "lesson",
260
+ "title": "连续打卡与冻结",
261
+ "sourcePath": "ch5/lesson-2.md",
262
+ "orderIdx": 1,
263
+ "content": "# 连续打卡与冻结\n\n## 连续打卡(Streak)\n\n每天至少完成一次学习活动,你的连续打卡天数就会 +1,显示在顶栏的火焰徽章上。连续打卡是多邻国验证过的最强激励之一:看到数字增长就不想断链,从而持续学习。连击增长时还有粒子庆祝动效。\n\n## 冻结(Freeze)\n\n生活中总有无法学习的日子。冻结机制保护你的连续打卡不断链:拥有冻结时某天没学习不会断链,冻结自动消耗。这让连续打卡既有激励效果又不会变成焦虑源。\n\n## 打卡状态\n\n顶栏显示当前连续天数(火焰图标)和可用冻结数。保持连续打卡不需要每天学很多——哪怕做一道题就够了。关键是保持习惯。",
264
+ "summary": "Streak 机制,冻结保护不断链",
265
+ "summaryEn": "How streaks work, and freeze protection that keeps the chain alive"
266
+ },
267
+ {
268
+ "id": "guide-les-5-3",
269
+ "parentId": "guide-sec-5",
270
+ "type": "lesson",
271
+ "title": "XP、等级与皇冠",
272
+ "sourcePath": "ch5/lesson-3.md",
273
+ "orderIdx": 2,
274
+ "content": "# XP、等级与皇冠\n\nLookatStudy 用 XP(经验值)和皇冠量化你的学习成就。\n\n## XP 与今日能量\n\n| 行为 | XP 奖励 |\n|------|---------|\n| 答对一题 | +10 XP |\n| 答错一题 | +1 XP |\n| 掌握一个课时 | +50 XP |\n\n顶栏的闪电能量条显示今日 XP(软参考 100 满,充满时闪电点亮),旁边是等级徽章(Lv 随总 XP 增长)。\n\n## 皇冠\n\n皇冠代表课时掌握度:课时掌握后节点显示金色光环👑,章节考试的星级也展示在考试节点上。皇冠数量 = 你真正掌握的课时数。\n\nXP 可以靠大量低质量答题刷上去。皇冠要求你真正通过短板知识点的掌握度判定——不能靠刷只能靠理解。XP 管过程激励,皇冠管结果验证。\n\n## 高光时刻\n\n答对、解锁、掌握、连击增长、能量充满、考试通过——这些时刻都有对应的粒子庆祝动效(尊重系统减少动效设置的用户会自动换成静态提示)。",
275
+ "summary": "经验值、今日能量与掌握度皇冠",
276
+ "summaryEn": "Experience points, today's energy bar, and mastery crowns"
277
+ },
278
+ {
279
+ "id": "guide-exam-5",
280
+ "parentId": "guide-sec-5",
281
+ "type": "exam",
282
+ "title": "记忆系统 · 章节测验",
283
+ "sourcePath": null,
284
+ "orderIdx": 3,
285
+ "content": null,
286
+ "summary": null,
287
+ "summaryEn": null
288
+ },
289
+ {
290
+ "id": "guide-sec-6",
291
+ "parentId": null,
292
+ "type": "section",
293
+ "title": "进阶功能",
294
+ "sourcePath": "ch6",
295
+ "orderIdx": 5,
296
+ "content": null,
297
+ "summary": "Provider 配置、多语言翻译、导出报告",
298
+ "summaryEn": "Provider setup, multilingual translations, and report export"
299
+ },
300
+ {
301
+ "id": "guide-les-6-1",
302
+ "parentId": "guide-sec-6",
303
+ "type": "lesson",
304
+ "title": "LLM Provider 配置",
305
+ "sourcePath": "ch6/lesson-1.md",
306
+ "orderIdx": 0,
307
+ "content": "# LLM Provider 配置\n\nLookatStudy 是 BYO Key(Bring Your Own Key)架构——你用自己的 API Key,对话不经过任何中间服务器。\n\n## 内置预设 Provider\n\n共 **19 个**预设:智谱 GLM(标准 API / CodingPlan 订阅)、DeepSeek、Kimi、Qwen、SiliconCloud、OpenRouter、OpenAI、Anthropic、Google、Groq、Together、Mistral、xAI、火山方舟、百度、MiniMax、百川、StepFun。\n\n每个预设卡片直接显示 API 端点地址,还提供多个模型档位可选(免费 / 均衡 / 旗舰)。\n\n## 自定义 Provider\n\n如果内置预设不满足需求,可以添加自定义 Provider:进入 Settings 填入 API Base URL、API Key、Model Name。只要兼容 OpenAI API 格式的端点都能用(同一家厂商有多个端点也没问题)。\n\n自定义 Provider 的 Key 存在本地 DB,选中 custom- 开头的 Provider 时优先生效。\n\n## 测试连接\n\n配置完成后点击测试连接按钮验证 Key 是否有效。系统会发送一个简短的测试请求,检查连通性和模型可用性。",
308
+ "summary": "19 个内置预设 + 自定义 Provider,BYO API Key",
309
+ "summaryEn": "19 built-in presets plus custom providers — bring your own API key"
310
+ },
311
+ {
312
+ "id": "guide-les-6-2",
313
+ "parentId": "guide-sec-6",
314
+ "type": "lesson",
315
+ "title": "多语言翻译支持",
316
+ "sourcePath": "ch6/lesson-2.md",
317
+ "orderIdx": 1,
318
+ "content": "# 多语言翻译支持\n\nLookatStudy 能自动识别仓库的翻译结构,让你用偏好的语言学习。\n\n## 语言偏好设置\n\n在 Settings 里设置你的偏好语言。首次启动时按系统语言自动检测默认值。\n\n## 自动翻译决策\n\n导入课程时系统自动判断仓库原文语言,检测仓库有哪些翻译版本,按偏好语言 + 原文语言决定导入哪个翻译。严格 fallback:仓库没有你偏好的翻译就用原文。\n\n## 课内语言切换\n\n多语言课程在地图标题卡上有 🌐 切换器,随时在原文和已导入翻译之间切换——讲解正文、标题全部跟随。\n\n## 支持的翻译布局\n\n系统自动检测三种翻译目录约定:translations/语言代码/(微软风格)、语言代码/平行目录(Vue/Docusaurus 风格)、文件名.语言代码.md 后缀风格(博客风格)。\n\n## 翻译图片处理\n\n翻译版正文里的图片不另外下载(机翻图片质量差),而是按出现位置替换成原文对应位置的图片。结果:翻译正文 = 翻译文字 + 原文图片。",
319
+ "summary": "自动检测翻译约定,按偏好语言导入与切换",
320
+ "summaryEn": "Translation conventions auto-detected; import and switch by preferred language"
321
+ },
322
+ {
323
+ "id": "guide-les-6-3",
324
+ "parentId": "guide-sec-6",
325
+ "type": "lesson",
326
+ "title": "导出学习报告",
327
+ "sourcePath": "ch6/lesson-3.md",
328
+ "orderIdx": 2,
329
+ "content": "# 导出学习报告\n\n你的学习数据存在本地——你可以随时导出。\n\n## JSON 格式\n\n结构化数据,包含课程列表和完成度、每个课时的掌握度(BKT 概率)、答题历史、连续打卡记录、XP 历史、间隔重复队列状态。适合数据分析、备份、迁移。\n\n## Markdown 格式\n\n人类可读的学习报告,包含学习概要(总课时/已掌握/连续天数/总 XP)、各章节掌握度、重点笔记摘录。适合分享学习成果和复习总结。\n\n## 怎么导出\n\n点击课程菜单的导出选项,选择格式(JSON 或 Markdown),选择保存位置。\n\n## 数据所有权\n\n导出功能是本地优先理念的直接体现:你的学习记录不锁定在任何云端,不需要账号不需要订阅,随时可以带着你的数据离开。这是你的数据,你拥有完全的控制权。",
330
+ "summary": "JSON / Markdown 格式导出全部学习数据",
331
+ "summaryEn": "Export all your learning data as JSON or Markdown"
332
+ },
333
+ {
334
+ "id": "guide-exam-6",
335
+ "parentId": "guide-sec-6",
336
+ "type": "exam",
337
+ "title": "进阶功能 · 章节测验",
338
+ "sourcePath": null,
339
+ "orderIdx": 3,
340
+ "content": null,
341
+ "summary": null,
342
+ "summaryEn": null
343
+ }
344
+ ],
345
+ "progress": [
346
+ {
347
+ "nodeId": "guide-sec-1",
348
+ "status": "available",
349
+ "crownLevel": 0
350
+ },
351
+ {
352
+ "nodeId": "guide-les-1-1",
353
+ "status": "available",
354
+ "crownLevel": 0
355
+ },
356
+ {
357
+ "nodeId": "guide-les-1-2",
358
+ "status": "locked",
359
+ "crownLevel": 0
360
+ },
361
+ {
362
+ "nodeId": "guide-les-1-3",
363
+ "status": "locked",
364
+ "crownLevel": 0
365
+ },
366
+ {
367
+ "nodeId": "guide-exam-1",
368
+ "status": "available",
369
+ "crownLevel": 0
370
+ },
371
+ {
372
+ "nodeId": "guide-sec-2",
373
+ "status": "locked",
374
+ "crownLevel": 0
375
+ },
376
+ {
377
+ "nodeId": "guide-les-2-1",
378
+ "status": "available",
379
+ "crownLevel": 0
380
+ },
381
+ {
382
+ "nodeId": "guide-les-2-2",
383
+ "status": "locked",
384
+ "crownLevel": 0
385
+ },
386
+ {
387
+ "nodeId": "guide-les-2-3",
388
+ "status": "locked",
389
+ "crownLevel": 0
390
+ },
391
+ {
392
+ "nodeId": "guide-exam-2",
393
+ "status": "available",
394
+ "crownLevel": 0
395
+ },
396
+ {
397
+ "nodeId": "guide-sec-3",
398
+ "status": "locked",
399
+ "crownLevel": 0
400
+ },
401
+ {
402
+ "nodeId": "guide-les-3-1",
403
+ "status": "locked",
404
+ "crownLevel": 0
405
+ },
406
+ {
407
+ "nodeId": "guide-les-3-2",
408
+ "status": "locked",
409
+ "crownLevel": 0
410
+ },
411
+ {
412
+ "nodeId": "guide-les-3-3",
413
+ "status": "locked",
414
+ "crownLevel": 0
415
+ },
416
+ {
417
+ "nodeId": "guide-exam-3",
418
+ "status": "available",
419
+ "crownLevel": 0
420
+ },
421
+ {
422
+ "nodeId": "guide-sec-4",
423
+ "status": "locked",
424
+ "crownLevel": 0
425
+ },
426
+ {
427
+ "nodeId": "guide-les-4-1",
428
+ "status": "locked",
429
+ "crownLevel": 0
430
+ },
431
+ {
432
+ "nodeId": "guide-les-4-2",
433
+ "status": "locked",
434
+ "crownLevel": 0
435
+ },
436
+ {
437
+ "nodeId": "guide-les-4-3",
438
+ "status": "locked",
439
+ "crownLevel": 0
440
+ },
441
+ {
442
+ "nodeId": "guide-exam-4",
443
+ "status": "available",
444
+ "crownLevel": 0
445
+ },
446
+ {
447
+ "nodeId": "guide-sec-5",
448
+ "status": "locked",
449
+ "crownLevel": 0
450
+ },
451
+ {
452
+ "nodeId": "guide-les-5-1",
453
+ "status": "locked",
454
+ "crownLevel": 0
455
+ },
456
+ {
457
+ "nodeId": "guide-les-5-2",
458
+ "status": "locked",
459
+ "crownLevel": 0
460
+ },
461
+ {
462
+ "nodeId": "guide-les-5-3",
463
+ "status": "locked",
464
+ "crownLevel": 0
465
+ },
466
+ {
467
+ "nodeId": "guide-exam-5",
468
+ "status": "available",
469
+ "crownLevel": 0
470
+ },
471
+ {
472
+ "nodeId": "guide-sec-6",
473
+ "status": "locked",
474
+ "crownLevel": 0
475
+ },
476
+ {
477
+ "nodeId": "guide-les-6-1",
478
+ "status": "locked",
479
+ "crownLevel": 0
480
+ },
481
+ {
482
+ "nodeId": "guide-les-6-2",
483
+ "status": "locked",
484
+ "crownLevel": 0
485
+ },
486
+ {
487
+ "nodeId": "guide-les-6-3",
488
+ "status": "locked",
489
+ "crownLevel": 0
490
+ },
491
+ {
492
+ "nodeId": "guide-exam-6",
493
+ "status": "available",
494
+ "crownLevel": 0
495
+ }
496
+ ],
497
+ "translations": [
498
+ {
499
+ "nodeId": "guide-sec-1",
500
+ "locale": "en",
501
+ "title": "Quick Start",
502
+ "content": null
503
+ },
504
+ {
505
+ "nodeId": "guide-les-1-1",
506
+ "locale": "en",
507
+ "title": "Welcome to LookatStudy",
508
+ "content": "# Welcome to LookatStudy\n\n**LookatStudy** is a local-first, AI-driven desktop learning platform. It turns any GitHub learning repo or local folder into a Duolingo-style interactive course — complete with a skill map, an AI tutor, spaced repetition, and playful incentives.\n\n## What it can do for you\n\n- 📚 **Turn any repo into a course**: paste a GitHub URL or pick a local folder; 10 document formats (Markdown / Jupyter / RST / PDF / PPTX / HTML and more) plus 30+ code languages are parsed into a structured course, images included\n- 🗺️ **Skill map navigation**: a Duolingo-style balloon map whose sky drifts from morning to night as you scroll; lessons unlock one by one and visualize your progress\n- 🤖 **A personal AI tutor**: every knowledge point carries its own mastery estimate (BKT); the AI adapts its teaching to your understanding and can see where you recently struggled\n- 📝 **A Cornell notebook**: three zones (understand / notes / practice); the AI generates concept maps, compare tables and flow diagrams while you highlight and annotate\n- 🔁 **Spaced repetition**: SM-2 schedules your reviews; streaks + XP + crowns keep you coming back\n\n## Design philosophy\n\n- **Local first**: all data lives in a local SQLite file — your learning record stays in your hands\n- **BYO Key**: bring your own LLM API key; your conversations never pass through a middleman server\n- **AI drafts, you decide**: the AI never edits your learning record directly — every state change goes through the Propose → Apply protocol and takes effect only after you approve\n\n## Where to start\n\nLookatStudy always opens in the “no course selected” state: pick an imported course in the “Import courses” panel on the left, or import something new. Open the next lesson, “Import Your First Course”, for all the ways in!"
509
+ },
510
+ {
511
+ "nodeId": "guide-les-1-2",
512
+ "locale": "en",
513
+ "title": "Import Your First Course",
514
+ "content": "# Import Your First Course\n\nLookatStudy supports three import paths that cover nearly every source of learning material.\n\n## Path 1: GitHub URL\n\nPaste a GitHub repo address into the “Import courses” panel on the left. The smart pipeline automatically fetches the README to find the course outline, scans the full file tree (documents + code + translations), has AI classify each file's role, has AI design the chapter structure, and inlines images.\n\n## Path 2: Local folder\n\nClick the local-folder button and pick a folder of learning material. Subdirectories are scanned recursively; documents, code, images and translations are recognized automatically.\n\nGood for: downloaded course bundles, locally cloned repos, or a folder of notes you curated yourself.\n\n## Path 3: Pasted Markdown\n\nPaste Markdown text directly. Good for: private repos, network-restricted environments, or quickly turning a block of notes into a course.\n\n## Imports run in the background\n\nClick import and the job goes to the background immediately: a progress window shows each step and how long it took, you can switch away and keep browsing other courses, and a notification pops when the import finishes — no forced jump. You can cancel at any point.\n\n## Managing courses\n\nHovering a course row in the course list shows a delete button (inline confirm card, no screen change); the course you are studying can be deleted too — the button sits next to the course name on the map title card, and deleting returns you to the “no course selected” state. Deleting wipes every learning record of that course and cannot be undone."
515
+ },
516
+ {
517
+ "nodeId": "guide-les-1-3",
518
+ "locale": "en",
519
+ "title": "Tour of the Three-Pane Layout",
520
+ "content": "# Tour of the Three-Pane Layout\n\nLookatStudy uses a three-pane layout; each pane covers a different part of studying. Light / dark / follow-system themes are all supported.\n\n## Left pane: course map and import\n\nThe top of the left pane has two tabs: “Import courses” and “Course map”. The map is a Duolingo-style balloon map — each balloon is a lesson, and as you work your way down, the sky in the background shifts from morning to night.\n\nThe map title card shows the course name, overall mastery percentage, a due-for-review badge, the 🌐 language switch (multilingual courses toggle between original and translated text here), and the delete-course button.\n\n## Middle pane: AI chat\n\nWhere you talk to the AI tutor: thread tabs on top (each lesson can hold several conversation threads), the chat stream in the middle (AI replies stream in; proposal cards and concept maps persist), and the input area at the bottom (with the teaching-persona pill, the A-/A+ font size controls, and four consolidation buttons).\n\nCtrl+K opens the command palette, Ctrl+Tab cycles threads, Ctrl+B collapses the left pane.\n\n## Right pane: the Cornell notebook\n\nA notebook in three zones: the Lesson tab renders the lesson body (Markdown), and you can select text to highlight and annotate. The Notes tab holds the three zones — Understand (AI artifacts), Notes (your highlights), Practice (quizzes + answer history).\n\n## Focus lock\n\nWhile the AI is replying, switching lessons or threads is temporarily locked — so you never lose context mid-answer."
521
+ },
522
+ {
523
+ "nodeId": "guide-exam-1",
524
+ "locale": "en",
525
+ "title": "Quick Start · Chapter Quiz",
526
+ "content": null
527
+ },
528
+ {
529
+ "nodeId": "guide-sec-2",
530
+ "locale": "en",
531
+ "title": "The Skill Map",
532
+ "content": null
533
+ },
534
+ {
535
+ "nodeId": "guide-les-2-1",
536
+ "locale": "en",
537
+ "title": "Balloon Nodes and Unlocks",
538
+ "content": "# Balloon Nodes and Unlocks\n\nEvery balloon on the skill map is a lesson in one of four states:\n\n| State | Look | Meaning |\n|------|------|------|\n| 🔒 locked | gray, translucent | not unlocked yet |\n| 🟢 available | colored, clickable | unlocked, ready to study |\n| 🔵 in_progress | colored + progress ring | currently studying |\n| ⭐ mastered | golden glow | mastered (weakest knowledge point cleared the bar) |\n\n## Unlock logic\n\nLookatStudy uses a two-track strategy so you never get fully stuck on one lesson: click any lesson in the current chapter and both the next lesson of the same chapter and the first lesson of the next chapter unlock. Practice lessons are learnable by default and never block the main line.\n\n## Mastery follows your weakest point\n\nEvery lesson breaks into knowledge points (KCs), each with its own mastery probability. Lesson mastery is the **lowest** value across its KCs — if any single knowledge point lags, the lesson does not count as mastered (no “fake graduation”). The progress ring on a balloon shows exactly that weakest value.\n\nSee chapter 3, “Per-Knowledge-Point BKT”, for details."
539
+ },
540
+ {
541
+ "nodeId": "guide-les-2-2",
542
+ "locale": "en",
543
+ "title": "The Two-Track Unlock Strategy",
544
+ "content": "# The Two-Track Unlock Strategy\n\nLinear courses have one painful failure mode: get stuck on a single lesson and everything stops. LookatStudy solves this with two-track unlocking.\n\n## What two-track means\n\nWhen you click any lesson of the current chapter to start studying, the system unlocks both the next lesson of the same chapter (keeping a steady sense of progress) and the first lesson of the next chapter (so there is always something new to explore).\n\n## Why it is designed this way\n\n- **No dead ends**: one lesson too hard? Hop to the next chapter for a change of scenery and come back later\n- **Stays coherent**: within a chapter the order is still linear, no jumping around\n- **Your call**: finish a chapter before moving on, or explore broadly first and deepen later\n\n## Practice worlds never block\n\nIf a course has practice content, it lives in the “Practice” tab of the map and is fully learnable by default. You can get your hands dirty anytime without finishing the theory first — learn and build in parallel.\n\n## Chapter exams\n\nEvery chapter with at least 2 teaching lessons gets an exam node (the chapter boss). The exam unlocks once the whole chapter's lessons clear the mastery bar — see the next lesson."
545
+ },
546
+ {
547
+ "nodeId": "guide-les-2-3",
548
+ "locale": "en",
549
+ "title": "Chapter Exams: Generation, Timers, and Results",
550
+ "content": "# Chapter Exams\n\nThe chapter exam is the boss at the end of each chapter: a 🎯 node that shows 1-3 stars once passed. It unlocks when every lesson in the chapter clears the mastery bar.\n\n## The question bank generates in the background\n\nOpen the exam node and the AI writes questions in batches by knowledge point, with progress shown as “X / Y knowledge points covered”. While it generates you can go study something else — the job keeps running in the background and notifies you when it is done. Coming back, you see the ready page: N questions, M knowledge points covered, estimated duration; the exam itself only starts when you click “Start exam”.\n\n## A timer on every question\n\nEach question runs its own countdown: 60 seconds for normal questions, 90 for long stems or questions with code. When time runs out, the current choice is recorded and the exam moves on.\n\n## Leaving terminates the attempt\n\nSwitching lessons or courses mid-exam pops a warning: confirm leaving and the attempt terminates, with unanswered questions scored as wrong.\n\n## The results page\n\nAfter submitting you see: stars, accuracy, **a per-knowledge-point breakdown** (weak points are flagged for review), and a question-by-question review (your answer vs the correct one, plus explanations). Returning to the exam node later shows your latest result by default, along with your best star count and total attempts.\n\n## Retakes\n\nRetake as many times as you like. Retakes reuse the same bank, but question order and option order are reshuffled each time — it tests understanding, not memory.\n\n## Exams never touch the learning model\n\nExams are an independent check: results only update stars and XP and **never write back** into knowledge-point mastery. Your BKT record is driven by everyday answers and self-ratings, never shaken by a single exam."
551
+ },
552
+ {
553
+ "nodeId": "guide-exam-2",
554
+ "locale": "en",
555
+ "title": "The Skill Map · Chapter Quiz",
556
+ "content": null
557
+ },
558
+ {
559
+ "nodeId": "guide-sec-3",
560
+ "locale": "en",
561
+ "title": "The AI Tutor",
562
+ "content": null
563
+ },
564
+ {
565
+ "nodeId": "guide-les-3-1",
566
+ "locale": "en",
567
+ "title": "Teaching Personas and Chat",
568
+ "content": "# Teaching Personas and Chat\n\nThe AI tutor's stance is set by its **teaching persona (soul)**, switchable in the persona pill inside the input box.\n\n## Three built-in personas\n\n| Persona | Style | Good for |\n|------|------|---------|\n| 🎯 Direct | worked examples + Feynman-style straight answers | beginners, low-energy days |\n| 🧭 Guided | struggle is where growth happens; questions lead you there | once you have the basics |\n| 🔧 Hands-on | project-style learning around real problems | when you want to apply things |\n\nThe persona changes how things are taught, not the knowledge itself — for the same concept, Direct unpacks it thoroughly, Guided keeps asking “are you sure?”, Hands-on pulls in a real scenario for you to try.\n\n## Start Learning\n\nInside a lesson, the middle pane has a “🚀 Start Learning” button. It opens with a curiosity hook, then a two-option mini guess — just for fun, not scored. Hook the learner first; momentum before formality.\n\n## Four consolidation buttons\n\nOnce the conversation starts, four buttons stay above the input: **Go deeper** (elaboration), **Give me an example** (concretize), **Quiz me** (retrieval practice), **I didn't get that** (voice the confusion; the stumble gets logged too). When you don't know what to ask, click one."
569
+ },
570
+ {
571
+ "nodeId": "guide-les-3-2",
572
+ "locale": "en",
573
+ "title": "Per-Knowledge-Point BKT Mastery",
574
+ "content": "# Per-Knowledge-Point BKT Mastery\n\nLookatStudy does not measure you with a plain accuracy rate — it runs BKT (Bayesian Knowledge Tracing), down to **each individual knowledge point**.\n\n## What BKT is\n\nBKT is a classic mastery model from educational data mining. It maintains a probability between 0 and 1 that you have truly mastered the knowledge point.\n\nEvery time you answer, BKT adjusts that probability with a Bayesian update: a correct answer raises it (but not to 100% — you might have guessed), a wrong one lowers it (but not to 0% — you might have slipped).\n\n## Knowledge-point (KC) granularity\n\nEach lesson breaks into knowledge points, each running its own BKT. Lesson mastery = the **lowest** value among its KCs — the weakest link decides. If any knowledge point lags, the lesson is not marked mastered. That blocks the “mostly got it, move on” fake graduation.\n\n## Two thresholds\n\n- Mastery ≥ 0.5: following lessons unlock (you can move on)\n- Mastery ≥ 0.9: the lesson graduates (golden crown)\n\n## What updates BKT\n\nAnswering in chat, practice-zone quizzes, and review self-ratings all update the relevant knowledge points. **Chapter exams are the exception** — they are an independent check and never write back.\n\n## How the AI uses mastery\n\nThe tutor sees your mastery probability per knowledge point plus your recent stumbles: low mastery gets detailed explanations and analogies, high mastery gets harder challenges, the middle gets comprehension checks to expose misconceptions."
575
+ },
576
+ {
577
+ "nodeId": "guide-les-3-3",
578
+ "locale": "en",
579
+ "title": "The Propose → Apply Protocol",
580
+ "content": "# The Propose → Apply Protocol\n\nOne of LookatStudy's core design principles: the AI never directly modifies your learning record.\n\n## Why the protocol exists\n\nAI makes mistakes (hallucinations, misjudgments). If the AI could directly change your mastery, mark things mastered, or push your progress, a single error would pollute your learning data.\n\n## How it flows\n\n1. The AI decides a change is needed and drafts a proposal\n2. You see a proposal card in the chat — for example “the AI suggests you've mastered this lesson” — with its reasoning and the consequences of applying it\n3. Click “Confirm mastered” to apply, or “Keep practicing” to reject\n\nProposal cards have three states: pending (a green card waiting for your call), accepted (golden check), dismissed (grayed out with strikethrough). Cards persist — switch away and come back, they are still there, state intact.\n\n## You always hold the final say\n\nMost learning apps silently mutate your progress data in the background. LookatStudy makes the process transparent — you see what the AI wants to change and why, and you decide."
581
+ },
582
+ {
583
+ "nodeId": "guide-exam-3",
584
+ "locale": "en",
585
+ "title": "The AI Tutor · Chapter Quiz",
586
+ "content": null
587
+ },
588
+ {
589
+ "nodeId": "guide-sec-4",
590
+ "locale": "en",
591
+ "title": "The Cornell Notebook",
592
+ "content": null
593
+ },
594
+ {
595
+ "nodeId": "guide-les-4-1",
596
+ "locale": "en",
597
+ "title": "Three Zones: Understand / Notes / Practice",
598
+ "content": "# Three Zones: Understand / Notes / Practice\n\nThe right-pane notebook is built on the Cornell Notes method, in three zones.\n\n## 🗺️ Understand (AI artifacts)\n\nAI-generated visual study aids: concept maps (how ideas relate), compare tables (similar concepts side by side), flow diagrams (steps made visible), code walkthroughs (line-by-line annotation). The AI generates them as you learn.\n\n## ✏️ Notes (your highlights)\n\nEvery highlight you made by selecting text on the lesson page: each entry keeps the original wording, can carry an annotation, and clicking one jumps back to the exact spot in the source.\n\n## 📝 Practice (quizzes + history)\n\nThe lesson's exercises and your answer history: AI-generated quiz questions, every attempt kept, wrong answers scheduled for review by the spaced-repetition system.\n\n## Two tabs\n\nThe top of the right pane has two tabs: the Lesson tab shows the lesson body (rendered Markdown); the Notes tab shows the three zones above. Keeping lesson and notes separate lets you read without clutter."
599
+ },
600
+ {
601
+ "nodeId": "guide-les-4-2",
602
+ "locale": "en",
603
+ "title": "Highlights, Notes, and Source Jumps",
604
+ "content": "# Highlights, Notes, and Source Jumps\n\n## How to highlight\n\nSelect a span of text in the right-pane Lesson tab; a note button appears next to the selection; click it and the text gets marked and can carry an annotation. Highlights persist. AI replies in the chat can be highlighted the same way.\n\n## Source jumps\n\nEvery highlight carries a source link. Click one in the Notes zone and you jump back to the Lesson tab (or the thread it came from), scrolled to the highlighted passage and flashing for attention.\n\n## How it works\n\nHighlight anchoring does not depend on DOM offsets (ReactMarkdown re-renders shift the DOM, and offsets go stale). LookatStudy uses plain-text search instead: it records the selected wording and re-locates it after each re-render. That keeps highlights accurate across React re-renders.\n\n## Symmetric by design\n\nHighlights from the lesson page and from chat are symmetric — whatever the source, all highlights are managed together in the Notes zone."
605
+ },
606
+ {
607
+ "nodeId": "guide-les-4-3",
608
+ "locale": "en",
609
+ "title": "Generative UI: Concept Maps / Compare Tables / Flow Diagrams",
610
+ "content": "# Generative UI\n\nThe AI tutor does not only output text — it emits interactive visual components.\n\n## Six generative components\n\n| Component | Use |\n|------|------|\n| 🗺️ Concept map | shows how ideas relate |\n| 📊 Compare table | contrasts several concepts |\n| 📐 Flow diagram | visualizes steps or pipelines |\n| 💻 Code walkthrough | explains code line by line |\n| 📝 Quiz | generates practice on the spot |\n| 🤔 Two-option guess | risk-free opener guess (unscored) |\n\n## What triggers them\n\nThe AI generates them on its own (when a concept suits visualization), on your request (“draw a concept map”), or from the consolidation buttons (Quiz me / Give me an example).\n\n## Where they live\n\nGenerated components appear in the middle-pane chat stream and in the Understand zone of the Notes tab (persisted). An AI concept map does not vanish when the chat ends — it stays in your notebook for review."
611
+ },
612
+ {
613
+ "nodeId": "guide-exam-4",
614
+ "locale": "en",
615
+ "title": "The Cornell Notebook · Chapter Quiz",
616
+ "content": null
617
+ },
618
+ {
619
+ "nodeId": "guide-sec-5",
620
+ "locale": "en",
621
+ "title": "The Memory System",
622
+ "content": null
623
+ },
624
+ {
625
+ "nodeId": "guide-les-5-1",
626
+ "locale": "en",
627
+ "title": "SM-2 Spaced Repetition and the Review Drawer",
628
+ "content": "# SM-2 Spaced Repetition and the Review Drawer\n\nWhat you learned fades — that is human hardware. LookatStudy schedules reviews with the SM-2 algorithm.\n\n## What SM-2 is\n\nSM-2 (SuperMemo 2) is the classic spaced-repetition algorithm, the core of Anki and most memory apps. Every correct review pushes the next interval out (1 day → 6 days → longer...); a wrong answer resets the interval to 1 day and schedules a near-term re-practice.\n\n## BKT and SM-2, wired both ways\n\nOne answer observation drives two models at once: mastery (BKT) judges whether you understand it now; scheduling (SM-2) judges when you will forget. Correct answers push reviews out, wrong ones pull them in; review self-ratings calibrate mastery back.\n\n## The review drawer\n\nThe due badge on the map title card opens the review drawer: the SM-2 quadrants (overdue / short interval / long interval / inactive), a per-chapter mastery accordion, and the lessons you keep stumbling on. The “Interleave” button picks a random learned lesson — change gears while keeping retrieval practice.\n\n## Review self-rating\n\nReviewing from the drawer shows a self-rating card under the lesson: **Forgot / Remembered / Solid**. Honest ratings drive the next interval — saying “forgot” costs nothing and gets the system to patch that spot sooner."
629
+ },
630
+ {
631
+ "nodeId": "guide-les-5-2",
632
+ "locale": "en",
633
+ "title": "Streaks and Freezes",
634
+ "content": "# Streaks and Freezes\n\n## Streaks\n\nComplete at least one learning activity every day and your streak count goes up, shown on the flame badge in the header. Streaks are one of the strongest motivators Duolingo ever validated: watching the number grow makes you not want to break the chain, so you keep showing up. Streak growth gets its own particle celebration.\n\n## Freezes\n\nLife happens; some days studying is impossible. Freezes protect the chain: with a freeze in stock, a missed day does not break the streak — the freeze burns instead. The streak stays motivating without turning into anxiety.\n\n## Reading the state\n\nThe header shows the current streak days (flame icon) and the available freezes. Keeping a streak alive does not require studying a lot every day — one question is enough. The habit is the point."
635
+ },
636
+ {
637
+ "nodeId": "guide-les-5-3",
638
+ "locale": "en",
639
+ "title": "XP, Levels, and Crowns",
640
+ "content": "# XP, Levels, and Crowns\n\nLookatStudy quantifies progress with XP (experience points) and crowns.\n\n## XP and daily energy\n\n| Action | XP |\n|------|---------|\n| Correct answer | +10 XP |\n| Wrong answer | +1 XP |\n| Mastering a lesson | +50 XP |\n\nThe lightning energy bar in the header shows today's XP (soft target of 100; the bolt lights up when full), with the level badge next to it (Lv grows with total XP).\n\n## Crowns\n\nCrowns stand for mastery: a mastered lesson shows a golden glow 👑 on its node, and exam stars sit on the exam nodes. Crown count = lessons you have truly mastered.\n\nXP can be farmed with a large volume of low-quality answers. Crowns require genuinely clearing your weakest knowledge point — no grinding your way there, only understanding. XP rewards the process; crowns certify the result.\n\n## Highlight moments\n\nCorrect answers, unlocks, mastery, streak growth, full energy, exam passed — each of these moments has its own particle celebration (users with system reduced-motion enabled get a static cue instead)."
641
+ },
642
+ {
643
+ "nodeId": "guide-exam-5",
644
+ "locale": "en",
645
+ "title": "The Memory System · Chapter Quiz",
646
+ "content": null
647
+ },
648
+ {
649
+ "nodeId": "guide-sec-6",
650
+ "locale": "en",
651
+ "title": "Going Further",
652
+ "content": null
653
+ },
654
+ {
655
+ "nodeId": "guide-les-6-1",
656
+ "locale": "en",
657
+ "title": "LLM Provider Setup",
658
+ "content": "# LLM Provider Setup\n\nLookatStudy is BYO Key (Bring Your Own Key) — you use your own API key, and conversations never pass through a middleman server.\n\n## Built-in presets\n\n**19** presets in total: Zhipu GLM (standard API / CodingPlan subscription), DeepSeek, Kimi, Qwen, SiliconCloud, OpenRouter, OpenAI, Anthropic, Google, Groq, Together, Mistral, xAI, Volcengine Ark, Baidu, MiniMax, Baichuan, StepFun.\n\nEach preset card shows its API endpoint directly and offers several model tiers (free / balanced / flagship).\n\n## Custom providers\n\nIf the presets do not fit, add a custom provider: open Settings and fill in API Base URL, API Key, and Model Name. Any OpenAI-compatible endpoint works (several endpoints from the same vendor are fine too).\n\nCustom provider keys live in the local DB; when the active provider id starts with custom-, it takes precedence.\n\n## Test connection\n\nAfter configuring, hit Test Connection to verify the key: a short test request checks connectivity and model availability."
659
+ },
660
+ {
661
+ "nodeId": "guide-les-6-2",
662
+ "locale": "en",
663
+ "title": "Multilingual Translation Support",
664
+ "content": "# Multilingual Translation Support\n\nLookatStudy recognizes a repo's translation structure automatically, so you can study in the language you prefer.\n\n## Language preference\n\nSet your preferred language in Settings; the default is detected from the system language on first launch.\n\n## The automatic language decision\n\nOn import, the system detects the repo's original language and which translations exist, then combines your preference with the source language to pick what to import. Strict fallback: if the repo has no translation you prefer, the original text is used.\n\n## The in-course language switch\n\nMultilingual courses get a 🌐 switch on the map title card; toggle anytime between the original and the imported translations — titles and lesson bodies follow along.\n\n## Supported layouts\n\nThree conventions are auto-detected: translations/{locale}/ (Microsoft style), {locale}/ parallel folders (Vue / Docusaurus style), and filename.{locale}.md suffixes (blog style).\n\n## Translated images\n\nImages inside translated bodies are not re-fetched (machine-translated images look bad); instead, each image is taken from the original at the matching position. Result: translated body = translated text + original images.\n\nFun fact: this very guide is bilingual — the 🌐 switch you just read about is live on its map title card. Try it."
665
+ },
666
+ {
667
+ "nodeId": "guide-les-6-3",
668
+ "locale": "en",
669
+ "title": "Exporting Your Learning Report",
670
+ "content": "# Exporting Your Learning Report\n\nYour data lives locally — and you can take it out anytime.\n\n## JSON\n\nStructured data: the course list with completion, per-lesson mastery (BKT probabilities), answer history, streak records, XP history, and the spaced-repetition queue state. For analysis, backup, or migration.\n\n## Markdown\n\nA human-readable report: a study summary (total lessons / mastered / streak days / total XP), per-chapter mastery, and selected highlights. For sharing progress or wrapping up a review.\n\n## How to export\n\nClick the export option in the course menu, pick a format (JSON or Markdown), and choose where to save.\n\n## Data ownership\n\nExport is the local-first idea made concrete: your record is not locked in any cloud — no account, no subscription — and you can take your data and leave anytime. It is your data; you hold full control."
671
+ },
672
+ {
673
+ "nodeId": "guide-exam-6",
674
+ "locale": "en",
675
+ "title": "Going Further · Chapter Quiz",
676
+ "content": null
677
+ }
678
+ ]
679
+ }