@qnroa/qtype 0.0.2 → 0.0.3

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 (468) hide show
  1. package/CHANGELOG.md +1 -3
  2. package/CHANGELOG.zh.md +1 -2
  3. package/README.md +88 -56
  4. package/README.zh.md +82 -62
  5. package/dist/cli/bootstrap.js +4 -115
  6. package/dist/cli/commands/check/index.js +11 -10
  7. package/dist/cli/commands/config/action.js +5 -9
  8. package/dist/cli/commands/content/lint/action.js +38 -44
  9. package/dist/cli/commands/content/search/action.js +44 -34
  10. package/dist/cli/commands/content/search/i18n.js +6 -0
  11. package/dist/cli/commands/content/search/index.js +19 -1
  12. package/dist/cli/commands/content/validate/action.js +28 -27
  13. package/dist/cli/commands/index.js +1 -3
  14. package/dist/cli/commands/pack/index.js +2 -1
  15. package/dist/cli/commands/publish/build/action.js +39 -11
  16. package/dist/cli/commands/repo/new/action.js +23 -4
  17. package/dist/cli/commands/repo/new/i18n.js +2 -2
  18. package/dist/cli/commands/repo/sync/action.js +24 -4
  19. package/dist/cli/commands/repo/templates.js +2 -1
  20. package/dist/cli/utils/material.js +49 -0
  21. package/dist/core/encrypt.js +24 -1
  22. package/dist/core/index.js +1 -0
  23. package/dist/core/parser/frontmatter.js +39 -34
  24. package/dist/core/parser/parseMaterial.js +174 -24
  25. package/dist/core/romanization/index.js +152 -0
  26. package/dist/core/schemas/both.js +52 -0
  27. package/dist/core/schemas/index.js +3 -0
  28. package/dist/core/schemas/repo.js +55 -0
  29. package/dist/core/schemas/user.js +19 -0
  30. package/dist/core/typing/engine/TypingInput.js +243 -0
  31. package/dist/core/typing/engine/chars.js +30 -0
  32. package/dist/core/typing/engine/feedback.js +15 -0
  33. package/dist/core/typing/engine/index.js +5 -0
  34. package/dist/core/typing/engine/settings.js +8 -0
  35. package/dist/core/typing/engine/stats.js +45 -0
  36. package/dist/core/typing/index.js +9 -1
  37. package/dist/view/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  38. package/dist/view/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  39. package/dist/view/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  40. package/dist/view/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  41. package/dist/view/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  42. package/dist/view/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  43. package/dist/view/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  44. package/dist/view/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  45. package/dist/view/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  46. package/dist/view/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  47. package/dist/view/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  48. package/dist/view/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  49. package/dist/view/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  50. package/dist/view/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  51. package/dist/view/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  52. package/dist/view/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  53. package/dist/view/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  54. package/dist/view/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  55. package/dist/view/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  56. package/dist/view/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  57. package/dist/view/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  58. package/dist/view/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  59. package/dist/view/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  60. package/dist/view/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  61. package/dist/view/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  62. package/dist/view/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  63. package/dist/view/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  64. package/dist/view/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  65. package/dist/view/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  66. package/dist/view/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  67. package/dist/view/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  68. package/dist/view/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  69. package/dist/view/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  70. package/dist/view/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  71. package/dist/view/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  72. package/dist/view/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  73. package/dist/view/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  74. package/dist/view/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  75. package/dist/view/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  76. package/dist/view/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  77. package/dist/view/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  78. package/dist/view/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  79. package/dist/view/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  80. package/dist/view/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  81. package/dist/view/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  82. package/dist/view/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  83. package/dist/view/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  84. package/dist/view/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  85. package/dist/view/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  86. package/dist/view/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  87. package/dist/view/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  88. package/dist/view/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  89. package/dist/view/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  90. package/dist/view/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  91. package/dist/view/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  92. package/dist/view/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  93. package/dist/view/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  94. package/dist/view/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  95. package/dist/view/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  96. package/dist/view/assets/abap-BdImnpbu.js +1 -0
  97. package/dist/view/assets/actionscript-3-B3316cI-.js +1 -0
  98. package/dist/view/assets/ada-bCR0ucgS.js +1 -0
  99. package/dist/view/assets/ahk-CsyLZFj1.js +1 -0
  100. package/dist/view/assets/ahk2-8Zs4aa1G.js +1 -0
  101. package/dist/view/assets/andromeeda-C4gqWexZ.js +1 -0
  102. package/dist/view/assets/angular-html-DA-rfuFy.js +1 -0
  103. package/dist/view/assets/angular-ts-BrjP3tb8.js +1 -0
  104. package/dist/view/assets/apache-Pmp26Uib.js +1 -0
  105. package/dist/view/assets/apex-DhZFqWV2.js +1 -0
  106. package/dist/view/assets/apl-CORt7UWP.js +1 -0
  107. package/dist/view/assets/applescript-Co6uUVPk.js +1 -0
  108. package/dist/view/assets/ara-BRHolxvo.js +1 -0
  109. package/dist/view/assets/asciidoc-CSVQ5wI8.js +1 -0
  110. package/dist/view/assets/asm-D_Q5rh1f.js +1 -0
  111. package/dist/view/assets/astro-HNnZUWAn.js +1 -0
  112. package/dist/view/assets/aurora-x-D-2ljcwZ.js +1 -0
  113. package/dist/view/assets/awk-DMzUqQB5.js +1 -0
  114. package/dist/view/assets/ayu-dark-DYE7WIF3.js +1 -0
  115. package/dist/view/assets/ayu-light-BA47KaF1.js +1 -0
  116. package/dist/view/assets/ayu-mirage-32ctXXKs.js +1 -0
  117. package/dist/view/assets/ballerina-BFfxhgS-.js +1 -0
  118. package/dist/view/assets/bat-CickPsom.js +1 -0
  119. package/dist/view/assets/beancount-k_qm7-4y.js +1 -0
  120. package/dist/view/assets/berry-uYugtg8r.js +1 -0
  121. package/dist/view/assets/bibtex-CHM0blh-.js +1 -0
  122. package/dist/view/assets/bicep-Bmn6On1c.js +1 -0
  123. package/dist/view/assets/bird2-Bx8U0n9b.js +1 -0
  124. package/dist/view/assets/blade-2xfisSek.js +1 -0
  125. package/dist/view/assets/bsl-DlhNcFeZ.js +1 -0
  126. package/dist/view/assets/c-BIGW1oBm.js +1 -0
  127. package/dist/view/assets/c3-Dp5svz6Z.js +1 -0
  128. package/dist/view/assets/cadence-Bv_4Rxtq.js +1 -0
  129. package/dist/view/assets/cairo-KRGpt6FW.js +1 -0
  130. package/dist/view/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
  131. package/dist/view/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
  132. package/dist/view/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
  133. package/dist/view/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
  134. package/dist/view/assets/chapel-DTp_pixX.js +1 -0
  135. package/dist/view/assets/clarity-Dn5IMItf.js +1 -0
  136. package/dist/view/assets/clojure-P80f7IUj.js +1 -0
  137. package/dist/view/assets/cmake-D1j8_8rp.js +1 -0
  138. package/dist/view/assets/cobol-nBiQ_Alo.js +1 -0
  139. package/dist/view/assets/codeowners-Bp6g37R7.js +1 -0
  140. package/dist/view/assets/codeql-DsOJ9woJ.js +1 -0
  141. package/dist/view/assets/coffee-Ch7k5sss.js +1 -0
  142. package/dist/view/assets/common-lisp-Cg-RD9OK.js +1 -0
  143. package/dist/view/assets/coq-C7JzOVbR.js +1 -0
  144. package/dist/view/assets/cpp-BMRokrvK.js +1 -0
  145. package/dist/view/assets/crystal-DGywbUpC.js +1 -0
  146. package/dist/view/assets/csharp-DSvCPggb.js +1 -0
  147. package/dist/view/assets/css-CLj8gQPS.js +1 -0
  148. package/dist/view/assets/csv-fuZLfV_i.js +1 -0
  149. package/dist/view/assets/cue-D82EKSYY.js +1 -0
  150. package/dist/view/assets/cypher-COkxafJQ.js +1 -0
  151. package/dist/view/assets/d-85-TOEBH.js +1 -0
  152. package/dist/view/assets/dark-plus-C3mMm8J8.js +1 -0
  153. package/dist/view/assets/dart-bE4Kk8sk.js +1 -0
  154. package/dist/view/assets/dax-CEL-wOlO.js +1 -0
  155. package/dist/view/assets/desktop-BmXAJ9_W.js +1 -0
  156. package/dist/view/assets/diff-D97Zzqfu.js +1 -0
  157. package/dist/view/assets/docker-BcOcwvcX.js +1 -0
  158. package/dist/view/assets/dotenv-Da5cRb03.js +1 -0
  159. package/dist/view/assets/dracula-BzJJZx-M.js +1 -0
  160. package/dist/view/assets/dracula-soft-BXkSAIEj.js +1 -0
  161. package/dist/view/assets/dream-maker-BtqSS_iP.js +1 -0
  162. package/dist/view/assets/edge-FbVlp4U3.js +1 -0
  163. package/dist/view/assets/elixir-CkH2-t6x.js +1 -0
  164. package/dist/view/assets/elm-DbKCFpqz.js +1 -0
  165. package/dist/view/assets/emacs-lisp-C_m_b--Z.js +1 -0
  166. package/dist/view/assets/erb-DXfck5VN.js +1 -0
  167. package/dist/view/assets/erlang-DsQrWhSR.js +1 -0
  168. package/dist/view/assets/everforest-dark-BgDCqdQA.js +1 -0
  169. package/dist/view/assets/everforest-light-C8M2exoo.js +1 -0
  170. package/dist/view/assets/fennel-BYunw83y.js +1 -0
  171. package/dist/view/assets/fish-BvzEVeQv.js +1 -0
  172. package/dist/view/assets/fluent-C4IJs8-o.js +1 -0
  173. package/dist/view/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  174. package/dist/view/assets/fortran-free-form-BxgE0vQu.js +1 -0
  175. package/dist/view/assets/fsharp-CXgrBDvD.js +1 -0
  176. package/dist/view/assets/gdresource-TyuKm33G.js +1 -0
  177. package/dist/view/assets/gdscript-DqcFQ5yU.js +1 -0
  178. package/dist/view/assets/gdshader-DkwncUOv.js +1 -0
  179. package/dist/view/assets/genie-D0YGMca9.js +1 -0
  180. package/dist/view/assets/gherkin-DyxjwDmM.js +1 -0
  181. package/dist/view/assets/git-commit-F4YmCXRG.js +1 -0
  182. package/dist/view/assets/git-rebase-r7XF79zn.js +1 -0
  183. package/dist/view/assets/github-dark-DHJKELXO.js +1 -0
  184. package/dist/view/assets/github-dark-default-Cuk6v7N8.js +1 -0
  185. package/dist/view/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  186. package/dist/view/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  187. package/dist/view/assets/github-light-DAi9KRSo.js +1 -0
  188. package/dist/view/assets/github-light-default-D7oLnXFd.js +1 -0
  189. package/dist/view/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  190. package/dist/view/assets/gleam-BspZqrRM.js +1 -0
  191. package/dist/view/assets/glimmer-js-ByusRIyA.js +1 -0
  192. package/dist/view/assets/glimmer-ts-BfAWNZQY.js +1 -0
  193. package/dist/view/assets/glsl-DplSGwfg.js +1 -0
  194. package/dist/view/assets/gn-n2N0HUVH.js +1 -0
  195. package/dist/view/assets/gnuplot-DdkO51Og.js +1 -0
  196. package/dist/view/assets/go-C27-OAKa.js +1 -0
  197. package/dist/view/assets/graphql-ChdNCCLP.js +1 -0
  198. package/dist/view/assets/groovy-gcz8RCvz.js +1 -0
  199. package/dist/view/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  200. package/dist/view/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  201. package/dist/view/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  202. package/dist/view/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  203. package/dist/view/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  204. package/dist/view/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  205. package/dist/view/assets/hack-BWmVpMyf.js +1 -0
  206. package/dist/view/assets/haml-D5jkg6IW.js +1 -0
  207. package/dist/view/assets/handlebars-BpdQsYii.js +1 -0
  208. package/dist/view/assets/haskell-Df6bDoY_.js +1 -0
  209. package/dist/view/assets/haxe-CfZj7gIn.js +1 -0
  210. package/dist/view/assets/hcl-BWvSN4gD.js +1 -0
  211. package/dist/view/assets/hjson-D5-asLiD.js +1 -0
  212. package/dist/view/assets/hlsl-D3lLCCz7.js +1 -0
  213. package/dist/view/assets/horizon-BUw7H-hv.js +1 -0
  214. package/dist/view/assets/horizon-bright-CUuTKBJd.js +1 -0
  215. package/dist/view/assets/houston-DnULxvSX.js +1 -0
  216. package/dist/view/assets/html-derivative-DlHx6ybY.js +1 -0
  217. package/dist/view/assets/html-pp8916En.js +1 -0
  218. package/dist/view/assets/http-jrhK8wxY.js +1 -0
  219. package/dist/view/assets/hurl-irOxFIW8.js +1 -0
  220. package/dist/view/assets/hxml-2-FPmUDs.js +1 -0
  221. package/dist/view/assets/hy-DFXneXwc.js +1 -0
  222. package/dist/view/assets/imba-DGztddWO.js +1 -0
  223. package/dist/view/assets/index-BLryk3W4.css +1 -0
  224. package/dist/view/assets/index-ByMJp0a5.js +3 -0
  225. package/dist/view/assets/index-CRh4USfC.js +189 -0
  226. package/dist/view/assets/index-JNx7Ohoj.js +153 -0
  227. package/dist/view/assets/ini-BEwlwnbL.js +1 -0
  228. package/dist/view/assets/java-CylS5w8V.js +1 -0
  229. package/dist/view/assets/javascript-wDzz0qaB.js +1 -0
  230. package/dist/view/assets/jinja-f2NsQr07.js +1 -0
  231. package/dist/view/assets/jison-wvAkD_A8.js +1 -0
  232. package/dist/view/assets/json-Cp-IABpG.js +1 -0
  233. package/dist/view/assets/json5-C9tS-k6U.js +1 -0
  234. package/dist/view/assets/jsonc-Des-eS-w.js +1 -0
  235. package/dist/view/assets/jsonl-DcaNXYhu.js +1 -0
  236. package/dist/view/assets/jsonnet-DFQXde-d.js +1 -0
  237. package/dist/view/assets/jssm-C2t-YnRu.js +1 -0
  238. package/dist/view/assets/jsx-g9-lgVsj.js +1 -0
  239. package/dist/view/assets/julia-5Bft2YPA.js +1 -0
  240. package/dist/view/assets/just-Cwhn7H3k.js +1 -0
  241. package/dist/view/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
  242. package/dist/view/assets/kanagawa-lotus-C3DzagqV.js +1 -0
  243. package/dist/view/assets/kanagawa-wave-DFGoQZhC.js +1 -0
  244. package/dist/view/assets/katex-BYZTj3zW.css +1 -0
  245. package/dist/view/assets/katex-C5jXJg4s.js +257 -0
  246. package/dist/view/assets/kdl-DV7GczEv.js +1 -0
  247. package/dist/view/assets/kotlin-BdnUsdx6.js +1 -0
  248. package/dist/view/assets/kusto-wEQ09or8.js +1 -0
  249. package/dist/view/assets/laserwave-DUszq2jm.js +1 -0
  250. package/dist/view/assets/latex-D5pSuvFb.js +1 -0
  251. package/dist/view/assets/lean-BZvkOJ9d.js +1 -0
  252. package/dist/view/assets/less-B1dDrJ26.js +1 -0
  253. package/dist/view/assets/light-plus-B7mTdjB0.js +1 -0
  254. package/dist/view/assets/liquid-C0sCDyMI.js +1 -0
  255. package/dist/view/assets/llvm-BZoOZj88.js +1 -0
  256. package/dist/view/assets/log-2UxHyX5q.js +1 -0
  257. package/dist/view/assets/logo-BtOb2qkB.js +1 -0
  258. package/dist/view/assets/lua-BaeVxFsk.js +1 -0
  259. package/dist/view/assets/luau-BnpPk5vE.js +1 -0
  260. package/dist/view/assets/make-CHLpvVh8.js +1 -0
  261. package/dist/view/assets/markdown-Cvjx9yec.js +1 -0
  262. package/dist/view/assets/marko-DjSrsDqO.js +1 -0
  263. package/dist/view/assets/material-theme-D5KoaKCx.js +1 -0
  264. package/dist/view/assets/material-theme-darker-BfHTSMKl.js +1 -0
  265. package/dist/view/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  266. package/dist/view/assets/material-theme-ocean-CyktbL80.js +1 -0
  267. package/dist/view/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  268. package/dist/view/assets/matlab-D7o27uSR.js +1 -0
  269. package/dist/view/assets/mdc-D1_yUvq7.js +1 -0
  270. package/dist/view/assets/mdx-Cmh6b_Ma.js +1 -0
  271. package/dist/view/assets/mermaid-CQcHuHx7.js +1 -0
  272. package/dist/view/assets/min-dark-CafNBF8u.js +1 -0
  273. package/dist/view/assets/min-light-CTRr51gU.js +1 -0
  274. package/dist/view/assets/mipsasm-CKIfxQSi.js +1 -0
  275. package/dist/view/assets/mojo-DJz3ZmWd.js +1 -0
  276. package/dist/view/assets/monokai-BRVnQi9A.js +1 -0
  277. package/dist/view/assets/moonbit-CHtswR0a.js +1 -0
  278. package/dist/view/assets/move-el3G9tDJ.js +1 -0
  279. package/dist/view/assets/narrat-DRg8JJMk.js +1 -0
  280. package/dist/view/assets/nextflow-C-mBbutL.js +1 -0
  281. package/dist/view/assets/nextflow-groovy-vE_lwT2v.js +1 -0
  282. package/dist/view/assets/nginx-BpAMiNFr.js +1 -0
  283. package/dist/view/assets/night-owl-C39BiMTA.js +1 -0
  284. package/dist/view/assets/night-owl-light-CMTm3GFP.js +1 -0
  285. package/dist/view/assets/nim-BIad80T-.js +1 -0
  286. package/dist/view/assets/nix-CwoSXNpI.js +1 -0
  287. package/dist/view/assets/nord-Ddv68eIx.js +1 -0
  288. package/dist/view/assets/nsis-BlV79W_Q.js +1 -0
  289. package/dist/view/assets/nushell-D3jzshHO.js +1 -0
  290. package/dist/view/assets/objective-c-DXmwc3jG.js +1 -0
  291. package/dist/view/assets/objective-cpp-CLxacb5B.js +1 -0
  292. package/dist/view/assets/ocaml-C0hk2d4L.js +1 -0
  293. package/dist/view/assets/odin-BBf5iR-q.js +1 -0
  294. package/dist/view/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  295. package/dist/view/assets/one-light-C3Wv6jpd.js +1 -0
  296. package/dist/view/assets/openscad-C4EeE6gA.js +1 -0
  297. package/dist/view/assets/org-DM6o9KBp.js +1 -0
  298. package/dist/view/assets/pascal-D93ZcfNL.js +1 -0
  299. package/dist/view/assets/perl-B9cMNwum.js +1 -0
  300. package/dist/view/assets/php-Csjmro_R.js +1 -0
  301. package/dist/view/assets/pkl-u5AG7uiY.js +1 -0
  302. package/dist/view/assets/plastic-3e1v2bzS.js +1 -0
  303. package/dist/view/assets/plsql-ChMvpjG-.js +1 -0
  304. package/dist/view/assets/po-BTJTHyun.js +1 -0
  305. package/dist/view/assets/poimandres-CS3Unz2-.js +1 -0
  306. package/dist/view/assets/polar-C0HS_06l.js +1 -0
  307. package/dist/view/assets/postcss-CXtECtnM.js +1 -0
  308. package/dist/view/assets/powerquery-CEu0bR-o.js +1 -0
  309. package/dist/view/assets/powershell-BmBUJMz7.js +1 -0
  310. package/dist/view/assets/prisma-Vru482bI.js +1 -0
  311. package/dist/view/assets/prolog-CbFg5uaA.js +1 -0
  312. package/dist/view/assets/proto-C7zT0LnQ.js +1 -0
  313. package/dist/view/assets/pug-DKIMFp6K.js +1 -0
  314. package/dist/view/assets/puppet-BMWR74SV.js +1 -0
  315. package/dist/view/assets/purescript-CklMAg4u.js +1 -0
  316. package/dist/view/assets/python-B6aJPvgy.js +1 -0
  317. package/dist/view/assets/qml-3beO22l8.js +1 -0
  318. package/dist/view/assets/qmldir-C8lEn-DE.js +1 -0
  319. package/dist/view/assets/qss-IeuSbFQv.js +1 -0
  320. package/dist/view/assets/r-Cf5RLm7j.js +1 -0
  321. package/dist/view/assets/racket-BqYA7rlc.js +1 -0
  322. package/dist/view/assets/raku-DXvB9xmW.js +1 -0
  323. package/dist/view/assets/razor-BjBPvh-w.js +1 -0
  324. package/dist/view/assets/rbs-CpoqiR4B.js +1 -0
  325. package/dist/view/assets/red-hvxz__6c.js +1 -0
  326. package/dist/view/assets/reg-C-SQnVFl.js +1 -0
  327. package/dist/view/assets/regexp-CDVJQ6XC.js +1 -0
  328. package/dist/view/assets/rel-C3B-1QV4.js +1 -0
  329. package/dist/view/assets/riscv-BM1_JUlF.js +1 -0
  330. package/dist/view/assets/ron-D8l8udqQ.js +1 -0
  331. package/dist/view/assets/rose-pine-5qJOZa0Y.js +1 -0
  332. package/dist/view/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
  333. package/dist/view/assets/rose-pine-moon-C9pEdX9L.js +1 -0
  334. package/dist/view/assets/rosmsg-BJDFO7_C.js +1 -0
  335. package/dist/view/assets/rst-bs7f0vWN.js +1 -0
  336. package/dist/view/assets/ruby-C0TQ7zu5.js +1 -0
  337. package/dist/view/assets/rust-B1yitclQ.js +1 -0
  338. package/dist/view/assets/sas-DEy46yEz.js +1 -0
  339. package/dist/view/assets/sass-Cj5Yp3dK.js +1 -0
  340. package/dist/view/assets/scala-CqE71os6.js +1 -0
  341. package/dist/view/assets/scheme-C98Dy4si.js +1 -0
  342. package/dist/view/assets/scss-D5BDwBP9.js +1 -0
  343. package/dist/view/assets/sdbl-DVxCFoDh.js +1 -0
  344. package/dist/view/assets/shaderlab-Dg9Lc6iA.js +1 -0
  345. package/dist/view/assets/shellscript-Yzrsuije.js +1 -0
  346. package/dist/view/assets/shellsession-BADoaaVG.js +1 -0
  347. package/dist/view/assets/slack-dark-BthQWCQV.js +1 -0
  348. package/dist/view/assets/slack-ochin-DqwNpetd.js +1 -0
  349. package/dist/view/assets/smalltalk-BOQMe2GC.js +1 -0
  350. package/dist/view/assets/smithy-cds9vsN8.js +1 -0
  351. package/dist/view/assets/snazzy-light-Bw305WKR.js +1 -0
  352. package/dist/view/assets/solarized-dark-CpvCGNkr.js +1 -0
  353. package/dist/view/assets/solarized-light-Dlz6yCKv.js +1 -0
  354. package/dist/view/assets/solidity-DijEV5ha.js +1 -0
  355. package/dist/view/assets/soy-8wufbnw4.js +1 -0
  356. package/dist/view/assets/sparql-rVzFXLq3.js +1 -0
  357. package/dist/view/assets/splunk-BtCnVYZw.js +1 -0
  358. package/dist/view/assets/sql-CRqJ_cUM.js +1 -0
  359. package/dist/view/assets/ssh-config-_ykCGR6B.js +1 -0
  360. package/dist/view/assets/stata-DI20mbqo.js +1 -0
  361. package/dist/view/assets/stylus-BEDo0Tqx.js +1 -0
  362. package/dist/view/assets/surrealql-Cjom0U5J.js +1 -0
  363. package/dist/view/assets/svelte-Cy7k_4gC.js +1 -0
  364. package/dist/view/assets/swift-C2oV4EkX.js +1 -0
  365. package/dist/view/assets/synthwave-84-CbfX1IO0.js +1 -0
  366. package/dist/view/assets/system-verilog-0hqHdDBg.js +1 -0
  367. package/dist/view/assets/systemd-4A_iFExJ.js +1 -0
  368. package/dist/view/assets/talonscript-CkByrt1z.js +1 -0
  369. package/dist/view/assets/tasl-QIJgUcNo.js +1 -0
  370. package/dist/view/assets/tcl-dwOrl1Do.js +1 -0
  371. package/dist/view/assets/templ-DhtptRzy.js +1 -0
  372. package/dist/view/assets/terraform-BETggiCN.js +1 -0
  373. package/dist/view/assets/tex-D96PA37w.js +1 -0
  374. package/dist/view/assets/tokyo-night-hegEt444.js +1 -0
  375. package/dist/view/assets/toml-vGWfd6FD.js +1 -0
  376. package/dist/view/assets/ts-tags-D351s5mN.js +1 -0
  377. package/dist/view/assets/tsv-B_m7g4N7.js +1 -0
  378. package/dist/view/assets/tsx-COt5Ahok.js +1 -0
  379. package/dist/view/assets/turtle-BsS91CYL.js +1 -0
  380. package/dist/view/assets/twig-27uCiNez.js +1 -0
  381. package/dist/view/assets/typescript-BPQ3VLAy.js +1 -0
  382. package/dist/view/assets/typespec-CAFt9gP4.js +1 -0
  383. package/dist/view/assets/typst-BUadGCkm.js +1 -0
  384. package/dist/view/assets/v-BGw2Nkan.js +1 -0
  385. package/dist/view/assets/vala-CsfeWuGM.js +1 -0
  386. package/dist/view/assets/vb-Cu-pLBUe.js +1 -0
  387. package/dist/view/assets/verilog-nZwndyjY.js +1 -0
  388. package/dist/view/assets/vesper-DRje8inN.js +1 -0
  389. package/dist/view/assets/vhdl-CeAyd5Ju.js +1 -0
  390. package/dist/view/assets/viml-CJc9bBzg.js +1 -0
  391. package/dist/view/assets/vitesse-black-Bkuqu6BP.js +1 -0
  392. package/dist/view/assets/vitesse-dark-D0r3Knsf.js +1 -0
  393. package/dist/view/assets/vitesse-light-CVO1_9PV.js +1 -0
  394. package/dist/view/assets/vue-BqiEGhQt.js +1 -0
  395. package/dist/view/assets/vue-html-AaS7Mt5G.js +1 -0
  396. package/dist/view/assets/vue-vine-BoDAl6tE.js +1 -0
  397. package/dist/view/assets/vyper-CDx5xZoG.js +1 -0
  398. package/dist/view/assets/wasm-CG6Dc4jp.js +1 -0
  399. package/dist/view/assets/wasm-MzD3tlZU.js +1 -0
  400. package/dist/view/assets/wenyan-BV7otONQ.js +1 -0
  401. package/dist/view/assets/wgsl-Dx-B1_4e.js +1 -0
  402. package/dist/view/assets/wikitext-BhOHFoWU.js +1 -0
  403. package/dist/view/assets/wit-5i3qLPDT.js +1 -0
  404. package/dist/view/assets/wolfram-lXgVvXCa.js +1 -0
  405. package/dist/view/assets/xml-sdJ4AIDG.js +1 -0
  406. package/dist/view/assets/xsl-CtQFsRM5.js +1 -0
  407. package/dist/view/assets/yaml-Buea-lGh.js +1 -0
  408. package/dist/view/assets/zenscript-DVFEvuxE.js +1 -0
  409. package/dist/view/assets/zig-VOosw3JB.js +1 -0
  410. package/dist/view/index.html +10 -2
  411. package/docs/README.md +21 -15
  412. package/docs/README.zh.md +15 -9
  413. package/docs/en/authoring.md +85 -80
  414. package/docs/en/cli-reference.md +110 -72
  415. package/docs/en/deployment.md +183 -0
  416. package/docs/en/getting-started.md +112 -0
  417. package/docs/en/material-types.md +241 -0
  418. package/docs/en/settings.md +133 -0
  419. package/docs/en/shortcuts.md +89 -0
  420. package/docs/en/typing-rules.md +208 -0
  421. package/docs/zh/authoring.md +74 -69
  422. package/docs/zh/cli-reference.md +92 -58
  423. package/docs/zh/deployment.md +179 -0
  424. package/docs/zh/getting-started.md +104 -0
  425. package/docs/zh/material-types.md +769 -0
  426. package/docs/zh/settings.md +120 -0
  427. package/docs/zh/shortcuts.md +83 -0
  428. package/docs/zh/typing-rules.md +191 -0
  429. package/package.json +13 -11
  430. package/templates/en/QTYPE.md +155 -495
  431. package/templates/en/README.md +11 -11
  432. package/templates/en/TODO.md +1 -1
  433. package/templates/en/material/article.md +20 -0
  434. package/templates/en/material/assets/article/sunrise.svg +12 -0
  435. package/templates/en/material/assets/code/tree.svg +19 -0
  436. package/templates/en/material/assets/qa/login-flow.svg +17 -0
  437. package/templates/en/material/assets/sentence/pangram.svg +6 -0
  438. package/templates/en/material/assets/snippet/moon.svg +8 -0
  439. package/templates/en/material/assets/word/apple.svg +5 -0
  440. package/templates/en/material/code.md +55 -0
  441. package/templates/en/material/qa.md +33 -0
  442. package/templates/en/material/sentence.md +18 -0
  443. package/templates/en/material/snippet.md +17 -0
  444. package/templates/en/material/word.md +20 -0
  445. package/templates/zh/QTYPE.md +191 -473
  446. package/templates/zh/README.md +6 -6
  447. package/templates/zh/index.md +1 -1
  448. package/templates/zh/material/article.md +18 -0
  449. package/templates/zh/material/assets/article/sunrise.svg +12 -0
  450. package/templates/zh/material/assets/code/tree.svg +19 -0
  451. package/templates/zh/material/assets/qa/login-flow.svg +17 -0
  452. package/templates/zh/material/assets/sentence/pangram.svg +6 -0
  453. package/templates/zh/material/assets/snippet/moon.svg +8 -0
  454. package/templates/zh/material/assets/word/apple.svg +5 -0
  455. package/templates/zh/material/code.md +55 -0
  456. package/templates/zh/material/qa.md +33 -0
  457. package/templates/zh/material/sentence.md +19 -0
  458. package/templates/zh/material/snippet.md +20 -0
  459. package/templates/zh/material/word.md +20 -0
  460. package/dist/cli/commands/check/action.js +0 -56
  461. package/dist/cli/commands/check/i18n.js +0 -26
  462. package/dist/cli/commands/plugin/i18n.js +0 -28
  463. package/dist/cli/commands/plugin/index.js +0 -41
  464. package/dist/core/typing/engine.js +0 -112
  465. package/dist/view/assets/index-DBABH3dG.js +0 -111
  466. package/dist/view/assets/index-RTLZ-zOC.css +0 -1
  467. package/templates/en/material/example.md +0 -47
  468. package/templates/zh/material/example.md +0 -47
