Site icon Iqraa.tech

الذاكرة واستمرار السياق في Claude Code

Claude Code Memory and Context Persistence — featured image

تتيح ذاكرة Claude Code استمرار السياق عبر الجلسات من خلال نظام هرمي من ملفات CLAUDE.md والذاكرة التلقائية (auto memory). يشمل التسلسل الهرمي السياسة المُدارة (managed policy)، وذاكرة المشروع، وذاكرة المستخدم، والتعليمات المحلية، ولكل منها أغراض محددة ومستويات أولوية خاصة.

تحتوي ذاكرة المشروع على الاصطلاحات المشتركة على مستوى الفريق وتُشارَك عبر git، بينما تحتفظ ذاكرة المستخدم بالتفضيلات الشخصية. أما الذاكرة التلقائية فيولّدها Claude تلقائيًا لتخزين الأنماط والملاحظات. يمكن إنشاء الملفات باستخدام /init، وتحديثها بـ /memory، وتحديد نطاقها لمجلدات بعينها باستخدام قواعد قائمة على المسارات.

ذاكرة Claude Code — فهم ذاكرة Claude Code هو مفتاح الحصول على نتائج متّسقة. يشرح هذا الدليل التسلسل الهرمي لملف CLAUDE.md، وقواعد المشروع، وذاكرة المستخدم، وكيفية استمرار السياق عبر الجلسات.

ذاكرة Claude Code: ما الذي ستتعلمه

في هذا الدليل إلى ذاكرة Claude Code، ستمرّ بخطوات عملية تطبيقية مع أمثلة واقعية. تُشرح ذاكرة Claude Code من الأساس حتى تتمكن من تطبيقها فورًا في مشاريعك الخاصة.

في Claude Code، تشير «الذاكرة» إلى السياق الذي يُنقَل بين الجلسات. ففي حين تُعاد نافذة المحادثة من جديد في كل مرة تبدأ فيها، تُحمَّل ملفات الذاكرة تلقائيًا في كل مرة يُشغَّل فيها Claude Code. يشرح هذا الدرس التسلسل الهرمي لملفات الذاكرة، وكيفية إنشائها وتحديثها، وكيف تعمل الذاكرة التلقائية في الخلفية.

التسلسل الهرمي لذاكرة Claude Code

يمتلك Claude Code نظامَي ذاكرة رئيسيين: ملفات CLAUDE.md التي تكتبها أنت، والذاكرة التلقائية التي يكتبها Claude لنفسه. تشمل مواقع CLAUDE.md الموثّقة رسميًا السياسة المُدارة (على مستوى المؤسسة)، وتعليمات المشروع (CLAUDE.md أو .claude/CLAUDE.md)، وتعليمات المستخدم (~/.claude/CLAUDE.md)، والتعليمات المحلية (./CLAUDE.local.md — خاصة بالمشروع وشخصية، ومستثناة من git).

ذاكرة المشروع هي التي ستستخدمها أكثر من غيرها. إنها ملف markdown يُلتزَم به في git ويُشارَك مع فريقك. ضع هنا حِزمتك التقنية، واصطلاحات التسمية، والأوامر الشائعة، والمزالق غير البديهية. أما ذاكرة المستخدم فهي للتفضيلات الشخصية التي تنطبق على جميع مشاريعك — الأنماط التي تفضّلها، والطريقة التي تحب أن يُشرح بها الكود، والأدوات التي تستخدمها دائمًا.

عمليًا: استخدم ذاكرة المشروع لكل ما يحتاجه زميل الفريق لفهم قاعدة الكود — خطوات الإعداد، وأوامر الاختبار، وقرارات البنية المعمارية. واستخدم ذاكرة المستخدم لطريقة عملك الشخصية، لا لما يفعله المشروع. وحين يكون مدخل ذاكرة المشروع مهمًّا لك وحدك (مثلًا اختصار مخصص أو alias محلي)، ضعه في CLAUDE.local.md بدلًا من ذلك ليبقى خاصًّا.

للمشاريع الأكبر، قسّم التعليمات إلى ملفات .claude/rules/*.md. يمكن أن تكون القواعد عامة على مستوى المشروع أو محدّدة النطاق بمسارات عبر الـ frontmatter. القاعدة التي تحمل paths: src/api/**/*.ts لا تُفعَّل إلا عندما يعمل Claude مع الملفات المطابقة:

