Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 26 additions & 9 deletions README.ar.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
| الطبقة | الأداة | ماذا تُصلح |
| --- | --- | --- |
| **1) طبقة النص (خادم أوبن‌كود)** | إضافة `server` | رسائل المستخدم المُرسلة وسجل المحادثة وردود النموذج ومخرجات الأدوات — عبر **عزل ثنائي الاتجاه** (`RLI` / `LRI` / `PDI`) وفق UAX #9. منذ أوبن‌كود **1.18.31** يتعرّف العرض الطرفي/سطح المكتب على الاتجاه تلقائيًا (`dir="auto"` + plaintext)، لذا تركز هذه الطبقة على الطرفية/الويب والحفاظ على ترميزات LTR |
| **2) طبقة الواجهة (سطح المكتب)** | سكربتات `patch/` (لينكس / ماك / ويندوز) | **حقل الكتابة المباشر** و**عناوين التبويبات/الجلسات** التي لا تصل إليها أي خطافات إضافة — عبر حقن `dir="auto"` + `unicode-bidi: plaintext` داخل `app.asar` |
| **2) طبقة الواجهة (سطح المكتب)** | رقعة `app.asar` (المحرك `patch/lib/patch-asar.mjs` + غلاف لكل نظام تشغيل)، وتطبّقها الإضافة نفسها وتُصلحها ذاتيًا | **كل أسطح النص في الواجهة**: حقل الكتابة المباشر، رسائل الدردشة، عناوين التبويبات/الجلسات والطرفية، القوائم، الحوارات، التنبيهات، الإعدادات، شجرة الملفات، أسماء ملفات المراجعة، المرفقات، الأذونات والأسئلة — عبر حقن `dir="auto"` + `unicode-bidi: plaintext` داخل `app.asar` (الكود والفروق ومخرجات الشل تبقى LTR) — إضافةً إلى خط **Vazirmatn** لكل نص الواجهة |

<details>
<summary>🔍 كيف يعمل؟</summary>
Expand All @@ -61,13 +61,15 @@
- ✅ أمران لحالة TUI: `RTL: Show Status` و `RTL: Analyze Sample` (يعملان في v2 أيضًا عبر CLI API الجديد)
- ✅ رقعة سطح المكتب لأنظمة التشغيل الثلاثة (لينكس / ماك / ويندوز) مع نسخة احتياطية تلقائية وتحقّق من تخطيط `app.asar.unpacked` وإمكانية التراجع (`--unpatch`)
- ✅ تغطية كاملة لواجهة سطح المكتب: الدردشة والمحرر، تبويبات الجلسات والطرفية، القوائم، الحوارات، التنبيهات، الإعدادات، شجرة الملفات وعارض الملفات، لوحة المراجعة، المرفقات، الأذونات والأسئلة — مع حماية LTR للكود والفروق ومخرجات الشل
- ✅ خط **Vazirmatn (OFL)** مُضمَّن في واجهة سطح المكتب (دون تثبيت أي خط على النظام)
- ✅ **إصلاح ذاتي**: إضافة الخادم تطبّق رقعة سطح المكتب تلقائيًا وتُعيد تطبيقها بعد كل تحديث (دون تشغيل يدوي)
- ✅ متوافق مع أوبن‌كود **1.19.0** و **2.x** (مدخل `./v2` للخادم و `./v2/tui` للـCLI)

## ⚠️ قيد مهم (بصراحة)

**حقل كتابة البرومبت أثناء الكتابة الفعلية قبل الإرسال يُرسم بواجهة أوبن‌كود نفسها ولا يصل إليه أي خطاف إضافة.** لذلك:

- **تطبيق سطح المكتب** → يُصلح هذا الجزء سكربتات `patch/` — `patch/linux/desktop-rtl.sh`, أو `patch/macos/desktop-rtl.sh`, أو `patch/windows/desktop-rtl.ps1` (الطبقة ٢).
- **تطبيق سطح المكتب** → يُصلح هذا الجزء رقعة `app.asar` (المحرك `patch/lib/patch-asar.mjs` مع غلاف لكل نظام تشغيل). لا تصل أي إضافة/امتداد إلى واجهة سطح المكتب، لذا تطبّق إضافة الخادم هذه الرقعة بنفسها و**تُصلحها ذاتيًا** — اضبط `desktop: false` إن كنت تفضّل الترقيع يدويًا.
- **الطرفية/TUI** → يُرسم خليةً بخلية عبر `@opentui/core`، والحل النهائي له يرجع إلى أوبن‌كود نفسه؛ لكن فور إرسال الرسالة، يُصلح برومبتك ورد النموذج عبر الطبقة ١ في كل مكان.

