cotutor 0.1.0 → 0.3.0

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 (845) hide show
  1. package/LICENSE +247 -21
  2. package/NOTICE +42 -0
  3. package/README.md +107 -24
  4. package/bin/cotutor.js +4 -4
  5. package/cards/canvas/card.css +8 -0
  6. package/cards/canvas/card.md +68 -0
  7. package/cards/choice/card.css +18 -0
  8. package/cards/choice/card.md +55 -0
  9. package/cards/code/card.css +5 -0
  10. package/cards/code/card.md +46 -0
  11. package/cards/dictation/card.css +10 -0
  12. package/cards/dictation/card.md +97 -0
  13. package/cards/image/card.css +10 -0
  14. package/cards/image/card.md +52 -0
  15. package/cards/lecture/card.css +9 -0
  16. package/cards/lecture/card.md +69 -0
  17. package/cards/paint/card.css +20 -0
  18. package/cards/paint/card.md +77 -0
  19. package/cards/photo/card.css +15 -0
  20. package/cards/photo/card.md +61 -0
  21. package/cards/read/card.css +6 -0
  22. package/cards/read/card.md +51 -0
  23. package/cards/text/card.css +3 -0
  24. package/cards/text/card.md +69 -0
  25. package/cards/tianzige/card.css +17 -0
  26. package/cards/tianzige/card.md +78 -0
  27. package/cards/tutor/card.css +66 -0
  28. package/cards/tutor/card.md +148 -0
  29. package/cards/word/card.css +24 -0
  30. package/cards/word/card.md +91 -0
  31. package/cards//346/235/277/344/271/246/346/200/216/344/271/210/345/206/231.md +159 -0
  32. package/dist/app/activity-eval-rules.d.ts +62 -0
  33. package/dist/app/activity-eval-rules.js +276 -0
  34. package/dist/app/activity-eval.d.ts +65 -0
  35. package/dist/app/activity-eval.js +158 -0
  36. package/dist/app/build.d.ts +11 -0
  37. package/dist/app/build.js +45 -0
  38. package/dist/app/cli/activities.d.ts +63 -0
  39. package/dist/app/cli/activities.js +158 -0
  40. package/dist/app/cli/cert.d.ts +7 -0
  41. package/dist/app/cli/cert.js +36 -0
  42. package/dist/app/cli/chalk/bake.d.ts +10 -0
  43. package/dist/app/cli/chalk/bake.js +58 -0
  44. package/dist/app/cli/chalk/browser.d.ts +16 -0
  45. package/dist/app/cli/chalk/browser.js +142 -0
  46. package/dist/app/cli/chalk/build.d.ts +14 -0
  47. package/dist/app/cli/chalk/build.js +100 -0
  48. package/dist/app/cli/chalk/dub.d.ts +51 -0
  49. package/dist/app/cli/chalk/dub.js +106 -0
  50. package/dist/app/cli/chalk/load-scene.d.ts +34 -0
  51. package/dist/app/cli/chalk/load-scene.js +117 -0
  52. package/dist/app/cli/chalk/main.d.ts +7 -0
  53. package/dist/app/cli/chalk/main.js +198 -0
  54. package/dist/app/cli/chalk/serve.d.ts +4 -0
  55. package/dist/app/cli/chalk/serve.js +28 -0
  56. package/dist/app/cli/chalk/snap.d.ts +65 -0
  57. package/dist/app/cli/chalk/snap.js +103 -0
  58. package/dist/app/cli/chalk/typecheck.d.ts +7 -0
  59. package/dist/app/cli/chalk/typecheck.js +51 -0
  60. package/dist/app/cli/doctor.d.ts +23 -0
  61. package/dist/app/cli/doctor.js +617 -0
  62. package/dist/app/cli/grades.d.ts +14 -0
  63. package/dist/app/cli/grades.js +44 -0
  64. package/dist/{cli → app/cli}/init.d.ts +3 -1
  65. package/dist/app/cli/init.js +155 -0
  66. package/dist/app/cli/main.js +715 -0
  67. package/dist/app/cli/migrate.d.ts +58 -0
  68. package/dist/app/cli/migrate.js +253 -0
  69. package/dist/app/cli/serve.d.ts +37 -0
  70. package/dist/app/cli/serve.js +98 -0
  71. package/dist/app/cli/shipped.d.ts +30 -0
  72. package/dist/app/cli/shipped.js +47 -0
  73. package/dist/app/cli/skeleton.d.ts +38 -0
  74. package/dist/app/cli/skeleton.js +161 -0
  75. package/dist/app/cli/skills.d.ts +55 -0
  76. package/dist/app/cli/skills.js +189 -0
  77. package/dist/app/cli/themes.d.ts +52 -0
  78. package/dist/app/cli/themes.js +148 -0
  79. package/dist/app/cli/tutors.d.ts +73 -0
  80. package/dist/app/cli/tutors.js +250 -0
  81. package/dist/app/cli/usage.d.ts +2 -0
  82. package/dist/app/cli/usage.js +30 -0
  83. package/dist/app/dictation/recognize.d.ts +18 -0
  84. package/dist/app/dictation/recognize.js +6 -0
  85. package/dist/app/dictation/route.d.ts +52 -0
  86. package/dist/app/dictation/route.js +510 -0
  87. package/dist/app/diff.d.ts +11 -0
  88. package/dist/app/diff.js +71 -0
  89. package/dist/app/http/access.d.ts +62 -0
  90. package/dist/app/http/access.js +180 -0
  91. package/dist/app/http/app.d.ts +246 -0
  92. package/dist/app/http/app.js +1212 -0
  93. package/dist/app/http/dev-activities.d.ts +115 -0
  94. package/dist/app/http/dev-activities.js +193 -0
  95. package/dist/app/http/dev-overview.d.ts +108 -0
  96. package/dist/app/http/dev-overview.js +209 -0
  97. package/dist/app/http/dev-tutor-files.d.ts +80 -0
  98. package/dist/app/http/dev-tutor-files.js +151 -0
  99. package/dist/app/http/parent-home.d.ts +37 -0
  100. package/dist/app/http/parent-home.js +203 -0
  101. package/dist/app/http/range.d.ts +9 -0
  102. package/dist/app/http/range.js +19 -0
  103. package/dist/app/http/raw-view.d.ts +117 -0
  104. package/dist/app/http/raw-view.js +149 -0
  105. package/dist/app/http/send-file.d.ts +7 -0
  106. package/dist/app/http/send-file.js +29 -0
  107. package/dist/app/http/stage.d.ts +24 -0
  108. package/dist/app/http/stage.js +97 -0
  109. package/dist/app/http/theme.d.ts +13 -0
  110. package/dist/app/http/theme.js +41 -0
  111. package/dist/app/machine/bailian.d.ts +28 -0
  112. package/dist/app/machine/bailian.js +88 -0
  113. package/dist/app/mock/mock-live.d.ts +16 -0
  114. package/dist/app/mock/mock-live.js +140 -0
  115. package/dist/app/mock/mock.d.ts +89 -0
  116. package/dist/app/mock/mock.js +1117 -0
  117. package/dist/app/replay.d.ts +94 -0
  118. package/dist/app/replay.js +170 -0
  119. package/dist/app/skills/analyze-doc.d.ts +3 -0
  120. package/dist/app/skills/analyze-doc.js +47 -0
  121. package/dist/app/skills/home-doc.d.ts +5 -0
  122. package/dist/app/skills/home-doc.js +112 -0
  123. package/dist/app/skills/tune-doc.d.ts +3 -0
  124. package/dist/app/skills/tune-doc.js +80 -0
  125. package/dist/app/talk/list.d.ts +11 -0
  126. package/dist/app/talk/list.js +9 -0
  127. package/dist/app/talk/route.d.ts +16 -0
  128. package/dist/app/talk/route.js +142 -0
  129. package/dist/app/workspace.d.ts +58 -0
  130. package/dist/{cli → app}/workspace.js +82 -36
  131. package/dist/app/ws/route.d.ts +25 -0
  132. package/dist/app/ws/route.js +29 -0
  133. package/dist/app/ws/ws.d.ts +31 -0
  134. package/dist/app/ws/ws.js +169 -0
  135. package/dist/board/canvas-chat.d.ts +97 -0
  136. package/dist/board/canvas-chat.js +175 -0
  137. package/dist/board/card-guards.d.ts +15 -0
  138. package/dist/board/card-guards.js +38 -0
  139. package/dist/board/cards/canvas.d.ts +41 -0
  140. package/dist/board/cards/canvas.js +83 -0
  141. package/dist/board/cards/choice.d.ts +20 -0
  142. package/dist/board/cards/choice.js +64 -0
  143. package/dist/board/cards/code.d.ts +9 -0
  144. package/dist/board/cards/code.js +10 -0
  145. package/dist/board/cards/dictation.d.ts +42 -0
  146. package/dist/board/cards/dictation.js +105 -0
  147. package/dist/board/cards/docs.d.ts +47 -0
  148. package/dist/board/cards/docs.js +152 -0
  149. package/dist/board/cards/image.d.ts +13 -0
  150. package/dist/board/cards/image.js +26 -0
  151. package/dist/board/cards/index.d.ts +62 -0
  152. package/dist/board/cards/index.js +144 -0
  153. package/dist/board/cards/kind.d.ts +33 -0
  154. package/dist/board/cards/kind.js +9 -0
  155. package/dist/board/cards/lecture.d.ts +26 -0
  156. package/dist/board/cards/lecture.js +62 -0
  157. package/dist/board/cards/paint.d.ts +38 -0
  158. package/dist/board/cards/paint.js +85 -0
  159. package/dist/board/cards/photo.d.ts +15 -0
  160. package/dist/board/cards/photo.js +29 -0
  161. package/dist/board/cards/read.d.ts +8 -0
  162. package/dist/board/cards/read.js +18 -0
  163. package/dist/board/cards/text.d.ts +20 -0
  164. package/dist/board/cards/text.js +59 -0
  165. package/dist/board/cards/tianzige.d.ts +16 -0
  166. package/dist/board/cards/tianzige.js +64 -0
  167. package/dist/board/cards/tutor.d.ts +72 -0
  168. package/dist/board/cards/tutor.js +134 -0
  169. package/dist/board/cards/word.d.ts +20 -0
  170. package/dist/board/cards/word.js +76 -0
  171. package/dist/board/lecture.d.ts +100 -0
  172. package/dist/board/lecture.js +204 -0
  173. package/dist/board/paper.d.ts +20 -0
  174. package/dist/board/paper.js +76 -0
  175. package/dist/board/parse.d.ts +120 -0
  176. package/dist/board/parse.js +330 -0
  177. package/dist/board/presentation.d.ts +295 -0
  178. package/dist/board/presentation.js +615 -0
  179. package/dist/board/sections.d.ts +16 -0
  180. package/dist/board/sections.js +130 -0
  181. package/dist/brain/api-tools.d.ts +8 -0
  182. package/dist/brain/api-tools.js +190 -0
  183. package/dist/brain/api.d.ts +62 -0
  184. package/dist/brain/api.js +411 -0
  185. package/dist/brain/cli/adapters.d.ts +60 -0
  186. package/dist/brain/cli/adapters.js +91 -0
  187. package/dist/brain/cli/qwen.d.ts +11 -0
  188. package/dist/brain/cli/qwen.js +141 -0
  189. package/dist/brain/cli/run-plan.d.ts +59 -0
  190. package/dist/brain/cli/run-plan.js +71 -0
  191. package/dist/brain/cli/run.d.ts +35 -0
  192. package/dist/brain/cli/run.js +256 -0
  193. package/dist/brain/cli/stream-json.d.ts +18 -0
  194. package/dist/brain/cli/stream-json.js +86 -0
  195. package/dist/brain/cli/types.d.ts +144 -0
  196. package/dist/brain/cli/types.js +3 -0
  197. package/dist/brain/cli/warm.d.ts +53 -0
  198. package/dist/brain/cli/warm.js +103 -0
  199. package/dist/brain/index.d.ts +145 -0
  200. package/dist/brain/index.js +74 -0
  201. package/dist/brain/stream.d.ts +20 -0
  202. package/dist/brain/stream.js +70 -0
  203. package/dist/brain/transcript.d.ts +45 -0
  204. package/dist/brain/transcript.js +132 -0
  205. package/dist/chalk/actions.d.ts +37 -0
  206. package/dist/chalk/actions.js +69 -0
  207. package/dist/chalk/bundle.d.ts +26 -0
  208. package/dist/chalk/bundle.js +69 -0
  209. package/dist/chalk/check.d.ts +28 -0
  210. package/dist/chalk/check.js +291 -0
  211. package/dist/chalk/circle.d.ts +64 -0
  212. package/dist/chalk/circle.js +193 -0
  213. package/dist/chalk/clock.d.ts +84 -0
  214. package/dist/chalk/clock.js +84 -0
  215. package/dist/chalk/geometry.d.ts +44 -0
  216. package/dist/chalk/geometry.js +139 -0
  217. package/dist/chalk/glyphs/capitals.d.ts +12 -0
  218. package/dist/chalk/glyphs/capitals.js +264 -0
  219. package/dist/chalk/glyphs/index.d.ts +21 -0
  220. package/dist/chalk/glyphs/index.js +18 -0
  221. package/dist/chalk/glyphs/letters.d.ts +13 -0
  222. package/dist/chalk/glyphs/letters.js +280 -0
  223. package/dist/chalk/glyphs/metrics.d.ts +33 -0
  224. package/dist/chalk/glyphs/metrics.js +28 -0
  225. package/dist/chalk/glyphs/registry.d.ts +7 -0
  226. package/dist/chalk/glyphs/registry.js +8 -0
  227. package/dist/chalk/glyphs/sample.d.ts +32 -0
  228. package/dist/chalk/glyphs/sample.js +102 -0
  229. package/dist/chalk/glyphs/skeleton.d.ts +64 -0
  230. package/dist/chalk/glyphs/skeleton.js +126 -0
  231. package/dist/chalk/glyphs/types.d.ts +58 -0
  232. package/dist/chalk/glyphs/types.js +17 -0
  233. package/dist/chalk/index.d.ts +23 -0
  234. package/dist/chalk/index.js +15 -0
  235. package/dist/chalk/manifest.d.ts +41 -0
  236. package/dist/chalk/manifest.js +6 -0
  237. package/dist/chalk/paint.d.ts +180 -0
  238. package/dist/chalk/paint.js +210 -0
  239. package/dist/chalk/pointer.d.ts +8 -0
  240. package/dist/chalk/pointer.js +21 -0
  241. package/dist/chalk/prepare.d.ts +11 -0
  242. package/dist/chalk/prepare.js +15 -0
  243. package/dist/chalk/scene-schema.d.ts +199 -0
  244. package/dist/chalk/scene-schema.js +91 -0
  245. package/dist/chalk/seed.d.ts +3 -0
  246. package/dist/chalk/seed.js +10 -0
  247. package/dist/chalk/text-metrics.d.ts +8 -0
  248. package/dist/chalk/text-metrics.js +156 -0
  249. package/dist/chalk/timeline.d.ts +47 -0
  250. package/dist/chalk/timeline.js +84 -0
  251. package/dist/chalk/types.d.ts +150 -0
  252. package/dist/chalk/types.js +8 -0
  253. package/dist/lib/index.d.ts +14 -8
  254. package/dist/lib/index.js +14 -8
  255. package/dist/media/draw.d.ts +23 -0
  256. package/dist/media/draw.js +44 -0
  257. package/dist/media/mp3.d.ts +6 -0
  258. package/dist/media/mp3.js +58 -0
  259. package/dist/media/mp4.d.ts +1 -0
  260. package/dist/media/mp4.js +58 -0
  261. package/dist/media/tts-voices.d.ts +18 -0
  262. package/dist/media/tts-voices.js +606 -0
  263. package/dist/media/tts.d.ts +56 -0
  264. package/dist/media/tts.js +174 -0
  265. package/dist/media/vision.d.ts +25 -0
  266. package/dist/media/vision.js +71 -0
  267. package/dist/memory/commit.d.ts +67 -0
  268. package/dist/memory/commit.js +130 -0
  269. package/dist/memory/context.d.ts +86 -0
  270. package/dist/memory/context.js +97 -0
  271. package/dist/memory/diary.d.ts +84 -0
  272. package/dist/memory/diary.js +183 -0
  273. package/dist/memory/grade.d.ts +2 -0
  274. package/dist/memory/grade.js +7 -0
  275. package/dist/{lib → memory}/plan.d.ts +3 -1
  276. package/dist/{lib → memory}/plan.js +10 -1
  277. package/dist/memory/proposals.d.ts +11 -0
  278. package/dist/memory/proposals.js +43 -0
  279. package/dist/memory/retrieval.d.ts +44 -0
  280. package/dist/memory/retrieval.js +157 -0
  281. package/dist/memory/timetable.d.ts +19 -0
  282. package/dist/memory/timetable.js +95 -0
  283. package/dist/memory/vault-notes.d.ts +165 -0
  284. package/dist/memory/vault-notes.js +359 -0
  285. package/dist/memory/vault.d.ts +70 -0
  286. package/dist/memory/vault.js +169 -0
  287. package/dist/realtime/bailian.d.ts +120 -0
  288. package/dist/realtime/bailian.js +288 -0
  289. package/dist/realtime/cues.d.ts +51 -0
  290. package/dist/realtime/cues.js +94 -0
  291. package/dist/realtime/listen.d.ts +32 -0
  292. package/dist/realtime/listen.js +53 -0
  293. package/dist/realtime/preview.d.ts +23 -0
  294. package/dist/realtime/preview.js +38 -0
  295. package/dist/realtime/prompt.d.ts +8 -0
  296. package/dist/realtime/prompt.js +13 -0
  297. package/dist/realtime/voices.d.ts +19 -0
  298. package/dist/realtime/voices.js +71 -0
  299. package/dist/runtime/activities.d.ts +17 -0
  300. package/dist/runtime/activities.js +46 -0
  301. package/dist/runtime/activity-state.d.ts +22 -0
  302. package/dist/runtime/activity-state.js +83 -0
  303. package/dist/runtime/activity.d.ts +63 -0
  304. package/dist/runtime/activity.js +428 -0
  305. package/dist/runtime/agent-file.d.ts +24 -0
  306. package/dist/runtime/agent-file.js +59 -0
  307. package/dist/runtime/auto-bookkeep.d.ts +30 -0
  308. package/dist/runtime/auto-bookkeep.js +84 -0
  309. package/dist/{lib → runtime/context}/context-pack.d.ts +3 -3
  310. package/dist/runtime/context/context-pack.js +182 -0
  311. package/dist/runtime/context/thread-digest.d.ts +4 -0
  312. package/dist/runtime/context/thread-digest.js +35 -0
  313. package/dist/runtime/context/tutor-rules.d.ts +25 -0
  314. package/dist/runtime/context/tutor-rules.js +47 -0
  315. package/dist/runtime/delivery/delivery.d.ts +94 -0
  316. package/dist/runtime/delivery/delivery.js +145 -0
  317. package/dist/runtime/delivery/playback.d.ts +25 -0
  318. package/dist/runtime/delivery/playback.js +29 -0
  319. package/dist/runtime/delivery/player.d.ts +145 -0
  320. package/dist/runtime/delivery/player.js +221 -0
  321. package/dist/runtime/delivery/queue.d.ts +89 -0
  322. package/dist/runtime/delivery/queue.js +59 -0
  323. package/dist/runtime/home/edit.d.ts +39 -0
  324. package/dist/runtime/home/edit.js +132 -0
  325. package/dist/runtime/home/home.d.ts +180 -0
  326. package/dist/runtime/home/home.js +311 -0
  327. package/dist/runtime/home/store.d.ts +142 -0
  328. package/dist/runtime/home/store.js +440 -0
  329. package/dist/runtime/journal/conversation.d.ts +46 -0
  330. package/dist/runtime/journal/conversation.js +89 -0
  331. package/dist/runtime/journal/events.d.ts +27 -0
  332. package/dist/runtime/journal/events.js +136 -0
  333. package/dist/runtime/journal/kid-log.d.ts +105 -0
  334. package/dist/runtime/journal/kid-log.js +133 -0
  335. package/dist/runtime/journal/ledger.d.ts +17 -0
  336. package/dist/{lib → runtime/journal}/ledger.js +7 -32
  337. package/dist/runtime/journal/mix.d.ts +33 -0
  338. package/dist/runtime/journal/mix.js +88 -0
  339. package/dist/runtime/journal/mouth-index.d.ts +26 -0
  340. package/dist/runtime/journal/mouth-index.js +34 -0
  341. package/dist/runtime/journal/mouth.d.ts +54 -0
  342. package/dist/runtime/journal/mouth.js +102 -0
  343. package/dist/runtime/journal/recorder.d.ts +46 -0
  344. package/dist/runtime/journal/recorder.js +58 -0
  345. package/dist/runtime/journal/store.d.ts +123 -0
  346. package/dist/runtime/journal/store.js +316 -0
  347. package/dist/runtime/kid-input.d.ts +16 -0
  348. package/dist/runtime/kid-input.js +195 -0
  349. package/dist/runtime/kid-view.d.ts +124 -0
  350. package/dist/runtime/kid-view.js +157 -0
  351. package/dist/runtime/lecture.d.ts +86 -0
  352. package/dist/runtime/lecture.js +237 -0
  353. package/dist/runtime/live/call.d.ts +219 -0
  354. package/dist/runtime/live/call.js +1211 -0
  355. package/dist/runtime/live/turns.d.ts +48 -0
  356. package/dist/runtime/live/turns.js +102 -0
  357. package/dist/runtime/runner.d.ts +289 -0
  358. package/dist/runtime/runner.js +898 -0
  359. package/dist/runtime/talk-run.d.ts +21 -0
  360. package/dist/runtime/talk-run.js +34 -0
  361. package/dist/scenes/dictation/match.d.ts +57 -0
  362. package/dist/scenes/dictation/match.js +255 -0
  363. package/dist/scenes/dictation/recognize.d.ts +86 -0
  364. package/dist/scenes/dictation/recognize.js +163 -0
  365. package/dist/scenes/dictation/store.d.ts +112 -0
  366. package/dist/scenes/dictation/store.js +99 -0
  367. package/dist/scenes/look.d.ts +26 -0
  368. package/dist/scenes/look.js +1 -0
  369. package/dist/scenes/paint/painter.d.ts +84 -0
  370. package/dist/scenes/paint/painter.js +170 -0
  371. package/dist/scenes/paint/prompt.d.ts +23 -0
  372. package/dist/scenes/paint/prompt.js +36 -0
  373. package/dist/scenes/talk/en-words.d.ts +8 -0
  374. package/dist/scenes/talk/en-words.js +44 -0
  375. package/dist/scenes/talk/list.d.ts +44 -0
  376. package/dist/scenes/talk/list.js +88 -0
  377. package/dist/scenes/talk/store.d.ts +27 -0
  378. package/dist/scenes/talk/store.js +61 -0
  379. package/dist/scenes/talk/warmup.d.ts +16 -0
  380. package/dist/scenes/talk/warmup.js +39 -0
  381. package/dist/schema/activity.d.ts +149 -0
  382. package/dist/schema/activity.js +113 -0
  383. package/dist/schema/board.d.ts +200 -0
  384. package/dist/schema/board.js +42 -0
  385. package/dist/schema/config.d.ts +353 -80
  386. package/dist/schema/config.js +293 -76
  387. package/dist/schema/context-pack.d.ts +82 -13
  388. package/dist/schema/context-pack.js +97 -10
  389. package/dist/schema/conversation-files.d.ts +43 -0
  390. package/dist/schema/conversation-files.js +26 -0
  391. package/dist/schema/conversation.d.ts +459 -13
  392. package/dist/schema/conversation.js +148 -8
  393. package/dist/schema/events.d.ts +138 -0
  394. package/dist/schema/events.js +1 -0
  395. package/dist/schema/home.d.ts +46 -0
  396. package/dist/schema/home.js +30 -0
  397. package/dist/schema/index.d.ts +19 -4
  398. package/dist/schema/index.js +19 -4
  399. package/dist/schema/json-schema.d.ts +2 -0
  400. package/dist/schema/json-schema.js +23 -0
  401. package/dist/schema/kid-device.d.ts +20 -0
  402. package/dist/schema/kid-device.js +32 -0
  403. package/dist/schema/ledger.d.ts +9 -64
  404. package/dist/schema/ledger.js +7 -31
  405. package/dist/schema/memory.d.ts +73 -0
  406. package/dist/schema/memory.js +47 -0
  407. package/dist/schema/plan.d.ts +2 -2
  408. package/dist/schema/plan.js +2 -2
  409. package/dist/schema/sections.d.ts +32 -25
  410. package/dist/schema/sections.js +21 -22
  411. package/dist/schema/theme.d.ts +25 -0
  412. package/dist/schema/theme.js +26 -0
  413. package/dist/schema/timetable.d.ts +26 -0
  414. package/dist/schema/timetable.js +18 -0
  415. package/dist/schema/workspace.d.ts +41 -0
  416. package/dist/schema/workspace.js +9 -0
  417. package/dist/shared/errors.d.ts +8 -0
  418. package/dist/shared/errors.js +13 -0
  419. package/dist/shared/home.d.ts +2 -0
  420. package/dist/shared/home.js +16 -0
  421. package/dist/shared/human-notes.d.ts +5 -0
  422. package/dist/shared/human-notes.js +7 -0
  423. package/dist/shared/qianwen.d.ts +50 -0
  424. package/dist/shared/qianwen.js +109 -0
  425. package/dist/shared/time.d.ts +9 -0
  426. package/dist/shared/time.js +22 -0
  427. package/dist/shared/tokens.d.ts +18 -0
  428. package/dist/shared/tokens.js +11 -0
  429. package/dist/shared/wav.d.ts +10 -0
  430. package/dist/shared/wav.js +50 -0
  431. package/dist/stage/Assistant-Bold-ZDZZ6JHA.woff2 +0 -0
  432. package/dist/stage/Assistant-Medium-DZ25RZU3.woff2 +0 -0
  433. package/dist/stage/Assistant-Regular-PLF2XOGW.woff2 +0 -0
  434. package/dist/stage/Assistant-SemiBold-CZ5MX6FK.woff2 +0 -0
  435. package/dist/stage/chunk-226TNLQA.js +129 -0
  436. package/dist/stage/chunk-24LGQEKE.js +1 -0
  437. package/dist/stage/chunk-25XV6UY3.js +10 -0
  438. package/dist/stage/chunk-2AZI3NHJ.js +1 -0
  439. package/dist/stage/chunk-2BQZTTBE.js +1 -0
  440. package/dist/stage/chunk-2M7CGY3Y.js +11 -0
  441. package/dist/stage/chunk-2VR4WFQ7.js +10 -0
  442. package/dist/stage/chunk-2ZYXBUWG.js +9 -0
  443. package/dist/stage/chunk-32LAWMGY.js +1 -0
  444. package/dist/stage/chunk-3LEMTSOO.js +11 -0
  445. package/dist/stage/chunk-3QCKGZYE.js +32 -0
  446. package/dist/stage/chunk-44P66WFA.js +1 -0
  447. package/dist/stage/chunk-4AM6FRR6.js +7 -0
  448. package/dist/stage/chunk-4QDE4SUK.js +1 -0
  449. package/dist/stage/chunk-4QESHV3U.js +1 -0
  450. package/dist/stage/chunk-4SG5QPHB.js +2 -0
  451. package/dist/stage/chunk-4T4UVCOC.js +1 -0
  452. package/dist/stage/chunk-4WUEPPG3.js +34 -0
  453. package/dist/stage/chunk-4YCN6UZ5.js +99 -0
  454. package/dist/stage/chunk-5V7ZY2AP.js +1 -0
  455. package/dist/stage/chunk-5VS5Y2VJ.js +6 -0
  456. package/dist/stage/chunk-5W4NO2ZD.js +62 -0
  457. package/dist/stage/chunk-65CRNICM.js +1 -0
  458. package/dist/stage/chunk-66MULO7F.js +5 -0
  459. package/dist/stage/chunk-6COFQTBS.js +162 -0
  460. package/dist/stage/chunk-6VZG3M3I.js +8 -0
  461. package/dist/stage/chunk-7HVDH43T.js +1 -0
  462. package/dist/stage/chunk-7JLJN4EZ.js +8 -0
  463. package/dist/stage/chunk-7QDSP4LN.js +1 -0
  464. package/dist/stage/chunk-7R6OQAO3.js +1 -0
  465. package/dist/stage/chunk-7VTTHZKW.js +7 -0
  466. package/dist/stage/chunk-ATHR5KEN.js +10 -0
  467. package/dist/stage/chunk-B6R5LTP2.js +36 -0
  468. package/dist/stage/chunk-BD4WE264.js +1 -0
  469. package/dist/stage/chunk-BONANU47.js +206 -0
  470. package/dist/stage/chunk-BTVW7OFK.js +89 -0
  471. package/dist/stage/chunk-BUTJIDHG.js +8 -0
  472. package/dist/stage/chunk-C2IPYMML.js +84 -0
  473. package/dist/stage/chunk-C54FTPPV.js +9 -0
  474. package/dist/stage/chunk-C6LOUF2Z.js +90 -0
  475. package/dist/stage/chunk-CFF3PILO.js +339 -0
  476. package/dist/stage/chunk-CI2FQ2JY.js +9 -0
  477. package/dist/stage/chunk-CW5O4RV7.js +12 -0
  478. package/dist/stage/chunk-CYABNQYD.js +1 -0
  479. package/dist/stage/chunk-D7FFA4NS.js +15 -0
  480. package/dist/stage/chunk-DUNNXU6Z.js +8 -0
  481. package/dist/stage/chunk-E3E4Q6JF.js +6 -0
  482. package/dist/stage/chunk-EB3U3LH7.js +9 -0
  483. package/dist/stage/chunk-EGSZ736B.js +8 -0
  484. package/dist/stage/chunk-EOBXW5VQ.js +2 -0
  485. package/dist/stage/chunk-ERZC3B7Y.js +11 -0
  486. package/dist/stage/chunk-ESDOOBIH.js +11 -0
  487. package/dist/stage/chunk-EVU4QAL4.js +178 -0
  488. package/dist/stage/chunk-EVVZI2NY.js +39 -0
  489. package/dist/stage/chunk-FBKAZUKD.js +39 -0
  490. package/dist/stage/chunk-FDVKYQJN.js +1 -0
  491. package/dist/stage/chunk-FGPVYHVR.js +5 -0
  492. package/dist/stage/chunk-FHUD4AZC.js +1 -0
  493. package/dist/stage/chunk-FKUJ2DMY.js +96 -0
  494. package/dist/stage/chunk-FNZGVIJV.js +1 -0
  495. package/dist/stage/chunk-GBYSEGYM.js +78 -0
  496. package/dist/stage/chunk-GCO4TDHX.js +1 -0
  497. package/dist/stage/chunk-GKTML2LG.js +10 -0
  498. package/dist/stage/chunk-GMDIHHXQ.js +11 -0
  499. package/dist/stage/chunk-GOUNACI3.js +10 -0
  500. package/dist/stage/chunk-GXAYATPF.js +3 -0
  501. package/dist/stage/chunk-H2K2DDXV.js +8 -0
  502. package/dist/stage/chunk-H3UJI6ZY.js +13 -0
  503. package/dist/stage/chunk-H6PUGCME.js +7 -0
  504. package/dist/stage/chunk-HNBUIMIG.js +1 -0
  505. package/dist/stage/chunk-HRZY2BJQ.js +10 -0
  506. package/dist/stage/chunk-HSPJGALW.js +30 -0
  507. package/dist/stage/chunk-IBYORHIP.js +25 -0
  508. package/dist/stage/chunk-IHF4EWTY.js +1 -0
  509. package/dist/stage/chunk-ISBRPNKI.js +1 -0
  510. package/dist/stage/chunk-IZ3OI3C2.js +2 -0
  511. package/dist/stage/chunk-JEFZAC2R.js +1 -0
  512. package/dist/stage/chunk-JFIGRDPO.js +1 -0
  513. package/dist/stage/chunk-JFVYBOOC.js +9 -0
  514. package/dist/stage/chunk-JGD4TUTQ.js +1 -0
  515. package/dist/stage/chunk-JO4BEHDH.js +4 -0
  516. package/dist/stage/chunk-JOWBS42C.js +1 -0
  517. package/dist/stage/chunk-JP3TM2TG.js +1 -0
  518. package/dist/stage/chunk-JVK2C52O.js +1 -0
  519. package/dist/stage/chunk-K4I76XBX.js +14 -0
  520. package/dist/stage/chunk-KA6CZZ4M.js +1 -0
  521. package/dist/stage/chunk-KESSJ36M.js +1 -0
  522. package/dist/stage/chunk-LKATEVRU.js +1 -0
  523. package/dist/stage/chunk-LS4EJ2EI.js +1 -0
  524. package/dist/stage/chunk-LUKJQC2X.js +70 -0
  525. package/dist/stage/chunk-LWULR3SM.js +1 -0
  526. package/dist/stage/chunk-LWVRFMKX.js +2 -0
  527. package/dist/stage/chunk-LXC4ZBPZ.js +1 -0
  528. package/dist/stage/chunk-M2UP255H.js +1 -0
  529. package/dist/stage/chunk-MAPPXUZQ.js +231 -0
  530. package/dist/stage/chunk-MBMPW7Z5.js +1 -0
  531. package/dist/stage/chunk-MD3HMMTK.js +1 -0
  532. package/dist/stage/chunk-MLPCUIKR.js +17 -0
  533. package/dist/stage/chunk-MNQIRPDQ.js +8 -0
  534. package/dist/stage/chunk-MRG7MJVS.js +1 -0
  535. package/dist/stage/chunk-MU6EXW72.js +10 -0
  536. package/dist/stage/chunk-MVU2X6LU.js +4 -0
  537. package/dist/stage/chunk-N6UA5CZV.js +36 -0
  538. package/dist/stage/chunk-NLZIT2TJ.js +7 -0
  539. package/dist/stage/chunk-NOJR3J7M.js +1 -0
  540. package/dist/stage/chunk-NT7ARDOL.js +1 -0
  541. package/dist/stage/chunk-NWOGMPZH.js +1 -0
  542. package/dist/stage/chunk-NXE4KMG3.js +40 -0
  543. package/dist/stage/chunk-O4YCZXD2.js +257 -0
  544. package/dist/stage/chunk-OAJZ7HLK.js +1 -0
  545. package/dist/stage/chunk-OCFCFASO.js +1 -0
  546. package/dist/stage/chunk-ODGPG5RY.js +7 -0
  547. package/dist/stage/chunk-ODUEA52Q.js +3 -0
  548. package/dist/stage/chunk-OGDJ3FCI.js +1 -0
  549. package/dist/stage/chunk-OLDJ55TT.js +1 -0
  550. package/dist/stage/chunk-OOCL4ATI.js +2 -0
  551. package/dist/stage/chunk-OQEFDUDV.js +1 -0
  552. package/dist/stage/chunk-OQWVEWG7.js +4 -0
  553. package/dist/stage/chunk-OUIX6BGK.js +1 -0
  554. package/dist/stage/chunk-OV7OZYUO.js +7 -0
  555. package/dist/stage/chunk-PFGDY33O.js +1 -0
  556. package/dist/stage/chunk-PFJDUJB3.js +139 -0
  557. package/dist/stage/chunk-PGEW76ER.js +1 -0
  558. package/dist/stage/chunk-PP76TAQX.js +32 -0
  559. package/dist/stage/chunk-PTBOP4OT.js +2 -0
  560. package/dist/stage/chunk-PX2RVHCK.js +1 -0
  561. package/dist/stage/chunk-Q7K3PNAD.js +1 -0
  562. package/dist/stage/chunk-QDDPLZDB.js +1 -0
  563. package/dist/stage/chunk-QLGLZ77F.js +1 -0
  564. package/dist/stage/chunk-QOPFDFHI.js +1 -0
  565. package/dist/stage/chunk-QXT4KAEJ.js +1 -0
  566. package/dist/stage/chunk-R4YVZCIT.js +1 -0
  567. package/dist/stage/chunk-R6P6EHWA.js +62 -0
  568. package/dist/stage/chunk-RCH3OXBI.js +9 -0
  569. package/dist/stage/chunk-RHPE44I2.js +1 -0
  570. package/dist/stage/chunk-RJ2R4FVC.js +1 -0
  571. package/dist/stage/chunk-RJH2YVTD.js +1 -0
  572. package/dist/stage/chunk-RLWWW5OB.js +6 -0
  573. package/dist/stage/chunk-S3WO35Z7.js +120 -0
  574. package/dist/stage/chunk-S7ZGX6MW.js +1 -0
  575. package/dist/stage/chunk-SIAWX27B.js +1 -0
  576. package/dist/stage/chunk-SLG4X622.js +1 -0
  577. package/dist/stage/chunk-SLJRBC77.js +168 -0
  578. package/dist/stage/chunk-SRORWQJZ.js +1 -0
  579. package/dist/stage/chunk-STZTUIIF.js +2 -0
  580. package/dist/stage/chunk-SVQ6MWNV.js +9 -0
  581. package/dist/stage/chunk-TL3HLL2S.js +132 -0
  582. package/dist/stage/chunk-U3DOE6SF.js +24 -0
  583. package/dist/stage/chunk-UABQIZKW.js +6 -0
  584. package/dist/stage/chunk-UDK3R764.js +1 -0
  585. package/dist/stage/chunk-UFF4E54B.js +41 -0
  586. package/dist/stage/chunk-UFP5Q4AY.js +1 -0
  587. package/dist/stage/chunk-UMH2TSW2.js +72 -0
  588. package/dist/stage/chunk-UTASVNF5.js +10 -0
  589. package/dist/stage/chunk-UW7ML5ML.js +88 -0
  590. package/dist/stage/chunk-V3J7F6OP.js +1 -0
  591. package/dist/stage/chunk-VEHP5B5Q.js +5 -0
  592. package/dist/stage/chunk-VRXWB733.js +9 -0
  593. package/dist/stage/chunk-VVDHBBS5.js +5 -0
  594. package/dist/stage/chunk-VYFOH6FU.js +106 -0
  595. package/dist/stage/chunk-W3VZTLQS.js +3 -0
  596. package/dist/stage/chunk-W7WNRWTZ.js +8 -0
  597. package/dist/stage/chunk-WHUCV53C.js +1 -0
  598. package/dist/stage/chunk-WULMYHIF.js +1 -0
  599. package/dist/stage/chunk-X54EX7AW.js +9 -0
  600. package/dist/stage/chunk-X565ISZM.js +1 -0
  601. package/dist/stage/chunk-XGZMDECB.js +1 -0
  602. package/dist/stage/chunk-XHONC4RF.js +172 -0
  603. package/dist/stage/chunk-XIK4XQ6E.js +24 -0
  604. package/dist/stage/chunk-XJQQWFTE.js +1 -0
  605. package/dist/stage/chunk-XM4WOU3I.js +13 -0
  606. package/dist/stage/chunk-XM7Y5HP5.js +38 -0
  607. package/dist/stage/chunk-XNYYRGD5.js +292 -0
  608. package/dist/stage/chunk-XOYVR3SV.js +1 -0
  609. package/dist/stage/chunk-XQIW5HCE.js +1 -0
  610. package/dist/stage/chunk-YEWL7FUW.js +8 -0
  611. package/dist/stage/chunk-YI55PY3V.js +1 -0
  612. package/dist/stage/chunk-YM63HI6W.js +1 -0
  613. package/dist/stage/chunk-YNLGLU4P.js +9 -0
  614. package/dist/stage/chunk-YTNMNOWP.js +1 -0
  615. package/dist/stage/chunk-YV62XKTC.js +1 -0
  616. package/dist/stage/chunk-YVBA3QW6.js +1 -0
  617. package/dist/stage/chunk-Z2SY2HOC.js +1 -0
  618. package/dist/stage/chunk-ZBTCQEBK.js +10 -0
  619. package/dist/stage/chunk-ZCUFN74D.js +1 -0
  620. package/dist/stage/chunk-ZHOULXEJ.js +11 -0
  621. package/dist/stage/chunk-ZTRZIET2.js +1 -0
  622. package/dist/stage/index.html +11 -0
  623. package/dist/stage/stage.css +1 -0
  624. package/dist/stage/stage.js +1 -0
  625. package/dist/ui/dev/dev-page.d.ts +1 -0
  626. package/dist/ui/dev/dev-page.js +2248 -0
  627. package/dist/ui/dev/dev-theme.d.ts +6 -0
  628. package/dist/ui/dev/dev-theme.js +67 -0
  629. package/dist/ui/dev/qr-page.d.ts +8 -0
  630. package/dist/ui/dev/qr-page.js +61 -0
  631. package/dist/ui/dev/voice-gallery-page.d.ts +1 -0
  632. package/dist/ui/dev/voice-gallery-page.js +121 -0
  633. package/dist/ui/dev/voice-scenes.d.ts +21 -0
  634. package/dist/ui/dev/voice-scenes.js +30 -0
  635. package/dist/ui/dictation/en-box.d.ts +2 -0
  636. package/dist/ui/dictation/en-box.js +86 -0
  637. package/dist/ui/dictation/en-page.d.ts +1 -0
  638. package/dist/ui/dictation/en-page.js +484 -0
  639. package/dist/ui/dictation/page.d.ts +1 -0
  640. package/dist/ui/dictation/page.js +1084 -0
  641. package/dist/ui/dictation/parent-page.d.ts +1 -0
  642. package/dist/ui/dictation/parent-page.js +234 -0
  643. package/dist/ui/dictation/reel-mode.d.ts +1 -0
  644. package/dist/ui/dictation/reel-mode.js +87 -0
  645. package/dist/ui/dictation/reel-page.d.ts +1 -0
  646. package/dist/ui/dictation/reel-page.js +62 -0
  647. package/dist/ui/dictation/reel.d.ts +163 -0
  648. package/dist/ui/dictation/reel.js +436 -0
  649. package/dist/ui/dictation/ui.d.ts +44 -0
  650. package/dist/ui/dictation/ui.js +80 -0
  651. package/dist/ui/dictation/unlock.d.ts +7 -0
  652. package/dist/ui/dictation/unlock.js +16 -0
  653. package/dist/ui/kid/audio-client.d.ts +11 -0
  654. package/dist/ui/kid/audio-client.js +74 -0
  655. package/dist/ui/kid/board-mark-art.d.ts +37 -0
  656. package/dist/ui/kid/board-mark-art.js +5 -0
  657. package/dist/ui/kid/board-mark.d.ts +24 -0
  658. package/dist/ui/kid/board-mark.js +58 -0
  659. package/dist/ui/kid/kid-log.d.ts +15 -0
  660. package/dist/ui/kid/kid-log.js +87 -0
  661. package/dist/ui/kid/kid-nav.d.ts +11 -0
  662. package/dist/ui/kid/kid-nav.js +22 -0
  663. package/dist/ui/kid/kid-page.d.ts +9 -0
  664. package/dist/ui/kid/kid-page.js +3719 -0
  665. package/dist/ui/kid/letters.d.ts +26 -0
  666. package/dist/ui/kid/letters.js +51 -0
  667. package/dist/ui/kid/photo-edit.d.ts +83 -0
  668. package/dist/ui/kid/photo-edit.js +106 -0
  669. package/dist/ui/kid/photo-ui.d.ts +23 -0
  670. package/dist/ui/kid/photo-ui.js +60 -0
  671. package/dist/ui/kid/reel.d.ts +419 -0
  672. package/dist/ui/kid/reel.js +648 -0
  673. package/dist/ui/kid/tianzige.d.ts +8 -0
  674. package/dist/ui/kid/tianzige.js +45 -0
  675. package/dist/ui/kid/tutor-face.d.ts +35 -0
  676. package/dist/ui/kid/tutor-face.js +84 -0
  677. package/dist/ui/kid/voice-ui.d.ts +70 -0
  678. package/dist/ui/kid/voice-ui.js +316 -0
  679. package/dist/ui/kid/voice-view.d.ts +71 -0
  680. package/dist/ui/kid/voice-view.js +75 -0
  681. package/dist/ui/kid/word-draw.d.ts +2 -0
  682. package/dist/ui/kid/word-draw.js +107 -0
  683. package/dist/ui/kid/word-emoji.d.ts +10 -0
  684. package/dist/ui/kid/word-emoji.js +66 -0
  685. package/dist/ui/kid/word-layout.d.ts +25 -0
  686. package/dist/ui/kid/word-layout.js +29 -0
  687. package/dist/ui/parent/parent-home-page.d.ts +1 -0
  688. package/dist/ui/parent/parent-home-page.js +414 -0
  689. package/dist/ui/parent/parent-page.d.ts +2 -0
  690. package/dist/ui/parent/parent-page.js +507 -0
  691. package/dist/ui/shared/brand.d.ts +36 -0
  692. package/dist/ui/shared/brand.js +51 -0
  693. package/dist/ui/shared/favicon.d.ts +12 -0
  694. package/dist/ui/shared/favicon.js +96 -0
  695. package/dist/ui/shared/icon.d.ts +9 -0
  696. package/dist/ui/shared/icon.js +35 -0
  697. package/dist/ui/shared/inline-lib.d.ts +1 -0
  698. package/dist/ui/shared/inline-lib.js +28 -0
  699. package/dist/ui/shared/logo.d.ts +31 -0
  700. package/dist/ui/shared/logo.js +43 -0
  701. package/dist/ui/shared/page-dom.d.ts +12 -0
  702. package/dist/ui/shared/page-dom.js +36 -0
  703. package/dist/ui/shared/png.d.ts +1 -0
  704. package/dist/ui/shared/png.js +45 -0
  705. package/dist/ui/shared/qr-svg.d.ts +3 -0
  706. package/dist/ui/shared/qr-svg.js +32 -0
  707. package/dist/ui/shared/qr.d.ts +14 -0
  708. package/dist/ui/shared/qr.js +281 -0
  709. package/dist/ui/shared/reel-dock.d.ts +22 -0
  710. package/dist/ui/shared/reel-dock.js +365 -0
  711. package/dist/ui/shared/tutor-color.d.ts +15 -0
  712. package/dist/ui/shared/tutor-color.js +47 -0
  713. package/dist/ui/talk/page.d.ts +6 -0
  714. package/dist/ui/talk/page.js +294 -0
  715. package/grades/grade-2/README.md +11 -0
  716. package/grades/grade-2/VALIDATION.md +41 -0
  717. package/grades/grade-2/agents/chinese-tutor/activities//344/275/240/350/257/264/346/210/221/347/224/273.md +157 -0
  718. package/grades/grade-2/agents/chinese-tutor/activities//344/275/240/350/257/264/346/210/221/347/224/273./344/276/213/345/255/220.md +78 -0
  719. package/grades/grade-2/agents/chinese-tutor/activities//344/276/213/345/255/220/345/233/276//345/200/237/344/274/236.jpg +0 -0
  720. package/grades/grade-2/agents/chinese-tutor/activities//344/276/213/345/255/220/345/233/276//345/260/217/347/214/264/346/221/230/346/241/203.jpg +0 -0
  721. package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235.md +64 -0
  722. package/grades/grade-2/agents/chinese-tutor/activities//345/206/231/350/257/235./344/276/213/345/255/220.md +31 -0
  723. package/grades/grade-2/agents/chinese-tutor/activities//345/220/254/345/206/231.md +48 -0
  724. package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240.md +79 -0
  725. package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  726. package/grades/grade-2/agents/chinese-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
  727. package/grades/grade-2/agents/chinese-tutor/activities//346/211/271/346/224/271.md +81 -0
  728. package/grades/grade-2/agents/chinese-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
  729. package/grades/grade-2/agents/chinese-tutor/activities//347/234/213/345/233/276/350/257/264/350/257/235.md +94 -0
  730. package/grades/grade-2/agents/chinese-tutor/activities//347/234/213/345/233/276/350/257/264/350/257/235./344/276/213/345/255/220.md +63 -0
  731. package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240.md +82 -0
  732. package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  733. package/grades/grade-2/agents/chinese-tutor.md +59 -0
  734. package/grades/grade-2/agents/english-tutor/activities//345/217/243/350/257/255/350/257/276.md +149 -0
  735. package/grades/grade-2/agents/english-tutor/activities//345/217/243/350/257/255/350/257/276./344/276/213/345/255/220.md +13 -0
  736. package/grades/grade-2/agents/english-tutor/activities//345/220/254/345/206/231.md +47 -0
  737. package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240.md +78 -0
  738. package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  739. package/grades/grade-2/agents/english-tutor/activities//345/260/217/350/257/276/345/240/202.md +53 -0
  740. package/grades/grade-2/agents/english-tutor/activities//346/211/271/346/224/271.md +80 -0
  741. package/grades/grade-2/agents/english-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
  742. package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240.md +86 -0
  743. package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  744. package/grades/grade-2/agents/english-tutor.md +57 -0
  745. package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240.md +78 -0
  746. package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240./344/276/213/345/255/220.md +35 -0
  747. package/grades/grade-2/agents/math-tutor/activities//345/260/217/350/257/276/345/240/202.md +56 -0
  748. package/grades/grade-2/agents/math-tutor/activities//345/260/217/350/257/276/345/240/202./344/276/213/345/255/220.md +52 -0
  749. package/grades/grade-2/agents/math-tutor/activities//346/211/271/346/224/271.md +80 -0
  750. package/grades/grade-2/agents/math-tutor/activities//346/211/271/346/224/271./344/276/213/345/255/220.md +35 -0
  751. package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240.md +81 -0
  752. package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240./344/276/213/345/255/220.md +35 -0
  753. package/grades/grade-2/agents/math-tutor.md +51 -0
  754. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/index.json +44 -0
  755. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-1.mp3 +0 -0
  756. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-2.mp3 +0 -0
  757. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-3.mp3 +0 -0
  758. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-4.mp3 +0 -0
  759. package/grades/grade-2/examples/2026-10-27-pingjunfen/audio/step-5.mp3 +0 -0
  760. package/grades/grade-2/examples/2026-10-27-pingjunfen/bake.json +1 -0
  761. package/grades/grade-2/examples/2026-10-27-pingjunfen/manifest.json +63 -0
  762. package/grades/grade-2/examples/2026-10-27-pingjunfen/scene.json +247 -0
  763. package/grades/grade-2/examples/2026-10-27-pingjunfen.md +40 -0
  764. package/grades/grade-2/examples/2026-10-27-pingjunfen.ts +26 -0
  765. package/grades/grade-2/examples//345/271/263/345/235/207/345/210/206./344/276/213/345/255/220.md +24 -0
  766. package/grades/grade-2/examples//346/225/260/345/255/246/345/271/263/345/235/207/345/210/206.md +42 -0
  767. package/grades/grade-2/validation/2026-10-27.json +4410 -0
  768. package/package.json +32 -12
  769. package/skills/chalk-cli/SKILL.md +62 -0
  770. package/skills/chalk-scene/SKILL.md +91 -0
  771. package/skills/chalk-teaching/SKILL.md +82 -0
  772. package/skills/chalk-teaching/models//344/272/244/351/224/231/346/225/260/345/210/227/345/210/206/350/241/214.md +8 -0
  773. package/skills/chalk-teaching/models//345/207/221/345/215/201.md +7 -0
  774. package/skills/chalk-teaching/models//345/221/250/346/234/237/350/247/204/345/276/213.md +6 -0
  775. package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/345/242/236/345/207/217.md +6 -0
  776. package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/346/257/224/345/244/232/345/260/221-/346/261/202/345/244/247/346/225/260/346/261/202/345/260/217/346/225/260.md +7 -0
  777. package/skills/chalk-teaching/models//345/256/236/347/211/251/345/233/276-/346/257/224/345/244/232/345/260/221-/346/261/202/345/267/256.md +6 -0
  778. package/skills/chalk-teaching/models//345/260/217/346/243/222/350/277/233/344/275/215/345/212/240.md +7 -0
  779. package/skills/chalk-teaching/models//345/260/217/346/243/222/351/200/200/344/275/215/345/207/217.md +6 -0
  780. package/skills/chalk-teaching/models//346/216/222/351/230/237/347/202/271/351/230/265.md +7 -0
  781. package/skills/chalk-teaching/models//346/227/266/351/227/264/346/225/260/350/275/264.md +6 -0
  782. package/skills/chalk-teaching/models//346/245/274/345/261/202/351/227/264/351/232/224/345/233/276.md +7 -0
  783. package/skills/chalk-teaching/models//347/240/264/345/215/201.md +7 -0
  784. package/skills/chalk-teaching/models//347/253/226/345/274/217/351/200/200/344/275/215.md +6 -0
  785. package/skills/chalk-teaching/models//347/272/277/346/256/265/345/233/276.md +7 -0
  786. package/skills/chalk-teaching/models-index.md +24 -0
  787. package/skills/chalk-teaching/references//350/256/262/350/247/243/346/250/241/346/235/277/344/270/211/346/241/243.md +32 -0
  788. package/skills/chalk-teaching/references//350/257/264/346/230/216/346/226/207/344/273/266.md +102 -0
  789. package/skills/chalk-verify/SKILL.md +57 -0
  790. package/skills/chalk-verify/references//350/257/204/345/210/244/346/240/207/345/207/206.md +69 -0
  791. package/skills/cotutor-analyze/SKILL.md +106 -0
  792. package/skills/cotutor-analyze/references//345/221/275/344/273/244/344/270/216/346/226/207/344/273/266.md +31 -0
  793. package/skills/cotutor-board/SKILL.md +373 -0
  794. package/skills/cotutor-board/references/README.md +38 -0
  795. package/skills/cotutor-board/references/canvas.md +68 -0
  796. package/skills/cotutor-board/references/choice.md +55 -0
  797. package/skills/cotutor-board/references/code.md +46 -0
  798. package/skills/cotutor-board/references/image.md +52 -0
  799. package/skills/cotutor-board/references/lecture.md +69 -0
  800. package/skills/cotutor-board/references/paint.md +77 -0
  801. package/skills/cotutor-board/references/photo.md +61 -0
  802. package/skills/cotutor-board/references/read.md +51 -0
  803. package/skills/cotutor-board/references/text.md +69 -0
  804. package/skills/cotutor-board/references/tianzige.md +78 -0
  805. package/skills/cotutor-board/references/word.md +91 -0
  806. package/skills/cotutor-home/SKILL.md +169 -0
  807. package/skills/cotutor-home/references/dictation.md +97 -0
  808. package/skills/cotutor-home/references/tutor.md +148 -0
  809. package/skills/cotutor-home/references//345/221/275/344/273/244.md +21 -0
  810. package/skills/cotutor-home/references//351/246/226/351/241/265/350/257/255/346/263/225.md +142 -0
  811. package/skills/cotutor-tune/SKILL.md +147 -0
  812. package/skills/cotutor-tune/references//345/255/227/346/256/265.md +50 -0
  813. package/skills/cotutor-tutor/SKILL.md +261 -0
  814. package/skills/cotutor-tutor/references//344/270/212/344/270/213/346/226/207/345/214/205.md +78 -0
  815. package/themes/default/kid.css +86 -0
  816. package/themes/default/theme.json +26 -0
  817. package/agents/chinese-teacher.md +0 -19
  818. package/agents/homework-aide.md +0 -17
  819. package/agents/math-teacher.md +0 -19
  820. package/agents/planner.md +0 -18
  821. package/agents/reading-teacher.md +0 -19
  822. package/dist/cli/doctor.d.ts +0 -19
  823. package/dist/cli/doctor.js +0 -190
  824. package/dist/cli/init.js +0 -114
  825. package/dist/cli/main.js +0 -123
  826. package/dist/cli/serve.d.ts +0 -19
  827. package/dist/cli/serve.js +0 -22
  828. package/dist/cli/skeleton.d.ts +0 -21
  829. package/dist/cli/skeleton.js +0 -82
  830. package/dist/cli/workspace.d.ts +0 -61
  831. package/dist/lib/agent-file.d.ts +0 -10
  832. package/dist/lib/agent-file.js +0 -16
  833. package/dist/lib/context-pack.js +0 -46
  834. package/dist/lib/conversation.d.ts +0 -28
  835. package/dist/lib/conversation.js +0 -44
  836. package/dist/lib/kid-view.d.ts +0 -26
  837. package/dist/lib/kid-view.js +0 -38
  838. package/dist/lib/ledger.d.ts +0 -21
  839. package/dist/lib/sections.d.ts +0 -12
  840. package/dist/lib/sections.js +0 -151
  841. package/dist/lib/transcript.d.ts +0 -36
  842. package/dist/lib/transcript.js +0 -95
  843. package/dist/server/app.d.ts +0 -13
  844. package/dist/server/app.js +0 -45
  845. /package/dist/{cli → app/cli}/main.d.ts +0 -0
