# البنية التقنية — مشروع «تلميذي» > الرفيق التقنيّ لكرّاسة المشروع (`tilmithi-project.md` في `D:\koora-web`). > **تحديث جوهريّ (2026-06-10): أُزيل الذكاء الاصطناعي من المشروع.** الآليّ يعمل الآن بمحتوًى مُعَدّ مسبقًا محليًّا، لا بنموذج لغويّ. --- ## 🧭 القرار الجوهري **التطبيق محليّ بالكامل، بلا ذكاء اصطناعي وبلا اتصال بالإنترنت.** «دماغ» الآليّ لم يَعُد نموذجًا يولّد ويتحدّث؛ صار **مكتبة محتوًى مُعَدّة مسبقًا + آلة حالات داخل التطبيق** تُرتّب هذا المحتوى. لا خادم، لا مفتاح، لا سحابة، لا تكلفة، ولا شيء يغادر الجهاز. > ما كان يفعله الذكاء الاصطناعي (توليد الذكريات/المهام، الاستماع لتقرير الطفل، تقرير أنّ الآليّ «تذكّر») يصير الآن محتوًى نؤلّفه سلفًا، والتطبيق يعرضه ويتتبّع التقدّم. تبقى «الحلقة السحرية» كما هي؛ والمقايضة: محتوًى محدود مؤلَّف بدل توليد لا نهائيّ — وهو مناسب وأكثر أمانًا وثباتًا لتجربة طفل. --- ## 🧱 الطبقات ### 1) الواجهة — تطبيق ويب تقدّمي (PWA) Vite + TypeScript. تُثبَّت وتعمل **دون اتصال بالكامل**. الإطار (React / Svelte / فانيلا كـ `koora-web`) تفصيل ثانويّ. ### 2) التخزين — محليّ (IndexedDB) تقدّم الطفل، حالة شفاء الآليّ، الذكريات المُنجَزة، أي تسجيلات — كلّها على الجهاز. ومكتبة المحتوى مُضمَّنة محليًّا (JSON + وسائط). ### 3) ~~الوسيط~~ — أُلغي لا مفتاح نخفيه ولا خادم نكلّمه. التطبيق مكتفٍ بذاته؛ يكفي تشغيل ملفات ثابتة محليًّا. ### 4) محرّك المحتوى المحليّ — بديل «الدماغ» - **مكتبة محتوى** مؤلَّفة سلفًا: الذكريات/المهام + جُمل الآليّ + ردوده، كبيانات محليّة. - **آلة حالات** في التطبيق تُرتّبها: الشرارة → المهمة → التلقين → الشفاء. - حتميّ، غير متّصل، آمن تمامًا. - **نموذج المحتوى المعتمد: مكتبة مُعَدّة مسبقًا** (قرار 2026-06-10) — نؤلّف الذكريات/المهام/جُمل الآليّ/ردوده سلفًا كبيانات محليّة، والتطبيق يرتّبها. ### 5) الأمان — أبسط وأقوى الآن بلا نموذج لغويّ: لا دردشة مُولَّدة، لا حقن أوامر، لا رفض غير متوقَّع. مدخلات الطفل تُحرّك التقدّم/الاختيار فقط. يبقى: مغلق، رفيق أهل، موجَّه بالمسار. ### 6) المحتوى — كـ JSON محليّ (مؤلَّف يدويًّا) نفس مخطّط المهمة أدناه، لكنه **يُكتَب سلفًا** لا يُولَّد. التنسيق الكامل ونموذج الشفاء في [`content-format.md`](content-format)، والبيانات في [`content/library.js`](../content/library.js). ### 7) الصوت بلا نموذج، يمكن **تسجيل جُمل الآليّ مسبقًا** (صوت دافئ وثابت — حتى صوت أحد أفراد العائلة!) بدل أي تركيب آليّ. كله محليّ. أو `SpeechSynthesis` للمتصفح إن فُضِّل. ### 8) الخصوصية — مطلقة لا حسابات، لا شبكة، لا شيء يغادر الجهاز. --- ## 🔁 آلة الحالات (الحلقة) — دوالّ داخل التطبيق (لا نقاط HTTP) | الحالة | الوظيفة | |---|---| | الشرارة | تختار الذكرى التالية من المكتبة وتعرض جملة الآليّ | | المهمة | تعرض/تطبع البطاقة؛ الطفل يفعلها في الواقع | | التلقين | الطفل/الأب يُعلِّم الإنجاز (+ تأمّل اختياريّ) | | الشفاء | تُضيء الشريحة ويعود جزء اللون؛ يُشغَّل ردّ الآليّ المُسجَّل مسبقًا | --- ## 🧩 مخطّط المحتوى (JSON — مؤلَّف يدويًّا) ```json { "domain": "هندسة|لغة|أخلاق|علوم|تفكير", "age_band": "4-6|7-10", "robo_line": "جملة الآليّ القصيرة (شرارة الذكرى)", "child_steps": ["خطوة واقعية", "..."], "materials": ["أشياء من البيت"], "success_signal": "كيف نعرف أنّ الطفل أنجزها", "healing_reward": "أيّ جزء من الآليّ يضيء" } ``` --- ## 💵 التكلفة **صفر.** لا واجهات برمجية ولا اشتراكات. --- ## 📱 النموذج الأوّليّ (شريحة عموديّة) ✅ يعمل من الطرف للطرف في [`app/`](../app/index.html) — HTML/JS صرف، بلا بناء وبلا ذكاء اصطناعي: - يقرأ `content/library.js`، يُمرّر ذكرى عبر الحالات الأربع (شرارة → مهمة → تلقين → شفاء)، ويُضيء جزءًا من الآليّ (SVG) مع حفظ التقدّم في `localStorage`. - فلتر بالفئة العمريّة + صفّ عناصر العالم + معلَم الضحكة عند ٨. - **رسومات SVG كرتونيّة محليّة** في وحدة مشتركة [`src/art.js`](../src/art.js): لكلّ قصّة **مشهدٌ خاصّ مفصّل/طفوليّ** عند توفّره (`ART[id]`) وإلّا رسمُ مجالها (`DOMAIN_ART`)، يظهر في **التطبيق والمطبوعات والفهرس** معًا؛ ورسوم ملوّنة لعناصر عالم الآليّ تُشرق عند الشفاء. أُنجِز **10 مشاهد مفصّلة** حتى الآن، قابلة للنموّ حتى تغطية الـ71. كلّها متّجهة محليّة بلا صور خارجيّة. - **الفهرس** ([`home.html`](../home.html)): لوحة رئيسيّة تربط المكوّنات (التطبيق · المطبوعات · لوحة الأهل · القصص) + فهرس المكتبة كاملًا (بحث/تصفية بالمجال والعمر، وكلّ ذكرى رابطٌ يفتحها). التطبيق يدعم `?memory=` (يفتح ذكرى بعينها) و`?parent=1` (يفتح بوّابة الأهل). زرّ 🏠 يربط الكلّ. - **قصص مصوّرة** ([`stories.html`](../stories.html)): قصص **أصيلة** (تأليفنا) بصورٍ كرتونيّة **كبيرة** (`src/story-art.js`)؛ قارئٌ بصفحات + نقاط تقدّم + درسٌ ختاميّ. البيانات في `content/stories.js`. **8 قصص** حتى الآن (مثابرة، صبر، شجاعة، صدق، تعاون، فضول، رحمة بالحيوان، نظافة)، قابلة للنموّ. - **ألعاب وأنشطة** ([`play.html`](../play.html)): **لعبة مطابقة الذاكرة** برسومنا الأصيلة (3 مستويات صعوبة)، بنيةٌ قابلة لإضافة أنشطة أخرى (توصيل نقاط، تلوين، اختبار). كلّه **محتوًى أصيل** — لا اقتباس من جهةٍ أخرى. - **لوحة الأهل** (خلف بوّابة حسابية): نظرة عامة، تقدّم حسب المجال مع تفعيل/تعطيل، مفتاح إظهار/إخفاء ذكريات الإخوة (`pair`)، سجلّ جلسات مؤرّخ، والتقاط صوت/صورة محليّ يُحفظ في **IndexedDB** (لا يغادر الجهاز). - **المطبوعات** ([`app/print.html`](../app/print.html)): بطاقات مهام قابلة للقصّ + ملصق «خريطة شفاء الآليّ» للتلوين، مفلترة بالمجال/العمر، تُطبع أو تُحفظ PDF عبر المتصفح (بلا مكتبات). - **التشغيل (محدّث 2026-06-12):** بعد تحويل البيانات إلى وحدات JS، تعمل **صفحات الجذر** مباشرةً بأيّ خادم ثابت — من `D:\kidlearn` نفّذ `python -m http.server 8123` وافتح `http://localhost:8123/home.html` (لم يَعُد التشغيل محصورًا في `/app/`). أو `npm run dev`. - **تمّ التحقّق منه حيًّا (2026-06-10):** الحلقة كاملة، الآليّ يتعافى، والبوّابة/اللوحة/المفاتيح/السجلّ تعمل. --- ## 🏭 بناء الإنتاج (Vite + PWA) ✅ نسخة الإنتاج في **جذر المشروع** ([`index.html`](../index.html) + [`print.html`](../print.html)) مبنيّة بـ **Vite** و**vite-plugin-pwa**: - **المكتبة مُضمَّنة** في الحزمة عبر `import library from "./content/library.js"` — لا جلب شبكيّ، فيعمل دون اتصال بلا حيلة. - **Service Worker (Workbox)** يُنشأ تلقائيًّا ويُسبِق-تخزين كلّ الأصول ← **يعمل دون اتصال**؛ و`manifest.webmanifest` ← **قابل للتثبيت** كتطبيق. - **الأوامر:** `npm install` ثمّ `npm run dev` (تطوير) أو `npm run build` (يُنتج `dist/`)؛ تُخدَم `dist/` كملفّات ثابتة في أيّ مكان. - **تمّ التحقّق منه حيًّا (2026-06-10):** البناء ينجح، الـ SW مُفعَّل ويُسبِق-تخزين 8 ملفات، المكتبة (٥٦) محمّلة من الحزمة، الحلقة تعمل، بلا أخطاء. - **البنية:** الجذر = مصدر الإنتاج (يحتاج `npm run dev`/`build`). مجلّد [`app/`](../app/) = النسخة القديمة بلا بناء (تعمل عبر `python -m http.server`) — قابلة للحذف لاحقًا. --- ## 🗂️ ملفّات البيانات = وحدات JS (تعمل بأيّ خادم ثابت) — قرار 2026-06-12 بياناتُ المحتوى في `content/` هي **وحدات ES** (`content/*.js` بصيغة `export default {…}`)، لا ملفّات `.json`. السبب: المتصفّح **لا يدعم `import x from "./x.json"`** بدون أداة بناء، فكانت الصفحات تظهر فارغةً عند تشغيل الجذر الخام عبر `python -m http.server` (بلا Vite). أمّا استيراد وحدة `.js` فيعمل **أصلًا في كلّ متصفّح**. النتيجة: المشروع يعمل الآن بثلاث طرق دون أيّ تغيير: 1. **خادم ثابت خام** على الجذر (`python -m http.server`) — يفتح `index.html`/`home.html` مباشرةً. 2. **Vite dev** (`npm run dev`). 3. **بناء Vite** (`npm run build` ثمّ خدمة `dist/`) — تُضمَّن البيانات في الحزم. أداة [`tools/import-from-gtsararim.mjs`](../tools/import-from-gtsararim.mjs) تُخرج `.js` (`export default`). تنسيق الحقول لا يزال JSON-الشكل؛ التغيير في الغلاف فقط. ## 🔤 ألعاب الكلمات — دمج الحروف (إضافة 2026-06-11، أصيلة) **أصيلٌ من تأليفنا** (لا علاقة لها بـ GT-SARARIM) لتدريب الطفل على **دمج الحروف لتكوين كلمات** — كلّ فكرةٍ حسّيّة اقترحها صاحب المشروع صارت **لعبةً تفاعليّة بآليّةٍ ذهنيّة مختلفة** (لا مجرّد حُلّةٍ بصريّة). تعيش كلّها **داخل صفحة «ألعاب وأنشطة»** [`play.html`](../play.html) (دُمِجت مع لعبة الذاكرة في مركزٍ واحد بقائمةٍ menu)؛ القائمة تفتح **لعبة الذاكرة** + سبع ألعابٍ للحروف: - **🚂 قطار:** *ترتيب* — يبني الكلمة من الصفر بوضع الحروف في خانات. - **🧺 مشابك الغسيل:** *تبديل* — الحروف مبعثرةٌ معلّقة، يضغط حرفين ليتبادلا حتى يصحّ الترتيب (فرز). - **🧱 بناء المكعّبات:** *إكمال* — الكلمة شبه مكتملة بحرفٍ (أو حرفين) ناقص، يختار المكعّب الصحيح وسط بدائل. - **🎣 صيد الحروف:** *انتقاء وسط تشتيت* — بِركةٌ فيها حروف الكلمة + حروفٌ دخيلة، يصطاد الصحيح بالترتيب ويتجاهل الدخيل. - **🧩 بطاقات الصور:** *تمييز* — ثلاث كتاباتٍ للكلمة (صحيحة + مبعثرتان)، يختار الصحيحة (اختيار من متعدّد). - **🌀 متاهة الحروف:** *تنقّل مكانيّ* — شبكةٌ تُولَّد بمسارٍ ذاتيّ التجنّب (self-avoiding walk) + حروف تشتيت؛ يمشي على خلايا الكلمة بالتجاور حتى الصورة. - **🎡 عجلة الحروف:** *استكشاف/دمج صوتيّ* — بكراتٌ تُدار/تُنقَر، الحروف مدموجةٌ وتُنطَق، مع كشف «كلمة حقيقية». - **🖨️ أنشطة للطباعة:** البطاقات الحسّيّة السبع للأهل (الأصل الورقيّ). **ملاحظات تقنيّة:** بنك الكلمات في [`content/words.js`](../content/words.js) (بالإيموجي بلا صورٍ خارجيّة، كلماتٌ تنفصل حروفها وتتّصل بلا لا/شدّة). الاتّصال يعتمد **تشكيل المتصفّح التلقائيّ** عند ضمّ الحروف في نصٍّ واحد. **لكلّ لعبةٍ حالتُها ومنطقُها المستقلّ** (لا محرّك مشترك). النطق اختياريّ عبر `SpeechSynthesis` (محليّ، يتعطّل بلطفٍ إن غاب). كلّها مُضمّنةٌ في `play.html` (لا مدخل Vite منفصل) ومربوطةٌ من `home.html`. --- ## 🔤 الأساسيّات — ما قبل القراءة (إضافة 2026-06-12، أصيلة) [`basics.html`](../basics.html) — الرُّكن التأسيسيّ تحت ألعاب الكلمات (الحروف/الأرقام/الحركات)، قائمةٌ تفتح خمسة أنشطة: **بطاقات الحروف** (الحرف + اسمه + 🔊 + كلمةٌ مثال + أشكال أوّل/وسط/آخر)، **أين الحرف؟** (تعرُّفٌ سمعيّ‑بصريّ)، **بطاقات الأرقام** (٠–١٠ بالعدّ)، **عُدّ معي** (كم العدد؟)، **الحركات** (فتحة/ضمّة/كسرة + لعبة «أيّ حركة سمعت؟»). البيانات في [`content/letters.js`](../content/letters.js) (الـ28 حرفًا + الأرقام). **أشكال الحرف الثلاثة تُشتقّ بالرابط الصِّفريّ ZWJ (`‍`)** بدل تخزينها. النطق عبر `SpeechSynthesis` (محليّ). ## 📖 سُلّم القراءة (إضافة 2026-06-12، أصيلة) [`read.html`](../read.html) — الجسر بين «الأساسيّات» و«ألعاب الكلمات»، ثلاث درجات متدرّجة لتعليم **فكّ القراءة**: - **ﹷ المقاطع:** حرف ساكن × حركة ← مقطع (بَ/بُ/بِ)؛ يضغط الطفل الحركة فيسمع المقطع، ويتنقّل بين الحروف. - **🔗 اجمع الكلمة:** الكلمة مقسومةٌ مقاطعَ مشكّلة (قَ·مَ·رْ بالإيموجي)؛ يقرأ كلّ مقطع (نطق) ثمّ «اقرأ الكلمة كاملةً» (دمج صوتيّ + كشف الكلمة). - **📜 اقرأ الجملة:** جملةٌ قصيرة بالحركات؛ يضغط كلّ كلمة لسماعها ثمّ يقرأ الجملة كاملة. البيانات في [`content/reading.js`](../content/reading.js) (16 كلمة بمقاطعها + 8 جُمل + قائمة حروف). النطق عبر `SpeechSynthesis`. تُسجّل التقدّم (`read_practice`) ولها وسامٌ خاصّ. مُضمَّنة في `vite.config.js` (مدخل `read`) ومربوطة من `home.html`. ## 🏆 التقدّم والتحفيز (إضافة 2026-06-12، أصيلة) وحدةٌ مشتركة [`src/progress.js`](../src/progress.js) (localStorage، لا شيء يغادر الجهاز) تُصدِّر `logEvent(type)` تستدعيها **كلّ الأقسام** عند نقطة النجاح: شفاء ذكرى (`index.html`) · فتح قصّة وإجابة فهم (`tales`) · كشف حلّ لغز (`puzzles`) · إنهاء اختبار بنتيجته (`quiz`) · فوز لعبة حروف/ذاكرة (`play`) · إجابة في الأساسيّات (`basics`). تحسب: **سلسلة الأيّام (streak)**، مجموع النجوم، الأقسام المُجرّبة، و**12 وسامًا** بشروط، و**«مهمّة اليوم»** (٣ مهامّ تُكتمَل بنشاطٍ من نوعها اليوم). الواجهة [`progress.html`](../progress.html): مهمّة اليوم + إحصاءات + أوسمة + **شهادة إنجاز قابلة للطباعة** باسم الطفل. و[`home.html`](../home.html) يعرض شريط «مهمّة اليوم». كلّ هذا حتميّ ومحليّ بلا حساب. ## 📦 مجموعة GT-SARARIM (إضافة 2026-06-11) أُدرِجت بياناتُ المحتوى من مشروع **GT-SARARIM** (GPL-3.0) كمجموعةٍ محليّةٍ مستقلّة، محوَّلةٍ إلى JSON عبر أداة [`tools/import-from-gtsararim.mjs`](../tools/import-from-gtsararim.mjs): - **51 قصّة** + 102 سؤال فهم → [`content/sararim-stories.js`](../content/sararim-stories.js) تُعرَض في [`tales.html`](../tales.html) («قصص وعِبَر»: نصّ بالحركات + أسئلة فهم، تصفية بالقسم/العمر، تغذية راجعة فوريّة). - **61 لغزًا** (فوازير/منطق، 4 مستويات) → [`content/puzzles.js`](../content/puzzles.js) تُعرَض في [`puzzles.html`](../puzzles.html) («ألغاز ذكية»: لغز ← تلميح ← حل، تصفية بالنوع/العمر). - **94 سؤال** اختيار من متعدد → [`content/quiz.js`](../content/quiz.js) تُعرَض في [`quiz.html`](../quiz.html) («اختبارات تعليمية»: جلسة 10 أسئلة بخياراتٍ مخلوطة ونتيجةٍ فوريّة). **التقنية:** نفس نمط المشروع — صفحةٌ واحدةٌ لكلّ نشاط (HTML + `