---
Expand Down Expand Up @@ -171,6 +173,7 @@ npm ci && npm run build
| `rtlWrapColumn` | `96` | عمود الالتفاف المستخدم في المحاذاة |
| `rtlAlignColumn` | `96` | عمود المحاذاة اليمنى |
| `directionEnv` | `true` | تصدير `OPENCODE_RTL*` في بيئة الأدوات |
| `desktop` | `true` | تثبيت/إصلاح رقعة سطح المكتب تلقائيًا (`app.asar` + خط Vazirmatn). لجعل الإضافة لا تلمس ملفات التطبيق: `false` |
| `debug` | `false` | تسجيل عبر `client.app.log()` |

> **ملاحظة الاتجاه:** الاتجاه بحسب «أول حرف قوي»؛ جملة تبدأ بالعربية تصبح RTL، وجملة تبدأ بالإنجليزية/كود تصبح LTR. لفرض RTL دائمًا: `"forceDirection": "rtl"`.
Expand All @@ -189,7 +192,9 @@ npm ci && npm run build

## 🖥️ رقعة تطبيق سطح المكتب (تغطية كاملة للواجهة)

يُرسم تطبيق Electron أجزاءً من النص دون أي اتجاه تلقائي. تُضيف الرقعة `<style>` + `<script>` إلى `out/renderer/index.html` داخل `app.asar` لتعمل **كل أسطح النص** — الدردشة والمحرر، التبويبات، القوائم، الحوارات، التنبيهات، الإعدادات، شجرة الملفات وعارضها، لوحة المراجعة، المرفقات، الأذونات والأسئلة — تمامًا كما في المتصفحات الحديثة (الكود والفروق ومخرجات الشل تبقى LTR عمدًا).
يُرسم تطبيق Electron أجزاءً من النص دون أي اتجاه تلقائي. تُضيف الرقعة `<style>` + `<script>` إلى `out/renderer/index.html` داخل `app.asar` لتعمل **كل أسطح النص** — الدردشة والمحرر، التبويبات، القوائم، الحوارات، التنبيهات، الإعدادات، شجرة الملفات وعارضها، لوحة المراجعة، المرفقات، الأذونات والأسئلة — تمامًا كما في المتصفحات الحديثة (الكود والفروق ومخرجات الشل تبقى LTR عمدًا). كما تُضمّن الرقعة خط **Vazirmatn** بصيغة base64 وتضبط `--font-family-sans` ليصبح خط الواجهة كلها Vazirmatn، دون تثبيت أي خط على النظام ودون إنترنت.

> 🔁 **مهم:** منذ الإصدار **0.2.0** تطبّق إضافة الخادم هذه الرقعة و**تُصلحها ذاتيًا**؛ أي بعد كل تحديث لسطح المكتب (يستبدل `app.asar`) تُعيد الإضافة تطبيقها تلقائيًا. السكربتات اليدوية أدناه مطلوبة فقط إذا ضبطت `desktop: false` أو أردت التطبيق فورًا دون إعادة تشغيل.

تستند الرقعة إلى **محرك جافاسكربت مشترك** (`patch/lib/patch-asar.mjs`) يعمل بنفس الطريقة على أنظمة التشغيل الثلاثة؛ وكل «غلاف» خاص بنظام تشغيل يحدد مسار التطبيق ويأخذ الصلاحيات المطلوبة (sudo / UAC):

Expand Down Expand Up @@ -227,8 +232,9 @@ powershell -ExecutionPolicy Bypass -File patch\windows\desktop-rtl.ps1
### ماذا يفعل

1. ينشئ نسخة احتياطية من `app.asar` في مكانها (`app.asar.bak-rtl`)؛
2. يستخرج الأرشيف ويُرقع `index.html` ويعيد التعبئة؛
3. **يتحقق من تخطيط `app.asar.unpacked` (الوحدات الأصلية مثل `node-pty`) واحدًا تلو الآخر مقابل النسخة السابقة** حتى لا ينكسر شيء.
2. يستخرج الأرشيف ويُرقع `index.html` (قواعد الاتجاه + `@font-face` لخط Vazirmatn) ويعيد التعبئة؛
3. **يتحقق من تخطيط `app.asar.unpacked` (الوحدات الأصلية مثل `node-pty`) واحدًا تلو الآخر مقابل النسخة السابقة** حتى لا ينكسر شيء؛
4. يكتب ختمًا (`app.asar.rtl-stamp`) يحمل إصدار الرقعة؛ تستخدمه الإضافة لمعرفة ما إذا كانت الرقعة حديثة ولـ**ترقية** الرقع القديمة (دون ترقيع ملف مُرقَّع مرتين).

ثم **أغلق وأعد فتح تطبيق أوبن‌كود لسطح المكتب**.

