ronin-skillforce 0.0.0-stage → 0.1.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.
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +225 -2
- package/bin/cli.js +811 -0
- package/bin/commands/check.js +298 -0
- package/bin/commands/create.js +169 -0
- package/bin/commands/doctor.js +392 -0
- package/bin/commands/import.js +557 -0
- package/bin/commands/next.js +125 -0
- package/bin/commands/review.js +207 -0
- package/bin/commands/status.js +114 -0
- package/bin/commands/studio.js +497 -0
- package/bin/commands/trail.js +211 -0
- package/bin/commands/web.js +350 -0
- package/bin/course-reader.js +611 -0
- package/bin/node-version.js +60 -0
- package/bin/platforms/_shared.js +211 -0
- package/bin/platforms/claude.js +104 -0
- package/bin/platforms/cursor.js +49 -0
- package/bin/platforms/gemini.js +65 -0
- package/bin/platforms/opencode.js +95 -0
- package/bin/registry-helpers.js +504 -0
- package/bin/static-server.js +153 -0
- package/bin/studio-store.js +94 -0
- package/bin/sync-shared.sh +5 -0
- package/package.json +91 -4
- package/plugin.json +139 -0
- package/shared/SKILL.md +568 -0
- package/shared/agents/coach.md +225 -0
- package/shared/agents/navigator.md +215 -0
- package/shared/agents/professor.md +372 -0
- package/shared/agents/researcher.md +181 -0
- package/shared/agents/spotter.md +129 -0
- package/shared/commands/professor/archive.md +103 -0
- package/shared/commands/professor/capstone-review.md +79 -0
- package/shared/commands/professor/capstone.md +34 -0
- package/shared/commands/professor/discuss.md +18 -0
- package/shared/commands/professor/done.md +44 -0
- package/shared/commands/professor/export.md +69 -0
- package/shared/commands/professor/hint.md +108 -0
- package/shared/commands/professor/navigator.md +67 -0
- package/shared/commands/professor/new-topic.md +73 -0
- package/shared/commands/professor/next.md +174 -0
- package/shared/commands/professor/note.md +63 -0
- package/shared/commands/professor/onboard.md +95 -0
- package/shared/commands/professor/progress.md +46 -0
- package/shared/commands/professor/publish.md +93 -0
- package/shared/commands/professor/quiz.md +27 -0
- package/shared/commands/professor/recall.md +74 -0
- package/shared/commands/professor/review.md +43 -0
- package/shared/commands/professor/schedule.md +75 -0
- package/shared/commands/professor/skill-export.md +87 -0
- package/shared/commands/professor/spotter.md +76 -0
- package/shared/commands/professor/stuck.md +27 -0
- package/shared/commands/professor/switch.md +50 -0
- package/shared/commands/professor/syllabus.md +9 -0
- package/shared/commands/professor/template-export.md +91 -0
- package/shared/commands/professor/template-import.md +111 -0
- package/shared/commands/professor/worktrees.md +58 -0
- package/shared/hooks/pre-compact.js +232 -0
- package/studio/README.md +313 -0
- package/studio/dist/assets/BetaReportPanel-8NrDLiPm.js +1 -0
- package/studio/dist/assets/Capstone-Cv9kH6LY.js +6 -0
- package/studio/dist/assets/CodeWorkspace-BwCEINWo.js +2 -0
- package/studio/dist/assets/Course-BJ_hafUP.js +1 -0
- package/studio/dist/assets/Editor-CV0mNhlz.js +53 -0
- package/studio/dist/assets/Home-C1ry89ak.js +1 -0
- package/studio/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/studio/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/studio/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/studio/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/studio/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/studio/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/studio/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/studio/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/studio/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/studio/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/studio/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/studio/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/studio/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/studio/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/studio/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/studio/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/studio/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/studio/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/studio/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/studio/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/studio/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/studio/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/studio/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/studio/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/studio/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/studio/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/studio/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/studio/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/studio/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/studio/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/studio/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/studio/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/studio/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/studio/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/studio/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/studio/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/studio/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/studio/dist/assets/Lesson-2e9TD9yL.js +2 -0
- package/studio/dist/assets/NewCourse-BZeOg2xn.js +952 -0
- package/studio/dist/assets/Progress-CRc_xEWC.js +1 -0
- package/studio/dist/assets/Review-6QEbHEfk.js +1 -0
- package/studio/dist/assets/Settings-NFnqVQui.js +1 -0
- package/studio/dist/assets/TutorPanel-DXQ6Z3BY.js +123 -0
- package/studio/dist/assets/abnfDiagram-WEYOIA3C-qeSjKlGM.js +1 -0
- package/studio/dist/assets/anthropic-D7NiQCUH.js +15 -0
- package/studio/dist/assets/arc-Y1ARJVZ4.js +1 -0
- package/studio/dist/assets/architecture-WOLXFQ4H-COG-m35l.js +1 -0
- package/studio/dist/assets/architectureDiagram-ZHVYKT53-VO7uKoeD.js +36 -0
- package/studio/dist/assets/array-BifhSqXX.js +1 -0
- package/studio/dist/assets/blockDiagram-RJAE7QA3-BGJF_qiL.js +140 -0
- package/studio/dist/assets/bridge-BTh0AeNX.js +1 -0
- package/studio/dist/assets/c4Diagram-XDPPPE54-C-S10RgU.js +38 -0
- package/studio/dist/assets/capstone-Amn6Hztq.js +135 -0
- package/studio/dist/assets/card-store-BrbrtX9w.js +1 -0
- package/studio/dist/assets/channel-SJiUQu_N.js +1 -0
- package/studio/dist/assets/chunk-2E7WHVMD-fv-iqTyC.js +88 -0
- package/studio/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/studio/dist/assets/chunk-4EMNKR2T-CY9IZrgv.js +1 -0
- package/studio/dist/assets/chunk-55XCU76K-DyTZz7v_.js +1 -0
- package/studio/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/studio/dist/assets/chunk-7S6XSTFO-BNMzTLRW.js +2 -0
- package/studio/dist/assets/chunk-AQDTSKZB-CEYANohH.js +72 -0
- package/studio/dist/assets/chunk-DSNLSHJZ-CDk5EXjH.js +129 -0
- package/studio/dist/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/studio/dist/assets/chunk-HAGFOTED-hNAi1zh_.js +62 -0
- package/studio/dist/assets/chunk-HNE4Q36P-COJnSYoZ.js +1 -0
- package/studio/dist/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/studio/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/studio/dist/assets/chunk-NGNAAXSQ-C2Wy9Xmz.js +136 -0
- package/studio/dist/assets/chunk-NQOKRVIF-BU6KVxRr.js +213 -0
- package/studio/dist/assets/chunk-UHW7PFBP-DYvxL9JG.js +1 -0
- package/studio/dist/assets/chunk-VQ5W62QI-CuRfk65j.js +1 -0
- package/studio/dist/assets/chunk-WQQL4CDK-KaG7x-Mb.js +10 -0
- package/studio/dist/assets/chunk-XXDRQBXY-CnbRkih_.js +1 -0
- package/studio/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/studio/dist/assets/chunk-YZO67HFG-DbuqIZmk.js +1 -0
- package/studio/dist/assets/chunk-ZAUX2LTX-bk4ivUmc.js +1 -0
- package/studio/dist/assets/chunk-ZCHMQSOR-B_LElfwh.js +2 -0
- package/studio/dist/assets/classDiagram-v2-4MYWR3UA-DtCJ6H_X.js +217 -0
- package/studio/dist/assets/cose-bilkent-JH36ORCC-DMBAZFnj.js +1 -0
- package/studio/dist/assets/course-export-DpaOTT3a.js +1 -0
- package/studio/dist/assets/cynefin-EF2NZ3EQ-D9btHJvU.js +1 -0
- package/studio/dist/assets/cynefinDiagram-WF24UDRP-CsFJuv27.js +62 -0
- package/studio/dist/assets/cytoscape.esm-CHBj4VkZ.js +321 -0
- package/studio/dist/assets/dagre-NK4GIZVX-Cg1Duec7.js +4 -0
- package/studio/dist/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/studio/dist/assets/diagram-CBK3MWTC-_KU2m5gd.js +24 -0
- package/studio/dist/assets/diagram-I5XIIV2D-5RaBrwUA.js +24 -0
- package/studio/dist/assets/diagram-ODIL2UCW-C0VKxoD3.js +30 -0
- package/studio/dist/assets/diagram-PFBEJUXE-BaHcZEP2.js +3 -0
- package/studio/dist/assets/diagram-RJA3I4VV-cwSAZ90p.js +41 -0
- package/studio/dist/assets/diagram-TYUNFSNR-BJImxCEN.js +200 -0
- package/studio/dist/assets/dist-CumnGVmJ.js +1 -0
- package/studio/dist/assets/ebnfDiagram-V4P3TTPT-OQQLRXcm.js +1 -0
- package/studio/dist/assets/elk-QONTBCTQ-BJGhQHxQ.js +27 -0
- package/studio/dist/assets/erDiagram-KYQIGQAA-D91EKSep.js +99 -0
- package/studio/dist/assets/error-BTdmRKoB.js +1 -0
- package/studio/dist/assets/errors-BZa_CNHL.js +1 -0
- package/studio/dist/assets/eventmodeling-K75KTNOO-DgdTRgnw.js +1 -0
- package/studio/dist/assets/fetch-local-DG3O3hmQ.js +4 -0
- package/studio/dist/assets/flowDiagram-IUGLLWBU-CVnJYMum.js +1 -0
- package/studio/dist/assets/ganttDiagram-R7GPNTJY-CSYLPWEI.js +292 -0
- package/studio/dist/assets/gitGraph-VSP46ZUC-D6GWaV9y.js +1 -0
- package/studio/dist/assets/gitGraphDiagram-PDYL7XHY-CaV31bvT.js +106 -0
- package/studio/dist/assets/graphlib-DS17s2tU.js +1 -0
- package/studio/dist/assets/index-CVenTTOY.css +2 -0
- package/studio/dist/assets/index-DioXTZVc.js +313 -0
- package/studio/dist/assets/info-OHQRW6UA-BN-x8GoN.js +1 -0
- package/studio/dist/assets/infoDiagram-MVDRKAX5-CIose_cy.js +2 -0
- package/studio/dist/assets/init-C-OQMol4.js +1 -0
- package/studio/dist/assets/ishikawaDiagram-HPEHV2GE-DCihSNBw.js +70 -0
- package/studio/dist/assets/journeyDiagram-BOSHW7O7-Bz3o3RIX.js +139 -0
- package/studio/dist/assets/js.worker-AD7DjksO.js +4 -0
- package/studio/dist/assets/kanban-definition-FNSA4HC5-BUyqvlFE.js +89 -0
- package/studio/dist/assets/katex-B_JcIwqj.js +257 -0
- package/studio/dist/assets/katex-BgsA2lO1.css +1 -0
- package/studio/dist/assets/line-B08T8KlK.js +1 -0
- package/studio/dist/assets/linear-C9iwaMOi.js +1 -0
- package/studio/dist/assets/mermaid-parser.core-BYwreSUy.js +7 -0
- package/studio/dist/assets/mermaid.core-DTO1oDmq.js +44 -0
- package/studio/dist/assets/mindmap-definition-6OY57UG3-BGLwKheY.js +98 -0
- package/studio/dist/assets/node.browser-BISniYn8.js +1 -0
- package/studio/dist/assets/node.browser-HQ5SKBOf.js +1 -0
- package/studio/dist/assets/ollama-De5w84tG.js +1 -0
- package/studio/dist/assets/openai-compatible-Joy1oK3L.js +1 -0
- package/studio/dist/assets/ordinal-BDEzSJ7C.js +1 -0
- package/studio/dist/assets/packet-JDAUHWVQ-CDIMjHS_.js +1 -0
- package/studio/dist/assets/path-fybaL0A-.js +1 -0
- package/studio/dist/assets/pegDiagram-ECIUJNBX-DWXm4mwS.js +1 -0
- package/studio/dist/assets/pie-XZMESJXO-CY3QQiKZ.js +1 -0
- package/studio/dist/assets/pieDiagram-GNMPY74T-M1aCnI7W.js +39 -0
- package/studio/dist/assets/python.worker-CzTrFdd9.js +24 -0
- package/studio/dist/assets/quadrantDiagram-D57K4MC3-BFFtO7U5.js +7 -0
- package/studio/dist/assets/radar-ABXABTNO-DT0W4_Xn.js +1 -0
- package/studio/dist/assets/railroad-I3PHUGI6-_VCpgZR5.js +1 -0
- package/studio/dist/assets/railroad-abnf-LNEFI6M7-DkSpQ5YY.js +1 -0
- package/studio/dist/assets/railroad-ebnf-DWYD2UWJ-BqWILdGb.js +1 -0
- package/studio/dist/assets/railroad-peg-JR7BVNR7-BB0bQL-Z.js +1 -0
- package/studio/dist/assets/railroadDiagram-Y72NRBL7-CjLKjIdJ.js +1 -0
- package/studio/dist/assets/react-B8SKf8RM.js +1 -0
- package/studio/dist/assets/rehype-katex-C-sKddsH.js +259 -0
- package/studio/dist/assets/remark-math-C-ox67hE.js +5 -0
- package/studio/dist/assets/requirementDiagram-EQYSW5RA-CnwzZqR8.js +84 -0
- package/studio/dist/assets/rolldown-runtime-COiEfhsA.js +1 -0
- package/studio/dist/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/studio/dist/assets/sankeyDiagram-SY24JHO5-CPDugTUl.js +40 -0
- package/studio/dist/assets/schemas-BOc2YsOP.js +55 -0
- package/studio/dist/assets/sequenceDiagram-BLEHNHQU-1dLfeU9Y.js +169 -0
- package/studio/dist/assets/settings-DhwuyNPU.js +1 -0
- package/studio/dist/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/studio/dist/assets/spec-nAnsSMkw.js +1 -0
- package/studio/dist/assets/sql-wasm-C1D_RJuy.wasm +0 -0
- package/studio/dist/assets/sql.worker-D7pBHOrq.js +4 -0
- package/studio/dist/assets/src-BWF7jMDv.js +1 -0
- package/studio/dist/assets/stateDiagram-v2-A6IESKWZ-DR7CmEjj.js +291 -0
- package/studio/dist/assets/swimlanes-B3ENRKFQ-BAWB9omQ.js +1 -0
- package/studio/dist/assets/swimlanesDiagram-AYQRV4AK-qeuHru16.js +8 -0
- package/studio/dist/assets/timeline-definition-JXYKGLGB-DNkj8z77.js +120 -0
- package/studio/dist/assets/treeView-D4JQ5SDB-BA-ouhMb.js +1 -0
- package/studio/dist/assets/treemap-SAJKECNS-BrrGxsAb.js +1 -0
- package/studio/dist/assets/useStream-rdsR6A7P.js +1 -0
- package/studio/dist/assets/usecaseDiagram-WPOLBNNX-BB3D0Dt_.js +328 -0
- package/studio/dist/assets/vennDiagram-Q3Y3IDCW-BrtqtKTE.js +34 -0
- package/studio/dist/assets/wardley-7MLQ67FV-BKkemDql.js +1 -0
- package/studio/dist/assets/wardleyDiagram-IVAIDKWA-DFnI3P5z.js +78 -0
- package/studio/dist/assets/xychartDiagram-4URNHDU4-Da0DZG_q.js +7 -0
- package/studio/dist/index.html +20 -0
- package/studio/dist/preview.html +22 -0
- package/studio/migrations/0001_init.sql +188 -0
- package/studio/migrations/0002_external_ids.sql +20 -0
- package/studio/migrations/0003_course_language.sql +12 -0
- package/studio/migrations/0004_capstone.sql +51 -0
- package/studio/migrations/0005_beta_loop.sql +73 -0
- package/studio/migrations/0006_interactive_exercises.sql +49 -0
- package/studio/src/lib/activity.js +92 -0
- package/studio/src/lib/ai/anthropic.js +109 -0
- package/studio/src/lib/ai/bridge.js +126 -0
- package/studio/src/lib/ai/catalog.js +160 -0
- package/studio/src/lib/ai/config.js +70 -0
- package/studio/src/lib/ai/errors.js +95 -0
- package/studio/src/lib/ai/fetch-local.js +104 -0
- package/studio/src/lib/ai/index.js +194 -0
- package/studio/src/lib/ai/ollama.js +136 -0
- package/studio/src/lib/ai/openai-compatible.js +101 -0
- package/studio/src/lib/ai/provider-utils.js +107 -0
- package/studio/src/lib/ai/sse.js +99 -0
- package/studio/src/lib/ai/status.js +92 -0
- package/studio/src/lib/ai/useStream.js +109 -0
- package/studio/src/lib/beta/metrics.js +147 -0
- package/studio/src/lib/beta/report.js +134 -0
- package/studio/src/lib/capstone-evidence.js +758 -0
- package/studio/src/lib/capstone.js +663 -0
- package/studio/src/lib/chat-store.js +128 -0
- package/studio/src/lib/course-export.js +38 -0
- package/studio/src/lib/course.js +187 -0
- package/studio/src/lib/exercises/journal-entry.js +259 -0
- package/studio/src/lib/exercises/placement.js +31 -0
- package/studio/src/lib/exercises/registry.js +19 -0
- package/studio/src/lib/exercises/spec.js +129 -0
- package/studio/src/lib/i18n/detect.js +162 -0
- package/studio/src/lib/i18n/en/app.json +23 -0
- package/studio/src/lib/i18n/en/betaReport.json +55 -0
- package/studio/src/lib/i18n/en/capstone.json +57 -0
- package/studio/src/lib/i18n/en/common.json +25 -0
- package/studio/src/lib/i18n/en/course.json +27 -0
- package/studio/src/lib/i18n/en/data.json +35 -0
- package/studio/src/lib/i18n/en/durability.json +5 -0
- package/studio/src/lib/i18n/en/errors.json +20 -0
- package/studio/src/lib/i18n/en/exercises.json +55 -0
- package/studio/src/lib/i18n/en/externalEvidence.json +76 -0
- package/studio/src/lib/i18n/en/home.json +18 -0
- package/studio/src/lib/i18n/en/lesson.json +33 -0
- package/studio/src/lib/i18n/en/nav.json +8 -0
- package/studio/src/lib/i18n/en/newCourse.json +51 -0
- package/studio/src/lib/i18n/en/onboarding.json +35 -0
- package/studio/src/lib/i18n/en/playwrightTemplate.json +20 -0
- package/studio/src/lib/i18n/en/practice.json +79 -0
- package/studio/src/lib/i18n/en/provider.json +27 -0
- package/studio/src/lib/i18n/en/providerMeta.json +26 -0
- package/studio/src/lib/i18n/en/reflection.json +17 -0
- package/studio/src/lib/i18n/en/revision.json +52 -0
- package/studio/src/lib/i18n/en/runnerNotice.json +14 -0
- package/studio/src/lib/i18n/en/settings.json +12 -0
- package/studio/src/lib/i18n/en/storage.json +49 -0
- package/studio/src/lib/i18n/en/tutor.json +39 -0
- package/studio/src/lib/i18n/en/workspace.json +50 -0
- package/studio/src/lib/i18n/index.js +144 -0
- package/studio/src/lib/i18n/languages.js +93 -0
- package/studio/src/lib/i18n/vi/app.json +23 -0
- package/studio/src/lib/i18n/vi/betaReport.json +55 -0
- package/studio/src/lib/i18n/vi/capstone.json +57 -0
- package/studio/src/lib/i18n/vi/common.json +25 -0
- package/studio/src/lib/i18n/vi/course.json +27 -0
- package/studio/src/lib/i18n/vi/data.json +35 -0
- package/studio/src/lib/i18n/vi/durability.json +5 -0
- package/studio/src/lib/i18n/vi/errors.json +20 -0
- package/studio/src/lib/i18n/vi/exercises.json +55 -0
- package/studio/src/lib/i18n/vi/externalEvidence.json +76 -0
- package/studio/src/lib/i18n/vi/home.json +18 -0
- package/studio/src/lib/i18n/vi/lesson.json +33 -0
- package/studio/src/lib/i18n/vi/nav.json +8 -0
- package/studio/src/lib/i18n/vi/newCourse.json +51 -0
- package/studio/src/lib/i18n/vi/onboarding.json +35 -0
- package/studio/src/lib/i18n/vi/playwrightTemplate.json +20 -0
- package/studio/src/lib/i18n/vi/practice.json +79 -0
- package/studio/src/lib/i18n/vi/provider.json +27 -0
- package/studio/src/lib/i18n/vi/providerMeta.json +26 -0
- package/studio/src/lib/i18n/vi/reflection.json +17 -0
- package/studio/src/lib/i18n/vi/revision.json +52 -0
- package/studio/src/lib/i18n/vi/runnerNotice.json +14 -0
- package/studio/src/lib/i18n/vi/settings.json +12 -0
- package/studio/src/lib/i18n/vi/storage.json +49 -0
- package/studio/src/lib/i18n/vi/tutor.json +39 -0
- package/studio/src/lib/i18n/vi/workspace.json +50 -0
- package/studio/src/lib/ids.js +10 -0
- package/studio/src/lib/json.js +26 -0
- package/studio/src/lib/markdown.js +74 -0
- package/studio/src/lib/prompts/base.js +139 -0
- package/studio/src/lib/prompts/capstone.js +777 -0
- package/studio/src/lib/prompts/course.js +150 -0
- package/studio/src/lib/prompts/lesson.js +275 -0
- package/studio/src/lib/prompts/practice.js +511 -0
- package/studio/src/lib/prompts/tutor.js +509 -0
- package/studio/src/lib/repo/blocked-adapter.js +69 -0
- package/studio/src/lib/repo/events.js +239 -0
- package/studio/src/lib/repo/idb-adapter.js +226 -0
- package/studio/src/lib/repo/index.js +1315 -0
- package/studio/src/lib/repo/memory-adapter.js +115 -0
- package/studio/src/lib/repo/remote-adapter.js +158 -0
- package/studio/src/lib/repo/schema.js +143 -0
- package/studio/src/lib/repo/select-adapter.js +345 -0
- package/studio/src/lib/router.js +71 -0
- package/studio/src/lib/runner/browser.js +244 -0
- package/studio/src/lib/runner/checks.js +248 -0
- package/studio/src/lib/runner/current-code.js +98 -0
- package/studio/src/lib/runner/esm-cjs.js +109 -0
- package/studio/src/lib/runner/hash.js +34 -0
- package/studio/src/lib/runner/history.js +48 -0
- package/studio/src/lib/runner/index.js +168 -0
- package/studio/src/lib/runner/languages.js +258 -0
- package/studio/src/lib/runner/local.js +139 -0
- package/studio/src/lib/runner/path.js +104 -0
- package/studio/src/lib/runner/skeleton.js +315 -0
- package/studio/src/lib/runner/strip-types.js +134 -0
- package/studio/src/lib/settings.js +399 -0
- package/studio/src/lib/srs.js +39 -0
- package/templates/agent/settings.json +6 -0
- package/templates/claude/plugin.json +139 -0
- package/templates/claude/settings.json +15 -0
- package/templates/cursor/professor.mdc +4 -0
- package/templates/cursor/settings.json +18 -0
- package/templates/gemini/GEMINI.md +28 -0
- package/templates/gemini/settings.json +5 -0
- package/templates/opencode/opencode.json +3 -0
- package/templates/researcher/README.md +61 -0
- package/templates/researcher/settings.json +18 -0
- package/web/client/components.json +15 -0
- package/web/client/index.html +12 -0
- package/web/client/package-lock.json +8732 -0
- package/web/client/package.json +39 -0
- package/web/client/postcss.config.js +6 -0
- package/web/client/src/App.jsx +140 -0
- package/web/client/src/api/client.js +357 -0
- package/web/client/src/components/ChatPanel.jsx +417 -0
- package/web/client/src/components/CommandPills.jsx +50 -0
- package/web/client/src/components/DeprecationBanner.jsx +21 -0
- package/web/client/src/components/ExerciseEditor.jsx +164 -0
- package/web/client/src/components/Header.jsx +119 -0
- package/web/client/src/components/LecturePanel.jsx +342 -0
- package/web/client/src/components/MobileTabSwitcher.jsx +51 -0
- package/web/client/src/components/SplitPane.jsx +42 -0
- package/web/client/src/components/ui/alert.jsx +38 -0
- package/web/client/src/components/ui/badge.jsx +24 -0
- package/web/client/src/components/ui/button.jsx +23 -0
- package/web/client/src/components/ui/select.jsx +74 -0
- package/web/client/src/hooks/useSSE.js +152 -0
- package/web/client/src/hooks/useWebSocket.js +98 -0
- package/web/client/src/index.css +23 -0
- package/web/client/src/lib/utils.js +6 -0
- package/web/client/src/main.jsx +12 -0
- package/web/client/src/utils/markdown.js +50 -0
- package/web/client/tailwind.config.js +8 -0
- package/web/client/vite.config.js +21 -0
- package/web/dist/assets/index-C1W0eXIQ.js +294 -0
- package/web/dist/assets/index-C3OUx70T.css +1 -0
- package/web/dist/index.html +13 -0
- package/web/lecture-archive.js +172 -0
- package/web/legacy-server.js +1277 -0
- package/web/package-lock.json +855 -0
- package/web/package.json +10 -0
- package/web/security.js +1016 -0
- package/web/server.js +390 -0
- package/web/studio-api/agents.js +580 -0
- package/web/studio-api/bridge.js +199 -0
- package/web/studio-api/db.js +66 -0
- package/web/studio-api/guards.js +201 -0
- package/web/studio-api/health.js +538 -0
- package/web/studio-api.js +214 -0
- package/web/studio-db.js +380 -0
- package/web/studio-runner.js +568 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"selfReported": "self-reported evidence",
|
|
3
|
+
"selfReportedHint": "Straight from your own terminal — Studio did not run this and cannot verify it.",
|
|
4
|
+
"title": "Verify externally",
|
|
5
|
+
"intro": "Run your Playwright test in your own terminal, then paste the reporter output below. Studio only reads what you paste.",
|
|
6
|
+
"commandTitle": "Commands to run in your own terminal",
|
|
7
|
+
"commandWhyChromium": "The --project=chromium flag matters: R6 needs a Chromium run, so the report must name it.",
|
|
8
|
+
"copy": "Copy",
|
|
9
|
+
"copied": "Copied",
|
|
10
|
+
"copyFailed": "Could not copy — select the command and copy it yourself.",
|
|
11
|
+
"pasteLabel": "Paste the reporter output",
|
|
12
|
+
"pastePlaceholder": "Paste the whole JSON report or the list output here…",
|
|
13
|
+
"uploadLabel": "Or upload the report file",
|
|
14
|
+
"uploadHint": "A .json or .txt file saved from your terminal, up to 1 MB.",
|
|
15
|
+
"uploadTooLarge": "That file is larger than 1 MB. Save the reporter output again and retry.",
|
|
16
|
+
"uploadUnreadable": "That file could not be read as text. Check that it is the reporter output.",
|
|
17
|
+
"clear": "Clear",
|
|
18
|
+
"factsTitle": "What your report says",
|
|
19
|
+
"total": "Total",
|
|
20
|
+
"passed": "Passed",
|
|
21
|
+
"failed": "Failed",
|
|
22
|
+
"skipped": "Skipped",
|
|
23
|
+
"flaky": "Flaky",
|
|
24
|
+
"durationLabel": "Duration: {ms}",
|
|
25
|
+
"versionLabel": "Playwright: {version}",
|
|
26
|
+
"versionUnknown": "Playwright version unknown (the list reporter does not print it)",
|
|
27
|
+
"projectsLabel": "Projects",
|
|
28
|
+
"noProjects": "No project named (a single-project run)",
|
|
29
|
+
"chromiumLabel": "Chromium",
|
|
30
|
+
"chromiumConfirmed": "Chromium",
|
|
31
|
+
"chromiumAssumed": "Chromium (assumed)",
|
|
32
|
+
"chromiumNone": "No Chromium run",
|
|
33
|
+
"formatLabel": "Format",
|
|
34
|
+
"formatValue": "Reporter format: {format}",
|
|
35
|
+
"specsTitle": "Spec files",
|
|
36
|
+
"noSpecs": "No spec files in this report.",
|
|
37
|
+
"testCount": "1 test|{count} tests",
|
|
38
|
+
"unrecognized": "This does not look like Playwright output — check that you copied the whole report.",
|
|
39
|
+
"warningsTitle": "Mismatches to look at",
|
|
40
|
+
"warningNone": "No mismatches detected.",
|
|
41
|
+
"confirmLabel": "I confirm these facts match the run I just did",
|
|
42
|
+
"confirmHint": "Studio cannot verify them; they are stored as self-reported evidence.",
|
|
43
|
+
"confirmRequired": "Tick the box above once the facts look right.",
|
|
44
|
+
"evidenceSectionTitle": "Evidence for this attempt",
|
|
45
|
+
"submitRequiresEvidence": "Paste and confirm your Playwright report before submitting.",
|
|
46
|
+
"revise": "Revise this attempt",
|
|
47
|
+
"reviseHint": "The review below points at what to change. Run your spec again in your own terminal, paste the new report, and submit — the new attempt is linked to this one.",
|
|
48
|
+
"revisingAttempt": "Revising attempt {n} — submit when your new run is ready.",
|
|
49
|
+
"specCodeTitle": "Your spec code",
|
|
50
|
+
"specCodeHint": "Paste the spec you ran. Studio reads it for the review and never executes it.",
|
|
51
|
+
"specPathLabel": "Spec file path",
|
|
52
|
+
"specCodeLabel": "Spec source",
|
|
53
|
+
"status": {
|
|
54
|
+
"met": "Met",
|
|
55
|
+
"partial": "Partial",
|
|
56
|
+
"not_met": "Not met"
|
|
57
|
+
},
|
|
58
|
+
"historyTitle": "Attempt history",
|
|
59
|
+
"historyEvidence": "Evidence for this attempt",
|
|
60
|
+
"historyTransitions": "What changed since the previous attempt",
|
|
61
|
+
"historyNoChange": "No criterion changed since the previous attempt.",
|
|
62
|
+
"historyFirstAttempt": "first attempt",
|
|
63
|
+
"command": {
|
|
64
|
+
"json_file": "JSON report written to results.json (easiest to paste or upload)",
|
|
65
|
+
"json_stdout": "JSON report printed to the terminal (copy the whole output)",
|
|
66
|
+
"list": "List report (accepted too; it carries no Playwright version)"
|
|
67
|
+
},
|
|
68
|
+
"warning": {
|
|
69
|
+
"no_tests": "The report contains no tests.",
|
|
70
|
+
"count_mismatch": "The counts in the report do not add up.",
|
|
71
|
+
"unknown_spec_files": "Some reported spec files are not in the code you submitted.",
|
|
72
|
+
"claimed_pass_with_failures": "Your write-up claims a green run, but the report contains failures.",
|
|
73
|
+
"unrecognized_format": "This does not look like Playwright reporter output.",
|
|
74
|
+
"truncated": "The report was too long and was cut down."
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Your courses",
|
|
3
|
+
"newCourse": "New course",
|
|
4
|
+
"loading": "Loading…",
|
|
5
|
+
"empty": {
|
|
6
|
+
"title": "No courses yet",
|
|
7
|
+
"description": "Create your first course from a prompt, or open the bundled demo course to see how Studio works — no AI provider needed.",
|
|
8
|
+
"createFirst": "Create your first course",
|
|
9
|
+
"openDemo": "Open demo course"
|
|
10
|
+
},
|
|
11
|
+
"continue": "Continue learning",
|
|
12
|
+
"lessonOf": "Lesson {n}: {title}",
|
|
13
|
+
"complete": "Complete",
|
|
14
|
+
"demo": "demo",
|
|
15
|
+
"delete": "Delete",
|
|
16
|
+
"deleteConfirm": "Delete “{title}”? Lessons and progress are kept as a soft-deleted record.",
|
|
17
|
+
"continueButton": "Continue"
|
|
18
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"home": "Home",
|
|
3
|
+
"breadcrumb": "Lesson {n}",
|
|
4
|
+
"markDone": "Mark done",
|
|
5
|
+
"revisit": "Revisit reflection",
|
|
6
|
+
"tabs": {
|
|
7
|
+
"practice": "Practice",
|
|
8
|
+
"tutor": "Tutor",
|
|
9
|
+
"workspace": "Workspace",
|
|
10
|
+
"exercise": "Exercises"
|
|
11
|
+
},
|
|
12
|
+
"status": {
|
|
13
|
+
"todo": "Not started",
|
|
14
|
+
"active": "In progress",
|
|
15
|
+
"done": "Done"
|
|
16
|
+
},
|
|
17
|
+
"loading": "Loading lesson…",
|
|
18
|
+
"loadingWorkspace": "Loading workspace…",
|
|
19
|
+
"notFound": "Lesson not found",
|
|
20
|
+
"backToCourse": "Back to course",
|
|
21
|
+
"noContent": {
|
|
22
|
+
"title": "No lesson content yet",
|
|
23
|
+
"description": "Generate this lesson from the course context and your level. You can regenerate later — older versions are never overwritten.",
|
|
24
|
+
"action": "Generate lesson"
|
|
25
|
+
},
|
|
26
|
+
"version": "Lesson version",
|
|
27
|
+
"generated": "generated {time}",
|
|
28
|
+
"regenerate": "Regenerate",
|
|
29
|
+
"regenerateConfirm": "Regenerate this lesson? This calls the AI again and costs tokens. Your current version is kept.",
|
|
30
|
+
"generating": "Generating lesson…",
|
|
31
|
+
"regenerateIn": "Regenerate in {language}",
|
|
32
|
+
"languageNotice": "The lesson came back in another language, so Professor regenerated it once in {language}."
|
|
33
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "New course",
|
|
3
|
+
"subtitle": "Describe what you want to learn. Professor proposes a syllabus you can edit before starting.",
|
|
4
|
+
"topic": {
|
|
5
|
+
"label": "What do you want to learn?",
|
|
6
|
+
"placeholder": "e.g. Kubernetes networking, Music theory, Linear algebra"
|
|
7
|
+
},
|
|
8
|
+
"level": "Level",
|
|
9
|
+
"language": "Lesson language",
|
|
10
|
+
"useDifferent": "Use a different language for this course",
|
|
11
|
+
"goal": {
|
|
12
|
+
"label": "Your goal",
|
|
13
|
+
"placeholder": "e.g. Pass the CKA exam, compose my first song"
|
|
14
|
+
},
|
|
15
|
+
"propose": "Propose syllabus",
|
|
16
|
+
"proposing": "Proposing…",
|
|
17
|
+
"stop": "Stop",
|
|
18
|
+
"skipAi": "Skip AI — start an empty course",
|
|
19
|
+
"hint": {
|
|
20
|
+
"before": "Using a no-key AI source? Configure it in",
|
|
21
|
+
"settingsLink": "Settings",
|
|
22
|
+
"after": ", or open the demo course first."
|
|
23
|
+
},
|
|
24
|
+
"courseTitle": "Course title",
|
|
25
|
+
"description": "Description",
|
|
26
|
+
"courseKind": "Course kind",
|
|
27
|
+
"detected": "Detected: {reason}",
|
|
28
|
+
"yourArtifact": "Your artifact",
|
|
29
|
+
"addToDo": "Add to “{label}”",
|
|
30
|
+
"artifactTitle": "Artifact title",
|
|
31
|
+
"artifactTitlePlaceholder": "e.g. A deployed URL shortener + repo",
|
|
32
|
+
"deliverable": "What you'll ship",
|
|
33
|
+
"deliverablePlaceholder": "The ONE concrete, real thing this course builds toward.",
|
|
34
|
+
"definitionOfDone": "Definition of Done",
|
|
35
|
+
"doneBulletPlaceholder": "A checkable finished-state bullet",
|
|
36
|
+
"removeItem": "Remove item",
|
|
37
|
+
"syllabus": "Syllabus · {count} {lessonWord}",
|
|
38
|
+
"lessonNTitle": "Lesson {n} title",
|
|
39
|
+
"summary": "Summary",
|
|
40
|
+
"moveUp": "Move up",
|
|
41
|
+
"moveDown": "Move down",
|
|
42
|
+
"addLesson": "Add lesson",
|
|
43
|
+
"start": "Start course",
|
|
44
|
+
"starting": "Starting…",
|
|
45
|
+
"bokiTemplate": {
|
|
46
|
+
"title": "Boki 3級 — 仕訳 cơ bản / Journal entry basics",
|
|
47
|
+
"description": "Three written lessons and 14 journal-entry exercises from the Japanese Bookkeeping 3rd grade (簿記3級) syllabus. Fill the debit and credit rows, press Check, and get instant feedback plus hints — no API key needed.",
|
|
48
|
+
"cta": "Start the Boki course",
|
|
49
|
+
"seeding": "Setting up your course…"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"step": "Step {n} of {total} · {name}",
|
|
3
|
+
"steps": {
|
|
4
|
+
"welcome": "Welcome",
|
|
5
|
+
"storage": "Where data is saved",
|
|
6
|
+
"source": "Choose an AI source",
|
|
7
|
+
"connect": "Connect",
|
|
8
|
+
"ready": "You are ready"
|
|
9
|
+
},
|
|
10
|
+
"skip": "Skip",
|
|
11
|
+
"back": "Back",
|
|
12
|
+
"next": "Next",
|
|
13
|
+
"tryDemo": "Try the demo course",
|
|
14
|
+
"createFirst": "Create your first course",
|
|
15
|
+
"welcome": {
|
|
16
|
+
"title": "Learn anything with a Socratic professor",
|
|
17
|
+
"body": "Create a course, study generated lessons, practise with quizzes and flashcards, and ask a tutor that guides you instead of doing the work for you.",
|
|
18
|
+
"privacy": "Everything stays on your device. Your API keys are never uploaded or included in backups.",
|
|
19
|
+
"language": "Learning language"
|
|
20
|
+
},
|
|
21
|
+
"storage": {
|
|
22
|
+
"title": "Where should your learning data be saved?",
|
|
23
|
+
"body": "You can change this later in Settings — Studio will offer to move your data for you."
|
|
24
|
+
},
|
|
25
|
+
"source": {
|
|
26
|
+
"title": "Where should lessons come from?"
|
|
27
|
+
},
|
|
28
|
+
"connect": {
|
|
29
|
+
"title": "Connect and test"
|
|
30
|
+
},
|
|
31
|
+
"ready": {
|
|
32
|
+
"title": "You are all set",
|
|
33
|
+
"body": "Create your first course, or explore the bundled demo course — it works with no provider at all."
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"card": {
|
|
3
|
+
"title": "Start from a template",
|
|
4
|
+
"description": "Ship your first reliable Playwright E2E test for a real web workflow — five written lessons plus a fixed seven-criterion capstone. No API key needed.",
|
|
5
|
+
"checklistTitle": "Before you start",
|
|
6
|
+
"checklistHint": "Tick every item. This course tests your own app with your own Playwright run; Studio never runs Playwright for you.",
|
|
7
|
+
"cta": "Start the Playwright course",
|
|
8
|
+
"notReady": "Tick all five to start",
|
|
9
|
+
"seeding": "Setting up your course…"
|
|
10
|
+
},
|
|
11
|
+
"rubric": {
|
|
12
|
+
"r1": "Real workflow in your own app",
|
|
13
|
+
"r2": "Semantic locators",
|
|
14
|
+
"r3": "Web-first assertions",
|
|
15
|
+
"r4": "No fixed waits, force or coordinate clicks",
|
|
16
|
+
"r5": "Isolated and repeatable",
|
|
17
|
+
"r6": "Evidence of a passing Chromium run",
|
|
18
|
+
"r7": "You can explain your choices"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"quiz": {
|
|
3
|
+
"title": "Check your understanding",
|
|
4
|
+
"subtitle": "Five quick questions, explained as you go.",
|
|
5
|
+
"intro": "Answer 5 quick questions to check what stuck. You will see the reasoning after each one — this is a self-check, not a grade.",
|
|
6
|
+
"start": "Check your understanding",
|
|
7
|
+
"startShort": "Start self-check",
|
|
8
|
+
"generating": "Generating questions",
|
|
9
|
+
"writing": "Writing your 5 questions…",
|
|
10
|
+
"stop": "Stop",
|
|
11
|
+
"tryAgain": "Try again",
|
|
12
|
+
"youGot": "You got {score} of {total} correct.",
|
|
13
|
+
"saving": "Saving your attempt…",
|
|
14
|
+
"saved": "Saved to your attempts.",
|
|
15
|
+
"retake": "Retake",
|
|
16
|
+
"newQuiz": "New quiz",
|
|
17
|
+
"questionOf": "Question {n} of {total}",
|
|
18
|
+
"demoQuiz": "demo quiz",
|
|
19
|
+
"correct": "Correct",
|
|
20
|
+
"notQuite": "Not quite — the answer is {letter}.",
|
|
21
|
+
"seeScore": "See score",
|
|
22
|
+
"nextQuestion": "Next question",
|
|
23
|
+
"noContent": "This lesson has no content yet.",
|
|
24
|
+
"noContentHint": "Generate or open the lesson first, then try again."
|
|
25
|
+
},
|
|
26
|
+
"flashcards": {
|
|
27
|
+
"title": "Flashcards",
|
|
28
|
+
"subtitle": "Add cards from this lesson to your review queue.",
|
|
29
|
+
"intro": "Turn this lesson into a few flashcards and they will enter your spaced-repetition queue.",
|
|
30
|
+
"generating": "Generating flashcards",
|
|
31
|
+
"writing": "Writing flashcards…",
|
|
32
|
+
"stop": "Stop",
|
|
33
|
+
"added": "Added {count} {cardWord} to your review queue.",
|
|
34
|
+
"alreadyInDeck": "Everything from this lesson is already in your deck.",
|
|
35
|
+
"skipped": "{count} {cardWord} already in your deck were skipped.",
|
|
36
|
+
"save": "Save {count} {cardWord}",
|
|
37
|
+
"generate": "Generate flashcards",
|
|
38
|
+
"generateAgain": "Generate again",
|
|
39
|
+
"front": "Front",
|
|
40
|
+
"back": "Back",
|
|
41
|
+
"delete": "Delete",
|
|
42
|
+
"noContent": "This lesson has no content yet.",
|
|
43
|
+
"noContentHint": "Generate or open the lesson first, then try again."
|
|
44
|
+
},
|
|
45
|
+
"past": {
|
|
46
|
+
"title": "Past attempts",
|
|
47
|
+
"empty": "No attempts yet — finish a self-check to see it here."
|
|
48
|
+
},
|
|
49
|
+
"due": {
|
|
50
|
+
"badge": "{count} due",
|
|
51
|
+
"title": "{count} {cardWord} due for review"
|
|
52
|
+
},
|
|
53
|
+
"streak": {
|
|
54
|
+
"none": "No streak yet",
|
|
55
|
+
"one": "1-day streak",
|
|
56
|
+
"many": "{count}-day streak",
|
|
57
|
+
"title": "Studied on {studied} of the last {total} days"
|
|
58
|
+
},
|
|
59
|
+
"review": {
|
|
60
|
+
"title": "Review",
|
|
61
|
+
"loading": "Loading your queue…",
|
|
62
|
+
"allCaughtUp": "All caught up",
|
|
63
|
+
"nextCard": "Your next card is due {date}.",
|
|
64
|
+
"noCards": "No cards are scheduled yet — generate flashcards from a lesson to start reviewing.",
|
|
65
|
+
"backToCourses": "Back to courses",
|
|
66
|
+
"sessionComplete": "Session complete",
|
|
67
|
+
"reviewed": "You reviewed {count} {cardWord}. Nice work.",
|
|
68
|
+
"checkForMore": "Check for more",
|
|
69
|
+
"cardOf": "Card {n} of {total}",
|
|
70
|
+
"question": "Question",
|
|
71
|
+
"answer": "Answer",
|
|
72
|
+
"tapFlip": "Tap or press Space to flip",
|
|
73
|
+
"gradeAfter": "Grade yourself after you flip the card.",
|
|
74
|
+
"again": "Again",
|
|
75
|
+
"hard": "Hard",
|
|
76
|
+
"good": "Good",
|
|
77
|
+
"easy": "Easy"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"selected": "Selected",
|
|
3
|
+
"anthropicKey": "Anthropic API key",
|
|
4
|
+
"model": "Model",
|
|
5
|
+
"preset": "Preset",
|
|
6
|
+
"baseUrl": "Base URL",
|
|
7
|
+
"apiKey": "API key",
|
|
8
|
+
"apiKeyOptional": "optional for local servers",
|
|
9
|
+
"ollamaBaseUrl": "Ollama base URL",
|
|
10
|
+
"loadInstalled": "Load installed",
|
|
11
|
+
"bridgeUrl": "Bridge URL",
|
|
12
|
+
"pairingToken": "Pairing token",
|
|
13
|
+
"pairingTokenHint": "Printed by the local server when it starts.",
|
|
14
|
+
"agent": "Agent",
|
|
15
|
+
"defaultModel": "Default (let the agent choose)",
|
|
16
|
+
"loadModels": "Load models",
|
|
17
|
+
"customModel": "Custom model (optional)",
|
|
18
|
+
"customModelHint": "Overrides the dropdown. Leave empty to use “Default”.",
|
|
19
|
+
"noModelFlag": "{agent} doesn’t accept a model flag here — it uses your signed-in default.",
|
|
20
|
+
"localHint": "Using a local agent or Ollama works best when Studio itself runs locally (`npm run dev`).",
|
|
21
|
+
"test": "Test connection",
|
|
22
|
+
"testing": "Testing…",
|
|
23
|
+
"streaming": "Streaming…",
|
|
24
|
+
"response": "Response",
|
|
25
|
+
"useOllamaServer": "Use Ollama through the local server",
|
|
26
|
+
"loopbackOnly": "Only a URL on this machine (localhost or 127.0.0.1) is allowed — Studio will not send the pairing token anywhere else."
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"anthropic": {
|
|
3
|
+
"label": "Anthropic (Claude)",
|
|
4
|
+
"tagline": "Best lesson quality with your own API key.",
|
|
5
|
+
"pros": "Highest-quality lessons and JSON",
|
|
6
|
+
"cons": "Needs a paid API key"
|
|
7
|
+
},
|
|
8
|
+
"openai": {
|
|
9
|
+
"label": "OpenAI-compatible",
|
|
10
|
+
"tagline": "OpenAI, OpenRouter, Groq, LM Studio…",
|
|
11
|
+
"pros": "Many providers and models",
|
|
12
|
+
"cons": "Some endpoints block browser CORS"
|
|
13
|
+
},
|
|
14
|
+
"ollama": {
|
|
15
|
+
"label": "Ollama (free, local)",
|
|
16
|
+
"tagline": "Runs on your machine, no key, no cost.",
|
|
17
|
+
"pros": "Free and private",
|
|
18
|
+
"cons": "Needs a local install"
|
|
19
|
+
},
|
|
20
|
+
"bridge": {
|
|
21
|
+
"label": "My local agent",
|
|
22
|
+
"tagline": "Use Claude Code, OpenCode, Cursor, Gemini, Antigravity or Ollama.",
|
|
23
|
+
"pros": "Free with your existing subscription",
|
|
24
|
+
"cons": "Needs the local server running"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"aria": "Finish lesson",
|
|
3
|
+
"title": "Finish “{title}”",
|
|
4
|
+
"hardest": "What was hardest?",
|
|
5
|
+
"hardestPlaceholder": "The part that took the most effort…",
|
|
6
|
+
"confidence": "Confidence",
|
|
7
|
+
"confidenceLabels": {
|
|
8
|
+
"1": "Lost",
|
|
9
|
+
"2": "Shaky",
|
|
10
|
+
"3": "Okay",
|
|
11
|
+
"4": "Solid",
|
|
12
|
+
"5": "Could teach it"
|
|
13
|
+
},
|
|
14
|
+
"cancel": "Cancel",
|
|
15
|
+
"markDone": "Mark done",
|
|
16
|
+
"saving": "Saving…"
|
|
17
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": {
|
|
3
|
+
"met": "Met",
|
|
4
|
+
"partial": "Partly met",
|
|
5
|
+
"not_met": "Not met"
|
|
6
|
+
},
|
|
7
|
+
"review": {
|
|
8
|
+
"title": "Review",
|
|
9
|
+
"criteria": "Criteria",
|
|
10
|
+
"questionLabel": "A question for you",
|
|
11
|
+
"failed": "The review came back in a format we cannot use.",
|
|
12
|
+
"failedHint": "Your attempt is already saved. Try the review again.",
|
|
13
|
+
"retry": "Try the review again",
|
|
14
|
+
"empty": "Nothing to review yet.",
|
|
15
|
+
"unreadable": "This review could not be shown.",
|
|
16
|
+
"surface": {
|
|
17
|
+
"quiz": "Quiz review",
|
|
18
|
+
"workspace": "Workspace review"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"revise": {
|
|
22
|
+
"label": "Revise this attempt"
|
|
23
|
+
},
|
|
24
|
+
"quiz": {
|
|
25
|
+
"criteriaTitle": "How each answer landed",
|
|
26
|
+
"fallbackQuestion": "What led you to that answer for “{label}”, and what would change your mind?",
|
|
27
|
+
"reviseHint": "Answer the same questions again. This attempt is recorded as a revision of the feedback above."
|
|
28
|
+
},
|
|
29
|
+
"tutor": {
|
|
30
|
+
"reviewAction": "Review my attempt",
|
|
31
|
+
"reviewUserText": "Review my attempt against the lesson criteria.",
|
|
32
|
+
"reviewEmpty": "Write or send an attempt first, then ask for a review.",
|
|
33
|
+
"reviseHint": "Write your revised answer below. Your next message is linked to this review."
|
|
34
|
+
},
|
|
35
|
+
"workspace": {
|
|
36
|
+
"criteriaTitle": "How each check landed",
|
|
37
|
+
"fallbackQuestion": "Which part of “{label}” is still unclear, and what have you tried so far?",
|
|
38
|
+
"reviseHint": "Change your code, then Run or Check again. The next run is linked to this feedback."
|
|
39
|
+
},
|
|
40
|
+
"history": {
|
|
41
|
+
"title": "Attempt history",
|
|
42
|
+
"toggle": "Attempt history ({count})",
|
|
43
|
+
"empty": "No attempts yet.",
|
|
44
|
+
"attempt": "Attempt {n}",
|
|
45
|
+
"summary": "{from} → {to} of {total} met",
|
|
46
|
+
"firstSummary": "{to} of {total} met",
|
|
47
|
+
"new": "new",
|
|
48
|
+
"removed": "removed",
|
|
49
|
+
"transition": "{key}: {from} → {to}",
|
|
50
|
+
"noChange": "No criteria changed since the previous attempt."
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"badge": {
|
|
3
|
+
"browser": "Browser",
|
|
4
|
+
"local": "Local machine"
|
|
5
|
+
},
|
|
6
|
+
"notice": {
|
|
7
|
+
"title": "Code runs on your machine",
|
|
8
|
+
"body": "Your code runs on this device with your own user permissions and can read and write your files.",
|
|
9
|
+
"acknowledge": "I understand — run my code",
|
|
10
|
+
"acknowledged": "You have acknowledged that code runs on your machine.",
|
|
11
|
+
"blocked": "Confirm where your code runs before the first local run.",
|
|
12
|
+
"blockedHint": "Press “I understand — run my code”, then Run again."
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Settings",
|
|
3
|
+
"subtitle": "Keys stay in this browser and are sent only to the provider you choose.",
|
|
4
|
+
"aiSource": "AI source",
|
|
5
|
+
"clearKeys": "Clear keys",
|
|
6
|
+
"learner": "Learner",
|
|
7
|
+
"name": "Your name",
|
|
8
|
+
"namePlaceholder": "Optional — used to greet you",
|
|
9
|
+
"learningLanguage": "Learning language",
|
|
10
|
+
"languageHint": "Every course, lesson, quiz and tutor reply uses this language unless a course overrides it.",
|
|
11
|
+
"storage": "Storage"
|
|
12
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Where your learning data is saved",
|
|
3
|
+
"subtitle": "Studio writes only to the store you choose — it never mirrors data into the other one.",
|
|
4
|
+
"sqlite": "SQLite file (local server)",
|
|
5
|
+
"sqlitePros": "One file on disk, shared with the CLI — easy to back up and keep.",
|
|
6
|
+
"sqliteCons": "Needs the local server running.",
|
|
7
|
+
"browser": "This browser (IndexedDB)",
|
|
8
|
+
"browserPros": "No setup, never leaves this device.",
|
|
9
|
+
"browserCons": "Cleared if you clear site data; may be evicted; not shared with the CLI.",
|
|
10
|
+
"checking": "Checking…",
|
|
11
|
+
"connected": "Connected — {path}",
|
|
12
|
+
"offline": "Offline",
|
|
13
|
+
"offlineReason": "Offline — {error}",
|
|
14
|
+
"browserMemory": "Best-effort — this session only (storage unavailable)",
|
|
15
|
+
"browserPersistent": "Persistent",
|
|
16
|
+
"browserBestEffort": "Best-effort (the browser may clear it)",
|
|
17
|
+
"activeStore": "Active store:",
|
|
18
|
+
"serverDown": "The local server isn’t running — run",
|
|
19
|
+
"serverDownAfter": ", then retry.",
|
|
20
|
+
"movedMessage": "Moved {count} {recordWord} to {target}. The old copy is kept until you remove it.",
|
|
21
|
+
"switchedMessage": "Switched to {target}. The old copy was left untouched.",
|
|
22
|
+
"oldCopyThere": "The old copy in {from} is still there.",
|
|
23
|
+
"removeOld": "Remove the old copy",
|
|
24
|
+
"removeOldConfirm": "Remove the old copy in {label}? This cannot be undone.",
|
|
25
|
+
"removedMessage": "Removed the old copy.",
|
|
26
|
+
"before": "browser",
|
|
27
|
+
"sqliteLabel": "the SQLite file (local server)",
|
|
28
|
+
"moveTitle": "Move your learning data?",
|
|
29
|
+
"moveUnavailable": "The current store can’t be read right now, so nothing will be copied. Switching keeps your existing copy untouched — you can move it later once the local server is running.",
|
|
30
|
+
"moveBody": "Move {courses} {courseWord} and {cards} {cardWord} to {target}? The old copy stays until you remove it.",
|
|
31
|
+
"secretsNote": "API keys and settings are never moved.",
|
|
32
|
+
"moveData": "Move data",
|
|
33
|
+
"switchAnyway": "Switch anyway",
|
|
34
|
+
"openLocalAgent": "Open Settings → My local agent",
|
|
35
|
+
"reasons": {
|
|
36
|
+
"not_paired": {
|
|
37
|
+
"short": "Not paired — start the local server (npx ronin-skillforce studio) and open the pairing link it prints in this browser.",
|
|
38
|
+
"hint": "Or paste the bridge URL and pairing token in Settings → My local agent."
|
|
39
|
+
},
|
|
40
|
+
"unreachable": {
|
|
41
|
+
"short": "Offline — the local server isn’t reachable.",
|
|
42
|
+
"hint": "Start npx ronin-skillforce studio, then retry. If it is already running, check the bridge URL and pairing token in Settings → My local agent."
|
|
43
|
+
},
|
|
44
|
+
"unexpected": {
|
|
45
|
+
"short": "Offline — the local server answered unexpectedly.",
|
|
46
|
+
"hint": "Check the local server’s terminal output and the pairing token in Settings → My local agent, then retry."
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Tutor",
|
|
3
|
+
"capstoneTitle": "Tutor · Capstone mode",
|
|
4
|
+
"desc": "Socratic help for “{title}”. The tutor explains ideas and guides the exercise — it never does the work for you.",
|
|
5
|
+
"capstoneDesc": "Concepts only — no hints, no code, no answers. The implementation is all you.",
|
|
6
|
+
"noSource": "No AI source is configured yet.",
|
|
7
|
+
"openSettings": "Open Settings",
|
|
8
|
+
"noSourceAfter": "to add a key, use a local model, or run the local agent bridge.",
|
|
9
|
+
"loadingHistory": "Loading history…",
|
|
10
|
+
"stop": "Stop",
|
|
11
|
+
"send": "Send",
|
|
12
|
+
"empty": {
|
|
13
|
+
"title": "Ask about this lesson",
|
|
14
|
+
"description": "Stuck on the exercise? Try a hint — the tutor will nudge you one step at a time."
|
|
15
|
+
},
|
|
16
|
+
"capstoneEmpty": {
|
|
17
|
+
"title": "Discuss the concepts",
|
|
18
|
+
"description": "The capstone is your solo build. Use this chat to think through a concept — not for hints, steps or code."
|
|
19
|
+
},
|
|
20
|
+
"capstoneNotice": "Capstone mode: the tutor will only discuss concepts. It will not give hints, steps, code or answers — and it will refuse if you ask.",
|
|
21
|
+
"placeholder": "Ask a question… (Enter to send, Shift+Enter for a new line)",
|
|
22
|
+
"capstonePlaceholder": "Ask about a concept… (no hints or code in capstone mode)",
|
|
23
|
+
"checkPlaceholder": "Paste your attempt here, then press Enter — I’ll point out what’s right first.",
|
|
24
|
+
"checkHint": "Paste your attempt and send it.",
|
|
25
|
+
"guideHint": "You do the work; the tutor guides.",
|
|
26
|
+
"capstoneFooter": "Concepts only — the capstone is your solo build.",
|
|
27
|
+
"ariaInput": "Message the tutor",
|
|
28
|
+
"thinking": "thinking…",
|
|
29
|
+
"quickAria": "Tutor quick actions",
|
|
30
|
+
"hintLabel": "Hint {n} of {total}",
|
|
31
|
+
"mode": {
|
|
32
|
+
"explain_simpler": "Explain simpler",
|
|
33
|
+
"hint": "Give me a hint",
|
|
34
|
+
"check_answer": "Check my answer",
|
|
35
|
+
"quiz": "Quiz me",
|
|
36
|
+
"review": "Review"
|
|
37
|
+
},
|
|
38
|
+
"languageNotice": "The reply came back in another language, so Professor asked the tutor again in {language}."
|
|
39
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Workspace",
|
|
3
|
+
"localServer": "Local server",
|
|
4
|
+
"browser": "Browser",
|
|
5
|
+
"run": "Run",
|
|
6
|
+
"running": "Running…",
|
|
7
|
+
"check": "Checking…",
|
|
8
|
+
"checkButton": "Check",
|
|
9
|
+
"stop": "Stop",
|
|
10
|
+
"history": "History",
|
|
11
|
+
"reset": "Reset",
|
|
12
|
+
"resetConfirm": "Reset the workspace to the exercise skeleton? Your run history is kept, but current edits will be replaced.",
|
|
13
|
+
"loading": "Loading workspace…",
|
|
14
|
+
"loadingEditor": "Loading editor…",
|
|
15
|
+
"newFileName": "New file name (e.g. util.js)",
|
|
16
|
+
"renameTo": "Rename file to",
|
|
17
|
+
"invalidFileName": "Invalid file name.",
|
|
18
|
+
"invalidFileHint": "Use a simple relative name like util.js — no slashes at the start or \"..\".",
|
|
19
|
+
"invalidOrDuplicate": "Invalid or duplicate file name.",
|
|
20
|
+
"invalidOrDuplicateHint": "Pick a unique relative name without \"..\".",
|
|
21
|
+
"deleteFileConfirm": "Delete {path}? The run history is kept.",
|
|
22
|
+
"addFile": "Add file",
|
|
23
|
+
"deleteFile": "Delete {path}",
|
|
24
|
+
"runHistory": "Run history",
|
|
25
|
+
"noRuns": "No runs yet. Every Run and Check is saved here.",
|
|
26
|
+
"restore": "Restore",
|
|
27
|
+
"checks": "Checks",
|
|
28
|
+
"passedOf": "{passed}/{total} passed",
|
|
29
|
+
"exit": "exit {code}",
|
|
30
|
+
"serial": "serial",
|
|
31
|
+
"timedOut": "timed out",
|
|
32
|
+
"outputTruncated": "output truncated",
|
|
33
|
+
"stopped": "stopped",
|
|
34
|
+
"stdout": "stdout",
|
|
35
|
+
"stderr": "stderr",
|
|
36
|
+
"preview": "Preview",
|
|
37
|
+
"noOutput": "No output.",
|
|
38
|
+
"pressRun": "Press",
|
|
39
|
+
"pressRunMid": "to execute your code, or",
|
|
40
|
+
"pressRunMid2": "to run the exercise self-checks.",
|
|
41
|
+
"needsCommand": "Needs the local server with `{command}` on your PATH.",
|
|
42
|
+
"needsServer": "Needs the local server.",
|
|
43
|
+
"needsCommandShort": "needs `{command}`",
|
|
44
|
+
"needsServerShort": "needs the local server",
|
|
45
|
+
"local": "Local",
|
|
46
|
+
"checkWord": "checks",
|
|
47
|
+
"unsupportedNotice": "This exercise uses “{info}”, which the Workspace can't run. Do it in your own terminal and ask the Tutor to review your output.",
|
|
48
|
+
"unsupportedCopy": "Copy skeleton",
|
|
49
|
+
"unsupportedCopied": "Copied"
|
|
50
|
+
}
|