10

مرجع الإعدادات

كل مفتاح في .clean-code-tracker.json، وملف التخصيص المحلي، وإعدادات VS Code، وخيارات سطر الأوامر، وأيها يغلب

6 دقائق قراءة7 أقسام

يمكن ضبط CleanLens في أربعة أماكن:

المكانالنطاقمن يستخدمه
.clean-code-tracker.jsonالمشروع؛ أضفه إلى المستودع لمشاركته مع الفريقالإضافة + سطر الأوامر
.clean-code-tracker.local.jsonشخصي؛ يتجاهله gitالإضافة + سطر الأوامر (ليس مع --preset)
إعدادات VS Code ‏(cleanlens.*)المستخدم أو مساحة العملالإضافة فقط
خيارات سطر الأوامرتشغيل واحدسطر الأوامر فقط

هذا الملف يسرد كل خيار. لمعرفة أي القيم تختار، انظر 11 — دليل الضبط والتخصيص.


1. .clean-code-tracker.json

يوجد في جذر المستودع. أنشئه بالأمر CleanLens: Initialize Project أو يدوياً. إذا لم يكن موجوداً، يُستخدم الإعداد المسبق javascript ويظهر تحذير.

مثال كامل (كل المفاتيح)

json
{
  "version": 1,
  "rules": {
    "maxFunctionLines":  { "enabled": true, "severity": "medium", "limit": 40 },
    "maxFileLines":      { "enabled": true, "severity": "medium", "limit": 400 },
    "maxParameters":     { "enabled": true, "severity": "medium", "limit": 5 },
    "maxComplexity":     { "enabled": true, "severity": "high",   "limit": 10 },
    "maxNestingDepth":   { "enabled": true, "severity": "high",   "limit": 4 },
    "detectDuplicateCode": { "enabled": true, "severity": "medium", "options": { "minLines": 6 } },
    "detectUnusedCode":  { "enabled": true, "severity": "low" },
    "requireClearVariableNames": { "enabled": true, "severity": "low" },
    "requireErrorHandling":      { "enabled": true, "severity": "medium" },
    "forbidEmptyCatchBlocks":    { "enabled": true, "severity": "high" },
    "forbidHardcodedSecrets":    { "enabled": true, "severity": "critical" },
    "forbidDebugStatements":     { "enabled": true, "severity": "low" },
    "requireSingleResponsibility": { "enabled": true, "severity": "medium", "options": { "maxMethods": 10 } },
    "requireDocumentationForComplexCode": { "enabled": true, "severity": "low", "options": { "complexityThreshold": 15 } }
  },
  "exclude": ["node_modules/**", "dist/**", "*.min.js", "scripts/**"],
  "excludeGenerated": true,
  "excludeMigrations": true,
  "excludeLockFiles": true,
  "mergeSameNameAuthors": true,
  "developers": [
    { "displayName": "Musa Alahmed", "emails": ["musa@work.com", "musa.personal@gmail.com"] }
  ],
  "analysis": {
    "maxCommits": 500,
    "since": "2026-01-01"
  },
  "scoring": {
    "categoryScales": { "duplication": 15, "structure": 45, "hygiene": 38 },
    "weights": { "duplication": 0.3, "structure": 0.45, "hygiene": 0.25 },
    "minLinesForRanking": 1000
  }
}

المفاتيح