@@ -1,112 +1,116 @@
1
1
  # 撰写 material 文件
2
2
 
3
- English: [authoring.md](../en/authoring.md)
3
+ English: [authoring.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/authoring.md)
4
4
 
5
- `material/*.md` 的快速入门。权威规范见
6
- [`templates/zh/QTYPE.md`](../../templates/zh/QTYPE.md)
7
- (`qtype init --lang zh` 时拷到新 repo)。有疑问先查那份。
5
+ `material/*.md` 的快速入门。深度参考见
6
+ [material-types.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/material-types.md);LLM 协作用的完整规范见
7
+ [`templates/zh/QTYPE.md`](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=templates/zh/QTYPE.md)(`qtype init
8
+ --lang zh` 时会拷到新 repo)。有疑问先查那两份。
8
9
 
9
10
  ## 文件位置
10
11
 
11
12
  ```
12
13
  my-deck/
13
- ├── QTYPE.md # 规范(init 时自动拷贝;留着)
14
- ├── index.md # 面向人的目录(可选)
14
+ ├── QTYPE.md # 规范(init 时自动拷贝;留着,给 LLM 用)
15
+ ├── index.md # 面向人的目录(可选)
15
16
  ├── material/
16
- │ ├── example.md
17
- │ ├── javascript-basics.md
18
- └── english-vocab.md
17
+ │ ├── word.md # 6 种类型的入门模板
18
+ │ ├── sentence.md # 由 qtype init 自动拷入
19
+ ├── article.md
20
+ │ ├── snippet.md
21
+ │ ├── qa.md
22
+ │ └── code.md
19
23
  └── .qtype/
20
24
  └── config.json # 单 repo 配置
21
25
  ```