Expand All @@ -245,11 +251,19 @@ sudo bash patch/macos/desktop-rtl.sh --unpatch
powershell -ExecutionPolicy Bypass -File patch\windows\desktop-rtl.ps1 -Unpatch
```

### ⚠️ بعد كل تحديث لسطح المكتب
### 🔁 إصلاح ذاتي بعد كل تحديث (افتراضي)

التطبيق يتحدّث تلقائيًا والتحديث يستبدل الملف المُرقَّع. منذ الإصدار **0.2.0** لا حاجة لأي خطوة يدوية:

- إضافة الخادم (التي تعمل مع سطح المكتب/CLI) تتحقق عند التحميل من وجود الرقعة وحداثتها؛
- `app.asar` مقفل أثناء تشغيل التطبيق، لذا تفحص الإضافة أولًا قابلية الكتابة ولا تُرقّع إلا عندما يكون التطبيق مغلقًا، وتعيد المحاولة كل دقيقتين؛
- لذا: ثبّت الإضافة → أغلق تطبيق سطح المكتب → في التشغيل التالي يكون مُرقَّعًا. وبعد كل تحديث يُصلح نفسه بالطريقة نفسها.

> لا تريد أن تلمس الإضافة ملفات التطبيق؟ اضبط `"desktop": false` واستخدم السكربتات اليدوية. لا شيء من هذا يحتاج `sudo`/UAC إلا إذا كان التطبيق مثبتًا في مسار نظامي.

التطبيق يتحدّث تلقائيًا والتحديث يستبدل الملف المُرقَّع. ما عليك سوى إعادة تشغيل سكربت نظامك بعد كل تحديث.
### التثبيت اليدوي (اختياري)

> المسارات الافتراضية: لينكس `/opt/OpenCode/resources/app.asar`، ماك `/Applications/OpenCode.app/Contents/Resources/app.asar`، ويندوز `%LOCALAPPDATA%\Programs\OpenCode\resources\app.asar`. إذا كان مثبتًا في مكان آخر: لينكس/ماك `sudo DESKTOP_ASAR=/path/to/app.asar bash patch/<linux|macos>/desktop-rtl.sh`، ويندوز `powershell ... -Asar C:\path\to\app.asar`.
> المسارات الافتراضية: لينكس `/opt/OpenCode/resources/app.asar`، ماك `/Applications/OpenCode.app/Contents/Resources/app.asar`، ويندوز `%LOCALAPPDATA%\Programs\@opencode-aidesktop\resources\app.asar`. إذا كان مثبتًا في مكان آخر: لينكس/ماك `sudo DESKTOP_ASAR=/path/to/app.asar bash patch/<linux|macos>/desktop-rtl.sh`، ويندوز `powershell ... -Asar C:\path\to\app.asar`.

---

Expand Down Expand Up @@ -298,6 +312,7 @@ npm test # البناء + الاختبارات (بما فيه محرك
RTL_OpenCode/
├── src/
│ ├── core.ts ← محرك Bidi: اكتشاف الاتجاه، العزل، ماركداون/كود، المحاذاة
│ ├── desktop.ts ← حارس الإصلاح الذاتي لرقعة سطح المكتب (تطبيق/إصلاح app.asar)
│ ├── server.ts ← خطافات الخادم v1 (1.19)
│ ├── tui.ts ← أوامر TUI في v1
│ └── index.ts ← الصادرات
Expand All @@ -306,7 +321,8 @@ RTL_OpenCode/
│ └── index.ts ← المخرجات
├── test/core.test.js ← الاختبارات
├── patch/
│ ├── lib/patch-asar.mjs ← محرك الرقعة المشترك (جافاسكربت، كل الأنظمة)
│ ├── lib/patch-asar.mjs ← محرك الرقعة المشترك (جافاسكربت، كل الأنظمة) + حارس الإصلاح الذاتي
│ ├── fonts/Vazirmatn-Variable.woff2 ← خط Vazirmatn (OFL) المُضمَّن كـbase64
│ ├── linux/desktop-rtl.sh ← رقعة سطح المكتب للينكس
│ ├── macos/desktop-rtl.sh ← رقعة سطح المكتب لماك
│ └── windows/
Expand Down Expand Up @@ -343,6 +359,7 @@ RTL_OpenCode/
## 🙏 الشكر والإسناد

- **أوبن‌كود** — [github.com/anomalyco/opencode](https://github.com/anomalyco/opencode) · [opencode.ai](https://opencode.ai)
- خط **Vazirmatn** — من إنشاء صابر راستي‌كردار، بترخيص [SIL OFL 1.1](https://github.com/rastikerdar/vazirmatn/blob/master/OFL.txt)
- إضافة **opencode-rtl** على npm (المؤلِّف: `razavioo`) التي كانت مصدر إلهام هذا التنفيذ
- عناصر ذات صلة في مستودع أوبن‌كود:
- [issue #35319](https://github.com/anomalyco/opencode/issues/35319) — نص مختلط معطّل في سطح المكتب
Expand Down
Loading