---
paths: src/api/**/*.ts
---
All API endpoints must validate input with Zod. Return 400 with field-level errors on validation failure.

إنشاء ذاكرة Claude Code وتحديثها

أسرع طريقة للبدء هي /init. شغّلها في مجلد مشروعك، فيحلّل Claude قاعدة الكود لتوليد ملف CLAUDE.md ابتدائي. استخدم CLAUDE_CODE_NEW_INIT=1 claude للحصول على تدفّق إعداد تفاعلي متعدد المراحل.

للتعديلات الأكبر، يفتح /memory ملفات ذاكرتك في محرّر نظامك. أجرِ التغييرات واحفظها، فيعيد Claude تحميلها تلقائيًا. وإذا أردت أن يتذكّر Claude شيئًا تلقائيًا، فاطلب ذلك بشكل طبيعي، مثل «تذكّر أن اختبارات الـ API تتطلب Redis». وإذا أردت كتابته داخل CLAUDE.md، فاطلب من Claude صراحةً إضافته هناك. تتيح لك صيغة الاستيراد @path/to/file الإشارة إلى التوثيق الموجود بدلًا من تكراره:

# Project Standards

@README.md
@docs/architecture.md
@package.json

تدعم عمليات الاستيراد عمقًا أقصاه أربع قفزات. عمليات الاستيراد لأول مرة من مسارات خارجية تُطلِق حوار موافقة.

الذاكرة التلقائية (Auto Memory)

الذاكرة التلقائية هي مجلد يكتب فيه Claude ملاحظاته الخاصة أثناء الجلسات — الأنماط التي يكتشفها، والسلوكيات الخاصة بالمشروع، وملاحظات تصحيح الأخطاء. تُحمَّل أول 200 سطر أو 25 كيلوبايت من ~/.claude/projects/<project>/memory/MEMORY.md، أيُّهما أتى أولًا، تلقائيًا عند بدء الجلسة. وتُحمَّل ملفات المواضيع الإضافية (debugging.md، api-conventions.md) عند الطلب.

يمكن للوكلاء الفرعيين (subagents) أيضًا الاحتفاظ بذاكرتهم التلقائية الخاصة. راجع توثيق إعداد الوكيل الفرعي للتفاصيل.

لست بحاجة إلى صيانة الذاكرة التلقائية يدويًا؛ فـ Claude يتولى عمليات الكتابة بنفسه. ويمكنك قراءة الملفات وتحريرها إن أردت تصحيح ملاحظات Claude أو الإضافة إليها. يمكنك تبديلها في /memory، أو تعطيلها لجلسة واحدة بـ CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 claude، أو ضبط autoMemoryEnabled في الإعدادات. ولنقل المجلد إلى موقع مُزامَن أو مسار مخصص، اضبط autoMemoryDirectory في إعدادات المستخدم (وليس إعدادات المشروع أو المحلية — إذ يمكن لإعدادات المشروع والمحلية إعادة توجيه الكتابة إلى مواقع حساسة ولذلك لا تُقبَل):

{
  "autoMemoryEnabled": true,
  "autoMemoryDirectory": "/path/to/shared/memory"
}

في المستودعات الأحادية الكبيرة (monorepos) التي تضم العديد من ملفات CLAUDE.md، استخدم claudeMdExcludes في الإعدادات لتخطّي غير المرتبطة منها:

{
  "claudeMdExcludes": ["packages/legacy-app/CLAUDE.md", "vendors/**/CLAUDE.md"]
}

كذلك يحمّل Claude ملفات CLAUDE.md التي يجدها أعلى من مجلد عملك الحالي، ويحمّل ملفات CLAUDE.md الموجودة في المجلدات الفرعية عند الطلب حين يقرأ Claude ملفات في تلك المجلدات. في المستودعات الأحادية، يساعد claudeMdExcludes على إبقاء التعليمات غير المرتبطة خارج السياق.


أمثلة كود واقعية: إعداد ذاكرة Claude Code

المثال 1: ملف CLAUDE.md للمشروع

ملف إعداد شامل للمشروع يحدّد البنية المعمارية والمعايير والاصطلاحات:

# Project Configuration