22
26
 
23
- 一个 `.md` 文件 = 一副卡组。
27
+ **一个 `.md` 文件 = 一副卡组,整个文件一个 `type`**。想加新卡组,
28
+ 复制一个类型模板重命名即可。
24
29
 
25
- ## 卡片形状
30
+ ## 六种类型
26
31
 
27
- 每张卡有一个问题和一个答案,用 `## Q:` / `## A:` 标题分隔。同一文件里
28
- 的多张卡用 `\n\n---\n\n`(独占一行的 `---`,前后各留空行)分隔。
32
+ qtype 支持 6 material 类型,每种有自己的 Markdown 结构:
29
33
 
30
- ```markdown
31
- ---
32
- tags: [js, basics]
33
- type: normal
34
- ---
35
-
36
- ## Q:
34
+ | type | 打字目标 | 结构 |
35
+ |---|---|---|
36
+ | `word` | H1 单词本身 | H1 + 可选 H2 音标 / H3 释义 / H4 图片 |
37
+ | `sentence` | H1 整句 | 结构同 word |
38
+ | `article` | H1 之下正文 | H1 是章节标题(不打),下方段落是目标 |
39
+ | `snippet` | H1 之下正文 | 结构同 article,渲染时**居中排版**;适合诗句 / 格言 |
40
+ | `qa` | `## A` 块 | H1 卡名, `## Q` 题干, `## A` 打字目标 |
41
+ | `code` | `## A` 里的 fenced code block | 同 qa,但 A 里是代码块 |
37
42
 