المفتاحالنوعالافتراضيالوصف
version1— (إلزامي)نسخة البنية. يجب أن تكون 1 بالضبط.
rulesكائن— (إلزامي)إدخال لكل معرّف قاعدة. المعرّفات غير المعروفة خطأ. القاعدة غير الموجودة تكون معطلة. انظر 06.
rules.<id>.enabledمنطقي— (إلزامي)تشغيل القاعدة أو إيقافها.
rules.<id>.severitylow/medium/high/critical— (إلزامي)الوزن 1/3/5/8؛ وأيضاً مستوى التنبيه في المحرر.
rules.<id>.limitرقم > 0حسب القاعدةالحد للقواعد الرقمية.
rules.<id>.options{ [k]: number | boolean }حسب القاعدةminLines وmaxMethods وcomplexityThreshold.
excludeمصفوفة نصوص[]أنماط glob إضافية. تُضاف إلى القائمة المدمجة، ولا تستبدلها أبداً. انظر 05 — صيغة glob.
excludeGeneratedمنطقيtrueتخطي ملفات linguist-generated والملفات التي تقول أسطرها الخمسة الأولى "generated" / "do not edit".
excludeMigrationsمنطقيtrueاستثناء **/migrations/**.
excludeLockFilesمنطقيtrueاستثناء package-lock.json وyarn.lock وpnpm-lock.yaml.
mergeSameNameAuthorsمنطقيtrueدمج الهويات التي تبدو لنفس الشخص تلقائياً. انظر 04.
developers{ displayName, emails[] }[][]إجبار عناوين بريد على أن تكون مطوّراً واحداً باسم عرض ثابت.
analysis.maxCommitsرقم ≥ 0500إعادة تشغيل أحدث N من الـ commits غير الدمجية. 0 = السجل كاملاً.
analysis.sinceنصلا يوجدإعادة تشغيل الـ commits بعد هذا التاريخ فقط. أي قيمة يقبلها git log --since.
scoring.categoryScales{ duplication?, structure?, hygiene? }15 / 45 / 38الكثافة التي تنخفض عندها الدرجة الفرعية إلى حوالي 37. الأكبر = أكثر تساهلاً.
scoring.weights{ duplication?, structure?, hygiene? }0.30 / 0.45 / 0.25حصة كل درجة فرعية في الدرجة النهائية. يجب أن يكون مجموعها 1.
scoring.minLinesForRankingرقم1000الأسطر المحللة المطلوبة لدخول الترتيب.
scoring.severityWeights{ low?, medium?, high?, critical? }1 / 3 / 5 / 8مقبول، لكنه لا يؤثر حالياً في الدرجات (انظر 08). استخدم severity للقاعدة بدلاً منه.

الكائنات الجزئية مقبولة في scoring.*: المفاتيح الناقصة تحتفظ بقيمها الافتراضية.

التحقق

يُتحقق من الملف عند تحميله (configValidator.ts). أي خطأ يوقف التحليل مع قائمة بكل المشاكل، مثلاً:

text
.clean-code-tracker.json is invalid:
- Rule "maxComplexity": "severity" must be one of critical | high | medium | low.
- Unknown rule: "maxLineLength". Supported rules: maxFunctionLines, …

ما يُفحص: version === 1؛ وrules كائن من معرّفات معروفة، لكل منها enabled منطقي، وseverity صالحة، وlimit موجب إن وُجد، وoptions أرقام/قيم منطقية؛ وexclude مصفوفة نصوص؛ والخيارات الأربعة منطقية؛ وdevelopers بالشكل الصحيح؛ وscoring وanalysis كائنات؛ وanalysis.maxCommits رقم غير سالب؛ وanalysis.since نص.

يجب أن يكون الملف JSON صارماً (بلا تعليقات ولا فواصل زائدة في النهاية).


2. .clean-code-tracker.local.json

تخصيص شخصي، يتجاهله .gitignore في هذا المستودع (أضفه إلى مستودعك أيضاً). يُقرأ منه مفتاحان فقط:

المفتاحالسلوك
rulesكل إدخال يُدمج دمجاً سطحياً مع قاعدة المشروع: { ...project, ...local }
excludeيُضاف إلى قائمة المشروع

مثال — إسكات قاعدتين لنفسك، وتخطي مجلد تجارب:

json
{
  "rules": {
    "forbidDebugStatements": { "enabled": false },
    "maxComplexity": { "limit": 15 }
  },
  "exclude": ["playground/**"]
}

ملاحظات:

  • الملف المحلي لا يُتحقق منه. خطأ إملائي في معرّف قاعدة يضيف قاعدة مجهولة لا يقرؤها شيء. تحقق من الكتابة جيداً.
  • المفاتيح الأخرى (scoring وanalysis وdevelopers، …) تُتجاهل.
  • التخصيص المحلي يغيّر بصمة الإعدادات، فيلغي ذاكرتك المؤقتة أيضاً.
  • التخصيصات المحلية تجعل أرقامك مختلفة عن أرقام زملائك. استخدمها للتجارب، وليس للتقارير الرسمية.

3. إعدادات VS Code

اضبطها من Settings ← Extensions ← CleanLens، أو في settings.json (للمستخدم، أو .vscode/settings.json لمساحة العمل).

الإعدادالنوعالافتراضييقابل
cleanlens.liveDiagnosticsمنطقيtrueإعادة فحص الملفات المفتوحة أثناء الكتابة
cleanlens.excludeمصفوفة نصوص[]يُضاف إلى exclude
cleanlens.excludeGeneratedمنطقيtrueexcludeGenerated
cleanlens.excludeMigrationsمنطقيtrueexcludeMigrations
cleanlens.excludeLockFilesمنطقيtrueexcludeLockFiles
cleanlens.mergeSameNameAuthorsمنطقيtruemergeSameNameAuthors
cleanlens.analysis.maxCommitsرقم500analysis.maxCommits
cleanlens.analysis.sinceنص""analysis.since (الفارغ = غير محدد)
cleanlens.scoring.minLinesForRankingرقم1000scoring.minLinesForRanking
cleanlens.cache.enabledمنطقيtrueاستخدام الذاكرة المؤقتة لكل commit
cleanCodeTracker.liveDiagnosticsمنطقيtrueاسم قديم لـ cleanlens.liveDiagnostics؛ يُقرأ فقط إذا ضُبط صراحة

مثال على settings.json لمساحة العمل:

json
{
  "cleanlens.analysis.maxCommits": 0,
  "cleanlens.exclude": ["scripts/**", "**/fixtures/**"],
  "cleanlens.scoring.minLinesForRanking": 500
}

4. خيارات سطر الأوامر

الخيارالأثر
[path]المستودع المراد تحليله (افتراضياً: المجلد الحالي)
--preset <name>استخدام إعداد مسبق (javascript/react/python/django) بدلاً من ملفي الإعدادات
--max-commits <n>يتجاوز analysis.maxCommits
--full-historyمثل --max-commits 0
--since <date>يتجاوز analysis.since
--no-cacheتعطيل الذاكرة المؤقتة
--json و--markdown و--violations و--fail-on <sev>المخرجات ورمز الخروج؛ انظر 13 — أداة سطر الأوامر

5. الأولوية — أي قيمة تغلب

في سطر الأوامر

text
built-in defaults
  ◀ .clean-code-tracker.json         (or --preset, which replaces both files)
  ◀ .clean-code-tracker.local.json   (rules + exclude only; skipped with --preset)
  ◀ --max-commits / --full-history / --since

أي: الافتراضيات المدمجة، ثم ملف المشروع (أو --preset الذي يحل محل الملفين)، ثم الملف المحلي (القواعد والاستثناءات فقط، ويُتخطى مع --preset)، ثم خيارات سطر الأوامر، والأخير يغلب.

في إضافة VS Code

text
built-in defaults
  ◀ .clean-code-tracker.json
  ◀ .clean-code-tracker.local.json   (rules + exclude only)
  ◀ VS Code settings

جدول سريع

الخيارملف الإعداداتالملف المحليإعداد VS Codeخيار سطر الأوامر
rules✅✅ (يُدمج)—--preset يستبدلها
exclude✅✅ (يُضاف)✅ (يُضاف)—
excludeGenerated / Migrations / LockFiles✅ (سطر الأوامر)—✅ (يغلب)—
mergeSameNameAuthors✅ (سطر الأوامر)—✅ (يغلب)—
developers✅———
analysis.maxCommits✅ (سطر الأوامر)—✅ (يغلب)✅ (يغلب)
analysis.since✅—✅ إذا لم يكن فارغاً✅ (يغلب)
scoring.categoryScales / weights✅———
scoring.minLinesForRanking✅ (سطر الأوامر)—✅ (يغلب)—
الذاكرة المؤقتة——✅--no-cache
التنبيهات المباشرة——✅—

6. ملفات أخرى تقرؤها CleanLens

الملفيُستخدم لـ
.gitignore (في الجذر فقط)يُضاف إلى قائمة الاستثناءات (بأفضل جهد، بلا نفي)
.gitattributes (في الجذر فقط)مسارات linguist-generated تُستثنى
.mailmapيطبّقه Git نفسه على أسماء الكتّاب وعناوينهم
manage.py وpyproject.toml وrequirements.txt وsetup.py وpackage.jsonاقتراح الإعداد المسبق في Initialize Project

7. الإعدادات المسبقة

الإعداد المسبقالقواعداستثناءات إضافية (فوق القائمة الأساسية)
javascriptالقواعد الأساسية—
reactالقواعد الأساسية*.stories.* وstorybook-static/** و**/__tests__/** و*.test.* و*.spec.*
pythonالقواعد الأساسية__pycache__/** و*.pyc و.mypy_cache/** و.pytest_cache/** و**/tests/** وtest_*.py وconftest.py
djangoالقواعد الأساسية، وmaxFileLines.limit = 500قائمة Python + **/migrations/** وmanage.py

قائمة الاستثناءات الأساسية في كل إعداد مسبق: node_modules/** و.venv/** وvenv/** وmigrations/** وdist/** وbuild/** وcoverage/** وstaticfiles/** و*.min.js و*.generated.*.