## Project Overview
- Name: E-commerce Platform
- Tech Stack: Node.js, PostgreSQL, React 18, Docker
- Team Size: 5 developers

## Architecture
@docs/architecture.md
@docs/api-standards.md
@docs/database-schema.md

## Development Standards

### Code Style
- Use Prettier for formatting
- Use ESLint with airbnb config
- Maximum line length: 100 characters

### Naming Conventions
- Files: kebab-case (user-controller.js)
- Classes: PascalCase (UserService)
- Functions/Variables: camelCase (getUserById)

### Git Workflow
- Branch names: feature/description or fix/description
- Commit messages: Follow conventional commits
- PR required before merge

المثال 2: ملف CLAUDE.local.md الشخصي (لا يُلتزَم به في Git)

تفضيلات شخصية تبقى محلية ولا تُشارَك أبدًا مع الفريق:

# My Development Preferences

## About Me
- Experience Level: 8 years full-stack development
- Preferred Languages: TypeScript, Python
- Communication Style: Direct, with examples

## Code Preferences

### Error Handling
I prefer explicit error handling with try-catch blocks.
Avoid generic errors. Always log errors for debugging.

### Testing
I prefer TDD (test-driven development).
Write tests first, then implementation.

### Architecture
I prefer modular, loosely-coupled design.
Use dependency injection for testability.

المثال 3: قواعد محدّدة النطاق بمجلد src/api/

ملف CLAUDE.md موضوع في src/api/ يتجاوز إعدادات الجذر بالنسبة لذلك المجلد:

# API Module Standards

This file overrides root CLAUDE.md for everything in /src/api/

### Request Validation
- Use Zod for schema validation
- Always validate input
- Return 400 with validation errors

### Authentication
- All endpoints require JWT token
- Token in Authorization header
- Token expires after 24 hours

### Response Format
{
  "success": true,
  "data": {},
  "timestamp": "2025-11-06T10:30:00Z",
  "version": "1.0"
}

### Rate Limiting
- 1000 requests per hour for authenticated users
- 100 requests per hour for public endpoints

نصائح احترافية


تحدٍّ تطبيقي: أنشئ نظام ذاكرة متعدد الطبقات

المهمة: أنشئ تسلسلًا هرميًا للذاكرة من ثلاث طبقات — ملف CLAUDE.md على مستوى المشروع، وتجاوز خاص بمجلد، وتفضيلات مستخدم شخصية — ثم تحقّق من تحميل كلٍّ منها بشكل صحيح.

الخطوات

  1. شغّل /init في مشروع لتوليد ملف CLAUDE.md جذري يتضمّن نظرة عامة على المشروع، والحِزمة التقنية، واصطلاحات كتابة الكود
  2. أضِف استيراد @docs/architecture.md للإشارة إلى التوثيق الموجود دون تكراره
  3. أنشئ src/api/CLAUDE.md بقواعد خاصة بالـ API (مثلًا «يجب أن تستخدم جميع نقاط النهاية تحقّق Zod وأن تُرجِع غلاف JSON قياسيًا»)
  4. أنشئ ~/.claude/CLAUDE.md بتفضيلات شخصية (مثلًا المسافة البادئة المفضّلة، وإطار الاختبار، وأسلوب التواصل)
  5. ابدأ جلسة Claude Code جديدة واسأل: «ما الاصطلاحات التي يجب أن أتّبعها لوحدة الـ API؟» — ينبغي لـ Claude أن يستخلص من ملفات ذاكرة المشروع والمجلد على حدٍّ سواء

النتيجة المتوقعة

ينبغي لـ Claude أن يطبّق الاصطلاحات على مستوى المشروع من ملف CLAUDE.md الجذري، وأن يتجاوزها بقواعد الـ API الأكثر تحديدًا من src/api/CLAUDE.md، وأن يحترم أيضًا تفضيلاتك الشخصية من ~/.claude/CLAUDE.md — مُظهِرًا نظام الذاكرة الهرمي وهو يعمل.

تلميح: استخدم صيغة الاستيراد @ للإشارة إلى ملفات مثل @README.md أو @package.json داخل CLAUDE.md. هذا يتجنّب التكرار — إذ يقرأ Claude الملف المُشار إليه وقت التحميل.


اختبار المعرفة: نظام ذاكرة Claude Code