38
- React 三大核心概念是什么?
43
+ ## 卡片切分
39
44
 
40
- ## A:
45
+ 同一文件里的多张卡用 **`# H1`** 分隔 —— 每一个 H1 起一张新卡。**不用
46
+ `---` 分割**。
41
47
 
42
- 组件、props 和 state。
48
+ ## 举例
43
49
 
50
+ **word:**
51
+ ```markdown
52
+ ---
53
+ type: word
54
+ tags: [example]
44
55
  ---
45
56
 
46
- ## Q:
47
-
48
- `useState` 返回什么?
49
-
50
- ## A:
57
+ # apple
58
+ ## /ˈæp.əl/
59
+ ### 苹果
51
60
 
52
- 一个 `[值, setter]` 的元组。
61
+ # ephemeral
62
+ ## /əˈfem(ə)rəl/
63
+ ### 短暂的
53
64
  ```
54
65
 
55
- parser 先按 `---` 分割,再逐卡提取 Q、A、metadata。缺 Q 或 A 的卡片被
56
- 静默丢弃(方便写占位)。
57
-
58
- ## Frontmatter 字段
59
-
60
- 文件顶部的 YAML frontmatter 对文件内每张卡都生效。如需单卡覆盖,把
61
- YAML fence 放到该卡上方(见规范)。
62
-
63
- | 字段 | 类型 | 说明 |
64
- |---|---|---|
65
- | `tags` | `string[]` | 自由形式;用于列表过滤 |
66
- | `type` | `normal \| word \| sentence` | 默认 `normal` |
67
- | `hint` | `none \| ghost` | 下方是否显示褪色目标 |
68
- | `difficulty` | `1..5` | 可选,信息用 |
69
- | `phonetic` | `string` | `type: word` 用 —— IPA / 拼音 |
70
- | `gloss` | `string` | `type: word` 用 —— 释义 |
71
- | `translation` | `string` | `type: sentence` 用 —— 目标语等价句 |
66
+ **sentence:**
67
+ ```markdown
68
+ ---
69
+ type: sentence
70
+ tags: [example]
71
+ ---
72
72
 
73
- 示例 —— 一张 `word` 卡:
73
+ # The quick brown fox jumps over the lazy dog.
74
+ ### 英文全字母句。
75
+ ```
74
76
 
