cotutor 0.4.3 → 0.4.5
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 +47 -0
- package/INSTALL.md +159 -0
- package/README.md +64 -17
- package/dist/app/cli/activities.d.ts +1 -1
- package/dist/app/cli/activities.js +2 -2
- package/dist/app/cli/cert.js +2 -1
- package/dist/app/cli/chalk/main.d.ts +0 -1
- package/dist/app/cli/chalk/main.js +8 -12
- package/dist/app/cli/commands.d.ts +50 -0
- package/dist/app/cli/commands.js +353 -0
- package/dist/app/cli/doctor.js +32 -17
- package/dist/app/cli/guide.d.ts +6 -0
- package/dist/app/cli/guide.js +17 -0
- package/dist/app/cli/init.d.ts +2 -0
- package/dist/app/cli/init.js +60 -6
- package/dist/app/cli/main.js +109 -46
- package/dist/app/cli/migrate.js +1 -1
- package/dist/app/cli/port.js +2 -10
- package/dist/app/cli/root-ca.d.ts +8 -0
- package/dist/app/cli/root-ca.js +33 -0
- package/dist/app/cli/sandbox.js +2 -7
- package/dist/app/cli/serve.d.ts +11 -2
- package/dist/app/cli/serve.js +49 -3
- package/dist/app/cli/service.d.ts +4 -1
- package/dist/app/cli/service.js +5 -2
- package/dist/app/cli/shipped.js +1 -1
- package/dist/app/cli/skeleton.d.ts +2 -0
- package/dist/app/cli/skeleton.js +3 -2
- package/dist/app/cli/skills.js +2 -2
- package/dist/app/cli/themes.js +2 -2
- package/dist/app/cli/tray.d.ts +6 -1
- package/dist/app/cli/tray.js +8 -5
- package/dist/app/cli/tutors.d.ts +2 -2
- package/dist/app/cli/tutors.js +4 -4
- package/dist/app/cli/update-cmd.js +4 -4
- package/dist/app/cli/usage.d.ts +26 -2
- package/dist/app/cli/usage.js +167 -38
- package/dist/app/http/access.js +1 -1
- package/dist/app/http/app.js +5 -1
- package/dist/app/http/parent-home.js +5 -0
- package/dist/app/http/stage.js +2 -2
- package/dist/app/mock/mock.js +3 -0
- package/dist/app/skills/analyze-doc.js +4 -8
- package/dist/app/skills/home-doc.js +3 -7
- package/dist/app/skills/tune-doc.js +4 -8
- package/dist/app/workspace.d.ts +16 -3
- package/dist/app/workspace.js +31 -9
- package/dist/runtime/home/home.js +1 -1
- package/dist/runtime/runner.js +2 -2
- package/dist/shared/home.d.ts +2 -0
- package/dist/shared/home.js +9 -0
- package/dist/stage/fonts/Assistant/Assistant-Bold.woff2 +0 -0
- package/dist/stage/fonts/Assistant/Assistant-Medium.woff2 +0 -0
- package/dist/stage/fonts/Assistant/Assistant-Regular.woff2 +0 -0
- package/dist/stage/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
- package/dist/stage/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
- package/dist/stage/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
- package/dist/stage/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
- package/dist/stage/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
- package/dist/stage/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
- package/dist/stage/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
- package/dist/stage/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
- package/dist/stage/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
- package/dist/stage/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
- package/dist/stage/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
- package/dist/stage/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
- package/dist/stage/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
- package/dist/stage/fonts/Liberation/LiberationSans-Regular.woff2 +0 -0
- package/dist/stage/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
- package/dist/stage/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
- package/dist/stage/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
- package/dist/stage/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
- package/dist/stage/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
- package/dist/stage/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
- package/dist/stage/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
- package/dist/stage/fonts/Virgil/Virgil-Regular.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 +0 -0
- package/dist/stage/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 +0 -0
- package/dist/ui/dev/dev-page.js +5 -5
- package/dist/ui/kid/kid-page.js +2 -0
- package/dist/ui/kid/offline-sw.d.ts +1 -0
- package/dist/ui/kid/offline-sw.js +42 -0
- package/dist/ui/parent/parent-home-page.js +9 -6
- package/install.ps1 +67 -0
- package/install.sh +84 -0
- package/package.json +15 -10
- package/skills/cotutor-analyze/SKILL.md +1 -1
- package/skills/cotutor-analyze/references//345/221/275/344/273/244/344/270/216/346/226/207/344/273/266.md +168 -10
- package/skills/cotutor-home/SKILL.md +1 -1
- package/skills/cotutor-home/references//345/221/275/344/273/244.md +75 -7
- package/skills/cotutor-tune/SKILL.md +8 -8
- package/skills/cotutor-tune/references//345/255/227/346/256/265.md +164 -10
- package/skills/cotutor-tutor/SKILL.md +1 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# 更新说明
|
|
2
|
+
|
|
3
|
+
写给家长:每个版本改了什么。升级跑 `cotutor update`(Windows 上 `cotutor.cmd update`),详见 README 的「数据与升级」。
|
|
4
|
+
|
|
5
|
+
## 0.4.5
|
|
6
|
+
|
|
7
|
+
- 让 AI 助手帮你装更省事:不用输网址,对它说「帮我在这台电脑上装 cotutor,先跑 npx cotutor@latest guide,照它说的一步步做」
|
|
8
|
+
- 孩子的笔记文件夹(档案、日记、老师的记忆)新装时放在 cotutor 文件夹旁边,也可以用你已有的 Obsidian 库;以前装的照旧能用
|
|
9
|
+
- Linux 上的后台服务能起来了
|
|
10
|
+
- 命令更好懂:cotutor --help 只列命令,每条的用法和例子在它自己的帮助里;写错的选项会直接说哪里不对,不再悄悄忽略
|
|
11
|
+
- 换新出厂文件改叫 cotutor refresh,把改过的老师换回出厂的用 cotutor reset;升级还是 cotutor update
|
|
12
|
+
|
|
13
|
+
## 0.4.4
|
|
14
|
+
|
|
15
|
+
- 装得快多了:安装从 275 个包变成 15 个,Windows 上第一次装从 3 分钟左右变成 1 分钟左右
|
|
16
|
+
- 平板第一次用:在家长端「扫码打开」点「装证书」,用平板相机扫一下就能装根证书
|
|
17
|
+
- 电脑关了或睡着时,孩子在平板上打开看到「老师们休息中」,不再是浏览器的报错;电脑好了自己回来
|
|
18
|
+
- 有了一行安装命令(Mac、Windows 都有),README 里也写了怎么卸载
|
|
19
|
+
|
|
20
|
+
## 0.4.3
|
|
21
|
+
|
|
22
|
+
- 自动备份:服务开着时每天一份,升级前一份,可以恢复;录音占地方,不在备份里
|
|
23
|
+
- 家长端首页多了「还差几步」,第一次打开就知道接下来做什么;选一下年级老师就知道孩子上几年级
|
|
24
|
+
- 遇到问题时,家长端「设置」能生成诊断信息,不含孩子的对话和 key,先看再发
|
|
25
|
+
- `cotutor init --grade` 自动算好学期,`cotutor doctor --fix` 一次修掉能自动修的
|
|
26
|
+
|
|
27
|
+
## 0.4.2
|
|
28
|
+
|
|
29
|
+
- 百炼欠费、key 失效或连不上时,图标和家长端会说清楚,孩子那边会请爸爸妈妈来看,不再一直转
|
|
30
|
+
- 升级只要一条命令 cotutor update,几个孩子一次升好,孩子在通话时不动
|
|
31
|
+
- 用 Homebrew 装 Node 的电脑:Node 升级后服务和图标不会再起不来
|
|
32
|
+
- 有新版本时能直接看到这次改了什么
|
|
33
|
+
|
|
34
|
+
## 0.4.1
|
|
35
|
+
|
|
36
|
+
- 有新版本时,图标菜单和家长端首页会提醒,孩子端不说,也不会自动升级
|
|
37
|
+
- 第一次装好后台服务时自动打开家长端
|
|
38
|
+
- 升级后图标不再误报“要重启”
|
|
39
|
+
- Windows 上给家长看的命令带 `.cmd`,新电脑的 PowerShell 不会拦
|
|
40
|
+
- `cotutor cert` 发现这台电脑没信任根证书时会提醒
|
|
41
|
+
- 新增 `INSTALL.md`:可以让 AI 助手照着替你安装
|
|
42
|
+
|
|
43
|
+
## 0.4.0
|
|
44
|
+
|
|
45
|
+
- 后台服务 `cotutor service`:登录后自己起来,崩了自己再起,关了终端照样跑
|
|
46
|
+
- 菜单栏(任务栏)图标 `cotutor tray`:不开终端也能看状态、打开家长端、重启
|
|
47
|
+
- 端口只在 `init` 时选一次,以后不变;地址认电脑名,换网络不用重扫
|
package/INSTALL.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# 在家长的电脑上安装 cotutor
|
|
2
|
+
|
|
3
|
+
这篇写给替家长安装的 AI 助手。cotutor 是家里的 AI 老师团:程序装在家长的电脑上,孩子在平板上用。要开发本仓库,看 `AGENTS.md`。
|
|
4
|
+
|
|
5
|
+
这篇随 npm 包发:`npx cotutor@latest guide` 打印的就是它,和 npm 上最新的版本对得上。npx 只是临时取来看,第 2 步照样要装;装好以后 `cotutor guide` 还能再看。
|
|
6
|
+
|
|
7
|
+
- **能跑命令的:** 照下面一步步跑。每步先看「成功」;不符合再看「不成功」。这里没写的 cotutor 命令不要自己编,用法不确定就看那条命令的帮助,如 `cotutor service --help`。写错了的选项、多余的参数,cotutor 会报错(退出码 2)并说是哪里不对,照它改,不要换着写法硬试。
|
|
8
|
+
- **不能跑命令的(网页聊天):** 一次只告诉家长一步,等家长贴回结果再走下一步。
|
|
9
|
+
- **【交给家长】的步骤必须停下:** 告诉家长做什么,等家长说做完了再继续。不要替家长做,也不要绕过去。
|
|
10
|
+
|
|
11
|
+
跟家长说话时用家常话:`slug` 说成「孩子的短名」,workspace 说成「孩子的 cotutor 文件夹」(具体到人:「小明的 cotutor 文件夹」),vault 说成「孩子的笔记文件夹」。
|
|
12
|
+
|
|
13
|
+
## 不能做
|
|
14
|
+
|
|
15
|
+
- 不要让家长把百炼的 API Key 贴进对话,对话内容会传到你的厂商那里。家长贴了,提醒他们到百炼控制台换一把。也不要读 `~/.config/cotutor/bailian.json`。
|
|
16
|
+
- 不要 `git clone` 本仓库,用 npm 装。
|
|
17
|
+
- 不要用 `sudo` 跑 npm。
|
|
18
|
+
- 不要跑 `cotutor reset`:它把家长改过的老师换回出厂的。家长明确说要回出厂的才跑。
|
|
19
|
+
- 不要跑 `cotutor backup restore`,除非家长明确说要恢复。
|
|
20
|
+
- 不要删孩子的 cotutor 文件夹(缺省 `~/cotutor/<slug>/`)和笔记文件夹(vault,缺省在旁边的 `~/cotutor/<slug>-vault/`),里面的记录删了找不回来。
|
|
21
|
+
- 不要关防火墙,不要改系统安全设置或 PowerShell 执行策略。
|
|
22
|
+
|
|
23
|
+
## 1. 看环境
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
node -v
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**成功:** `v22.18` 或更高。系统是 macOS、Windows 或 Linux。
|
|
30
|
+
|
|
31
|
+
**不成功:** 没有 Node 或版本太低:**【交给家长】** 到 https://nodejs.org 装 LTS 版,装完重开终端。Linux 上不要用系统自带的 `apt install nodejs`(Ubuntu 22.04 给的是 12,太旧),照 nodejs.org 上 Linux 的装法来;已经用 nvm、asdf 装了合适版本的不用动。
|
|
32
|
+
|
|
33
|
+
**已经装过:** 如果 `cotutor doctor --json` 能跑,而且 `root` 不是 `null`,这台电脑已经有孩子的 cotutor 文件夹了。问家长是要升级,还是再加一个孩子。升级看 README 的「数据与升级」,这篇不用接着做。再加一个孩子就接着做,并且从第 4 步起,除 `cotutor cert` 外,每条 cotutor 命令都加 `--workspace ~/cotutor/<slug>`。
|
|
34
|
+
|
|
35
|
+
## 2. 装程序
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
npm i -g cotutor
|
|
39
|
+
cotutor --version
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**成功:** 打印出版本号。
|
|
43
|
+
|
|
44
|
+
**不成功:**
|
|
45
|
+
- 下载慢或超时:加上 `--registry=https://registry.npmmirror.com` 再装一次。
|
|
46
|
+
- 报 `EACCES`(没权限):不要加 `sudo`。跑 `npm config set prefix ~/.npm-global`,把 `~/.npm-global/bin` 加进 PATH,再装一次。
|
|
47
|
+
- 找不到 `cotutor`:重开终端再试。Node 是 asdf 装的,跑 `asdf reshim nodejs`。还不行,跑 `npm prefix -g` 看装到了哪,把那个目录下的 `bin`(Windows 上是目录本身)加进 PATH。
|
|
48
|
+
- Windows 的 PowerShell 说禁止运行脚本:这篇里所有的 `npm`、`cotutor` 都改用 `npm.cmd`、`cotutor.cmd`。不要改执行策略。
|
|
49
|
+
- Windows 的 PowerShell 里 cotutor 的中文成了乱码(中文系统按代码页 936 解):先在这个终端里跑 `[Console]::OutputEncoding = [Text.Encoding]::UTF8` 再看。只管这个终端,不改系统设置。
|
|
50
|
+
|
|
51
|
+
## 3. 建孩子的 cotutor 文件夹和笔记文件夹
|
|
52
|
+
|
|
53
|
+
问家长三件事:
|
|
54
|
+
- **短名(slug):** 小写字母、数字、连字符,如 `ming`。不要用真名,它会出现在路径和对话里。
|
|
55
|
+
- **称呼:** 老师怎么叫孩子,小名就行。
|
|
56
|
+
- **年级:** 1 到 6。
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
cotutor grades --json
|
|
60
|
+
cotutor init <slug> --name <称呼> --grade <年级>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**成功:** 第一行是「cotutor init →」加文件夹路径,缺省是 `~/cotutor/<slug>/`。cotutor 的输出把家目录写成 `$HOME`(为了不把用户名传出去),`$HOME/cotutor/<slug>` 就是这个文件夹,不是别的地方。重复跑只补缺,已有的文件不动。
|
|
64
|
+
|
|
65
|
+
**笔记文件夹(vault):** init 还在旁边建了笔记文件夹,缺省是 `~/cotutor/<slug>-vault/`,输出里括号写着「笔记文件夹」的那一行就是它。孩子的档案 `孩子.md`、日记、老师的记忆都在这里,和 cotutor 文件夹分开放。里面全是普通的 markdown 文件:
|
|
66
|
+
- **不用装 Obsidian**,也不要问家长要 Obsidian 库。不要改 `cotutor.json` 的 `paths.vault`,也不要另建 vault。
|
|
67
|
+
- 家长想用 Obsidian 看:装好以后用 Obsidian 打开 `<slug>-vault` 这个文件夹就行。
|
|
68
|
+
- 家长主动说要用自己已有的 Obsidian 库:要在第一次 init 时加 `--vault <库的路径>`。一个孩子一个库,不能放在孩子的 cotutor 文件夹里。Mac 上别用「文稿」「桌面」、iCloud 云盘里的库,后台服务读不到;家长坚持的话,第 4 步会出一行 `!`,照它转告。init 已经跑过了就不要再换(init 会报「不换笔记文件夹」),请家长用 Obsidian 打开 `<slug>-vault`。
|
|
69
|
+
|
|
70
|
+
**不成功:** 家长说的年级不在 `grades` 列出的里面:这个年级还没有教学包,不要换成别的年级。告诉家长,问他们想怎么办。
|
|
71
|
+
|
|
72
|
+
## 4. 装后台服务
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
cotutor service install --no-open
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`--no-open` 是先不打开家长端,第 7 步再开:第 6 步切到 HTTPS 后,之前开的页面会打不开。
|
|
79
|
+
|
|
80
|
+
**成功:** 退出码 0,输出里有「后台服务」和「家长端」两行。Mac 和 Windows 上还会多一个菜单栏(任务栏)图标。以 `!` 开头的行都记下来,第 7 步转告家长。
|
|
81
|
+
|
|
82
|
+
**不成功:**
|
|
83
|
+
- 退出码不是 0:先看输出里说的原因(Linux 上 systemd 报的错也在里面),再跑 `cotutor service logs`,把原因告诉家长。
|
|
84
|
+
- 说端口上有一个 `cotutor serve` 在终端里跑着:请家长关掉那个终端,再装一次。
|
|
85
|
+
|
|
86
|
+
**【交给家长】(只在出现时):**
|
|
87
|
+
- Windows 弹窗问「允许访问」:点允许,平板才连得进来。
|
|
88
|
+
- Linux 输出里有 `sudo loginctl enable-linger`:请家长自己跑那一行,不登录时服务才会继续跑。
|
|
89
|
+
|
|
90
|
+
## 5. 体检
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
cotutor doctor --fix
|
|
94
|
+
cotutor doctor --json
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`--fix` 把能自动修的都修掉(幂等,不碰孩子的数据,不用人输东西)。然后看 `--json` 的输出:`checks` 是一个列表,逐条看 `ok` 为 `false` 的:
|
|
98
|
+
|
|
99
|
+
- **有 `human: true`:** 不要动手。记下 `detail` 和 `fix`,第 7 步交给家长。
|
|
100
|
+
- **还有 `cmd`:** `--fix` 跑过了还在,说明修不好。停下,把 `detail` 告诉家长,不要试别的办法。
|
|
101
|
+
|
|
102
|
+
**成功:** 不过的条目里已经没有 `cmd`。这时退出码可能还是 1,没关系:百炼要家长自己填,填之前 `bailian` 这条过不了。
|
|
103
|
+
|
|
104
|
+
## 6. 让平板能用
|
|
105
|
+
|
|
106
|
+
平板上按住说话要 HTTPS,所以要签一张证书。
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
cotutor service status --json
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`cert.serving` 已经是 `true` 就跳过这一步。
|
|
113
|
+
|
|
114
|
+
先装 mkcert:
|
|
115
|
+
- Mac:`brew install mkcert`。
|
|
116
|
+
- Windows:`winget install FiloSottile.mkcert`,然后重开终端。
|
|
117
|
+
- Linux(Ubuntu、Debian):**【交给家长】** 请家长跑 `sudo apt install mkcert libnss3-tools`。`libnss3-tools` 让这台电脑上的 Chrome、Firefox 也认这张证书。
|
|
118
|
+
- 别的情况(别的 Linux 发行版、没有 brew 或 winget):**【交给家长】** 照 `cotutor doctor --json` 里 `https` 那条的 `fix` 装。
|
|
119
|
+
|
|
120
|
+
**【交给家长】** 请家长在这台电脑的终端里自己跑 `mkcert -install`。Mac 上要输开机密码,Windows 上弹窗点「是」,Linux 上要输 sudo 密码。密码不要说给你听。Linux 上的 `apt install` 也一样由家长自己跑;不要主动问家长要 sudo 权限,也不要自己试 `sudo`。
|
|
121
|
+
|
|
122
|
+
家长做完后:
|
|
123
|
+
|
|
124
|
+
```sh
|
|
125
|
+
cotutor cert
|
|
126
|
+
cotutor service restart
|
|
127
|
+
cotutor service status --json
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**成功:** `cert.present`、`cert.coversName`、`cert.serving` 都是 `true`。
|
|
131
|
+
|
|
132
|
+
**不成功:**
|
|
133
|
+
- 说 PATH 里没有 mkcert:重开终端再试。
|
|
134
|
+
- 说要先跑 `mkcert -install`(包括 `cotutor cert` 输出里以 `!` 开头的那行,这时证书签好了,但这台电脑的浏览器会报警告):回到上面,交给家长。做完不用重签。
|
|
135
|
+
|
|
136
|
+
平板上还要装根证书,第 7 步再交给家长:要在家长端里扫码装,家长端第 7 步才打开。
|
|
137
|
+
|
|
138
|
+
## 7. 告诉家长
|
|
139
|
+
|
|
140
|
+
```sh
|
|
141
|
+
cotutor service status --json
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**成功:** `health.mode` 是 `service`,`health.version` 和 `version` 一样。
|
|
145
|
+
|
|
146
|
+
**不成功:** `health` 是 `null`:看 `portHolder`(端口被谁占着)和 `cotutor service logs`,把原因告诉家长。解决不了就跑 `cotutor report`,把输出给家长,请家长到 https://github.com/TarsLab/cotutor/issues 反馈;里面没有孩子的对话和 key。
|
|
147
|
+
|
|
148
|
+
确认成功后,跑 `cotutor open`,在这台电脑上打开家长端。你是经 SSH 装的,或者这台电脑没有图形界面时,`cotutor open` 只打印地址、开不到屏幕上:请家长在这台电脑的浏览器里打开 `parentPage`。再告诉家长这些,安装就结束了:
|
|
149
|
+
|
|
150
|
+
1. **家长端地址:** `parentPage`。以后 Mac、Windows 上点图标,或者跑 `cotutor open`;登录电脑时不会自己弹出来。
|
|
151
|
+
2. **【交给家长】平板和手机:** 在家长端「首页」的「扫码打开」。每台设备第一次用,先扫「装证书」那张装根证书,再到设置里打开信任开关(步骤见 [iPad 与 iPhone](https://github.com/TarsLab/cotutor/blob/main/docs/iPad与iPhone.md) 的第 3、4 节;安卓的装法在 `cotutor cert` 的输出里)。然后孩子的平板扫「孩子的平板」那张,家长的手机扫「我的手机」那张。不扫码时,平板上要输的地址是 `tabletUrl`。
|
|
152
|
+
3. **后台服务装好了:** 关了终端照样跑,登录这台电脑后自己起来。Mac 看菜单栏的 cotutor 图标,Windows 看任务栏右下角 `^` 里的图标;图标上出橙点是有事要处理,变淡加红点是没在跑。Linux 上没有图标,用 `cotutor service status` 看。
|
|
153
|
+
4. **还要家长做的事:**
|
|
154
|
+
- **【交给家长】填百炼(必做):** `bailian` 是 `false` 时,在这台电脑上打开家长端「首页」,填百炼「按量付费」的 API Key 和业务空间 ID,保存前会先试连。控制台右上角先选北京;`sk-sp-` 开头的 Token Plan 不行。没填时孩子端只显示「老师们还没到」。提醒家长:**直接填在页面上,不要贴到对话里。** 只有在这台电脑上打开的家长端才能填;家长不在这台电脑前(比如你是经 SSH 装的),请家长在自己的电脑上开一条转发 `ssh -L 18443:localhost:<parentPage 里的端口> <用户>@<这台电脑>`(`parentPage` 里没写端口就是 443),再打开 `https://localhost:18443/parent/home` 填,这样也算在这台电脑上。或者请家长先在这台电脑的终端里跑 `cotutor pin` 设家长密码,再从别的设备打开家长端填。
|
|
155
|
+
- **【交给家长】第 4 步记下的 `!` 行和第 5 步记下的 `human` 条目:** 逐条转告。常见的有:设家长端密码(`server.access`:不设的话,同一个网络里的设备都打得开家长端,孩子的平板也打得开;家长在旁边可以不设。要设,请家长自己在这台电脑的终端里跑 `cotutor pin`,密码不要说给你听)、电脑别睡(`mac.sleep`、`windows.sleep`,睡着时平板连不上)。`bailian`、`tts` 填好百炼就好了,不用另外说;档案算不出学期(`vault.profile`)只在 init 没给年级时才会有。
|
|
156
|
+
- **【交给家长】Linux 上的睡眠:** doctor 不查这一项,直接提醒家长:笔记本合盖默认会睡,要开着盖;GNOME「设置 › 电源」里的「自动挂起」,接着电源时要关。
|
|
157
|
+
5. **孩子的记录在哪:** 档案、日记、老师的记忆在笔记文件夹里(第 3 步的 vault,缺省 `~/cotutor/<slug>-vault/`),用任何文本编辑器都能看能改,装了 Obsidian 就把这个文件夹当库打开。老师写进了什么,家长端「记录」右栏也列着,不要的可以一行一行撤回。档案 `孩子.md` 的正文可以写孩子的情况(性格、喜欢什么、要避开什么),每位老师每个话题开头都会读到。
|
|
158
|
+
|
|
159
|
+
不用等家长填完。家长填好百炼后,`cotutor doctor --json` 的 `ok` 会变成 `true`。
|
package/README.md
CHANGED
|
@@ -2,21 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
家里的 AI 老师团,和家长一起教。几位可以直接对话的老师(数学、语文、英语),孩子在 iPad 上按住说话就能问,家长在自己的页面上看全部过程、管每位老师的性子和规矩。数据全在自家电脑上。
|
|
4
4
|
|
|
5
|
-
> 家长端与孩子端都能用:老师的回复是一页板书(卡 + 逐句讲稿)
|
|
5
|
+
> 家长端与孩子端都能用:老师的回复是一页板书(卡 + 逐句讲稿),家长在幕后把要画出来讲的题做成小课堂;学完家长打星记账进日记(普通 markdown,想用 Obsidian 看也行),作业照片在学科老师页上拍。
|
|
6
6
|
|
|
7
7
|
## 五分钟用起来
|
|
8
8
|
|
|
9
|
-
**让 AI 助手帮你装:**
|
|
9
|
+
**让 AI 助手帮你装:** 把这句话发给能在电脑上跑命令的 AI 助手(WorkBuddy、Claude Code、Codex 这类),它会一步步带你做。不用输网址:安装说明跟着 npm 包走,和装上的版本对得上。百炼的 Key 由你自己填在页面上,不用告诉它。
|
|
10
10
|
|
|
11
11
|
```text
|
|
12
|
-
|
|
12
|
+
帮我在这台电脑上装 cotutor:先跑 npx cotutor@latest guide,照它说的一步步做。没有 Node 就先告诉我
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
网页版的聊天机器人跑不了命令,换这句,它会一次告诉你一步:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
请阅读 https://cdn.jsdelivr.net/npm/cotutor@latest/INSTALL.md ,一步一步带我在这台电脑上安装 cotutor
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**自己装:** 需要一台电脑(Mac 最省事)、[Node.js](https://nodejs.org) ≥ 22.18(装 LTS 版),和一个百炼账号(北京地域,按量付费)。老师的嘴和脑都走百炼,由应用直接调用,不用另装模型客户端:嘴是 `qwen3.8-omni-flash-realtime`,听孩子说、照着讲稿念;脑是 `qwen3.8-max`,写讲稿和板书。
|
|
22
|
+
|
|
23
|
+
一行装好(会查 Node 的版本、连不上 npm 就用国内镜像;不用 sudo、不改系统设置)。最后那三个是孩子的短名(小写字母,不用真名)、称呼、年级,不写就只装程序:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
# Mac(终端里)
|
|
27
|
+
curl -fsSL https://cdn.jsdelivr.net/npm/cotutor@latest/install.sh | sh -s -- ming 小明 2
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```powershell
|
|
31
|
+
# Windows(PowerShell 里;这行长一点:jsDelivr 不说文件是什么编码,要自己按 UTF-8 解开,不然中文是乱码)
|
|
32
|
+
& ([scriptblock]::Create([Text.Encoding]::UTF8.GetString((iwr -useb https://cdn.jsdelivr.net/npm/cotutor@latest/install.ps1).Content))) ming 小明 2
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
连不上 jsDelivr 就从 GitHub 取:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
curl -fsSL https://raw.githubusercontent.com/TarsLab/cotutor/main/install.sh | sh -s -- ming 小明 2
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```powershell
|
|
42
|
+
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/TarsLab/cotutor/main/install.ps1))) ming 小明 2
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
也可以一条条自己来:
|
|
16
46
|
|
|
17
47
|
```sh
|
|
18
48
|
npm i -g cotutor
|
|
19
|
-
cotutor init ming --name 小明 --grade 2 # 建 ~/cotutor/ming
|
|
49
|
+
cotutor init ming --name 小明 --grade 2 # 建 cotutor 文件夹 ~/cotutor/ming/(三位老师、技能、账本、对话目录、cotutor.json)和旁边的笔记文件夹 ~/cotutor/ming-vault/(档案、日记、记忆)
|
|
20
50
|
cotutor service install # 装成这台电脑的后台服务,第一次装会打开家长端,孩子的平板在那里扫码
|
|
21
51
|
```
|
|
22
52
|
|
|
@@ -33,14 +63,14 @@ Mac 和 Windows 上,`service install` 会一起装一个菜单栏(任务栏)图
|
|
|
33
63
|
接着三件事:
|
|
34
64
|
|
|
35
65
|
1. **填百炼**:在这台电脑上打开家长端 `/parent` 的「首页」,填百炼「按量付费」的 API Key 和业务空间 ID,保存前会先试连。API Key 在百炼控制台的「密钥管理」里创建,业务空间 ID 在控制台的业务空间详情里看,以百炼文档为准:[获取与配置 API Key](https://help.aliyun.com/zh/model-studio/get-api-key)、[首次调用千问 API](https://help.aliyun.com/zh/model-studio/first-api-call-to-qwen)(里面讲了业务空间 ID)。Key 跟地域绑定,控制台右上角先选北京。Token Plan 的 `sk-sp-` 不行。没填时孩子端只出「老师们还没到」。
|
|
36
|
-
2.
|
|
66
|
+
2. **填档案**:笔记文件夹(vault,`~/cotutor/<孩子>-vault/`)里的 `孩子.md` 写 `school_start`(读一年级的年月,如 `2025-09`;`init --grade` 已经算好了),老师据此知道现在是几年级哪个学期;正文写孩子的情况。笔记文件夹里全是普通 markdown,不用装 Obsidian,想用 Obsidian 看就把它当库打开。想用自己已有的 Obsidian 库,第一次 init 时加 `--vault <路径>`(一个孩子一个库;Mac 上别用「文稿」「桌面」和 iCloud 云盘里的,后台服务读不到)。
|
|
37
67
|
3. **体检**:`cotutor doctor` 逐项检查,不过的每条都带修法。
|
|
38
68
|
|
|
39
|
-
|
|
69
|
+
装好以后也可以让编程助手帮你管:在孩子的 cotutor 文件夹(`~/cotutor/<孩子>/`)里打开 Claude Code 或 Codex,已带的技能直接能用。`cotutor-home` 排孩子的首页,`cotutor-tune` 调老师的口气和规矩,`cotutor-analyze` 分析某次对话为什么那样答。
|
|
40
70
|
|
|
41
71
|
`init` 把出厂老师拷进 `agents/<老师>.md`,把做课包用的四个技能 chalk-* 和五个机器件 cotutor-tutor / cotutor-board / cotutor-analyze / cotutor-tune / cotutor-home 拷进 `.agents/skills/`(Codex、Qwen Code 直接读;Claude Code 读的 `.claude/skills` 是链到它的);
|
|
42
72
|
做小课堂的课包用 `cotutor chalk`(check / build / bake / snap / dub),烤画面与截图用本机的 Chrome(Windows 上没有 Chrome 就用 Edge)。要在平板上用(按住说话要 HTTPS):`cotutor cert` 签一张
|
|
43
|
-
自签证书(要 mkcert:Mac 上 `brew install mkcert && mkcert -install`;Windows 上 `winget install FiloSottile.mkcert`,重开终端再 `mkcert -install`),把根证书装到平板并打开信任,`cotutor service restart`(在终端里跑的就重开 `cotutor serve`),扫码打开。iPad 的步骤见 [iPad 与 iPhone](docs/iPad与iPhone.md)。
|
|
73
|
+
自签证书(要 mkcert:Mac 上 `brew install mkcert && mkcert -install`;Windows 上 `winget install FiloSottile.mkcert`,重开终端再 `mkcert -install`;Ubuntu、Debian 上 `sudo apt install mkcert libnss3-tools && mkcert -install`),把根证书装到平板并打开信任,`cotutor service restart`(在终端里跑的就重开 `cotutor serve`),扫码打开。iPad 的步骤见 [iPad 与 iPhone](docs/iPad与iPhone.md)。
|
|
44
74
|
|
|
45
75
|
然后在浏览器里:
|
|
46
76
|
|
|
@@ -57,11 +87,11 @@ Mac 和 Windows 上,`service install` 会一起装一个菜单栏(任务栏)图
|
|
|
57
87
|
|
|
58
88
|
出厂文件在 `grades/grade-2/`。三科分别提供预习、检查作业、复习(孩子端老师牌上常驻三块方砖);语文有写话与看图写话,英语有口语课,数学小课堂配合提前做好的课包。家长按教材版本、学期和孩子实际进度设置材料。
|
|
59
89
|
|
|
60
|
-
孩子当前学期仍由档案决定;升年级不会自动替换家长的老师文件。旧 workspace 执行 `cotutor
|
|
90
|
+
孩子当前学期仍由档案决定;升年级不会自动替换家长的老师文件。旧 workspace 执行 `cotutor refresh` 补记二年级来源,保留自定义内容。贡献其他年级与验证方式见 [年级教学包设计](docs/年级教学包.md)。
|
|
61
91
|
|
|
62
92
|
## 老师是文件
|
|
63
93
|
|
|
64
|
-
每位老师 = 一个 Markdown 文件(frontmatter + 正文即系统提示)+ cotutor.json 里的一条(显示名、头像、音色、开关、政策)+ 自己的目录与对话。出厂三位(数学、语文、英语)随包发布,init **拷贝**进你的老师们,改了就是你家的;`cotutor
|
|
94
|
+
每位老师 = 一个 Markdown 文件(frontmatter + 正文即系统提示)+ cotutor.json 里的一条(显示名、头像、音色、开关、政策)+ 自己的目录与对话。出厂三位(数学、语文、英语)随包发布,init **拷贝**进你的老师们,改了就是你家的;`cotutor refresh` 只换没改过的,改过的打印差异让你定;想回出厂的那份,`cotutor reset <老师>`(你那份存成 .bak)。再加一位:
|
|
65
95
|
|
|
66
96
|
```sh
|
|
67
97
|
cotutor add science-tutor --display 科学老师 --subject 科学 --avatar 🔬
|
|
@@ -110,9 +140,9 @@ import { loadWorkspace } from 'cotutor/workspace'; // 解
|
|
|
110
140
|
|
|
111
141
|
## 数据与升级
|
|
112
142
|
|
|
113
|
-
默认 workspace 是 `~/cotutor/<孩子>/`:配置在 `cotutor.json`,老师在 `agents/<老师>.md`,activity 在 `agents/<老师>/activities/`,技能在 `.agents/skills/`,对话在 `conversations/`,账本在 `ledger/`,照片在 `captures/`,课包在 `bundles/`,首页在 `home
|
|
143
|
+
默认 workspace(孩子的 cotutor 文件夹)是 `~/cotutor/<孩子>/`:配置在 `cotutor.json`,老师在 `agents/<老师>.md`,activity 在 `agents/<老师>/activities/`,技能在 `.agents/skills/`,对话在 `conversations/`,账本在 `ledger/`,照片在 `captures/`,课包在 `bundles/`,首页在 `home/`。长期档案、记忆和日记在 vault(笔记文件夹),和 workspace 分开放:缺省是旁边的 `~/cotutor/<孩子>-vault/`,位置写在 `cotutor.json` 的 `paths.vault`(0.4.4 及以前建的没写,vault 就是 workspace 本身,照旧能用,`cotutor doctor` 的 `vault.separate` 说怎么分开),规则见 [obsidian 仓库设计](docs/obsidian仓库设计.md)。workspace 与 vault 都要留着。
|
|
114
144
|
|
|
115
|
-
|
|
145
|
+
**备份**放在 cotutor 文件夹旁边的 `.backups/<孩子>/`,一份就是一个普通目录。服务开着时每天自动备一份(留 14 份),`cotutor refresh` 前也备一份(留 5 份),没变的文件不占第二份地方;`cotutor backup` 随时手动备。**录音(wav)不在备份里**,它占了绝大部分地方;想留就自己拷 `conversations/`。笔记文件夹里的 md 也备一份(在那一份的 `_vault/` 里);恢复时不动笔记文件夹,只告诉你那份在哪,要不要拿回来你定。硬盘坏了这些也跟着没了,重要的话把 `.backups` 再拷到别处。
|
|
116
146
|
|
|
117
147
|
```sh
|
|
118
148
|
cotutor backup list # 看有哪些
|
|
@@ -133,24 +163,24 @@ cotutor update
|
|
|
133
163
|
|
|
134
164
|
```sh
|
|
135
165
|
npm i -g cotutor # 换上新版程序
|
|
136
|
-
cotutor
|
|
166
|
+
cotutor refresh # 更新未修改的出厂老师、activity、主题与技能
|
|
137
167
|
cotutor service restart # 服务和图标换上新代码(在终端里跑的就重开 serve)
|
|
138
168
|
```
|
|
139
169
|
|
|
140
170
|
升完它提示要迁移配置时再跑:
|
|
141
171
|
|
|
142
172
|
```sh
|
|
143
|
-
cotutor
|
|
144
|
-
cotutor
|
|
173
|
+
cotutor refresh --config --dry-run # 预览 cotutor.json 的迁移
|
|
174
|
+
cotutor refresh --config # 执行配置迁移
|
|
145
175
|
```
|
|
146
176
|
|
|
147
177
|
家长改过的老师与主题保留并显示差异;机器技能会随版本覆盖。配置迁移补缺,并更新未自定义的旧命令模板,保留自定义配置。换了 Node 版本、或包装到了别处,再 `cotutor service install` 一次。
|
|
148
178
|
|
|
149
|
-
2026-10-30 之前建的 workspace,老师在 `.claude/agents/`、技能在 `.claude/skills/`。`cotutor
|
|
179
|
+
2026-10-30 之前建的 workspace,老师在 `.claude/agents/`、技能在 `.claude/skills/`。`cotutor refresh`(或 `init`)先把它们原样挪到新位置,再照常升级;新位置已有同名的不挪,会点名。`.claude/` 里别的文件不动。
|
|
150
180
|
|
|
151
181
|
### 旧 workspace 换运行时
|
|
152
182
|
|
|
153
|
-
2026-11-02 起不再起命令行(Qwen Code;Claude CLI 更早就去掉了),老师只走应用直连百炼。2026-10-31 之前建的 workspace 缺省走 Qwen Code,doctor 会报「命令行运行时不再支持」:先 `cotutor
|
|
183
|
+
2026-11-02 起不再起命令行(Qwen Code;Claude CLI 更早就去掉了),老师只走应用直连百炼。2026-10-31 之前建的 workspace 缺省走 Qwen Code,doctor 会报「命令行运行时不再支持」:先 `cotutor refresh --config` 补上出厂的 `api` / `api-flash`,把 `runtimes.default` 和 `tutors.*.runtime` 改成 `api`,在家长端「首页」填好百炼,再删掉 `qwen`、`qwen-flash`(或更早的 Claude)条目。换之前聊的话题照上面「配置模型」说的办:记录照样能看,不导入、不记账。旧 `proxy` 字段可删除,对应命令已移除。
|
|
154
184
|
|
|
155
185
|
### 试用不进孩子的记录
|
|
156
186
|
|
|
@@ -162,6 +192,23 @@ cotutor send math-tutor 你好 --sandbox
|
|
|
162
192
|
cotutor serve --sandbox --fresh # 丢掉试过的,从真 workspace 重新分(真的那边改了老师文件、vault 也用这个带过来)
|
|
163
193
|
```
|
|
164
194
|
|
|
195
|
+
## 卸载
|
|
196
|
+
|
|
197
|
+
孩子的 cotutor 文件夹(`~/cotutor/<孩子>/`)、笔记文件夹(`~/cotutor/<孩子>-vault/`)和备份(`~/cotutor/.backups/`)是家里的记录,删了找不回来,卸载程序不会碰它们;真不要了自己删。Windows 上命令写成 `cotutor.cmd`、`npm.cmd`。
|
|
198
|
+
|
|
199
|
+
```sh
|
|
200
|
+
cotutor service uninstall --workspace ~/cotutor/<孩子> # 每个孩子一次;最后一个卸掉时,菜单栏(任务栏)图标也一起卸
|
|
201
|
+
npm rm -g cotutor
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
还留在电脑上的,不要了可以删:
|
|
205
|
+
|
|
206
|
+
- `~/.config/cotutor/`:百炼的 key、证书、家长端密码、几项设置
|
|
207
|
+
- 日志:Mac 在 `~/Library/Logs/cotutor/`,Windows 在 `%LOCALAPPDATA%\cotutor\`(里面还有图标的文件),Linux 在 `~/.local/state/cotutor/`;Mac 的图标文件在 `~/Library/Application Support/cotutor/`
|
|
208
|
+
- 签证书时装的根证书:跑 `mkcert -uninstall` 从这台电脑的信任里拿掉,再删 `mkcert -CAROOT` 说的那个目录
|
|
209
|
+
- 平板上:设置 › 通用 › VPN 与设备管理里删掉那个描述文件,主屏幕上的图标长按删掉
|
|
210
|
+
- Windows 防火墙里给 Node.js 开的「允许」:Windows 安全中心 › 防火墙和网络保护 › 允许应用通过防火墙,别的程序也用 Node.js 时留着
|
|
211
|
+
|
|
165
212
|
## 开发
|
|
166
213
|
|
|
167
214
|
```sh
|
|
@@ -37,7 +37,7 @@ export declare function upgradeActivities(root: string, opts?: {
|
|
|
37
37
|
force?: string[];
|
|
38
38
|
}): Promise<ActivityUpgradeStep[]>;
|
|
39
39
|
/**
|
|
40
|
-
* 只把一个出厂 activity 换回出厂那份(工作台「恢复出厂」,与
|
|
40
|
+
* 只把一个出厂 activity 换回出厂那份(工作台「恢复出厂」,与 cotutor reset 老师/名 同一条路,但不碰别的):
|
|
41
41
|
* 现在那份和出厂不一样就先存 .bak。不是出厂的 → UsageError。返回 .bak 的路径(没存就是 null)
|
|
42
42
|
*/
|
|
43
43
|
export declare function restoreActivity(root: string, tutor: string, name: string): Promise<{
|
|
@@ -102,7 +102,7 @@ export async function installActivities(root) {
|
|
|
102
102
|
steps.push({ item, action: s.state === 'missing' ? 'created' : 'replaced', note: s.state === 'broken' ? '读不到,重新拷贝' : `拷自本包 ${PACKAGE_VERSION}` });
|
|
103
103
|
}
|
|
104
104
|
else
|
|
105
|
-
steps.push({ item, action: s.state === 'untracked' ? 'kept' : 'exists', note: s.state === 'custom' ? `自定义(基于 ${s.basedOn})` : s.state === 'upgradable' ? '可升级(cotutor
|
|
105
|
+
steps.push({ item, action: s.state === 'untracked' ? 'kept' : 'exists', note: s.state === 'custom' ? `自定义(基于 ${s.basedOn})` : s.state === 'upgradable' ? '可升级(cotutor refresh)' : s.state === 'untracked' ? '已有(没有出厂记录);升级时当自定义对待' : undefined });
|
|
106
106
|
}
|
|
107
107
|
if (touched)
|
|
108
108
|
await writeManifest(root, { ...manifest, version: PACKAGE_VERSION });
|
|
@@ -137,7 +137,7 @@ export async function upgradeActivities(root, opts = {}) {
|
|
|
137
137
|
return steps;
|
|
138
138
|
}
|
|
139
139
|
/**
|
|
140
|
-
* 只把一个出厂 activity 换回出厂那份(工作台「恢复出厂」,与
|
|
140
|
+
* 只把一个出厂 activity 换回出厂那份(工作台「恢复出厂」,与 cotutor reset 老师/名 同一条路,但不碰别的):
|
|
141
141
|
* 现在那份和出厂不一样就先存 .bak。不是出厂的 → UsageError。返回 .bak 的路径(没存就是 null)
|
|
142
142
|
*/
|
|
143
143
|
export async function restoreActivity(root, tutor, name) {
|
package/dist/app/cli/cert.js
CHANGED
|
@@ -23,7 +23,8 @@ export function mkcertHint(platform = process.platform) {
|
|
|
23
23
|
return 'brew install mkcert && mkcert -install';
|
|
24
24
|
if (platform === 'win32')
|
|
25
25
|
return 'winget install FiloSottile.mkcert(没有 winget 就到 https://github.com/FiloSottile/mkcert/releases 下 windows-amd64 那个,改名 mkcert.exe 放进 PATH),重开终端跑 mkcert -install(弹窗问装不装根证书,点「是」)';
|
|
26
|
-
|
|
26
|
+
// libnss3-tools 给 mkcert 一个 certutil,这台电脑上的 Chrome、Firefox 才认证书(2026-11-09 Ubuntu 22.04 上装过)
|
|
27
|
+
return '用系统的包管理器装 mkcert(Ubuntu、Debian 上 sudo apt install mkcert libnss3-tools),再 mkcert -install(要 sudo 密码)';
|
|
27
28
|
}
|
|
28
29
|
/** mkcert 在、根证书建过了:cotutor cert 不用人就能跑。mkcert -install 要开机密码或点弹窗,那一步是人的 */
|
|
29
30
|
export async function mkcertReady(caRootOf = async () => (await execFileP('mkcert', ['-CAROOT'], { timeout: 8000 })).stdout.trim()) {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
type Flags = Record<string, string | true>;
|
|
2
|
-
export declare const CHALK_USAGE = "\u7528\u6CD5:\n cotutor chalk check <scene.ts|\u76EE\u5F55> [--no-types] [--json]\n cotutor chalk build <scene.ts|\u76EE\u5F55> [--out <dir>] [--json]\n cotutor chalk bake <scene.ts|\u8BFE\u5305 id> [--bundles <dir>] [--json]\n cotutor chalk snap <scene.ts|\u8BFE\u5305 id> [--step <n>] [--no-cursor] [--out <dir>] [--bundles <dir>] [--json]\n cotutor chalk dub <scene.ts|\u8BFE\u5305 id> [--voice <\u97F3\u8272>] [--tutor <\u8001\u5E08>] [--instruction <\u8BED\u6C14>] [--dry-run] [--bundles <dir>] [--json]\n\u8BFE\u5305\u7F3A\u7701\u5728 workspace \u7684 bundles/(--bundles \u6362);\u573A\u666F\u6E90\u4E0E --out / --bundles \u7684\u76F8\u5BF9\u8DEF\u5F84\u6309\u5F53\u524D\u76EE\u5F55\u3002\n";
|
|
3
2
|
export declare function chalkCommand(args: string[], flags: Flags, opts: {
|
|
4
3
|
workspace?: string;
|
|
5
4
|
json: boolean;
|
|
@@ -14,14 +14,10 @@ import { UsageError, loadWorkspace, redactDeep, redactHome } from "../../workspa
|
|
|
14
14
|
import { buildBundle, readBundle } from "./build.js";
|
|
15
15
|
import { LoadError, NotFoundError, loadScene, loadSceneFiles, resolveSceneInput } from "./load-scene.js";
|
|
16
16
|
import { typecheckScene } from "./typecheck.js";
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
cotutor chalk snap <scene.ts|课包 id> [--step <n>] [--no-cursor] [--out <dir>] [--bundles <dir>] [--json]
|
|
22
|
-
cotutor chalk dub <scene.ts|课包 id> [--voice <音色>] [--tutor <老师>] [--instruction <语气>] [--dry-run] [--bundles <dir>] [--json]
|
|
23
|
-
课包缺省在 workspace 的 bundles/(--bundles 换);场景源与 --out / --bundles 的相对路径按当前目录。
|
|
24
|
-
`;
|
|
17
|
+
import { commandHelp } from "../usage.js";
|
|
18
|
+
/** cotutor chalk 的用法从命令表来(app/cli/commands.ts),帮助和参数检查同源 */
|
|
19
|
+
const CHALK_HELP = () => commandHelp('chalk');
|
|
20
|
+
const SEE_HELP = '用法:cotutor chalk --help';
|
|
25
21
|
const str = (v) => (typeof v === 'string' ? v : undefined);
|
|
26
22
|
function report(json, r) {
|
|
27
23
|
const errors = r.findings.filter((f) => f.level === 'error').length;
|
|
@@ -64,13 +60,13 @@ export async function chalkCommand(args, flags, opts) {
|
|
|
64
60
|
const [sub, file, ...extra] = args;
|
|
65
61
|
const json = opts.json;
|
|
66
62
|
if (!sub || flags.help === true) {
|
|
67
|
-
process.stdout.write(
|
|
63
|
+
process.stdout.write(CHALK_HELP());
|
|
68
64
|
return;
|
|
69
65
|
}
|
|
70
66
|
if (!file)
|
|
71
|
-
throw new UsageError(`cotutor chalk ${sub} 要一个场景文件(或课包 id)
|
|
67
|
+
throw new UsageError(`cotutor chalk ${sub} 要一个场景文件(或课包 id)。${SEE_HELP}`);
|
|
72
68
|
if (extra.length)
|
|
73
|
-
throw new UsageError(`多余的参数 '${extra[0]}'
|
|
69
|
+
throw new UsageError(`多余的参数 '${extra[0]}'。${SEE_HELP}`);
|
|
74
70
|
const bundlesOf = () => (str(flags.bundles) ? resolve(str(flags.bundles)) : loadWorkspace(opts.workspace).dirs.bundles);
|
|
75
71
|
try {
|
|
76
72
|
switch (sub) {
|
|
@@ -182,7 +178,7 @@ export async function chalkCommand(args, flags, opts) {
|
|
|
182
178
|
return;
|
|
183
179
|
}
|
|
184
180
|
default:
|
|
185
|
-
throw new UsageError(`cotutor chalk 没有 '${sub}'
|
|
181
|
+
throw new UsageError(`cotutor chalk 没有 '${sub}'。${SEE_HELP}`);
|
|
186
182
|
}
|
|
187
183
|
}
|
|
188
184
|
catch (err) {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 命令表:cotutor 每条命令的说明、参数和例子,只在这里写一次。
|
|
3
|
+
* 由它生成:顶层帮助与 cotutor <命令> --help(usage.ts)、技能里的命令参考(app/skills/*-doc.ts);
|
|
4
|
+
* main.ts 照它拦不认识的旗标、用错子命令的旗标和多余的参数(agent 打错一个字,不能悄悄当没看见)。
|
|
5
|
+
* 纯数据,不引别的模块:技能生成和测试都要读它。
|
|
6
|
+
*/
|
|
7
|
+
export type Group = 'setup' | 'daily' | 'custom' | 'debug';
|
|
8
|
+
export declare const GROUP_TITLE: Record<Group, string>;
|
|
9
|
+
export interface FlagSpec {
|
|
10
|
+
name: string;
|
|
11
|
+
/** 带值的旗标写值的占位,如 '<n>';不写就是开关 */
|
|
12
|
+
value?: string;
|
|
13
|
+
desc: string;
|
|
14
|
+
/** 只给这几个子命令用;空串是不带子命令的那种(如 cotutor backup) */
|
|
15
|
+
subs?: readonly string[];
|
|
16
|
+
/** 认,但不写进帮助(旧名、内部用的) */
|
|
17
|
+
hidden?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface CommandSpec {
|
|
20
|
+
name: string;
|
|
21
|
+
group: Group;
|
|
22
|
+
/** 顶层帮助里的一句 */
|
|
23
|
+
summary: string;
|
|
24
|
+
/** 用法,一种写法一行 */
|
|
25
|
+
usage: readonly string[];
|
|
26
|
+
/** 认、但不进帮助(旧名) */
|
|
27
|
+
hidden?: boolean;
|
|
28
|
+
/** 第一个参数是子命令时列出来;subRequired 时必须给 */
|
|
29
|
+
subs?: readonly string[];
|
|
30
|
+
subRequired?: boolean;
|
|
31
|
+
/** 认、但不写进帮助的子命令(后台服务的看护进程用) */
|
|
32
|
+
hiddenSubs?: readonly string[];
|
|
33
|
+
/** 参数(含子命令)最多几个;Infinity 是不限 */
|
|
34
|
+
maxArgs: number;
|
|
35
|
+
flags?: readonly FlagSpec[];
|
|
36
|
+
/** 认 --workspace */
|
|
37
|
+
workspace?: boolean;
|
|
38
|
+
/** 认 --sandbox(在试用副本里跑) */
|
|
39
|
+
sandbox?: boolean;
|
|
40
|
+
/** 认 --json;给数组就是只有这几个子命令认 */
|
|
41
|
+
json?: boolean | readonly string[];
|
|
42
|
+
notes?: readonly string[];
|
|
43
|
+
/** 会花钱、会写孩子的数据、要人来:agent 跑之前要知道 */
|
|
44
|
+
effects?: readonly string[];
|
|
45
|
+
examples: readonly string[];
|
|
46
|
+
}
|
|
47
|
+
export declare const COMMANDS: readonly CommandSpec[];
|
|
48
|
+
export declare const commandSpec: (name: string | undefined) => CommandSpec | undefined;
|
|
49
|
+
/** 所有命令里带值的旗标(parseArgs 要先知道哪些吃下一个词) */
|
|
50
|
+
export declare const VALUED_FLAGS: readonly string[];
|