اختبر فهمك بأسئلة الاختبار هذه. حاول الإجابة عن كل سؤال قبل كشف الإجابة.

1. كم مستوى يضم التسلسل الهرمي لذاكرة Claude Code، وما الذي يحظى بأعلى أولوية؟

  1. 5 مستويات، ذاكرة المستخدم هي الأعلى
  2. 7 مستويات، السياسة المُدارة هي الأعلى
  3. 3 مستويات، ذاكرة المشروع هي الأعلى
  4. 7 مستويات، الذاكرة التلقائية هي الأعلى

الإجابة الصحيحة: B. يضم التسلسل الهرمي 7 مستويات: السياسة المُدارة > ذاكرة المشروع > قواعد المشروع > ذاكرة المستخدم > قواعد المستخدم > ذاكرة المشروع المحلية > الذاكرة التلقائية. السياسة المُدارة (التي يضبطها المسؤولون) لها أعلى أولوية.

2. كيف تضيف قاعدة جديدة إلى الذاكرة بسرعة أثناء محادثة؟

  1. استخدم أمر الشرطة المائلة /memory أو اطلب ذلك حواريًا
  2. ابدأ رسالتك بـ # (مثلًا # always use TypeScript)
  3. اكتب /rule “rule text”
  4. استخدم @add-memory “rule text”

الإجابة الصحيحة: A. الطرق الموصى بها لإضافة الذاكرة هي أمر /memory (الذي يفتح ملفات الذاكرة في محرّرك) أو سؤال Claude حواريًا. أما بادئة # فقد أُلغي العمل بها.

3. ما العمق الأقصى لعمليات الاستيراد @path/to/file في CLAUDE.md؟

  1. 3 مستويات عمقًا
  2. 5 مستويات عمقًا
  3. 10 مستويات عمقًا
  4. غير محدود

الإجابة الصحيحة: B. تدعم صيغة الاستيراد @ عمليات الاستيراد المتداخلة حتى عمق أقصاه 5 لمنع الحلقات اللانهائية.