77
+ **qa:**
75
78
  ```markdown
76
79
  ---
77
- type: word
78
- phonetic: /ˈklō-zhər/
79
- gloss: 捕获词法作用域的函数
80
+ type: qa
81
+ tags: [js]
80
82
  ---
81
83
 
82
- ## Q:
84
+ # 什么是闭包
83
85
 
84
- closure
86
+ ## Q
87
+ 用一句话解释闭包。
85
88
 
86
- ## A:
87
-
88
- closure
89
+ ## A
90
+ 闭包是函数与它诞生时的词法作用域组合在一起。
89
91
  ```
90
92
 
91
- ## 被打字的是什么?
93
+ 其余三种见 [material-types.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/material-types.md)。
94
+
95
+ ## 被打字的是什么?
92
96
 
93
- **答案**是用户要打的内容。Q 只做提示(不打)。代码块、行内代码、多行
94
- 答案都支持 —— 打字引擎按归一化后的答案逐 codepoint 迭代。
97
+ **答案侧**(见每种类型的「打字目标」列)是用户要打的内容。题干 / 音标 /
98
+ 释义只做展示,不打。所有字符必须 OS 键盘(含中文 IME)能敲得出来。
95
99
 
96
- 引擎处理不了的字符(比如某些代理对 emoji)会出现在 `qtype check`
97
- 输出里。发布前修掉或删掉。
100
+ 打字引擎处理不了的字符(某些代理对 emoji / 零宽字符 / 控制字符)会
101
+ 出现在 `qtype check` 输出里 —— 发布前修掉或删掉。
98
102
 