@@ -0,0 +1,78 @@
1
+ <!-- 给人看
2
+ 谁读:有脸的老师按需 Read;workspace 里的编程助手(cotutor-analyze)查「老师看到了什么」
3
+ 能改:机器件,upgrade 覆盖。形状的真相在 src/schema/context-pack.ts;加一个字段,这里就要加一行(tests/skills.test.ts 查)
4
+ -->
5
+
6
+ # 上下文包每一行是什么
7
+
8
+ 消息前面 `cotutor:` 开头的那段 YAML,是应用替你备好的。它后面接几段原文,再是 `---`,再是消息本身。
9
+
10
+ 怎么用这些行,见守则(`<cotutor-rules>`)。
11
+
12
+ ## 每一行
13
+
14
+ | 行 | 是什么 | 什么时候有 |
15
+ |---|---|---|
16
+ | `at` | 本地时间,分钟精度,如 `2026-09-08T16:20` | 每条 |
17
+ | `slot` | 课程表命中的时段,如「数学 16:00-17:00」 | 命中时 |
18
+ | `focus` | `focus.card` 是孩子发消息时正开着的那张卡(`<job>/<n>`) | 开着卡时 |
19
+ | `rules` | 老师守则在哪,后面跟状态 | 有脸的老师 |
20
+ | `boardGuide` | 板书写法在哪:「已在你的系统提示里」,或一个路径加状态 | 板书没关时 |
21
+ | `activityGuide` | 这个话题的 activity:「已在你的系统提示里」,或文件路径加状态(原文在 `<cotutor-activity>`) | activity 话题 |
22
+ | `semester` | 当前学期,如「二年级上」。应用按档案算好的,你不用再推 | 算得出时 |
23
+ | `profile` | 档案的路径(相对 vault 根),后面跟状态 | 每条 |
24
+ | `child` | 孩子的记忆的路径,后面跟状态:关于孩子本人、换一科也成立的,所有老师共用一篇;「还没有」= 谁都还没记过 | 有脸的老师 |
25
+ | `entry` | 你这一科这学期入口文件的路径,后面跟状态 | 有脸的老师 |
26
+ | `memory` | 你的记忆文件的路径,后面跟状态;「还没有」= 你还没记过东西 | 每条 |
27
+ | `lesson` | 家长写的那一课的口径在哪(教材路径加课题),后面跟状态;原文在 `<vault-note role="lesson">` | 孩子提到那一课、或问到那一课要会写的字时 |
28
+ | `refs` | 参考资料的绝对路径:这科这学期的教材,加档案与入口文件里链到的笔记。**只给路径**,用到才读 | 有资料、这轮带工具时 |
29
+ | `plan` | 本周计划里你的行 | 计划里有你时 |
30
+ | `recent` | 最近 14 天日记里本学科的「- 观察:」行,取最新的几条 | 有观察时 |
31
+ | `lookup` | 应用替你查好的,一条一行:孩子问到的字在这学期生字表的哪一课、会认还是会写(「不在这学期的识字、写字表里」= 不是这学期的字);以前讲过那一课的骨架 | 孩子问字、提到某一课,教材里查得到时 |
32
+ | `board` | `off` = 只说话,不出卡 | 家长关了板书时 |
33
+ | `cards` | 上一轮之后孩子在卡上做的,一张卡一行:编号、种类、标题、做了什么、答案。交了画板的,行里有几笔(各颜色几笔)、画了多久、清空重画过几次,和那张图、清掉的那几版的绝对路径,**Read 用它** | 孩子动过卡时 |
34
+ | `lecture` | 孩子刚看完的小课堂:`title` 课名,`source` 哪一课(`bundle <id>` 是课包,`video <id>` 是视频),`length` 课长,`lines` 每句的起点与原话(「0:18 …」),`watched` 他怎么看的(看完没、停过几次、画了几处),`marks` 他画的每一处(停在同一刻画的几笔):那一刻在讲哪句、截图是 `photos` 里第几张;课包的还说画的地方盖着什么 | 看完后的第一条;问过以后再看一遍又画了的那条 |
35
+ | `home` | 孩子从首页的按钮进来:`button` 是按钮上的字,`brief` 是家长备好的讲法 | 只在按钮发来的那条 |
36
+ | `live` | 这一轮走实时:你的讲稿交给嘴(realtime 模型)照念、不配音。`caught` 是嘴先说的那句(只有拍照时有:「我看一看图片」);`cut` 是上一轮你的讲稿念到第几句被孩子打断(0 = 一句都没念到,孩子没听到你上一轮写的)。口语课还有:`warmup` 热身的摸底,一拍一行(应用按转写记,不说明发音);`phone` 打电话打了几分钟;`app` 这一轮不是孩子说的(`call` 你念了 `[[call]]`,现在开始打电话;`quiet` 热身里孩子连着两拍没开口)。交画的那一轮还有 `draw`:这张画画着的时候孩子说的和你(嘴)说的,一句一行(「孩子:…」「你:…」) | 实时老师的每一轮 |
37
+ | `drawing` | 孩子从左栏的纸上交来的画:是 `photos` 第几张、几笔(各颜色几笔)、画了多久、清空重画过的话清掉的那几版是第几张 | 孩子交了纸上的画时 |
38
+ | `continue` | 接着以前某天的某个话题:`from` 哪天哪个话题,`title` 话题名,`said` / `cards` 那个话题最后一节的讲稿与卡(卡带孩子做的与答案),`index` 那天的对话索引 | 只在新话题的第一条 |
39
+ | `activity` | 孩子从首页的 activity 进来的话题:`name` 是哪个,`params` 是家长填的,`state` 是应用算好的(如还能画几张)。在最后几行 | activity 话题的每一条 |
40
+ | `photos` | 这条带的作业照片,相对 workspace 根。写在卡上用 | 孩子拍了照片时 |
41
+ | `photoFiles` | 同一批照片的绝对路径,顺序一一对应。**Read 用它** | 同上 |
42
+ | `vault` | 家长的 Obsidian 仓库在哪:`root` 是绝对路径,`diary` / `plans` / `timetable` / `reference` 相对 `root` | 配了 vault、这轮带工具时 |
43
+
44
+ ## 路径后面的状态
45
+
46
+ `rules`、`boardGuide`、`activityGuide`、`profile`、`child`、`entry`、`memory`、`lesson` 的路径后面可能跟一段括号:
47
+
48
+ | 写着 | 意思 | 你怎么做 |
49
+ |---|---|---|
50
+ | 只有路径 | 原文就在后面的原文段里 | 看原文段 |
51
+ | 「未变」 | 这个话题前面已经给过原文,内容没改 | 往前看,别再 Read |
52
+ | 「截到 N」 | 原文太长,只带了前面 N 字 | 用带来的这些;这轮带工具才 Read 全文 |
53
+ | 「只带最近 N」 | 记忆(或孩子的记忆)太长,截掉的是前面旧的 | 同上 |
54
+ | 「缺:…」 | 没有这篇,冒号后面写着为什么 | 照常教,别编 |
55
+
56
+ ## 原文段
57
+
58
+ YAML 后面、`---` 前面,整篇原文照登:
59
+
60
+ | 标签 | 是什么 |
61
+ |---|---|
62
+ | `<cotutor-rules>` | 老师守则 |
63
+ | `<cotutor-board>` | 板书写法(没进系统提示时才有) |
64
+ | `<cotutor-activity>` | 这个 activity 怎么带(没进系统提示时才有);后面可能接「这个 activity 多用的卡」的写法 |
65
+ | `<vault-note role="profile">` | 档案 |
66
+ | `<vault-note role="child">` | 孩子的记忆:所有老师共用,和档案对不上时以档案为准 |
67
+ | `<vault-note role="entry">` | 你这一科这学期的入口文件 |
68
+ | `<vault-note role="memory">` | 你的记忆 |
69
+ | `<vault-note role="lesson">` | 家长写的那一课怎么讲(教材那一节的 `### 口径`) |
70
+
71
+ - 守则与笔记只在话题第一条带,或者话题里原文改过了才再带。
72
+ - 家长写的字是真相。
73
+
74
+ ## 拼 vault 里的路径
75
+
76
+ - 路径拼法:`<vault.root>/<相对路径>`。
77
+ - `root` 可能含空格。
78
+ - 别猜缺省名,别去读 cotutor.json。
@@ -0,0 +1,86 @@
1
+ /*
2
+ * cotutor 出厂主题 default —— 孩子端板书的样子:板、卡、笔、舞台壳。
3
+ * 这份是家长的(init 拷进 workspace 的 themes/default/,改了刷新就有;没改过的随 cotutor upgrade 更新)。
4
+ * 槽的名字在旁边的 theme.json:底色槽 → .c[data-tint="<名>"],字形槽 → .c[data-look="<名>"],笔 → .mk-<名> / .pen-<名>;
5
+ * 名字对不上的卡落回 paper / plain(.c 的缺省)。页面骨架(首页、头部、字幕行、输入条)在页面里,这里只管板书。
6
+ * 各种卡自己的结构样式(选项行、空、图、缩略图)在包里 cards/<kind>/card.css,服务把它们拼在这份前面——这里写同名选择器就能盖过去。
7
+ */
8
+
9
+ /* ---- 值:板、六个底色槽、五支笔、选中态 ---- */
10
+ :root {
11
+ --paper:#faf9f4; --ink:#2b2b2b; --dim:#8a8781; --line:#e2dfd6; --card:#ffffff; --kid:#dbeeff; --tutor:#fff3d6; --accent:#e8743b; --hi:#ffe3a8; --blue:#eef4ff; --cream:#f7f1e3; --ok:#e8f6ee; --ok-ink:#1f8a4c; --purple:#efe9fb; --purple-ink:#7a4fc9; --grey:#eeece6;
12
+ --tint-paper-bg:#ffffff; --tint-paper-line:#e2dfd6; --tint-paper-head:#6b675f;
13
+ --tint-sky-bg:#e9f1fb; --tint-sky-line:#c6d9f0; --tint-sky-head:#2f5e9e;
14
+ --tint-moss-bg:#e5f4ea; --tint-moss-line:#bddcc8; --tint-moss-head:#1f8a4c;
15
+ --tint-sand-bg:#f9f1de; --tint-sand-line:#e7d7b2; --tint-sand-head:#8a5a12;
16
+ --tint-plum-bg:#efe9fb; --tint-plum-line:#d3c6f0; --tint-plum-head:#7a4fc9;
17
+ --tint-night-bg:#2b3a4a; --tint-night-line:#2b3a4a; --tint-night-head:#ffffff;
18
+ --pen-marker:#ffd66b; --pen-tint:#b9e6c8; --pen-underline:#e8743b; --pen-box:#7a4fc9; --pen-circle:#1f8a4c;
19
+ --sel:#e8743b; --sel-halo:rgba(232,116,59,0.22);
20
+ --serif:"Songti SC","Times New Roman",serif;
21
+ }
22
+
23
+ /* ---- 节:头一行 + 行(行是页面按卡的宽度排的) ---- */
24
+ .sec { display:flex; flex-direction:column; gap:12px; }
25
+ .sec + .sec { margin-top:12px; }
26
+ .sh { display:flex; align-items:center; gap:8px; padding:6px 4px 0; font-size:13px; color:var(--dim); white-space:nowrap; }
27
+ .sh::after { content:""; flex:1; height:1px; background:var(--line); }
28
+ .row { display:grid; gap:12px; grid-template-columns:repeat(1,minmax(0,1fr)); }
29
+ .heading { font-size:16px; font-weight:700; padding:8px 4px 0; }
30
+
31
+ /* ---- 卡:底色槽 + 同系描边,不用阴影;选中态主色描边 + 外晕,不放大 ---- */
32
+ .c { position:relative; display:flex; flex-direction:column; gap:4px; padding:14px 16px; border-radius:16px; background:var(--tint-paper-bg); border:1.5px solid var(--tint-paper-line); font-size:17px; line-height:1.6; box-sizing:border-box; -webkit-user-select:text; user-select:text; transition:border-color .2s, box-shadow .2s; }
33
+ .c .ct { font-size:13px; font-weight:700; color:var(--tint-paper-head); letter-spacing:.3px; }
34
+ .c .cb { white-space:pre-line; }
35
+ .c[data-tint="sky"] { background:var(--tint-sky-bg); border-color:var(--tint-sky-line); } .c[data-tint="sky"] .ct { color:var(--tint-sky-head); }
36
+ .c[data-tint="moss"] { background:var(--tint-moss-bg); border-color:var(--tint-moss-line); } .c[data-tint="moss"] .ct { color:var(--tint-moss-head); }
37
+ .c[data-tint="sand"] { background:var(--tint-sand-bg); border-color:var(--tint-sand-line); } .c[data-tint="sand"] .ct { color:var(--tint-sand-head); }
38
+ .c[data-tint="plum"] { background:var(--tint-plum-bg); border-color:var(--tint-plum-line); } .c[data-tint="plum"] .ct { color:var(--tint-plum-head); }
39
+ .c[data-tint="night"] { background:var(--tint-night-bg); border-color:var(--tint-night-line); color:#ffffff; } .c[data-tint="night"] .ct { color:var(--tint-night-head); }
40
+ .c.now { border-color:var(--sel); box-shadow:0 0 0 3px var(--sel-halo), inset 0 0 0 .5px var(--sel); }
41
+ /* 字形槽 */
42
+ .c[data-look="title"] .cb { font-size:21px; font-weight:700; text-align:center; line-height:1.45; }
43
+ .c[data-look="formula"] .cb { font-family:var(--serif); font-size:22px; text-align:center; letter-spacing:.5px; line-height:1.5; }
44
+ .c[data-look="quote"] .cb { font-style:italic; text-align:center; color:#5a5650; }
45
+ .c[data-tint="night"][data-look="quote"] .cb { color:#ffffffcc; }
46
+
47
+ /* ---- 笔:面类一下子涂上;线条类是 SVG 路径,念到时描出来 ---- */
48
+ .mk-marker { background:linear-gradient(transparent 30%, var(--pen-marker) 30%, var(--pen-marker) 90%, transparent 90%); padding:0 3px; border-radius:2px; }
49
+ .c[data-tint="night"] .mk-marker { background:linear-gradient(transparent 30%, #ffd66b99 30%, #ffd66b99 90%, transparent 90%); }
50
+ .mk-tint { background:var(--pen-tint); padding:0 4px; border-radius:5px; }
51
+ .mk-underline, .mk-box, .mk-circle { padding:0 2px; }
52
+ .mk-box { padding:1px 5px; }
53
+ .pen { position:absolute; pointer-events:none; overflow:visible; }
54
+ .pen path { fill:none; stroke-width:2.4; stroke-linecap:round; stroke-linejoin:round; }
55
+ .pen-underline path { stroke:var(--pen-underline); }
56
+ .pen-box path { stroke:var(--pen-box); stroke-width:2.2; }
57
+ .pen-circle path { stroke:var(--pen-circle); }
58
+ .pen.draw path { transition:stroke-dashoffset .55s ease-out; }
59
+ .mk-marker, .mk-tint { animation:pen .25s ease-out; }
60
+ @keyframes pen { from { opacity:0; } to { opacity:1; } }
61
+
62
+ /* ---- 舞台:盖住板书那块,留 8px 边;顶栏 = 卡的名字 + 关闭;字幕行与输入条还在下面 ---- */
63
+ #stage { position:absolute; inset:8px; border-radius:20px; background:#ffffff; box-shadow:0 8px 30px #00000029; display:none; flex-direction:column; z-index:5; overflow:hidden; }
64
+ #stage.on { display:flex; }
65
+ #stage .top { display:flex; align-items:center; gap:10px; padding:12px 14px 12px 20px; border-bottom:1px solid var(--line); }
66
+ #stage .top .ttl { flex:1; min-width:0; font-size:17px; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
67
+ #stage .top .kd { font-size:12px; color:var(--dim); border:1px solid var(--line); border-radius:10px; padding:1px 8px; }
68
+ #st-x { width:40px; height:40px; display:grid; place-items:center; color:var(--dim); }
69
+ #st-body { flex:1; min-height:0; overflow:auto; padding:20px; display:flex; flex-direction:column; gap:14px; -webkit-overflow-scrolling:touch; }
70
+ #st-body[hidden] { display:none; }
71
+ #st-body .c { font-size:20px; line-height:1.6; padding:18px 20px; }
72
+ #st-body .c[data-look="title"] .cb { font-size:26px; } #st-body .c[data-look="formula"] .cb { font-size:28px; } #st-body .rd { font-size:22px; }
73
+ #st-act { padding:12px 20px 16px; display:flex; align-items:center; justify-content:flex-end; gap:12px; border-top:1px solid var(--line); }
74
+ #st-act .note { flex:1; font-size:14px; color:var(--dim); text-align:right; }
75
+ #st-act[hidden] { display:none; }
76
+ #st-go { padding:0 22px; height:48px; border-radius:24px; background:var(--accent); color:#fff; font-size:17px; font-weight:600; }
77
+ #st-go:disabled { opacity:.35; }
78
+ body.limit #st-go, body.pending #st-go { opacity:.35; pointer-events:none; }
79
+ #st-frame { flex:1; min-height:0; width:100%; border:0; display:block; background:#ffffff; }
80
+ #st-frame[hidden] { display:none; }
81
+
82
+ /* ---- 平板横屏 ---- */
83
+ @media (min-width:900px) and (orientation:landscape) {
84
+ #stage { left:50%; transform:translateX(-50%); width:min(1040px, calc(100% - 16px)); }
85
+ #st-body { padding:28px 40px; }
86
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "default",
3
+ "_note": "cotutor 出厂主题的清单。tints = 卡的底色槽、looks = 字形槽、pens = 五支笔;槽想要几个就几个,每个一个名字 + 一句「给什么用」(写课文件、排版时照这句挑),default 是素版与回退用的槽。颜色的值在旁边的 kid.css 里,这里只登记名字。",
4
+ "default": "paper",
5
+ "tints": {
6
+ "paper": { "use": "公式、图、代码:白底,不抢" },
7
+ "sky": { "use": "结论、定义、要记住的一句" },
8
+ "moss": { "use": "方法、那一下、验算" },
9
+ "sand": { "use": "事实、例子、列表、引言" },
10
+ "plum": { "use": "题目、要孩子做的" },
11
+ "night": { "use": "封面、反面、一节的收尾" }
12
+ },
13
+ "looks": {
14
+ "plain": { "use": "缺省:小标题 + 正文" },
15
+ "title": { "use": "一句话看懂:大字居中" },
16
+ "formula": { "use": "算式:衬线居中" },
17
+ "quote": { "use": "引一句原文:斜体居中" }
18
+ },
19
+ "pens": {
20
+ "marker": { "use": "荧光笔:要记住的一句 / 一个公式" },
21
+ "tint": { "use": "术语底:正在定义的词" },
22
+ "underline": { "use": "下划线:事实里的关键数字 / 词" },
23
+ "box": { "use": "方框:列表的引导词、选项" },
24
+ "circle": { "use": "圈:并列几项里点到的那个" }
25
+ }
26
+ }
@@ -1,19 +0,0 @@
1
- ---
2
- name: chinese-teacher
3
- description: 语文老师。生字、词语、课文、写话都找它;先一两句大白话回答,要范读要示范的以后再出课件
4
- maxTurns: 40
5
- permissionMode: bypassPermissions
6
- memory: project
7
- ---
8
- 你是这个家的语文老师,面对的是一个小学生和他的家长。cwd 是你的家(agents/chinese-teacher/),账本在 ../../ledger/,家规在 ../../CLAUDE.md。消息前面有一段 `cotutor:` 开头的上下文包,先看它再答。孩子问「这个字怎么读 / 什么意思」这类,直接答。
9
-
10
- 回复只有两种,先分清:
11
- - **问答**(缺省,孩子或家长随口问):这次回复就是一两句大白话,不超过三句;不用工具,不读账本(上下文包里已经给了时段、正在看什么、本周计划、最近观察),想到的就直接说。
12
- - **任务**(消息前的上下文包里 `from: system`,或家长明确写了「出课包 / 补讲 / 记账 / 做计划」):按任务做,做完在最后一段报告结果。
13
-
14
- 现在还没有出课件的通道(R5 才接上):**不要自己写 HTML 或任何课件文件**。要画要讲的,在最后一段对孩子说「这个要画给你看,等我准备好会出现在你的今天里」就够了。
15
-
16
- 你说给孩子听的话放在回复的**最后一段**;孩子只看得到最后一段,中间的话和工具过程只有家长看。永远不评价孩子答得对不对,不打分;把孩子的话当问题,不当答案。
17
-
18
- 记账与记忆(只在任务里做,问答不做):值得别的老师知道的观察,追加一行到 ../../ledger/observations.jsonl;你自己的经验记进你的记忆目录。
19
- 需要家长拍板的事写成一段「## 待裁量」(question: 一句话;options: 列表),不要停下来等。
@@ -1,17 +0,0 @@
1
- ---
2
- name: homework-aide
3
- description: 作业助教。家长拍的作业照片先到它这里:认学科、认题号、交给对应的学科老师;自己不讲题
4
- maxTurns: 30
5
- permissionMode: bypassPermissions
6
- memory: project
7
- ---
8
- 你是这个家的作业助教,只和家长打交道。cwd 是你的家(agents/homework-aide/),账本在 ../../ledger/,家规在 ../../CLAUDE.md。消息前面有一段 `cotutor:` 开头的上下文包,先看它再答。
9
-
10
- 你的活:
11
- - 家长发来作业照片或素材集引用时,看照片认学科、认有几道题、哪几道错了,写一句结论。
12
- - 然后写一段「## 转交」交给学科老师(to: math-teacher / chinese-teacher / reading-teacher;why: 一句话;refs: 照片或素材集路径)。第一期只允许一跳,你自己不讲题。
13
- - 认不出学科、或照片糊了拍不全,写一段「## 待裁量」问家长(question + options),不要猜。
14
- - 把「哪天、什么作业、错了几道」追加一行到 ../../ledger/observations.jsonl。
15
- - 家长随口问你别的,一两句话答,不用工具。
16
-
17
- 回复的最后一段留给家长看的一句话结论。
@@ -1,19 +0,0 @@
1
- ---
2
- name: math-teacher
3
- description: 数学老师。孩子问数学题、家长发数学作业都找它;先一两句大白话回答,要画要讲的以后再出课包或补讲
4
- maxTurns: 40
5
- permissionMode: bypassPermissions
6
- memory: project
7
- ---
8
- 你是这个家的数学老师,面对的是一个小学生和他的家长。cwd 是你的家(agents/math-teacher/),账本在 ../../ledger/,家规在 ../../CLAUDE.md。消息前面有一段 `cotutor:` 开头的上下文包(谁在说、几点、正在看什么、本周计划、最近观察),先看它再答。
9
-
10
- 回复只有两种,先分清:
11
- - **问答**(缺省,孩子或家长随口问):这次回复就是一两句大白话,不超过三句;不用工具,不读账本(上下文包里已经给了时段、正在看什么、本周计划、最近观察),想到的就直接说。
12
- - **任务**(消息前的上下文包里 `from: system`,或家长明确写了「出课包 / 补讲 / 记账 / 做计划」):按任务做,做完在最后一段报告结果。
13
-
14
- 现在还没有出课件的通道(R5 才接上):**不要自己写 HTML 或任何课件文件**。要画要讲的,在最后一段对孩子说「这个要画给你看,等我准备好会出现在你的今天里」就够了。
15
-
16
- 你说给孩子听的话放在回复的**最后一段**;孩子只看得到最后一段,中间的话和工具过程只有家长看。永远不评价孩子答得对不对,不打分;把孩子的话当问题,不当答案。
17
-
18
- 记账与记忆(只在任务里做,问答不做):值得别的老师知道的观察,追加一行到 ../../ledger/observations.jsonl;你自己的经验记进你的记忆目录。
19
- 需要家长拍板的事写成一段「## 待裁量」(question: 一句话;options: 列表),不要停下来等。
package/agents/planner.md DELETED
@@ -1,18 +0,0 @@
1
- ---
2
- name: planner
3
- description: 规划老师。读账本和上周计划,出下周计划草稿到 vault 的计划目录;孩子端不露面
4
- maxTurns: 40
5
- permissionMode: bypassPermissions
6
- memory: project
7
- ---
8
- 你是这个家的规划老师,只和家长打交道,孩子看不到你。cwd 是你的家(agents/planner/),账本在 ../../ledger/,家规在 ../../CLAUDE.md。消息前面有一段 `cotutor:` 开头的上下文包,先看它再答。
9
-
10
- 你的活:
11
- - 家长说「做下周计划」(或 `from: system` 的定时任务)时,读 ../../ledger/observations.jsonl(最近两周)、../../ledger/artifacts.jsonl、上周的计划文件,写下周计划**草稿**。
12
- - 计划文件放 vault 的计划目录(cotutor.json 的 paths.plans),文件名 `<YYYY-Www>.md`,形状固定:
13
- frontmatter `week: 2026-W37`、`status: draft`、`author: planner`;正文按老师**显示名**分 `## 数学老师` `## 语文老师` `## 朗读老师` `## 家长`,每段几行,宁少勿多。
14
- - 家长改成 `status: confirmed` 才算数;你不改别人的计划文件。
15
- - 别的老师的记忆目录也是本地文件,想读可以读,但以账本为准。
16
- - 家长随口问你别的,一两句话答,不用工具。
17
-
18
- 回复的最后一段写一句:计划草稿放在哪里、几条。
@@ -1,19 +0,0 @@
1
- ---
2
- name: reading-teacher
3
- description: 朗读老师(英语)。教材页、单词、句子、跟读都找它;回答尽量短,英文后面跟中文
4
- maxTurns: 40
5
- permissionMode: bypassPermissions
6
- memory: project
7
- ---
8
- 你是这个家的英语朗读老师,面对的是一个刚开始学英语的小学生和他的家长。cwd 是你的家(agents/reading-teacher/),账本在 ../../ledger/,家规在 ../../CLAUDE.md。消息前面有一段 `cotutor:` 开头的上下文包,先看它再答。孩子问单词、句子怎么读怎么说,直接答:英文一句,后面跟中文意思,总共不超过两句。
9
-
10
- 回复只有两种,先分清:
11
- - **问答**(缺省,孩子或家长随口问):这次回复就是一两句大白话,不超过三句;不用工具,不读账本(上下文包里已经给了时段、正在看什么、本周计划、最近观察),想到的就直接说。
12
- - **任务**(消息前的上下文包里 `from: system`,或家长明确写了「出课包 / 补讲 / 记账 / 做计划」):按任务做,做完在最后一段报告结果。
13
-
14
- 现在还没有出课件的通道(R5 才接上):**不要自己写 HTML 或任何课件文件**。要画要讲的,在最后一段对孩子说「这个要画给你看,等我准备好会出现在你的今天里」就够了。
15
-
16
- 你说给孩子听的话放在回复的**最后一段**;孩子只看得到最后一段,中间的话和工具过程只有家长看。永远不评价孩子答得对不对,不打分;把孩子的话当问题,不当答案。
17
-
18
- 记账与记忆(只在任务里做,问答不做):值得别的老师知道的观察,追加一行到 ../../ledger/observations.jsonl;你自己的经验记进你的记忆目录。
19
- 需要家长拍板的事写成一段「## 待裁量」(question: 一句话;options: 列表),不要停下来等。
@@ -1,19 +0,0 @@
1
- import { type ResolveOptions, type RootSource } from './workspace.ts';
2
- export interface DoctorCheck {
3
- name: string;
4
- ok: boolean;
5
- required: boolean;
6
- detail: string;
7
- fix?: string;
8
- }
9
- export interface DoctorReport {
10
- ok: boolean;
11
- root: string | null;
12
- source: RootSource | null;
13
- checks: DoctorCheck[];
14
- }
15
- /** 预设的 CLI 名(run[0] 的 basename):决定链在 .claude 还是 .qwen 下 */
16
- export declare function presetCli(run: readonly string[]): string;
17
- export declare function doctorWorkspace(override?: string, opts?: ResolveOptions & {
18
- probeEnv?: boolean;
19
- }): Promise<DoctorReport>;
@@ -1,190 +0,0 @@
1
- /**
2
- * cotutor doctor:环境 + 工作区逐项体检,失败项附修复命令(错误信息即修复指南)。
3
- * 静默失败摆到明面:配置坏了、老师链断了、账本有坏行、角色指向踩空。
4
- * exit 约定同 drawtell / voxtell doctor:必需项全过 exit 0,否则 1;--json 带 ok 与整份 checks。
5
- */
6
- import { execFile } from 'node:child_process';
7
- import { readFile, readdir, stat } from 'node:fs/promises';
8
- import { basename, join } from 'node:path';
9
- import { promisify } from 'node:util';
10
- import { parseAgentFile } from "../lib/agent-file.js";
11
- import { parseArtifactEvents, parseObservations } from "../lib/ledger.js";
12
- import { DIRS } from "./skeleton.js";
13
- import { CONFIG_FILE, ConfigError, USER_CONFIG, UsageError, assembleWorkspace, expandPath, parseConfig, readJson, redactHome, resolveRoot, } from "./workspace.js";
14
- const execFileP = promisify(execFile);
15
- async function statOrNull(p) {
16
- return stat(p).catch(() => null);
17
- }
18
- async function evictedCount(dir) {
19
- try {
20
- return (await readdir(dir)).filter((f) => f.endsWith('.icloud')).length;
21
- }
22
- catch {
23
- return 0;
24
- }
25
- }
26
- /** 预设的 CLI 名(run[0] 的 basename):决定链在 .claude 还是 .qwen 下 */
27
- export function presetCli(run) {
28
- return basename(run[0] ?? '');
29
- }
30
- export async function doctorWorkspace(override, opts = {}) {
31
- const probeEnv = opts.probeEnv ?? true;
32
- const checks = [];
33
- const push = (c) => checks.push(c);
34
- const [maj, min] = process.versions.node.split('.').map(Number);
35
- const nodeOk = maj > 22 || (maj === 22 && min >= 18);
36
- push({ name: 'node', ok: nodeOk, required: true, detail: `node ${process.versions.node}`, fix: nodeOk ? undefined : '需要 Node ≥ 22.18' });
37
- let root = null;
38
- let source = null;
39
- try {
40
- ({ root, source } = resolveRoot(override, opts));
41
- }
42
- catch (err) {
43
- if (!(err instanceof UsageError))
44
- throw err;
45
- push({
46
- name: err instanceof ConfigError ? 'user-config' : 'workspace',
47
- ok: false,
48
- required: true,
49
- detail: err.message,
50
- fix: err instanceof ConfigError ? `修复 ${redactHome(err.file)} 的 JSON,或删掉它` : 'cotutor init <slug>,或用 --workspace / COTUTOR_WORKSPACE 指定',
51
- });
52
- return { ok: false, root: null, source: null, checks };
53
- }
54
- push({ name: 'workspace', ok: true, required: true, detail: `${redactHome(root)}(来源:${source})` });
55
- // ---- cotutor.json ----
56
- let ws = null;
57
- const configFile = join(root, CONFIG_FILE);
58
- try {
59
- const raw = readJson(configFile);
60
- if (raw === null) {
61
- push({ name: CONFIG_FILE, ok: false, required: true, detail: '不存在', fix: `cotutor init <slug> --dir ${redactHome(root)}(已有文件不动)` });
62
- }
63
- else {
64
- const config = parseConfig(raw, configFile);
65
- ws = assembleWorkspace(root, source, config);
66
- push({
67
- name: CONFIG_FILE,
68
- ok: true,
69
- required: true,
70
- detail: `kid ${config.kid.slug}、${Object.keys(config.teachers).length} 位老师、预设 ${config.agents.default}、端口 ${config.server.port}`,
71
- });
72
- }
73
- }
74
- catch (err) {
75
- if (!(err instanceof ConfigError))
76
- throw err;
77
- push({ name: CONFIG_FILE, ok: false, required: true, detail: err.message, fix: '按上面逐条修;政策文件机器不重建,改坏了靠 git 回退' });
78
- }
79
- // ---- 骨架 ----
80
- const missing = [];
81
- for (const d of DIRS)
82
- if (!(await statOrNull(join(root, d)))?.isDirectory())
83
- missing.push(`${d}/`);
84
- push({
85
- name: 'skeleton',
86
- ok: missing.length === 0,
87
- required: true,
88
- detail: missing.length ? `缺 ${missing.join(' ')}` : [...DIRS].map((d) => `${d}/`).join(' '),
89
- fix: missing.length ? `cotutor init <slug> --dir ${redactHome(root)}(幂等补缺)` : undefined,
90
- });
91
- const rulesMissing = (await Promise.all(['CLAUDE.md', 'QWEN.md'].map(async (f) => ((await statOrNull(join(root, f))) ? null : f)))).filter(Boolean);
92
- push({
93
- name: 'rules',
94
- ok: rulesMissing.length === 0,
95
- required: false,
96
- detail: rulesMissing.length ? `缺家规 ${rulesMissing.join(' ')}(老师少了常驻指令)` : '家规 CLAUDE.md QWEN.md 在',
97
- fix: rulesMissing.length ? 'cotutor init 补上(已有的不动)' : undefined,
98
- });
99
- if (ws) {
100
- // ---- 老师:定义链 + 名字一致 + 老师目录 ----
101
- const defaultCli = presetCli(ws.config.agents[ws.config.agents.default]?.run ?? []);
102
- for (const name of Object.keys(ws.config.teachers)) {
103
- for (const [cli, dir] of [
104
- ['claude', ws.dirs.claudeAgents],
105
- ['qwen', ws.dirs.qwenAgents],
106
- ]) {
107
- const file = join(dir, `${name}.md`);
108
- const required = cli === defaultCli;
109
- let detail;
110
- let ok = false;
111
- try {
112
- const { frontmatter } = parseAgentFile(await readFile(file, 'utf8'));
113
- ok = frontmatter.name === name;
114
- detail = ok ? `${redactHome(file)} name 一致` : `${redactHome(file)} 的 frontmatter name 是 "${frontmatter.name ?? ''}",与老师键 ${name} 不一致`;
115
- }
116
- catch {
117
- detail = `${redactHome(file)} 读不到(链断了或没建)`;
118
- }
119
- push({
120
- name: `teacher.${name}.${cli}`,
121
- ok,
122
- required,
123
- detail,
124
- fix: ok ? undefined : `cotutor init 重链(链到本包 agents/${name}.md),或把老师键改成文件里的 name`,
125
- });
126
- }
127
- const home = join(ws.dirs.agents, name);
128
- const there = (await statOrNull(home))?.isDirectory() ?? false;
129
- push({ name: `teacher.${name}.home`, ok: there, required: true, detail: there ? `agents/${name}/ 在(会话 cwd)` : `agents/${name}/ 不在`, fix: there ? undefined : 'cotutor init 补建' });
130
- }
131
- // ---- paths 角色指向:配了就该在 ----
132
- for (const [role, value] of Object.entries(ws.config.paths)) {
133
- const target = ws.paths[role] ?? expandPath(value, ws.root);
134
- const st = await statOrNull(target);
135
- if (!st) {
136
- push({ name: `paths.${role}`, ok: false, required: true, detail: `指向不存在:${redactHome(target)}`, fix: `mkdir -p 该目录,或修正 cotutor.json 的 paths.${role};指向 Obsidian vault 时确认 vault 已建、iCloud 已同步` });
137
- continue;
138
- }
139
- const evicted = target.includes('Mobile Documents') && st.isDirectory() ? await evictedCount(target) : 0;
140
- push({ name: `paths.${role}`, ok: evicted === 0, required: false, detail: `${redactHome(target)}${evicted ? `——有 ${evicted} 个 .icloud 占位` : ''}`, fix: evicted ? '关掉 iCloud「优化 Mac 储存空间」,或把该目录下载到本地' : undefined });
141
- }
142
- // ---- 账本:坏行必须响(不可再生,别删)----
143
- for (const [name, file, parse] of [
144
- ['observations', ws.files.observations, parseObservations],
145
- ['artifacts', ws.files.artifacts, parseArtifactEvents],
146
- ]) {
147
- try {
148
- const text = await readFile(file, 'utf8');
149
- const { rows, errors } = parse(text);
150
- push({ name: `ledger.${name}`, ok: errors.length === 0, required: true, detail: errors.length ? errors.slice(0, 3).join(';') : `${rows.length} 行`, fix: errors.length ? '修那几行,或 git checkout 回退;账本不可再生,不要删了重来' : undefined });
151
- }
152
- catch {
153
- push({ name: `ledger.${name}`, ok: true, required: false, detail: '没有(还没记过);cotutor init 会建空文件' });
154
- }
155
- }
156
- // ---- 预设的 CLI 在不在 ----
157
- if (probeEnv) {
158
- for (const [preset, p] of Object.entries(ws.config.agents)) {
159
- if (preset === 'default' || typeof p === 'string')
160
- continue;
161
- const bin = presetCli(p.run);
162
- const required = preset === ws.config.agents.default;
163
- try {
164
- const { stdout } = await execFileP(bin, ['--version'], { timeout: 8000 });
165
- push({ name: `agents.${preset}`, ok: true, required, detail: `${bin} ${stdout.trim().split('\n')[0]}` });
166
- }
167
- catch {
168
- push({ name: `agents.${preset}`, ok: false, required, detail: `PATH 里没有 ${bin}`, fix: required ? `装 ${bin},或把 agents.default 改成装了的那个预设` : undefined });
169
- }
170
- }
171
- }
172
- }
173
- // ---- 用户配置 ----
174
- try {
175
- const text = await readFile(USER_CONFIG, 'utf8');
176
- try {
177
- const u = JSON.parse(text);
178
- push({ name: 'user-config', ok: true, required: false, detail: u.workspace ? `workspace → ${redactHome(expandPath(u.workspace, root))}` : '有,但未设 workspace' });
179
- }
180
- catch {
181
- push({ name: 'user-config', ok: false, required: false, detail: `${redactHome(USER_CONFIG)} 解析失败`, fix: '修复 JSON 或删掉它' });
182
- }
183
- }
184
- catch {
185
- push({ name: 'user-config', ok: true, required: false, detail: `未配置(可选):{"workspace": "…"} 写进 ${redactHome(USER_CONFIG)};cotutor init 会代劳` });
186
- }
187
- const gitThere = (await statOrNull(join(root, '.git'))) !== null;
188
- push({ name: 'git', ok: gitThere, required: false, detail: gitThere ? '工作区是 git 仓' : '工作区不在 git 里', fix: gitThere ? undefined : '建议 git init:老师记忆、账本、政策都是不可再生状态' });
189
- return { ok: checks.filter((c) => c.required).every((c) => c.ok), root, source, checks };
190
- }
package/dist/cli/init.js DELETED
@@ -1,114 +0,0 @@
1
- /**
2
- * cotutor init <slug>:建 ~/cotutor/<slug>/ 骨架。语义是**幂等补缺**——已有的文件与目录一律不动,缺什么补什么。
3
- * 三条边界(沿 drawtell init):政策文件只在缺失时写模板;用户配置只在还没指定 workspace 时补;不动 git。
4
- * 老师定义不拷贝,**链**到本包 agents/(共享的是定义,不共享记忆与账本);链已存在(哪怕是实体文件)就不动。
5
- */
6
- import { mkdir, readFile, stat, symlink, writeFile } from 'node:fs/promises';
7
- import { basename, dirname, join, resolve } from 'node:path';
8
- import { DIRS, GITIGNORE, LEDGER_FILES, RULES, configTemplate, shippedAgents } from "./skeleton.js";
9
- import { CONFIG_FILE, HOME_ROOT, USER_CONFIG, expandPath } from "./workspace.js";
10
- async function exists(p) {
11
- return (await stat(p).catch(() => null)) !== null;
12
- }
13
- async function lexists(p) {
14
- const { lstat } = await import('node:fs/promises');
15
- return (await lstat(p).catch(() => null)) !== null;
16
- }
17
- export async function initWorkspace(opts) {
18
- const root = opts.dir ? expandPath(opts.dir, resolve(process.cwd())) : join(HOME_ROOT, opts.slug);
19
- const steps = [];
20
- const agents = await shippedAgents();
21
- const rootExisted = await exists(root);
22
- if (!rootExisted)
23
- await mkdir(root, { recursive: true });
24
- steps.push({ item: '.', action: rootExisted ? 'exists' : 'created' });
25
- for (const dir of DIRS) {
26
- const p = join(root, dir);
27
- if (await exists(p)) {
28
- steps.push({ item: `${dir}/`, action: 'exists' });
29
- continue;
30
- }
31
- await mkdir(p, { recursive: true });
32
- steps.push({ item: `${dir}/`, action: 'created' });
33
- }
34
- for (const a of agents) {
35
- const home = join(root, 'agents', a.name);
36
- if (await exists(home)) {
37
- steps.push({ item: `agents/${a.name}/`, action: 'exists' });
38
- }
39
- else {
40
- await mkdir(home, { recursive: true });
41
- await writeFile(join(home, '.gitkeep'), '');
42
- steps.push({ item: `agents/${a.name}/`, action: 'created' });
43
- }
44
- for (const sub of ['.claude/agents', '.qwen/agents']) {
45
- const link = join(root, sub, basename(a.file));
46
- if (await lexists(link)) {
47
- steps.push({ item: `${sub}/${basename(a.file)}`, action: 'exists' });
48
- continue;
49
- }
50
- await symlink(a.file, link);
51
- steps.push({ item: `${sub}/${basename(a.file)}`, action: 'created', note: `→ ${a.file}` });
52
- }
53
- }
54
- for (const f of LEDGER_FILES) {
55
- const p = join(root, f);
56
- if (await exists(p))
57
- steps.push({ item: f, action: 'exists' });
58
- else {
59
- await writeFile(p, '');
60
- steps.push({ item: f, action: 'created' });
61
- }
62
- }
63
- const config = join(root, CONFIG_FILE);
64
- if (await exists(config))
65
- steps.push({ item: CONFIG_FILE, action: 'kept', note: '政策文件不覆盖(家长的决定)' });
66
- else {
67
- await writeFile(config, configTemplate({ slug: opts.slug, name: opts.name, port: opts.port, teachers: agents }));
68
- steps.push({ item: CONFIG_FILE, action: 'created' });
69
- }
70
- for (const f of ['CLAUDE.md', 'QWEN.md']) {
71
- const p = join(root, f);
72
- if (await exists(p))
73
- steps.push({ item: f, action: 'kept', note: '家规已有,不覆盖' });
74
- else {
75
- await writeFile(p, RULES);
76
- steps.push({ item: f, action: 'created' });
77
- }
78
- }
79
- const gitignore = join(root, '.gitignore');
80
- if (await exists(gitignore))
81
- steps.push({ item: '.gitignore', action: 'kept' });
82
- else {
83
- await writeFile(gitignore, GITIGNORE);
84
- steps.push({ item: '.gitignore', action: 'created' });
85
- }
86
- // 用户配置:补缺不改向;解析不了也不动(doctor 去体检)
87
- let user = null;
88
- let userBroken = false;
89
- try {
90
- user = JSON.parse(await readFile(USER_CONFIG, 'utf8'));
91
- }
92
- catch (err) {
93
- userBroken = err.code !== 'ENOENT';
94
- }
95
- const configured = user && typeof user.workspace === 'string' && user.workspace ? user.workspace : null;
96
- if (userBroken)
97
- steps.push({ item: 'user-config', action: 'kept', note: '解析失败,未动(cotutor doctor 可体检)' });
98
- else if (configured) {
99
- steps.push(expandPath(configured, root) === root
100
- ? { item: 'user-config', action: 'exists', note: '已指向本工作区' }
101
- : { item: 'user-config', action: 'kept', note: '已指向别的工作区,未改;多孩子时一 workspace 一进程,用 --workspace / COTUTOR_WORKSPACE 指定' });
102
- }
103
- else {
104
- await mkdir(dirname(USER_CONFIG), { recursive: true });
105
- await writeFile(USER_CONFIG, `${JSON.stringify({ ...(user ?? {}), workspace: root }, null, 2)}\n`);
106
- steps.push({ item: 'user-config', action: 'created', note: 'workspace 指向本工作区' });
107
- }
108
- const suggestions = [];
109
- if (!(await exists(join(root, '.git'))))
110
- suggestions.push('git init(建议:老师记忆、账本、政策都是不可再生状态,git 是破坏后的兜底)');
111
- suggestions.push(`改 ${CONFIG_FILE}:paths.vault 指到孩子的 Obsidian vault,teachers.*.voice 填 voxtell 音色 id`);
112
- suggestions.push('cotutor doctor 逐项体检;cotutor serve 起服务');
113
- return { root, steps, suggestions };
114
- }