4. كيف تحدّد نطاق ملف قاعدة بحيث ينطبق فقط على الملفات الموجودة في src/api/؟

  1. ضع القاعدة في src/api/CLAUDE.md
  2. أضِف frontmatter بصيغة YAML بـ paths: src/api/** إلى ملف .claude/rules/*.md
  3. سمِّ الملف .claude/rules/api.md
  4. استخدم @scope: src/api في ملف القاعدة

الإجابة الصحيحة: B. تدعم الملفات الموجودة في .claude/rules/ حقل frontmatter بصيغة paths: مع أنماط glob لتحديد نطاق القواعد لمجلدات بعينها.

5. كيف تعطّل الذاكرة التلقائية بالكامل؟

  1. احذف مجلد ~/.claude/projects
  2. اضبط CLAUDE_CODE_DISABLE_AUTO_MEMORY=1
  3. أضِف auto-memory: false إلى CLAUDE.md
  4. استخدم /memory disable auto

الإجابة الصحيحة: B. ضبط CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 يعطّل الذاكرة التلقائية. القيمة 0 تفرض تشغيلها. عدم الضبط = مُفعّلة افتراضيًا.

اختبر معرفتك

/5

اختبار الدرس 3: نظام الذاكرة

اختبر معرفتك بتسلسل الذاكرة الهرمي في Claude Code، وملف CLAUDE.md، وإدارة الذاكرة.

1 / 5

ماذا يفعل أمر /init؟

يحلّل أمر /init مشروعك ويُنشئ نموذجًا لملف CLAUDE.md يتضمن قواعد ومعايير مقترحة.

2 / 5

كيف تضيف قاعدة جديدة إلى الذاكرة بسرعة أثناء المحادثة؟

استخدم أمر /memory (الذي يفتح ملفات الذاكرة في المحرر) أو اطلب ذلك من Claude في سياق المحادثة. أما البادئة # فقد توقّف استخدامها.

3 / 5

كم عدد المستويات في التسلسل الهرمي لذاكرة Claude Code، وأيها له الأولوية العليا؟

يتكوّن التسلسل الهرمي من 7 مستويات: Managed Policy > Project Memory > Project Rules > User Memory > User Rules > Local Project Memory > Auto Memory.

4 / 5

ما الحد الأقصى لعمق عمليات الاستيراد @path/to/file داخل ملف CLAUDE.md؟

تدعم صيغة الاستيراد @import عمليات استيراد متداخلة حتى عمق أقصى يبلغ 5 مستويات لمنع التكرار اللانهائي.

5 / 5

تريد تفضيلات شخصية خاصة بالمشروع لا تُرفَع إلى git. أي ملف ينبغي أن تستخدم؟

ملف CLAUDE.local.md في جذر المشروع مخصص للتفضيلات الشخصية الخاصة بالمشروع. وينبغي استبعاده من git عبر gitignore.

Your score is

0%

مصادر إضافية

المصدر النوع الرابط
Claude Code — توثيق الذاكرة توثيق رسمي code.claude.com/docs/en/memory
Claude Code — الإعدادات والتهيئة توثيق رسمي code.claude.com/docs/en/settings
Claude Code — الوضع التفاعلي (/init، /memory) توثيق رسمي code.claude.com/docs/en/interactive-mode
Claude Code — مرجع واجهة سطر الأوامر توثيق رسمي code.claude.com/docs/en/cli-reference
دليل إعدادات Anthropic توثيق Anthropic docs.anthropic.com — الإعدادات

ما الفرق بين ذاكرة المشروع وذاكرة المستخدم؟

يُلتزَم بذاكرة المشروع وتُشارَك مع الفريق؛ أما ذاكرة المستخدم فتحتفظ بملاحظات شخصية خاصة بالجهاز لا تُدفَع أبدًا.

كم مرة ينبغي أن أراجع الذاكرة؟

كل بضعة أسابيع. احذف الحقائق القديمة كي لا يُوجَّه المساعد أبدًا بقواعد عفا عليها الزمن.

هل يمكن أن تتعارض القواعد؟

نعم، وتفوز الطبقة الأكثر تحديدًا والأكثر موثوقية. القواعد الخاصة بالمسارات تتغلب على القواعد على مستوى المستودع كله.

جمع كل شيء معًا

ذاكرة المشروع القوية لا تتعلق بكتابة المزيد بقدر ما تتعلق بكتابة الأشياء الصحيحة في المكان الصحيح. فحين يلتقط الملف المُلتزَم به الاصطلاحات التي يشترك فيها الجميع، وتحمل الطبقات المحلية التفاصيل الشخصية، يتصرّف المساعد باتّساق للفريق بأكمله دون أن يضطر أحد إلى تكرار نفسه في كل جلسة.

فكّر في ملف الذاكرة كعقد حيّ بينك وبين المساعد. إنه يبيّن كيف بُني المشروع، وكيف يُختبَر، والحفنة من القواعد الأكثر أهمية. أبقِ هذا العقد قصيرًا ومحدّدًا وحديثًا، وسيتّبعه المساعد عن كثب بدلًا من تخمين اصطلاحات لم تدوّنها قط.

والعائد يتراكم مع الوقت. فكل قاعدة تدوّنها مرة واحدة هي تصحيح لن تضطر إلى إجرائه مرة أخرى أبدًا، وكل أمر مُدوَّن هو عمل يمكن للمساعد التحقق منه بنفسه، وكل ملاحظة قديمة تُزيلها هي فرصة أقل ليتصرف المساعد بناءً على شيء لم يعد صحيحًا.

الذاكرة واستمرار السياق في Claude Code: الأسئلة الشائعة

ما الفرق بين ملفات الذاكرة الثابتة والذاكرة التلقائية (Auto Memory)؟

ملفات مثل CLAUDE.md تُكتب يدويًا وتبقى كما هي حتى تُعدَّل، بينما تُنشئ الذاكرة التلقائية ملاحظات من أنماط عملك الفعلي وتتحدّث تدريجيًا بلا تدخل. الأولى مناسبة للقواعد الثابتة، والثانية مناسبة لالتقاط عادات لم تُوثَّق بعد.

كيف يحسم Claude Code التعارض حين تتضارب قاعدتان في مستويين مختلفين؟

يُطبَّق التسلسل الهرمي: القواعد الأكثر تحديدًا (خاصة بمسار فرعي) تتفوق على القواعد العامة للمشروع، وقواعد المشروع تتفوق على التفضيلات الشخصية للمستخدم. عند التعارض المباشر يفوز المستوى الأضيق نطاقًا.

متى يجب تقليم أو تنظيف السياق المحفوظ؟

كلما لاحظت أن المساعد يستشهد بقرارات قديمة لم تعد سارية أو بتقنيات تم استبدالها. القاعدة العملية: راجع الملف كل بضعة أسابيع أو عند أي تغيير معماري كبير، واحذف أي سطر لم يعد صحيحًا بدل تركه يتراكم.

هل يمكن تخصيص قواعد لمجلد فرعي واحد فقط داخل نفس المستودع؟

نعم، القواعد الخاصة بالمسارات مصممة لهذا بالضبط؛ في مستودع أحادي يضم عدة حزم، يمكن لكل مجلد فرعي أن يحمل اصطلاحاته الخاصة دون أن يؤثر ذلك على بقية المشروع.

ماذا يحدث إذا تجاوز حجم الملفات المحفوظة نافذة السياق المتاحة؟

يُعطي المساعد الأولوية للمستويات الأضيق والأحدث، وقد يُسقِط تفاصيل من المستويات الأعمّ إذا لزم الأمر. لهذا يُنصح بإبقاء كل مستوى مختصرًا ومركّزًا بدل حشوه بتفاصيل غير ضرورية.

ذاكرة Claude Code تمنحك سير عمل صلبًا قابلًا للتكرار. احفظ هذا الدليل عن ذاكرة Claude Code في إشاراتك المرجعية، وعُد إلى الخطوات متى احتجت إليها.

ذاكرة Claude Code: أخطاء شائعة يجب تجنبها

حتى المطورون ذوو الخبرة يتعثرون في المشكلات نفسها حين يبدؤون بذاكرة Claude Code. انتبه لهذه الأخطاء فتوفّر وقت تصحيح حقيقيًا.

كيف يحلّ التسلسل الهرمي التعارضات

حين تتعارض طبقتان، تفوز الطبقة الأكثر تحديدًا والأكثر موثوقية. فالسياسة المُدارة التي تضبطها مؤسسة تتجاوز ملف المشروع، وملف المشروع يتجاوز التفضيلات الشخصية، والقاعدة الخاصة بمسار تتجاوز القاعدة العامة على مستوى المستودع كله. ومعرفة هذا الترتيب تجنّبك مطاردة أخطاء «لماذا يتجاهل قاعدتي».

أبقِ كل طبقة تؤدي العمل الذي تجيده أكثر. ضع الاصطلاحات الدائمة على مستوى الفريق حيث يشترك فيها الجميع، وأبقِ المسارات الخاصة بالجهاز أو ملاحظات الأسلوب الشخصية في طبقة لا يُلتزَم بها أبدًا. هذا الفصل يُبقي الملف المشترك نظيفًا ويمنع تسرّب الخصوصيات المحلية لمطوّر واحد إلى جلسات الجميع.

مثال عملي على ملف المشروع

ملف المشروع القوي قصير وسهل المسح بالنظر. افتتحه بجملة أو جملتين تصف المنتج، ثم اذكر أوامر البناء والاختبار والتدقيق (lint) بالضبط كي يتمكن المساعد من التحقق من عمله بنفسه. اتبع ذلك بحفنة من القواعد الأمرية، كلٌّ في سطرها الخاص، مكتوبة بحيث يمكن اتّباعها حرفيًا.

قاوِم الرغبة في كتابة مقال. فجدار من التوجيهات الغامضة أصعب على المساعد في تطبيقه من خمس قواعد حادة عالية الإشارة. راجع الملف كل بضعة أسابيع، واحذف أي شيء لم يعد صحيحًا، وتعامل معه كالكود: التغييرات الصغيرة المُراجَعة تتفوق على وثيقة متضخّمة لا يثق بها أحد.

وأخيرًا، اكتب القواعد كنتائج لا كأمنيات. «استخدم علامات الجدولة (tabs) للمسافة البادئة» و«لا تحرّر أبدًا الملفات في مجلد ناتج البناء» قاعدتان ملموستان وقابلتان للفحص. أما «اكتب كودًا نظيفًا» فلا، وهي تدرّبك بهدوء على توقّع نتائج لا يملك المساعد طريقة موثوقة لتقديمها.

ذاكرة Claude Code: أفضل الممارسات

Exit mobile version