99
103
  ## 跑 `qtype check`
100
104
 
101
- 发布前始终跑:
105
+ 发布前始终跑:
102
106
 
103
107
  ```bash
104
108
  qtype check
105
109
  ```
106
110
 
107
- 它报告:
108
- - `material/` 目录不存在(致命)
109
- - 含无法打字字符的卡片(致命,附逐卡列表)
111
+ 它报告:
112
+ - `material/` 目录不存在(致命)
113
+ - 含无法打字字符的卡片(致命,附逐卡列表)
110
114
 
111
115
  退出码 0 = 可以安全发布。
112
116
 
@@ -117,15 +121,16 @@ qtype publish build
117
121
  qtype publish serve # http://localhost:4000
118
122
  ```
119
123
 
120
- 密码保护的卡组:
124
+ 密码保护的卡组:
121
125
 
122
126
  ```bash
123
127
  qtype publish password set # 写入 repo 配置
124
128
  qtype publish build # 出栈时加密 material
125
129
  ```
126
130
 
127
- ## 完整规范在哪
131
+ ## 完整参考
128
132
 
129
- 以上是 80% 的用法。少见场景(单卡 frontmatter 覆盖、准确的空白处理、
130
- 分隔规则边界情形、跨文件引用)见
131
- [`templates/zh/QTYPE.md`](../../templates/zh/QTYPE.md)
133
+ - [material-types.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/material-types.md) —— 6 种类型的**深度**参考,
134
+ 含解析器行为 / UI 布局 / 交互细节
135
+ - [`templates/zh/QTYPE.md`](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=templates/zh/QTYPE.md) —— **LLM 协作
136
+ 规范**,init 时自动拷入 repo,让 AI agent 直接按规矩生成 material
@@ -1,6 +1,6 @@
1
1
  # qtype CLI 简介
2
2
 
3
- English: [cli-reference.md](../en/cli-reference.md)
3
+ English: [cli-reference.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/cli-reference.md)
4
4
 
5
5
  每个顶层命令的简单介绍。跑 `qtype <cmd> --help` 看完整选项。
6
6
 
@@ -12,69 +12,107 @@ English: [cli-reference.md](../en/cli-reference.md)
12
12
  | `-v, --version` | 显示版本 |
13
13
  | `--lang <zh\|en>` | 本次调用的 UI 语言 |
14
14
 
15
- 语言优先级:`--lang` > `$QTYPE_LANG` > `~/.config/qtype/config.json` 里的
15
+ 语言优先级:`--lang` > `$QTYPE_LANG` > `~/.config/qtype/config.json` 里的
16
16
  `cli.lang` > 系统 locale。
17
17
 
18
18
  ---
19
19
 
20
- ## `qtype init [dir]`
20
+ ## `qtype init [path]`
21
21
 
22
- 在已有目录里搭起 material 仓库脚手架。`qtype repo sync` 的别名,形态一致。
22
+ 在已有目录里搭起 material 仓库脚手架。`qtype repo sync` 的顶层别名。
23
23
 
24
24
  ```bash
25
- qtype init # 当前目录
26
- qtype init my-deck --lang en # 在 ./my-deck 下用英文模板
25
+ mkdir my-deck && qtype init my-deck --lang zh
26
+ qtype init # 当前目录
27
+ qtype init my-deck --force # 覆盖 qtype 管理的规范文件
28
+ qtype init my-deck --dry-run # 只打印计划,不写盘
27
29
  ```
28
30
 
29
- 创建:`QTYPE.md`(撰写规范)、`AGENTS.md` / `CLAUDE.md` / `GEMINI.md`
30
- (指向 `QTYPE.md` 的软链)、`README.md`、`TODO.md`、`index.md`、
31
- `log.md`、含 example 的 `material/`、`.qtype/` 骨架。
31
+ 创建:`QTYPE.md`(撰写规范)、`AGENTS.md` / `CLAUDE.md` / `GEMINI.md`
32
+ (指向 `QTYPE.md` 的软链)、`README.md`、`TODO.md`、`index.md`、
33
+ `log.md`、`material/{word,sentence,article,snippet,qa,code}.md` 6 张起手模板
34
+ + 对应的 SVG 图片(`material/assets/<type>/*.svg`)、`.qtype/` 骨架。
32
35
 
33
- 幂等 —— 跳过已有的用户内容,只有 `--force` 会覆盖 qtype 管理的规范文件。
36
+ 幂等 —— 跳过已有的用户内容,只有 `--force` 才会覆盖 qtype 管理的规范文件。
34
37
 
35
38
  ---
36
39
 
37
40
  ## `qtype repo new <name>`
38
41
 
39
- 新建一个 material 仓库目录。
42
+ 在**父目录**下新建一个 material 仓库子目录。
40
43
 
41
44
  ```bash
42
45
  qtype repo new my-deck --lang zh
43
- cd my-deck
46
+ qtype repo new my-deck --description "GRE 词汇" --git
44
47
  ```
45
48
 
46
- ## `qtype repo sync [dir]`
49
+ | 选项 | 说明 |
50
+ |---|---|
51
+ | `--lang <zh\|en>` | 语言,决定模板 |
52
+ | `--description <text>` | README 里的一句简介 |
53
+ | `--dir <path>` | 父目录(默认当前) |
54
+ | `--git` | 顺手 `git init` |
55
+
56
+ ## `qtype repo sync [path]`
47
57
 
48
58
  在已有 repo 里补齐约定。与 `qtype init` 相同。
49
59
 
50
60
  ---
51
61
 
52
- ## `qtype check [dir]`
62
+ ## `qtype check [path]`
63
+
64
+ `qtype content lint` 的顶层别名,校验 `material/*.md`:报告含打字引擎无法处理
65
+ 字符的卡片。返回非零码用于 CI。
66
+
67
+ ```bash
68
+ qtype check # 当前目录
69
+ qtype check --json # JSON 输出,便于工具处理
70
+ ```
71
+
72
+ ---
73
+
74
+ ## `qtype content lint | validate | search`
75
+
76
+ - `lint` —— 卡片文本级校验(打字目标里有无法打字的字符 → 报错)
77
+ - `validate` —— schema 级校验(frontmatter 字段类型 / 必填等)
78
+ - `search <query>` —— 卡片全量子串搜索
53
79
 
54
- 校验 `material/*.md` 里的每张卡。报告含打字引擎无法处理字符的卡片
55
- (返回非零码)。只读;建议在 CI 里放在 `publish build` 前面。
80
+ `search` 支持过滤 + 结构化输出:
56
81
 
57
82
  ```bash
58
- qtype check
83
+ qtype content search "闭包"
84
+ qtype content search "apple" --tag GRE --type word --limit 5
85
+ qtype content search "*" --tag 数学 --json # 脚本友好
59
86
  ```
60
87
 
88
+ | `search` 选项 | 说明 |
89
+ |---|---|
90
+ | `--limit <n>` | 最多返回结果数(默认 20) |
91
+ | `--tag <tag...>` | 按 tag 过滤(可多次;AND 语义,需全部匹配) |
92
+ | `--type <type...>` | 按 material 类型过滤(可多次) |
93
+ | `--json` | 以 JSON 输出结果 |
94
+
61
95
  ---
62
96
 
63
- ## `qtype publish build [dir]`
97
+ ## `qtype publish build [path]`
64
98
 
65
- 拼装静态站到 `dist/`。执行:
99
+ 拼装静态站到 `<repo>/dist/`。执行:
66
100
 
67
101
  1. 解析每个 `material/*.md`
68
- 2. 预渲染 Mermaid 图(除非 `publish.mermaid=off`)
69
- 3. 加密 material(如果 `publish.password.enabled=true`)
70
- 4. 输出每份 material 的 HTML + `_data/material.json`
71
- 5. 把预构建的 view bundle 拷到 `dist/_app/`
102
+ 2. 预渲染 Mermaid 图(除非 `publish.mermaid=off`),生成
103
+ `dist/material/mermaid.json` + `mermaid.css`(dark + light 两版 SVG)
104
+ 3. 加密 material(如果 `publish.password.enabled=true`)—— 用 argon2id
105
+ 派生 AES-256 密钥,AES-GCM 加密每份 material,输出 `<file>.enc.json`
106
+ 4. 生成 `dist/material/index.json` manifest(供浏览器懒加载)
107
+ 5. 把预构建的 view bundle 拷到 `dist/` 根,可以直接静态部署
72
108
 
73
109
  ```bash
74
110
  qtype publish build
111
+ QTYPE_PUBLISH_PASSWORD=demo qtype publish build # 非交互输密码
112
+ qtype publish build --out ./build # 自定义输出目录
75
113
  ```
76
114
 
77
- ## `qtype publish serve [dir]`
115
+ ## `qtype publish serve [path]`
78
116
 
79
117
  本地 HTTP 预览 `dist/`。默认端口 4000。
80
118
 
@@ -85,18 +123,31 @@ qtype publish serve --port 8080
85
123
 
86
124
  ## `qtype publish init`
87
125
 
88
- `.gitignore` + GitHub Pages workflow,push 到 `main` 就触发构建 + 部署。
126
+ 写入部署辅助文件。**默认只写 `.gitignore`**;`--ci github` 追加
127
+ `.github/workflows/pages.yml`,push 到 `main` 就触发构建 + 部署。
128
+
129
+ ```bash
130
+ qtype publish init # 只写 .gitignore
131
+ qtype publish init --ci github # 带 GitHub Pages 部署
132
+ ```
89
133
 
90
134
  ## `qtype publish password set / clear / status`
91
135
 
92
- 密码保护生命周期。`set` 会提示输入密码,用 Argon2id 派生 AES 密钥,
93
- 把结果 salt + hash 写到 `.qtype/config.json`。`clear` 关闭保护。
136
+ 密码保护生命周期。`set` 会提示输入密码,用 Argon2id(64 MiB / t=3 / p=1)
137
+ 派生一个短暂 AES 密钥,把 hash + salt 写到 `.qtype/config.json`。密码本身
138
+ **不存**,只存 hash;每次 `publish build` 需要重新提供密码派生 AES 密钥
139
+ 加密内容。
94
140
 
95
141
  ```bash
96
- qtype publish password set
142
+ qtype publish password set # 交互输入
143
+ echo "hunter2" | qtype publish password set # stdin 输入,便于脚本
97
144
  qtype publish password status
145
+ qtype publish password clear
98
146
  ```
99
147
 
148
+ 浏览器端:用户在 `PasswordGate` 输密码 → argon2id 派生同一 AES 密钥 →
149
+ 解密 material。派生结果缓存到 `sessionStorage`(同一 tab 内刷新不再问)。
150
+
100
151
  ---
101
152
 
102
153
  ## `qtype pack [-o file]`
@@ -110,25 +161,13 @@ qtype pack -o my-deck.tar.gz
110
161
 
111
162
  ---
112
163
 
113
- ## `qtype content lint | validate | search`
114
-
115
- - `lint` —— material 文件的样式级 pass
116
- - `validate` —— schema 级 pass;`qtype check` 的补充
117
- - `search <query>` —— 卡片全量子串搜索
118
-
119
- ```bash
120
- qtype content search "closure"
121
- ```
122
-
123
- ---
124
-
125
164
  ## `qtype config get / set / unset / list`
126
165
 
127
- git 风格的双层配置(user 层在 `~/.config/qtype/config.json`,repo 层
128
- 在 `<repo>/.qtype/config.json`)。
166
+ git 风格的双层配置(user 层在 `~/.config/qtype/config.json`,repo 层
167
+ 在 `<repo>/.qtype/config.json`)。
129
168
 
130
- 读优先级:repo > user > schema default。写入默认:repo-scope 键写到
131
- repouser-only 键写到 user,双层键优先写 repo。
169
+ 读优先级:**CLI flag > repo > user > schema default**。写入默认:
170
+ repo-only 键写到 repo,user-only 键写到 user,双 scope 键优先写 repo。
132
171
 
133
172
  ```bash
134
173
  qtype config set cli.lang zh --global
@@ -138,25 +177,20 @@ qtype config list
138
177
  qtype config unset typing.targetWpm
139
178
  ```
140
179
 
141
- 已知的键包括:
142
-
143
- - `cli.lang`、`cli.color`(user-only)
144
- - `repo.name`、`publish.password.*`(repo-only)
145
- - `repo.lang`、`typing.theme`、`typing.targetWpm`、`typing.tabBehavior`、
146
- `typing.hint`、`typing.showKeyboard`、`typing.showHands`、
147
- `publish.mermaid`(双 scope)
148
-
149
- 严格模式:未知键会被拒绝。
150
-
151
- ---
180
+ **已知配置键**:
152
181
 
153
- ## `qtype plugin`
182
+ - **User-only**: `cli.lang`、`cli.color`
183
+ - **Repo-only**: `repo.name`、`publish.password.enabled`、`publish.password.hash`、
184
+ `publish.password.aesSalt`、`publish.password.scope`、`publish.password.selected`
185
+ - **双 scope**: `repo.lang`、`typing.theme`、`typing.targetWpm`、`typing.tabBehavior`、
186
+ `typing.hint`、`typing.showKeyboard`、`typing.showHands`、`publish.mermaid`
154
187
 
155
- 命令骨架。运行时执行尚未实现 —— [TODO.zh.md](../../TODO.zh.md)。
188
+ 严格模式:未知键会被拒绝。View-side 的界面设置(自动朗读 / 数学渲染 /
189
+ AFK 阈值等)存在**浏览器 kv 层**,不在这个 config 里。
156
190
 
157
191
  ---
158
192
 
159
193
  ## 退出码
160
194
 
161
195
  - `0` —— 成功
162
- - `1` —— 校验 / lint / 构建失败,或任何抛出的错误
196
+ - `1` —— 校验 / lint / 构建失败,或任何抛出的错误
@@ -0,0 +1,179 @@
1
+ # 部署指南
2
+
3
+ English: [deployment.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/deployment.md)
4
+
5
+ `qtype publish build` 出的 `dist/` 是一个纯静态目录:HTML + JS + CSS +
6
+ `material/*.md`(或加密的 `.enc.json`)+ assets。**没有 server 端**,
7
+ 可以扔到任何 CDN / 静态托管上。
8
+
9
+ ## 部署前的 checklist
10
+
11
+ ```bash
12
+ qtype check # 校验干净?
13
+ qtype publish build # 生成 dist/
14
+ ls dist/ # 应看到 index.html + assets/ + material/
15
+ ```
16
+
17
+ **关键点**:构建产物是 `dist/`,不是 `dist/view/`。前者是**用户仓库
18
+ 里**的输出目录,后者是**开发时**的 view bundle 缓存(publish build 会
19
+ 把 dist/view/* 拷进你的 dist/)。
20
+
21
+ ## GitHub Pages
22
+
23
+ qtype 自带一键 workflow:
24
+
25
+ ```bash
26
+ qtype publish init --ci github
27
+ ```
28
+
29
+ 它会写 `.github/workflows/pages.yml`。push 到 `main` 分支就会:
30
+ 1. `npm install -g @qnroa/qtype`
31
+ 2. `qtype publish build`
32
+ 3. 把 `dist/` 上传到 GitHub Pages
33
+
34
+ **需要在 GitHub 仓库设置里**手动开启 Pages:
35
+ - Settings → Pages → Source 选 **GitHub Actions**
36
+
37
+ **如果启用了密码保护**:workflow 里得用 secret 注入密码:
38
+
39
+ ```yaml
40
+ - run: qtype publish build
41
+ env:
42
+ QTYPE_PUBLISH_PASSWORD: ${{ secrets.QTYPE_PASSWORD }}
43
+ ```
44
+
45
+ 在 Settings → Secrets and variables → Actions 里加一个叫
46
+ `QTYPE_PASSWORD` 的 secret。
47
+
48
+ ## Cloudflare Pages
49
+
50
+ 1. Cloudflare Dashboard → Pages → Create → Connect Git
51
+ 2. 构建配置:
52
+ - **Framework preset**: `None`
53
+ - **Build command**: `npx @qnroa/qtype publish build`
54
+ - **Build output directory**: `dist`
55
+ - **Node version**: `20` (环境变量 `NODE_VERSION=20`)
56
+ 3. 密码保护:在 Settings → Environment variables 加
57
+ `QTYPE_PUBLISH_PASSWORD`(选「Production」+ 勾「Encrypt」)
58
+
59
+ ## Vercel
60
+
61
+ `vercel.json`(仓库根):
62
+
63
+ ```json
64
+ {
65
+ "buildCommand": "npx @qnroa/qtype publish build",
66
+ "outputDirectory": "dist",
67
+ "framework": null
68
+ }
69
+ ```
70
+
71
+ 密码用 `vercel env add QTYPE_PUBLISH_PASSWORD` 加。
72
+
73
+ ## Netlify
74
+
75
+ `netlify.toml`(仓库根):
76
+
77
+ ```toml
78
+ [build]
79
+ command = "npx @qnroa/qtype publish build"
80
+ publish = "dist"
81
+
82
+ [build.environment]
83
+ NODE_VERSION = "20"
84
+ ```
85
+
86
+ 密码在 Site settings → Environment variables 里加。
87
+
88
+ ## 自建 nginx
89
+
90
+ `qtype publish build` 完之后:
91
+
92
+ ```bash
93
+ scp -r dist/* user@yourhost:/var/www/your-site/
94
+ ```
95
+
96
+ nginx 配置:
97
+
98
+ ```nginx
99
+ server {
100
+ listen 80;
101
+ server_name your-site.example;
102
+ root /var/www/your-site;
103
+ index index.html;
104
+
105
+ # SPA 回退:任何未命中的路由都返回 index.html,
106
+ # 让客户端路由接管(/typing/xxx.md 等)
107
+ location / {
108
+ try_files $uri $uri/ /index.html;
109
+ }
110
+
111
+ # 静态资源长缓存 —— hash 化过的文件名,可以放心 immutable
112
+ location /assets/ {
113
+ expires 1y;
114
+ add_header Cache-Control "public, immutable";
115
+ }
116
+
117
+ # material/* 短缓存 —— 用户可能重发,不要缓存太久
118
+ location /material/ {
119
+ expires 5m;
120
+ }
121
+ }
122
+ ```
123
+
124
+ 启用 gzip(整个 config 或 site-level):
125
+
126
+ ```nginx
127
+ gzip on;
128
+ gzip_types text/plain text/css application/javascript application/json image/svg+xml;
129
+ gzip_min_length 1024;
130
+ ```
131
+
132
+ ## Docker
133
+
134
+ 一个最小 Dockerfile,serve 静态站:
135
+
136
+ ```dockerfile
137
+ FROM node:20-alpine AS build
138
+ WORKDIR /app
139
+ COPY . .
140
+ RUN npm install -g @qnroa/qtype && qtype publish build
141
+
142
+ FROM nginx:alpine
143
+ COPY --from=build /app/dist /usr/share/nginx/html
144
+ COPY nginx.conf /etc/nginx/conf.d/default.conf
145
+ ```
146
+
147
+ nginx.conf 用上一节的 SPA fallback 配置。
148
+
149
+ ## 密码保护的部署注意
150
+
151
+ 密码保护是**客户端解密** —— server 只 serve 加密的 `.enc.json`,
152
+ 浏览器输密码后本地解密。所以:
153
+
154
+ - ✅ **server 不需要认证** —— 加密内容本身就是保护
155
+ - ✅ 可以放到公开的 GitHub Pages / Cloudflare Pages
156
+ - ⚠️ **攻击者能下载整个 dist**,离线暴力破解 KDF —— argon2id 参数
157
+ (64 MiB / t=3 / p=1)让每次尝试 ≈ 700ms,但不是无限强度。**别用
158
+ 弱密码**(< 12 字符的 dictionary 词组)
159
+ - ⚠️ 密码错了后端不知道,只有客户端能识别 —— 所以没有服务端限速。
160
+ view 端有本地限速(3 次错误后冷却 2/5/15 秒)是防止手动敲错的,
161
+ 不是安全屏障
162
+
163
+ ## 子路径部署(sub-path)
164
+
165
+ 如果你的站在 `https://example.com/mydeck/` 而不是根,现在**不支持**
166
+ —— 客户端 fetch `/material/*` 是硬编码的绝对路径。要求根部署,或者
167
+ 用反代把 `/mydeck/*` rewrite 成 `/*`。
168
+
169
+ ## 验证部署
170
+
171
+ 部署完打开:
172
+ - `/` → 应看到 material 列表(如果加密,先看到密码框)
173
+ - `/material/index.json` → JSON manifest
174
+ - 打开浏览器 devtools → Network,应看到:
175
+ - 一次 `/material/index.json`
176
+ - 点某张卡后一次 `/material/<file>.md`(或 `.enc.json`)
177
+ - 图片时 `/material/assets/**/*.svg`
178
+
179
+ **任一 404** = server 没配 SPA fallback 或路径搞错了。