Coverage Studio على سطر الأوامر 2.2026.4 — الملف الذي قاسه محرّكان يُحسب مرة واحدة، من أي مجلد بدأت الأمر
2026-10-04
أُصلح
- المجلد الذي تبدأ منه الأمر لا يقرّر ما الذي يعنيه التقرير. تُنسب الإصدارة 2.2026.3 المسارات النسبية للتقرير إلى المجلد الذي كُتب فيه ذلك التقرير — لكن للأمر الذي بدأ في مكان آخر فقط. أما إذا شُغّل من جذر الشجرة التي يقيسها، وهو المكان الذي يُشغَّل منه أمر التغطية عادةً، فإن المسار النسبي كان لا يزال يُحَلّ تجاه ذلك المجلد، فيُحسب مرة ثانية ملفٌّ سبق أن سمّاه llvm-cov بمساره الكامل: فشجرة من 5٬258 سطرًا كانت تُقرأ 5٬836. الآن لا يقرّر سوى
--cwd وموضع التقرير نفسه. والإصلاح نفسه موجود في المحرّرَين، حيث كان ذلك المجلد هو الذي بدأ منه VS Code أو Visual Studio. export --format json كان يكتب التشغيلة فوق إعداداتك. فملفه كان fucini-coverage.json — وهو الاسم الذي تُقرأ منه الإعدادات — ولذلك كان التصدير، في مجلد مُهيَّأ على النحو المعتاد، يتلف العتبات التي حكم بها لتوّه. تُكتب التشغيلة الآن في coverage-run.json، ويرفض export وbadge أي --out يسمّي ملف الإعدادات. --cwd يقبل المجلد مهما كتبته. كان المجلد النسبي — --cwd .، --cwd ../tree — يُؤخذ كما كُتب ويُقرأ بقواعد مسارات خاطئة: ففي Windows كان يجيب بأن ملف إعدادات نصفه POSIX ونصفه Windows لا يمكن قراءته، ولم يكن يجد أي تقرير. كما لم يعد الفاصل الأخير جزءًا من المجلد. - الرايةُ التي لم يعلنها أحد ليست تقريرًا. كان
summary -o out.json يأخذ -o على أنه تقرير ويقول إنه لا وجود لهذا الملف. والقصيرتان هما -h و-v فقط؛ ولا يزال -- يمرّر ملفًا يبدأ اسمه بشَرطة، أما الراية المكتوبة قبل الأمر فتُسمَّى في رسالة الخطأ بدل أن تُقابَل بالمساعدة كاملة. check --json يقول ما يقوله رمز خروجه. فمن دون أي عتبة مضبوطة كان يكتب "passed": false إلى جانب رمز الخروج 0، فكان خط الإنتاج الذي يقرأ JSON بدل رمز الخروج يُفشل تشغيلةً أجازها الأمر. وpassed هو رمز الخروج في كلمة؛ أما الذي يقول إنه لم تكن هناك بوابة أصلًا فهو configured. ويُرفض --lines "" الفارغ بدل أن يُطفئ تلك البوابة بصمت. - المقارنة تضع خط الأساس حيث تضع التشغيلة. كان
pathRemap والجذر الذي يعلنه التقرير يُطبَّقان على التشغيلة دون خط الأساس، فلم يكن خط أساس مكتوب على خادم بناء يقابل شيئًا، وكانت المقارنة تُعلن أن شيئًا لم يتغيّر إلى جانب مجموع تغيّر بوضوح.
Coverage Studio على سطر الأوامر 2.2026.3 — الملف الذي قاسه محرّكان صار ملفًا واحدًا من جديد
2026-10-04
أُصلح
- المسارات النسبية في التقرير تُنسب إلى المجلد الذي كُتب فيه ذلك التقرير. يكتب llvm-cov المسار الكامل للملف، أما gcovr فيكتبه نسبةً إلى مجلد البناء الذي يقع فيه تقريره. وبإعطاء تقريري شجرة واحدة، كان
summary يسرد كل ملف مشترك بينهما مرتين — مرة بأرقام كل محرّك — ويضيف كلتيهما إلى المجموع، لأن المسار النسبي لم يكن له جذر يُحَلّ تجاهه فكان يُحَلّ تجاه المجلد الذي تصادف وجود الصدفة فيه. فكانت شجرة من 5٬258 سطرًا تُعلَن 5٬836 سطرًا، والزيادة تنتمي إلى ملفات تحت مسار لا يحتوي أيًّا منها. أصبح كل تقرير الآن مُنسَبًا إلى مجلده الخاص والمجلدات التي تعلوه، حتى المجلد الذي يعمل فيه الأمر، كما تفعل الإصدارتان بالفعل — فيتلاقى الاثنان كمجموعة ملفات واحدة، دون قاعدة pathRemap لكل مجلد بناء. - ملف الإعدادات الذي يبدأ بعلامة ترتيب البايتات كان يُرفض هو أيضًا. قد يكتبها محرّر على Windows قبل النص؛ ولم تُعَدّ جزءًا من JSON.
- المخرجات المُمرَّرة إلى قارئ يتوقف مبكرًا تنتهي بهدوء. كان
summary المُمرَّر إلى head، أو إلى Select-Object -First في PowerShell، يموت بـ EPIPE غير معالَج وبتتبُّع للمكدّس. وإغلاق القارئ للأنبوب خياره هو، لا فشل من الأمر: فهو ينتهي الآن برمز الخروج الذي كان قد بلغه.
Coverage Studio على سطر الأوامر 2.2026.1 — ملف الإعدادات الذي يحتوي على أنماط يُقرأ الآن
2026-10-04
أُصلح
- كان ملف الإعدادات الذي يحتوي على أنماط يُرفض. عند وجود
**/*.lcov.info في أحد مسارات fuciniCoverage.coverageFile.paths و**/coverage.json في المسار التالي، كان كل أمر ينتهي بالرسالة is not JSON: إذ كان ما بينهما يُعدّ تعليقًا. يُقرأ الملف الآن كما تقرؤه محرِّرات الشيفرة، بما في ذلك تعليق بعد قيمة وفاصلة قبل قوس إغلاق.
Coverage Studio على سطر الأوامر 2.2026.0 — fucini-coverage، الإصدار الأول
2026-10-04
أُضيف
- القارئ على سطر الأوامر، مجانًا.
npm install -g fucini-coverage — القارئ نفسه الذي في الإصدارين، للأماكن التي لا محرر فيها. حزمة واحدة وسلوك واحد على Windows وLinux وWSL وmacOS، مع Node 20 أو أحدث.
check، البوابة. رمز الخروج 1 تحت عتبة على الأسطر أو الفروع أو الدوال أو MC/DC أو الشروط أو المناطق أو الطفرات أو الدرجة المرجّحة، من الإعدادات أو من سطر الأوامر؛ و--new-code 80 --base-ref origin/main يحكم على الأسطر التي غيّرها فرع، من git diff تشغّله الأداة؛ و--require-reasons يُفشل علامة استبعاد بلا سبب.
summary وexport وreport وbadge وcompare. المجاميع وكل ملف؛ والتشغيل بصيغة CSV لكل ملف أو لكل دالة، أو Markdown، أو LCOV، أو Cobertura، أو SARIF، أو قائمة الاستبعادات، أو شارة، أو JSON الخاص بـ Fucini؛ وتقرير HTML متعدد الصفحات؛ والشارة ملوّنة بمقياس الإعدادات؛ وهذا التشغيل مقارنةً بخط أساس، التراجعات أولًا، مع --fail-on-regression لفحص طلب سحب.
mcp، لوكيل ذكاء اصطناعي. الأدوات الست التي في الإصدارين، تُقدَّم من التشغيل على 127.0.0.1 خلف رمز مميز، مع طباعة المدخل الخاص بملف mcp.json للعميل.
- ملف الإعدادات الخاص بإصدار Visual Studio.
fucini-coverage.json بجوار الكود، بمفاتيح fuciniCoverage.* من إعدادات VS Code؛ ويليه .vscode/settings.json. تُسمّى التقارير ملفاتٍ أو مجلدات أو أنماطًا، ويُفكّ ضغط .gz، وكل أمر يوثّق نفسه: fucini-coverage help <command>.
Coverage Studio لـ VS Code 2.2026.2 — الفترة التجريبية تبدأ مع ردّ خادم التراخيص
2026-10-04
تغيّر
- تبدأ الفترة التجريبية لتثبيت جديد مع أول ردّ من خادم التراخيص. إلى أن يصل الامتداد إلى fucini.software مرة واحدة يعمل على مستوى Community ويذكر السبب. التثبيت الذي هو في فترته التجريبية بالفعل، أو لديه ترخيص، لا يلاحظ شيئًا.
- لا فترة تجريبية في حاوية تطوير أو Codespace. يبدأ الامتداد هناك على مستوى Community؛ ويفتح رمزُ اشتراك أو مفتاح أو تصريح الأيام السبعة كل شيء.
- يعرف سجلّ الاستخدام الجهاز بتجزئة ثانية، هي تجزئة معرّف نظام التشغيل نفسه. لا تُرسَل سوى التجزئة؛ انظر سياسة الخصوصية.
Coverage Studio لـ Visual Studio 2.2026.1 — إصلاحات صغيرة
2026-10-04
أُصلح
- إصلاحات صغيرة. إصدار صيانة: إصلاحات داخلية صغيرة، ولا شيء يغيّر ما تراه أو طريقة الاستخدام.
Coverage Studio لـ VS Code 2.2026.1 — إصلاحات صغيرة
2026-10-04
أُصلح
- إصلاحات صغيرة. إصدار صيانة: إصلاحات داخلية صغيرة، ولا شيء يغيّر ما تراه أو طريقة الاستخدام.
Coverage Studio لـ Visual Studio 2.2026.0 — التغطية المعروضة على الشاشة، لوكلاء الذكاء الاصطناعي
2026-10-04
أُضيف
- التغطية المعروضة على الشاشة، لوكلاء الذكاء الاصطناعي. كان الوكيل الذي يكتب الاختبارات يستطيع تشغيلها وقراءة نسبة مئوية؛ ولم يكن يستطيع أن يسأل عمّا يعرفه Visual Studio. ست أدوات تجيب عن ذلك، بكلمات يستطيع الوكيل أن يعمل بها:
coverage_summary وcoverage_gaps وtests_for_line وpatch_coverage وcoverage_delta وtest_run_command. والوكيل الذي يتحدث MCP يبلغها عبر خادم يشغّله Visual Studio حين يكون fuciniCoverage.mcp.enabled مفعّلًا — معطّل افتراضيًا، على 127.0.0.1 فقط، خلف رمز مميّز خاص بك، ومغلق أمام صفحات الويب. ويضع Copy MCP Server Configuration مدخل العميل في الحافظة. - الأرقام نفسها التي على الشاشة. تجيب الأدوات من التشغيل المحمَّل — الاستبعادات نفسها، وإعادة تعيين المسارات نفسها — فالوكيل الذي طُلب منه تغطية ثغرات دالة، والمراجع الذي ينظر إلى الهامش، يتحدثان عن الأسطر نفسها.
تغيّر
- خطة المفتاح تقرّر في Visual Studio ما تقرّره في VS Code. الخطة التي لا تشمل ميزة — MC/DC، وتقرير HTML، وأسماء الاختبارات التي شغّلت سطرًا — كانت تحجبها في VS Code لا هنا. صار الإصداران يقرآن الجدول نفسه: الميزة التي لا تشملها الخطة تُحجب، ويقول أمرها ذلك.
- الحد الأدنى لرقم النسخة الذي يطلبه خادم التراخيص يسري هنا أيضًا. يحمل الإصداران رقم النسخة نفسه ابتداءً من 2.2026.0، فالبناء الأقدم من ذلك الحد الأدنى يطلب التحديث، كما يفعل إصدار VS Code.
Coverage Studio لـ VS Code 2.2026.0 — التغطية المعروضة على الشاشة، لوكلاء الذكاء الاصطناعي
2026-10-04
أُضيف
- التغطية المعروضة على الشاشة، لوكلاء الذكاء الاصطناعي. كان الوكيل الذي يكتب الاختبارات يستطيع تشغيلها وقراءة نسبة مئوية؛ ولم يكن يستطيع أن يسأل عمّا يعرفه المحرر. ست أدوات تجيب عن ذلك، بكلمات يستطيع الوكيل أن يعمل بها:
coverage_summary وcoverage_gaps وtests_for_line وpatch_coverage وcoverage_delta وtest_run_command. وكيل VS Code نفسه يملكها أدواتٍ لنموذج اللغة، دون أي إعداد. وكل وكيل آخر يتحدث MCP يبلغها عبر خادم تشغّله الإضافة حين يكون fuciniCoverage.mcp.enabled مفعّلًا — معطّل افتراضيًا، على 127.0.0.1 فقط، خلف رمز مميّز خاص بك، ومغلق أمام صفحات الويب. ويضع Copy MCP Server Configuration مدخل العميل في الحافظة. - الأرقام نفسها التي على الشاشة. تجيب الأدوات من التشغيل المحمَّل — الاستبعادات نفسها، وإعادة تعيين المسارات نفسها — فالوكيل الذي طُلب منه تغطية ثغرات دالة، والمراجع الذي ينظر إلى الهامش، يتحدثان عن الأسطر نفسها.
Coverage Studio لـ Visual Studio 1.2026.22 — الملف الذي قاسه محرّكان ملف واحد
2026-10-04
أُصلح
- الملف الذي قاسه محرّكان ملف واحد. يكتب llvm-cov المسار الكامل للملف، أما gcovr فيكتبه نسبةً إلى مجلد البناء الذي يقع فيه تقريره. ويُنسب المسار النسبي إلى مجلد التقرير نفسه والمجلدات التي تعلوه — غير أن المحلِّل كان قبل ذلك يسأل: هل يوجد هذا المسار كما هو؟ وهذا السؤال يُجاب عليه من المجلد الذي بدأ منه Visual Studio نفسه. فإن كان ذلك المجلد يحوي الملف، بقي المسار نسبيًا: صار للملف اسمان، ووردَ مرتين في نافذة Coverage، وحُسب مرتين في المجاميع. فشجرة من 5٬258 سطرًا كانت تُقرأ 5٬836. أما المسار الذي لا يسمّي موضعًا خاصًا به فلم يعد يُسأل عنه أصلًا؛ بل يُنسب إلى حيث كُتب التقرير، والصف يقول ذلك.
Coverage Studio لـ VS Code 1.2026.23 — الملف الذي قاسه محرّكان ملف واحد، ووضع الهامش الذي تختاره يبقى خارج إعداداتك
2026-10-04
أُصلح
- الملف الذي قاسه محرّكان ملف واحد. يكتب llvm-cov المسار الكامل للملف، أما gcovr فيكتبه نسبةً إلى مجلد البناء الذي يقع فيه تقريره. ويُنسب المسار النسبي إلى مجلد التقرير نفسه والمجلدات التي تعلوه — غير أن المحلِّل كان قبل ذلك يسأل: هل يوجد هذا المسار كما هو؟ وهذا السؤال يُجاب عليه من المجلد الذي بدأ منه مضيف الامتدادات، وهو بعد
code . جذر مشروعك. فكان المسار يبقى نسبيًا: صار للملف اسمان، ووردَ مرتين في عرض Coverage، وحُسب مرتين في المجاميع. فشجرة من 5٬258 سطرًا كانت تُقرأ 5٬836. أما المسار الذي لا يسمّي موضعًا خاصًا به فلم يعد يُسأل عنه أصلًا؛ بل يُنسب إلى حيث كُتب التقرير، والصف يقول ذلك. - وضع الهامش الذي تختاره يبقى طوال الجلسة، وإعداداتك تبقى كما كتبتها. كان اختيار وضع من شريط الحالة أو من القائمة أو عبر Toggle Coverage Painting يكتبه في
settings.json — وهو ملف خاضع لإدارة الإصدارات في كثير من المشاريع، يعيد كتابتَه زرٌّ وُضع ليُضغط مرتين في الدقيقة. أصبح الاختيار يحيا طوال الجلسة، ولا يزال الوضع الذي كتبته في إعداداتك هو الغالب عند فتح النافذة.
Coverage Studio لـ Visual Studio 1.2026.21 — هل سيلاحظ اختبار؟ تشغيل طفرات عند المؤشر
2026-10-03
أُضيف
- Run Mutation Tests Here. التغطية تقول إن سطرًا نُفّذ؛ وأداة الطفرات تقول هل كان اختبار سيلاحظ أنه خاطئ. الدالة التي فيها المؤشر — أو الأسطر المحددة، أو الملف — هي ما يُطلب من مشغّل المجلد أن يُجري عليه الطفرات، ويُحمَّل تقريره إلى جانب التغطية المعروضة على الشاشة: Stryker.NET لـ C#، وStrykerJS لـ JavaScript وTypeScript، وPIT مع Maven لـ Java. تشغيل الطفرات لمشروع يستغرق ساعة؛ ولدالة واحدة دقيقة.
Coverage Studio لـ VS Code 1.2026.22 — هل سيلاحظ اختبار؟ تشغيل طفرات عند المؤشر
2026-10-03
أُضيف
- Run Mutation Tests Here. التغطية تقول إن سطرًا نُفّذ؛ وأداة الطفرات تقول هل كان اختبار سيلاحظ أنه خاطئ. الدالة التي فيها المؤشر — أو الأسطر المحددة، أو الملف — هي ما يُطلب من مشغّل المجلد أن يُجري عليه الطفرات، ويُحمَّل تقريره إلى جانب التغطية المعروضة على الشاشة: Stryker.NET لـ C#، وStrykerJS لـ JavaScript وTypeScript، وPIT مع Maven لـ Java. تشغيل الطفرات لمشروع يستغرق ساعة؛ ولدالة واحدة دقيقة.
Coverage Studio لـ Visual Studio 1.2026.20 — التطبيق نفسه، مع التغطية
2026-10-03
أُضيف
- Run App with Coverage… يقيس ما يبلغه شخص، لا ما تفعله الاختبارات فقط: يُشغَّل تطبيق .NET الخاص بالمجلد تحت
dotnet-coverage من Microsoft، في نافذة أوامر خاصة به، ويعمل إلى أن يُغلق. ثم يُحمَّل ما جرى التجوّل فيه كأي تشغيل، وفي جلسة تغطية يُضاف إلى ما شغّلته الاختبارات. يحتاج إلى dotnet tool install --global dotnet-coverage.
Coverage Studio لـ VS Code 1.2026.21 — التطبيق نفسه، مع التغطية
2026-10-03
أُضيف
- Run App with Coverage… يقيس ما يبلغه شخص، لا ما تفعله الاختبارات فقط: يُشغَّل تطبيق .NET الخاص بالمجلد تحت
dotnet-coverage من Microsoft، في نافذة أوامر خاصة به، ويعمل إلى أن يُغلق. ثم يُحمَّل ما جرى التجوّل فيه كأي تشغيل، وفي جلسة تغطية يُضاف إلى ما شغّلته الاختبارات. يحتاج إلى dotnet tool install --global dotnet-coverage.
Coverage Studio لـ Visual Studio 1.2026.19 — نواتج بناء بصيغة Zip من GitHub وGitLab
2026-10-03
أُضيف
- خط أساس CI من ناتج بناء بصيغة zip. ينشر GitHub وGitLab ناتج البناء (artifact) أرشيفًا. حيث يسمّي
baseline.report واحدًا — عنوان URL، أو ملف zip على القرص — يُفتح ويُحتفظ بالتقرير الذي فيه: العضو المسمّى بعد # (ci/artifact.zip#coverage/lcov.info)، وإلا فالملف الوحيد في الأرشيف، وإلا فملفه الوحيد الذي يشبه تقريرًا.
Coverage Studio لـ VS Code 1.2026.20 — نواتج بناء بصيغة Zip من GitHub وGitLab
2026-10-03
أُضيف
- نواتج بناء بصيغة Zip من GitHub وGitLab. ينشر CI ناتج بناء (artifact)، وناتج البناء أرشيف. صار ملف zip المجلوب يُفتح ويُحتفظ بالتقرير الذي فيه — العضو المسمّى بعد
# في عنوان URL (…/zip#coverage/lcov.info)، وإلا فالملف الوحيد في الأرشيف، وإلا فملفه الوحيد الذي يشبه تقريرًا. لعنوان URL في coverageFile.paths، ولـ baseline.report، ولخط أساس هو ملف zip على القرص.
أُصلح
- لم يكن يُعثر على ملفات خط أساس Cobertura تحت
<source> الخاص بالتقرير نفسه. كانت المقارنة تقول 0 file(s) moved إلى جانب مجموع قد تغيّر. صار الجذر الذي يسمّيه التقرير يُستخدم، كما هو الحال مع تقرير يُحمَّل.
Coverage Studio لـ Visual Studio 1.2026.18 — الشفرة الجديدة حسب المؤلف وحسب التاريخ
2026-10-03
أُضيف
- الشفرة الجديدة حسب المؤلف وحسب التاريخ. كانت الشفرة الجديدة هي الأسطر المتغيّرة مقابل مرجع git. إعدادان يسألان ما لا يستطيعه المرجع:
fuciniCoverage.gitDiff.author — الأسطر التي كتبها شخص واحد — وfuciniCoverage.gitDiff.since — الأسطر المكتوبة منذ يوم معيّن. يُقرأ كلاهما من git blame ويسريان على تغطية الفرق وعلى بوابة الشفرة الجديدة.
Coverage Studio لـ VS Code 1.2026.19 — الشفرة الجديدة حسب المؤلف وحسب التاريخ
2026-10-03
أُضيف
- الشفرة الجديدة حسب المؤلف وحسب التاريخ. كانت الشفرة الجديدة هي الأسطر المتغيّرة مقابل مرجع git. إعدادان يسألان ما لا يستطيعه المرجع:
fuciniCoverage.gitDiff.author — الأسطر التي كتبها شخص واحد — وfuciniCoverage.gitDiff.since — الأسطر المكتوبة منذ يوم معيّن. يُقرأ كلاهما من git blame ويسريان على تغطية الفرق وعلى بوابة الشفرة الجديدة.
Coverage Studio لـ Visual Studio 1.2026.17 — اختبار واحد مع التغطية، في Go وRust
2026-10-02
أُضيف
- Run This Test with Coverage يقرأ Go وRust. في ملف Go يعمل
func TestXxx الذي عنده المؤشر وحده، في حزمته وباسمه الدقيق — go test ./pkg/calc -run "^TestTotal$". وفي ملف Rust تعمل دالة #[test] بمسارها في crate، مع --exact؛ وفي mod، اختبارات تلك الوحدة؛ واختبار تكامل تحت tests/، في ملفه الثنائي الخاص.
Coverage Studio لـ VS Code 1.2026.18 — اختبار واحد مع التغطية، في Go وRust
2026-10-02
أُضيف
- Run This Test with Coverage يقرأ Go وRust. في ملف Go يعمل
func TestXxx الذي عنده المؤشر وحده، في حزمته وباسمه الدقيق — go test ./pkg/calc -run "^TestTotal$". وفي ملف Rust تعمل دالة #[test] بمسارها في crate، مع --exact؛ وفي mod، اختبارات تلك الوحدة؛ واختبار تكامل تحت tests/، في ملفه الثنائي الخاص.
Coverage Studio لـ Visual Studio 1.2026.16 — تغطية الشروط في GCC 14، سطرًا بسطر
2026-10-02
أُضيف
- تغطية الشروط في GCC 14، سطرًا بسطر. كان
-fcondition-coverage يُقرأ عدّادين لكل ملف؛ صار كل شرط يُعلَّم على سطره ويُسمّى في تلميح التمرير — الشرط 1 لم يكن صحيحًا قط، الشرط 0 لم يأخذ أيًّا من القيمتين قط — من JSON الخاص بـ gcov ومن قائمته النصية. يضع threshold.conditions بوابة عليها، وفي Copy Coverage Summary عمود Conditions، ويقبل badge.metric القيمة conditions، ويقبل البحث conditions < 80.
أُصلح
- كان رقم فروع الدالة يعدّ نواتج شروطها أيضًا.
branches 8/12 حيث قالت الأداة 4 من 6. تُترك الشروط خارجه هناك، كما في رقمَي الملف والتشغيل.
Coverage Studio لـ VS Code 1.2026.17 — تغطية الشروط في GCC 14، سطرًا بسطر
2026-10-02
أُضيف
- تغطية الشروط في GCC 14، سطرًا بسطر. كان
-fcondition-coverage يُقرأ عدّادين لكل ملف؛ صار كل شرط يُعلَّم على سطره ويُسمّى في تلميح التمرير — الشرط 1 لم يكن صحيحًا قط، الشرط 0 لم يأخذ أيًّا من القيمتين قط — من JSON الخاص بـ gcov ومن قائمته النصية. يضع threshold.conditions بوابة عليها، وفي Copy Coverage Summary عمود Conditions، ويقبل badge.metric القيمة conditions، ويقبل البحث conditions < 80.
أُصلح
- كان رقم فروع الدالة يعدّ نواتج شروطها أيضًا.
branches 8/12 حيث قالت الأداة 4 من 6. تُترك الشروط خارجه هناك، كما في رقمَي الملف والتشغيل.
Coverage Studio لـ Visual Studio 1.2026.15 — عرض Coverage يتبع المحرر
2026-10-02
أُضيف
- عرض Coverage يتبع المحرر. الملف الذي تنظر إليه يُميَّز في الشجرة، وتُفتح المجلدات التي فوقه ويُمرَّر صفه إلى مجال الرؤية. و
fuciniCoverage.coverageView.followActiveEditor يوقف ذلك.
Coverage Studio لـ VS Code 1.2026.16 — عرض Coverage يتبع المحرر
2026-10-02
أُضيف
- عرض Coverage يتبع المحرر. الملف الذي تنظر إليه يُميَّز في الشجرة، وتُفتح المجلدات التي فوقه ويُمرَّر صفه إلى مجال الرؤية. و
fuciniCoverage.coverageView.followActiveEditor يوقف ذلك.
Coverage Studio لـ Visual Studio 1.2026.14 — علامات استبعاد للفروع فقط، وتغطية الفروع في تقارير .NET
2026-10-02
أُضيف
- علامات استبعاد للفروع فقط وعلامات gcovr.
LCOV_EXCL_BR_LINE وLCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP تُخرج الفروع الواقعة على أسطرها من العدّ وتُبقي الأسطر فيه؛ وLCOV_EXCL_EXCEPTION_BR_LINE لا يُخرج إلا الأذرع التي يبلغها استثناء. وتُقرأ كل علامة ببادئات gcovr أيضًا: GCOVR_EXCL_LINE وGCOVR_EXCL_START وGCOV_EXCL_BR_LINE والبقية.
أُصلح
- كان تقرير .NET لا يُظهر تغطية فروع. يكتب Coverlet و
dotnet-coverage سمة branch لسطر Cobertura بالصيغة True، ولم تكن تُقرأ إلا true بالأحرف الصغيرة — فكان كل قرار في مثل هذا التقرير يُسقَط. صارت الكتابتان تُقرآن. الأرقام تتغيّر: تظهر تغطية الفروع لمشروع .NET حيث لم يكن منها شيء، ومعها نتيجته. - كان تقرير Cobertura المدموج من عدة أشجار لا يجد إلا ملفات الشجرة الأولى. يسمّي مثل هذا التقرير
<source> واحدًا لكل شجرة؛ صار كل منها يُجرَّب، بترتيب التقرير.
Coverage Studio لـ VS Code 1.2026.15 — علامات استبعاد للفروع فقط، وتغطية الفروع في تقارير .NET
2026-10-02
أُضيف
- علامات استبعاد للفروع فقط وعلامات gcovr.
LCOV_EXCL_BR_LINE وLCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP تُخرج الفروع الواقعة على أسطرها من العدّ وتُبقي الأسطر فيه؛ وLCOV_EXCL_EXCEPTION_BR_LINE لا يُخرج إلا الأذرع التي يبلغها استثناء. وتُقرأ كل علامة ببادئات gcovr أيضًا: GCOVR_EXCL_LINE وGCOVR_EXCL_START وGCOV_EXCL_BR_LINE والبقية.
أُصلح
- كان تقرير .NET لا يُظهر تغطية فروع. يكتب Coverlet و
dotnet-coverage سمة branch لسطر Cobertura بالصيغة True، ولم تكن تُقرأ إلا true بالأحرف الصغيرة — فكان كل قرار في مثل هذا التقرير يُسقَط. صارت الكتابتان تُقرآن. الأرقام تتغيّر: تظهر تغطية الفروع لمشروع .NET حيث لم يكن منها شيء، ومعها نتيجته. - كان تقرير Cobertura المدموج من عدة أشجار لا يجد إلا ملفات الشجرة الأولى. يسمّي مثل هذا التقرير
<source> واحدًا لكل شجرة؛ صار كل منها يُجرَّب، بترتيب التقرير.
Coverage Studio لـ Visual Studio 1.2026.13 — أقل عدد من الاختبارات يظل يشغّل كل سطر
2026-10-01
أُضيف
- Show Minimal Test Set… يجد أقل عدد من الاختبارات يظل يشغّل كل سطر تشغّله المجموعة، ويسرد تحتها الاختبارات التي لا تضيف سطرًا من عندها. للتشغيل السريع قبل الإيداع، ولمن يشذّب المجموعة — مع التذكير بأن الزائد بحسب الأسطر ليس زائدًا بحسب ما يتحقق منه الاختبار.
Coverage Studio لـ VS Code 1.2026.14 — أقل عدد من الاختبارات يظل يشغّل كل سطر
2026-10-01
أُضيف
- Show Minimal Test Set… يجد أقل عدد من الاختبارات يظل يشغّل كل سطر تشغّله المجموعة، ويسرد تحتها الاختبارات التي لا تضيف سطرًا من عندها. للتشغيل السريع قبل الإيداع، ولمن يشذّب المجموعة — مع التذكير بأن الزائد بحسب الأسطر ليس زائدًا بحسب ما يتحقق منه الاختبار.
Coverage Studio لـ Visual Studio 1.2026.12 — استبعادات تقول السبب
2026-10-01
أُضيف
- استبعادات مبرَّرة. الشفرة المُخرجة من العدّ حيث كُتبت يمكنها أن تقول السبب —
// LCOV_EXCL_LINE: defensive, unreachable by construction، [ExcludeFromCodeCoverage(Justification = "…")] — وتُذكر الأسباب في التقرير: يسرد Export Coverage Report… الاستبعادات ومبرراتها بصيغة Markdown وبصيغة CSV. ومع fuciniCoverage.exclusions.requireReason يكون الاستبعاد الذي لا يذكر سببًا تحذيرًا عند سطره ويُفشل Check Coverage Thresholds.
Coverage Studio لـ VS Code 1.2026.13 — استبعادات تقول السبب
2026-10-01
أُضيف
- استبعادات مبرَّرة. الشفرة المُخرجة من العدّ حيث كُتبت يمكنها أن تقول السبب —
// LCOV_EXCL_LINE: defensive, unreachable by construction، [ExcludeFromCodeCoverage(Justification = "…")] — وتُذكر الأسباب في التقرير: يسرد Export Coverage Report… الاستبعادات ومبرراتها بصيغة Markdown وبصيغة CSV. ومع fuciniCoverage.exclusions.requireReason يكون الاستبعاد الذي لا يذكر سببًا تحذيرًا عند سطره ويُفشل Check Coverage Thresholds.
Coverage Studio لـ Visual Studio 1.2026.11 — بوابة على الشفرة الجديدة، والتغطية التي تغيّرت بلا تعديل
2026-10-01
أُضيف
- بوابة على الشفرة الجديدة، إلى جانب البوابات على التشغيل كله.
fuciniCoverage.threshold.newCode هو الحد الأدنى لتغطية الأسطر، بالنسبة المئوية، للأسطر المتغيّرة مقابل gitDiff.baseRef. ويُفشلها Check Coverage Thresholds في جملة خاصة بها — New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran) — ويبقى التشغيل كله على الشاشة. - Show Indirect Coverage Changes… يسرد الأسطر التي تغيّرت تغطيتها مع أن أحدًا لم يعدّلها — شفرة لم تعد تُنفَّذ لأن اختبارًا أُزيل، أو لأن فرعًا يسبقها صار يعود مبكرًا. مقابل خط أساس CI حيث يسمّي
baseline.report واحدًا، وإلا فمقابل التشغيل الذي قبله.
Coverage Studio لـ VS Code 1.2026.12 — بوابة على الشفرة الجديدة، والتغطية التي تغيّرت بلا تعديل
2026-10-01
أُضيف
- بوابة على الشفرة الجديدة، إلى جانب البوابات على التشغيل كله.
fuciniCoverage.threshold.newCode هو الحد الأدنى لتغطية الأسطر، بالنسبة المئوية، للأسطر المتغيّرة مقابل gitDiff.baseRef. ويُفشلها Check Coverage Thresholds في جملة خاصة بها — New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran) — ويبقى التشغيل كله على الشاشة. - Show Indirect Coverage Changes… يسرد الأسطر التي تغيّرت تغطيتها مع أن أحدًا لم يعدّلها — شفرة لم تعد تُنفَّذ لأن اختبارًا أُزيل، أو لأن فرعًا يسبقها صار يعود مبكرًا. مقابل خط أساس CI حيث يسمّي
baseline.report واحدًا، وإلا فمقابل التشغيل الذي قبله.
Coverage Studio لـ Visual Studio 1.2026.10 — شغّل فقط الاختبارات التي تمسّها تغييراتك
2026-10-01
أُضيف
- Run Tests Affected by My Changes… يسرد الاختبارات التي شغّلت سطرًا تغيّره شجرة العمل مقابل
fuciniCoverage.testImpact.baseRef (HEAD افتراضيًا)، بدءًا بالذي شغّل أكبر قدر من التغيير. اختيار اختبار يفتحه؛ وحيث جاءت التقارير من تشغيل لكل اختبار (testRun.perTest)، يشغّل المدخل الأول تلك الاختبارات وحدها.
أُصلح
testRun.skipWhenTestsFail يسري بعد انتهاء التشغيل. كانت التقارير التي كتبها تشغيل أحمر تبقى على القرص، حيث يحمّلها المراقب بعد لحظة. صارت تُزال.- النسخة التي يصنعها مسجّل TRX من تقرير تغطية لا تُحسب أبدًا ملف تتبّع.
Coverage Studio لـ VS Code 1.2026.11 — شغّل فقط الاختبارات التي تمسّها تغييراتك
2026-10-01
أُضيف
- Run Tests Affected by My Changes… يسرد الاختبارات التي شغّلت سطرًا تغيّره شجرة العمل مقابل
fuciniCoverage.testImpact.baseRef (HEAD افتراضيًا)، بدءًا بالذي شغّل أكبر قدر من التغيير. اختيار اختبار يفتحه؛ وحيث جاءت التقارير من تشغيل لكل اختبار (testRun.perTest)، يشغّل المدخل الأول تلك الاختبارات وحدها.
أُصلح
testRun.skipWhenTestsFail يسري بعد انتهاء التشغيل. كانت التقارير التي كتبها تشغيل أحمر تبقى على القرص، حيث يحمّلها المراقب بعد لحظة. صارت تُزال.- النسخة التي يصنعها مسجّل TRX من تقرير تغطية لا تُحسب أبدًا ملف تتبّع.
Coverage Studio لـ Visual Studio 1.2026.9 — النجاح أو الفشل على العلامات، وملفات تغطية الشفرة الخاصة بـ Visual Studio
2026-09-30
أُضيف
- النجاح أو الفشل على العلامات. السطر الذي شغّله اختبار فاشل يحصل على شريط أحمر في أوله، ويسمّي تلميح التمرير عليه الاختبارات الفاشلة؛ ويقول Show Tests That Ran This Line أيّ الاختبارات فشل. يحتاج ذلك إلى تقرير يقول أي الاختبارات شغّلت السطر، وإلى ملف نتائج المشغّل — TRX أو JUnit XML — في مجلد التقرير أو مسمّى في
fuciniCoverage.testResults.paths. وصار Run Tests with Coverage يطلب واحدًا من dotnet test. - تغطية الشفرة الخاصة بـ Visual Studio، محمَّلة. ملف
.coverage الذي يكتبه Analyze Code Coverage في Visual Studio يُحوَّل بـ dotnet-coverage ويُحمَّل من تلقاء نفسه: Coverage Studio يبني على الجامع المدمج بدلًا من منافسته.
Coverage Studio لـ VS Code 1.2026.10 — النجاح أو الفشل على العلامات
2026-09-30
أُضيف
- النجاح أو الفشل على العلامات. السطر الذي شغّله اختبار فاشل يحصل على شريط أحمر في أوله، ويسمّي تلميح التمرير عليه الاختبارات الفاشلة؛ ويقول Show Tests That Ran This Line أيّ الاختبارات فشل. يحتاج ذلك إلى تقرير يقول أي الاختبارات شغّلت السطر، وإلى ملف نتائج المشغّل — TRX أو JUnit XML — في مجلد التقرير أو مسمّى في
fuciniCoverage.testResults.paths. وصار Run Tests with Coverage يطلب واحدًا من dotnet test.
Coverage Studio لـ Visual Studio 1.2026.8 — إعادة تحميل تحفظ بحثك وجلستك وتشغيلك الأخير
2026-09-30
أُصلح
- مربع البحث يحتفظ باستعلامه، وبتركيزه، عند إعادة تحميل التغطية. كانت كل إعادة تحميل تفرغه، وكثيرًا ما كان الاستعلام لا يزال يُكتب. والاستعلام مثل
< 80% يُبقي أيضًا نقاط الخطر التي يطابقها. - لم تعد جلسة التغطية تعدّ التشغيل نفسه مرتين. كانت كل إعادة تحميل لتقارير لم تتغير تضيفها من جديد، فيتضاعف كل عدّاد تنفيذ. صارت الجلسة تحتفظ بكل مجموعة تقارير مرة واحدة.
- لم يعد خط أساس CI يؤخّر التحميل. يُعرض التحميل أولًا ثم تتبعه المقارنة. ويُجهَّز خط الأساس مرة واحدة ويُحتفظ به ما دام تقريره والإعدادات على حالها، وحين يتعذر الوصول إلى عنوان URL تُستخدم النسخة التي جُلبت من قبل.
- «منذ التشغيل الأخير» يصمد أمام إعادة تحميل تقارير لم تتغير. كان تغيير في الإعدادات أو تحديث يجعل التشغيل المعروض على الشاشة تشغيلَه الأخير نفسه، فيختفي كل تغيير منذ التشغيل الذي قبله. ولم تعد مثل هذه القراءة المعادة تُحفظ في السجل أيضًا.
- تحميل واحد في كل مرة. كانت إعادتا تحميل تُطلبان معًا تجريان جنبًا إلى جنب، وتفوز الأبطأ. وإعادات التحميل المطلوبة أثناء تحميل تصبح الآن تحميلًا واحدًا بعده.
- خط أساس CI عبر HTTP يُجلب كما في VS Code. عميل واحد، وآخر نسخة تُحفظ تحسّبًا لتعذّر الوصول إلى الخادم، و
remote.headers لا تُرسل إلا إلى العنوان الذي كُتبت له — ولا تُرسل أبدًا عبر HTTP غير المشفَّر. - الأمر الذي يفشل عمله يقول ذلك. كان الفشل في أمر أو مؤقّت يُبتلع؛ صار سطرًا في نافذة Output.
- عمل أقل على خيط واجهة المستخدم. تُنشأ مراقبات الملفات في الخلفية، وتُحسب مدخلات Error List مرة لكل تحميل، ويُكتب السجل على دفعات بدلًا من كتابته سطرًا بسطر.
- لم تعد نافذتا Visual Studio تتلفان سجل التشغيلات. يُستبدل فهرسه في خطوة واحدة تحت قفل تتشاركه النافذتان، ويُعاد إنشاؤه من التشغيلات إذا فُقد.
- Run Native Project with Coverage يبني لمنصة المشروع نفسه، ويأخذ
llvm-cov وllvm-profdata من LLVM الخاص بالمترجم، زوجًا واحدًا. - ألوان التحذير والخطأ والنجاح في نافذة Coverage تتبع السمة الفاتحة كما تتبع الداكنة.
- ملف الإعدادات المفتوح بتغييرات غير محفوظة لا يُكتب فوقه. تطلب صفحة الإعدادات حفظه أولًا.
تغيّر
- ملف التغطية الذي تختاره، والتقرير الذي يكتبه تشغيل الاختبارات، يُحتفظ بهما لك بدلًا من كتابتهما في
.vscode/settings.json. فذلك الملف يُودَع كثيرًا، فكان تشغيل الاختبارات يترك في المستودع تغييرًا لم يطلبه أحد. والمسارات الموجودة أصلًا في coverageFile.paths تظل تعمل.
Coverage Studio لـ VS Code 1.2026.9 — إعادة تحميل تحفظ بحثك وجلستك وتشغيلك الأخير
2026-09-30
أُصلح
- مربع البحث يحتفظ باستعلامه، وبتركيزه، عند إعادة تحميل التغطية. كانت كل إعادة تحميل تفرغه، وكثيرًا ما كان الاستعلام لا يزال يُكتب. والاستعلام مثل
< 80% يُبقي أيضًا نقاط الخطر التي يطابقها. - لم تعد جلسة التغطية تعدّ التشغيل نفسه مرتين. كانت كل إعادة تحميل لتقارير لم تتغير تضيفها من جديد، فيتضاعف كل عدّاد تنفيذ. صارت الجلسة تحتفظ بكل مجموعة تقارير مرة واحدة.
- لم يعد خط أساس CI يؤخّر التحميل. يُعرض التحميل أولًا ثم تتبعه المقارنة. ويُجهَّز خط الأساس مرة واحدة ويُحتفظ به ما دام تقريره والإعدادات على حالها، وحين يتعذر الوصول إلى عنوان URL تُستخدم النسخة التي جُلبت من قبل.
- فحص ملفات التقارير المتغيّرة يجري مرورًا واحدًا في كل مرة. على قرص شبكة بطيء كان مروران يريان التغيير نفسه، فتُحمَّل التغطية مرتين.
- «منذ التشغيل الأخير» يصمد أمام إعادة تحميل تقارير لم تتغير. كان تغيير في الإعدادات أو تحديث يجعل التشغيل المعروض على الشاشة تشغيلَه الأخير نفسه، فيختفي كل تغيير منذ التشغيل الذي قبله. ولم تعد مثل هذه القراءة المعادة تُحفظ في السجل أيضًا.
تغيّر
- ملف التغطية الذي تختاره، والتقرير الذي يكتبه تشغيل الاختبارات، يُحتفظ بهما لك بدلًا من كتابتهما في
.vscode/settings.json. فذلك الملف يُودَع كثيرًا، فكان تشغيل الاختبارات يترك في المستودع تغييرًا لم يطلبه أحد. والمسارات الموجودة أصلًا في coverageFile.paths تظل تعمل.
Coverage Studio لـ Visual Studio 1.2026.7 — تشغيلات اختبار تشغّل ما تسمّيه بالضبط
2026-09-30
أُصلح
- لم يعد حل .NET الذي فيه مشروعا اختبار أو أكثر يفقد تغطية كل المشاريع إلا واحدًا. كان
dotnet test يكتب تقريرًا لكل مشروع وتُنقل كلها إلى coverage/coverage.cobertura.xml نفسه، فلا يُحمَّل إلا الأخير. صار مثل هذا المجلد يشغّل dotnet test مرة لكل مشروع اختبار، ويذهب كل تقرير إلى coverage/<Project>/، وتشغيل مشروع واحد لا يستبدل إلا تقرير ذلك المشروع. - حفظ عدة ملفات دفعة واحدة يشغّل اختبارات كل ملف محفوظ. مع
testRun.onSave كانت تعمل اختبارات الملف الأخير فقط؛ وعمليات الحفظ التي تقع أثناء تشغيل جارٍ تُستبقى وتُشغَّل معًا بعده. - Run This Test with Coverage والتشغيلات لكل اختبار تشغّل ما تسمّيه بالضبط. كان مرشّح .NET يطابق بجزء من السلسلة:
Total كان يشغّل TotalTax أيضًا. صار الاختبار يعمل باسمه الدقيق، والصنف باسمه متبوعًا بنقطة، ويُعثر على الاختبار الواقع في صنف متداخل (Outer+Inner). - اختبار jest أو vitest الذي في عنوانه
( أو + أو $ صار يعمل. كان العنوان يذهب إلى -t، الذي يقرأ تعبيرًا نمطيًا، فلا يطابق مثل هذا الاختبار شيئًا ولا يعمل شيء. - Run This Test with Coverage يقرأ ملفات اختبار VB وF#. لم يكن
<Fact> فوق Public Sub، ولا [<Fact>] فوق let أو member، يُتعرَّف عليهما قط. - إلغاء تشغيل الاختبارات ينهي كل عملية بدأها. كانت الصدفة وحدها تُنهى، ويواصل
dotnet test العمل خلفها. وإغلاق Visual Studio يلغي التشغيل أيضًا. - الكتابة أثناء تشغيل بعد الحفظ لم تعد تزيح العلامات. فهي مثبّتة على النص الذي قاسه التشغيل.
- الحل الموجود على مشاركة شبكة يشغّل اختباراته هناك. كان التشغيل يبدأ في
C:\Windows، لأن صدفة الأوامر لا تقبل مسار \\server\share مجلدًا لها.
Coverage Studio لـ VS Code 1.2026.8 — تشغيلات اختبار تشغّل ما تسمّيه بالضبط
2026-09-30
أُصلح
- لم يعد حل .NET الذي فيه مشروعا اختبار أو أكثر يفقد تغطية كل المشاريع إلا واحدًا. كان
dotnet test يكتب تقريرًا لكل مشروع وتُنقل كلها إلى coverage/coverage.cobertura.xml نفسه، فلا يُحمَّل إلا الأخير. صار مثل هذا المجلد يشغّل dotnet test مرة لكل مشروع اختبار، ويذهب كل تقرير إلى coverage/<Project>/، وتشغيل مشروع واحد لا يستبدل إلا تقرير ذلك المشروع. - حفظ عدة ملفات دفعة واحدة يشغّل اختبارات كل ملف محفوظ. مع
testRun.onSave كانت تعمل اختبارات الملف الأخير فقط؛ وعمليات الحفظ التي تقع أثناء تشغيل جارٍ تُستبقى وتُشغَّل معًا بعده. - Run This Test with Coverage والتشغيلات لكل اختبار تشغّل ما تسمّيه بالضبط. كان مرشّح .NET يطابق بجزء من السلسلة:
Total كان يشغّل TotalTax أيضًا. صار الاختبار يعمل باسمه الدقيق، والصنف باسمه متبوعًا بنقطة، ويُعثر على الاختبار الواقع في صنف متداخل (Outer+Inner). - اختبار jest أو vitest الذي في عنوانه
( أو + أو $ صار يعمل. كان العنوان يذهب إلى -t، الذي يقرأ تعبيرًا نمطيًا، فلا يطابق مثل هذا الاختبار شيئًا ولا يعمل شيء. - عنوان اختبار فيه علامات اقتباس يصل إلى الطرفية كاملًا. كان الأمر الذي يحوي
\" داخل علامات اقتباس يتفكك عند أول واحدة. - Run This Test with Coverage يقرأ ملفات اختبار VB وF#. لم يكن
<Fact> فوق Public Sub، ولا [<Fact>] فوق let أو member، يُتعرَّف عليهما قط. - مهمة اختبار تنتهي دون أن تبدأ عملية لم تعد تترك Run Tests with Coverage منتظرًا إلى الأبد. ينتهي، ويقول إن التشغيل لم يكتب شيئًا.
Coverage Studio لـ Visual Studio 1.2026.6 — أي الاختبارات شغّلت سطرًا، والتغطية بعد كل حفظ، وخط أساس من CI
2026-09-29
أُضيف
- أي الاختبارات شغّلت هذا السطر. حيث يسجّل التقرير ذلك — coverage.py مع
--show-contexts، والطرق المتتبَّعة في OpenCover، وملف تتبّع lcov مكتوب لكل اختبار — تقول CodeLens الخاصة بالدالة كم اختبارًا شغّلها، ويعرضها Show Tests That Ran This Line بدءًا بالأكثر تشغيلًا ويفتح الذي تختاره. ولتشغيل dotnet test، يشغّل testRun.perTest الاختبارات صنفًا صنفًا، فيقول كل تقرير أي صنف كتبه.
- التغطية بعد كل حفظ. مع
testRun.onSave، يشغّل حفظ ملف مصدري الاختبارات التي تغطيه، مع التغطية، ويتبعه الهامش. في حل .NET لا تعمل إلا مشاريع الاختبار التي تشير إلى مشروع الملف المحفوظ؛ وعدة عمليات حفظ متتالية هي تشغيل واحد.
- Run This Test with Coverage. حين يكون المؤشر في طريقة اختبار أو صنف اختبار أو
describe، أو في ملف اختبار، يشغّل أمر واحد ذلك وحده مع التغطية — dotnet test --filter أو jest/vitest -t أو معرّف عقدة pytest — ويحمّل ما كتبه. يُقرأ الاختبار من النص، لذا يعمل مع C# وVB وF# وJavaScript وTypeScript وPython دون خدمة لغة.
- Exclude from Coverage، ومرشّحان لـ .NET. النقر بالزر الأيمن على صف في شجرة التغطية، أو Exclude This File from Coverage على الملف المفتوح، يضيف الملف أو المجلد إلى
fuciniCoverage.ignore، فيخرج من كل مجموع. يستبعد ignore.namespaces ملفات فضاء أسماء (*.Migrations)، ويستبعد ignore.attributes الصنف أو الطريقة أو الخاصية التي تحت سمة — ExcludeFromCodeCoverage افتراضيًا، وهي سمة لا يلتزم بها OpenCover ولا dotCover ولا lcov المحوَّل.
- Exclude Selection from Coverage. حدّد الأسطر واختر الإجراء من المصباح أو من قائمة المحرر السياقية: فوق صنف أو طريقة أو خاصية في .NET يكتب
[ExcludeFromCodeCoverage] — بالصيغة القصيرة إن كان الملف يستورد System.Diagnostics.CodeAnalysis أصلًا — وفي غير ذلك يكتب LCOV_EXCL_LINE أو زوجًا من LCOV_EXCL_START/STOP في تعليق اللغة نفسها. ولا تتكرر علامة موجودة من قبل.
- فضاءات الأسماء والأصناف والطرق. لتقرير .NET يسمّي أصنافه — Cobertura وCoverlet وOpenCover — تعرض قائمة Folders / Namespaces التشغيل نفسه حسب فضاء الأسماء والصنف والطريقة، بالترتيب والمرشّح نفسيهما؛ ويفتح صف الطريقة الملف عند الطريقة. أما الأنواع التي يولّدها المترجم، مثل
<>c وآلات الحالة غير المتزامنة، فتُدمج في الصنف الذي وُلّدت له.
- مربع بحث فوق شجرة التغطية. اكتب كلمات لتبقى الصفوف التي يحتوي اسمها أو مسارها عليها كلها، أو مقارنة —
< 80% وlines >= 90 وbranches = 0 — لتبقى الصفوف التي يستوفيها رقمها؛ والاثنان معًا يشترطان الاثنين. ويشمل البحث صفوف الطرق ونقاط الخطر أيضًا؛ وEscape يمسح.
- Run Native Project with Coverage. مشروع C++ الابتدائي، من قائمة Tools: يُبنى مشروع ClangCL من جديد مع أدوات تغطية clang في
coverage/native/، ويُشغَّل، ويُحمَّل تقريره؛ وأي مجموعة أدوات أخرى تعمل تحت OpenCppCoverage حيث يكون مثبتًا، وحيث لا يمكن هذا ولا ذاك تقول جملة ما يجب تثبيته.
- جلسات التغطية واتجاه. Start Coverage Session، ويُضاف كل تشغيل يُحمَّل بعدها إلى ما قبله — الأسطر والفروع والدوال على السواء: ما شغّله أي منها مغطّى — فتُظهر اختبارات الوحدة واختبارات التكامل وجولة في التطبيق ما بلغته معًا. وتحت شريط الأدوات تُرسم تغطية الأسطر في السجل المحفوظ اتجاهًا، نقطة لكل تشغيل.
- Compare Two History Runs، كما في VS Code: اختر تشغيلين محفوظين فتُعرض الملفات التي تغيّرت بينهما من الأقدم إلى الأحدث، أيًّا كان الذي اخترته أولًا.
- Compare with CI Baseline. يحدّد
baseline.report التقرير الذي ينشره بناء فرعك الرئيسي — عنوان URL يُجلب مع remote.headers، أو ملفًا منزَّلًا — ويُقاس كل تحميل مقابله: تقول بطاقة شريط الحالة أين يقف هذا التشغيل، ويعرض Compare with CI Baseline الملفات التي تغيّرت. ويمر خط الأساس بقائمة الاستبعاد نفسها التي يمر بها التشغيل، فتُقارن المجاميع بالمثل.
- أين تجدها. الأوامر الجديدة تحت Tools > Coverage Studio وفي قائمة المحرر السياقية؛ وShow Tests That Ran This Line متاح أيضًا عبر Ctrl+Shift+U, T، وExclude Selection from Coverage إجراء من المصباح.
أُصلح
- لم يعد تقرير تشغيل الاختبارات يحمل اسم المستخدم واسم الجهاز. يسمّي جامع Code Coverage من Microsoft تقريره
<user>_<machine>_<stamp>.cobertura.xml، وكان هذا الاسم يظهر في الشجرة وفي كل لقطة شاشة لها؛ صار التقرير يُعاد تسميته إلى coverage.cobertura.xml قبل تحميله.
- كان يُقال عن ملف مولَّد إن
fuciniCoverage.ignore هو الذي استبعده. صار كل ملف مستبعد يُعدّ تحت الإعداد الذي استبعده — ignore أو ignore.generated أو ignore.namespaces — فيكون الاسم المعروض هو الذي يجب تغييره.
- ملف تتبّع lcov المكتوب لكل اختبار يُقرأ سجلًا واحدًا لكل ملف، بعد جمع أقسام الاختبارات، كما يقرؤه VS Code؛ وكان سجل كل اختبار من قبل ملفًا مستقلًا.
- السجل يقول ما تركه المحلّل. الملفات التي لم يجد فيها المحلّل شيئًا يُجهَّز للقياس (
FUCINI_PARSE_030) وما يذكره التقرير نفسه عن ثغراته (FUCINI_PARSE_031، وMissingPdb في OpenCover) تُكتب في السجل، كما يكتبها VS Code.
- لم يعد ملف ترويسة من الماكرو يظهر في الشجرة بنسبة 100%. ينسب llvm-cov وgcov استخدامات الماكرو إلى الأسطر التي تعرّفه؛ صارت الفروع والدوال الواقعة على أسطر مستبعدة تذهب مع تلك الأسطر، والملف الذي لا يبقى فيه شيء قابل للقياس يُخرج من التشغيل ويُذكر في المخرجات (
FUCINI_EXCLUDE_001).
- خمسة تقارير كانت تُرفض بوصفها صيغة غير مدعومة صارت تُعرف. ملف JaCoCo XML من Kover، وتقرير Stryker.NET، وتقرير NCover، وresultset قديم من SimpleCov، وتقرير SonarQube لملفات فارغة كثيرة، صارت تُعرف بما تحمله في أولها. ولم يعد تقرير Clover أو SonarQube تحتوي مساراته على كلمة
cobertura يُقرأ على أنه Cobertura.
- أرقام تتفق مع الأدوات التي كتبتها. رقم الفروع في بناء MC/DC يطابق
llvm-cov report؛ وفروع الاستثناءات في LCOV 2 (BRDA:12,e0,1,3) تُحسب؛ ودالة llvm-cov تُعلن فقط في الملف الذي يعرّفها؛ وكتلة Go يذكرها ملفا اختبار ثنائيان تجمع عدّاتها؛ وقرار Cobertura يبلّغ عنه صنفان وسطر JaCoCo مذكور مرتين يحتفظان بكل أذرعهما، مرة واحدة.
- إصلاحات أصغر. لم يعد ملف تتبّع انقطع في منتصف الكتابة يفقد ملفًا؛ و
gcov -t على عدة ملفات .gcda يعطي ملفًا لكل منها، وتُقرأ نسخ القوالب مرة واحدة، وتُحفظ عدّات مثل 1.20k من gcov -H؛ ولم تعد ملفات GNATcoverage كلها تُعلن متغيّرة منذ تغطيتها؛ ولم يعد متحوّر Stryker معلّق أو تشغيل PIT منقطع يُحسبان ضد النتيجة.
- التعديل اليدوي لملف الإعدادات يُطبَّق عند حفظه، كما يطبّق VS Code تغيير الإعدادات.
Coverage Studio لـ VS Code 1.2026.7 — أي الاختبارات شغّلت سطرًا، والتغطية بعد كل حفظ، وخط أساس من CI
2026-09-29
أُضيف
- أي الاختبارات شغّلت هذا السطر. حيث يسجّل التقرير ذلك — coverage.py مع
--show-contexts، والطرق المتتبَّعة في OpenCover، وملف تتبّع lcov مكتوب لكل اختبار — تقول CodeLens الخاصة بالدالة كم اختبارًا شغّلها، ويعرضها Show Tests That Ran This Line بدءًا بالأكثر تشغيلًا ويفتح الذي تختاره. ولتشغيل dotnet test، يشغّل testRun.perTest الاختبارات صنفًا صنفًا، فيقول كل تقرير أي صنف كتبه.
- التغطية بعد كل حفظ. مع
testRun.onSave، يشغّل حفظ ملف مصدري الاختبارات التي تغطيه، مع التغطية، ويتبعه الهامش. في حل .NET لا تعمل إلا مشاريع الاختبار التي تشير إلى مشروع الملف المحفوظ؛ وعدة عمليات حفظ متتالية هي تشغيل واحد.
- Run This Test with Coverage. حين يكون المؤشر في طريقة اختبار أو صنف اختبار أو
describe، أو في ملف اختبار، يشغّل أمر واحد ذلك وحده مع التغطية — dotnet test --filter أو jest/vitest -t أو معرّف عقدة pytest — ويحمّل ما كتبه. يُقرأ الاختبار من النص، لذا يعمل مع C# وVB وF# وJavaScript وTypeScript وPython دون خدمة لغة.
- Exclude from Coverage، ومرشّحان لـ .NET. النقر بالزر الأيمن على صف في شجرة التغطية، أو Exclude This File from Coverage على الملف المفتوح، يضيف الملف أو المجلد إلى
fuciniCoverage.ignore، فيخرج من كل مجموع. يستبعد ignore.namespaces ملفات فضاء أسماء (*.Migrations)، ويستبعد ignore.attributes الصنف أو الطريقة أو الخاصية التي تحت سمة — ExcludeFromCodeCoverage افتراضيًا، وهي سمة لا يلتزم بها OpenCover ولا dotCover ولا lcov المحوَّل.
- Exclude Selection from Coverage. حدّد الأسطر واختر الإجراء من المصباح أو من قائمة المحرر السياقية: فوق صنف أو طريقة أو خاصية في .NET يكتب
[ExcludeFromCodeCoverage] — بالصيغة القصيرة إن كان الملف يستورد System.Diagnostics.CodeAnalysis أصلًا — وفي غير ذلك يكتب LCOV_EXCL_LINE أو زوجًا من LCOV_EXCL_START/STOP في تعليق اللغة نفسها. ولا تتكرر علامة موجودة من قبل.
- فضاءات الأسماء والأصناف والطرق. لتقرير .NET يسمّي أصنافه — Cobertura وCoverlet وOpenCover — تعرض قائمة Folders / Namespaces التشغيل نفسه حسب فضاء الأسماء والصنف والطريقة، بالترتيب والمرشّح نفسيهما؛ ويفتح صف الطريقة الملف عند الطريقة. أما الأنواع التي يولّدها المترجم، مثل
<>c وآلات الحالة غير المتزامنة، فتُدمج في الصنف الذي وُلّدت له.
- مربع بحث فوق شجرة التغطية. اكتب كلمات لتبقى الصفوف التي يحتوي اسمها أو مسارها عليها كلها، أو مقارنة —
< 80% وlines >= 90 وbranches = 0 — لتبقى الصفوف التي يستوفيها رقمها؛ والاثنان معًا يشترطان الاثنين. ويشمل البحث صفوف الطرق ونقاط الخطر أيضًا؛ وEscape يمسح.
- جلسات التغطية واتجاه. Start Coverage Session، ويُضاف كل تشغيل يُحمَّل بعدها إلى ما قبله — الأسطر والفروع والدوال على السواء: ما شغّله أي منها مغطّى — فتُظهر اختبارات الوحدة واختبارات التكامل وجولة في التطبيق ما بلغته معًا. وتحت شريط الأدوات تُرسم تغطية الأسطر في السجل المحفوظ اتجاهًا، نقطة لكل تشغيل.
- Compare with CI Baseline. يحدّد
baseline.report التقرير الذي ينشره بناء فرعك الرئيسي — عنوان URL يُجلب مع remote.headers، أو ملفًا منزَّلًا — ويُقاس كل تحميل مقابله: تقول بطاقة شريط الحالة أين يقف هذا التشغيل، ويعرض Compare with CI Baseline الملفات التي تغيّرت. ويمر خط الأساس بقائمة الاستبعاد نفسها التي يمر بها التشغيل، فتُقارن المجاميع بالمثل.
أُصلح
- لم يعد تقرير تشغيل الاختبارات يحمل اسم المستخدم واسم الجهاز. يسمّي جامع Code Coverage من Microsoft تقريره
<user>_<machine>_<stamp>.cobertura.xml، وكان هذا الاسم يظهر في الشجرة وفي كل لقطة شاشة لها؛ صار التقرير يُعاد تسميته إلى coverage.cobertura.xml قبل تحميله.
- كان تشغيل الاختبارات يفشل على Windows حين تكون الطرفية PowerShell. كانت علامات الاقتباس حول
Code Coverage;Format=cobertura تضيع في الطريق إلى pwsh، الذي كان يقرأ ; نهايةً للأمر؛ صارت الوصفة تُسلَّم إلى الطرفية كلمة كلمة وتُقتبس للصدفة التي تشغّلها.
- كان يُقال عن ملف مولَّد إن
fuciniCoverage.ignore هو الذي استبعده. صار كل ملف مستبعد يُعدّ تحت الإعداد الذي استبعده — ignore أو ignore.generated أو ignore.namespaces — فيكون الاسم المعروض هو الذي يجب تغييره.
- لم يعد ملف ترويسة من الماكرو يظهر في الشجرة بنسبة 100%. ينسب llvm-cov وgcov استخدامات الماكرو إلى الأسطر التي تعرّفه؛ صارت الفروع والدوال الواقعة على أسطر مستبعدة تذهب مع تلك الأسطر، والملف الذي لا يبقى فيه شيء قابل للقياس يُخرج من التشغيل ويُذكر في المخرجات (
FUCINI_EXCLUDE_001).
- خمسة تقارير كانت تُرفض بوصفها صيغة غير مدعومة صارت تُعرف. ملف JaCoCo XML من Kover، وتقرير Stryker.NET، وتقرير NCover، وresultset قديم من SimpleCov، وتقرير SonarQube لملفات فارغة كثيرة، صارت تُعرف بما تحمله في أولها. ولم يعد تقرير Clover أو SonarQube تحتوي مساراته على كلمة
cobertura يُقرأ على أنه Cobertura.
- أرقام تتفق مع الأدوات التي كتبتها. رقم الفروع في بناء MC/DC يطابق
llvm-cov report؛ وفروع الاستثناءات في LCOV 2 (BRDA:12,e0,1,3) تُحسب؛ ودالة llvm-cov تُعلن فقط في الملف الذي يعرّفها؛ وكتلة Go يذكرها ملفا اختبار ثنائيان تجمع عدّاتها؛ وقرار Cobertura يبلّغ عنه صنفان وسطر JaCoCo مذكور مرتين يحتفظان بكل أذرعهما، مرة واحدة.
- إصلاحات أصغر. لم يعد ملف تتبّع انقطع في منتصف الكتابة يفقد ملفًا؛ و
gcov -t على عدة ملفات .gcda يعطي ملفًا لكل منها، وتُقرأ نسخ القوالب مرة واحدة، وتُحفظ عدّات مثل 1.20k من gcov -H؛ ولم تعد ملفات GNATcoverage كلها تُعلن متغيّرة منذ تغطيتها؛ ولم يعد متحوّر Stryker معلّق أو تشغيل PIT منقطع يُحسبان ضد النتيجة.
تغيّر
- لا مزيد من
FUCINI_ENCODING_001 مع كل تحميل. التقرير الذي بلا علامة ترتيب البايتات يُقرأ بترميز UTF-8، كما تكتبه كل أداة، دون ملاحظة تقول ذلك.
Coverage Studio لـ Visual Studio 1.2026.5 — مراقبة حيث سيظهر التقرير
2026-09-28
أُضيف
- يُبحث عن المدخل النسبي الذي يحوي حرف بدل على أي عمق. يجد
*.lcov.info في coverageFile.paths الملف أينما كان تحت المجلد الأساسي، كما قرأه VS Code دائمًا؛ أما المدخل المطلق — ${workspaceFolder}/build/coverage-merged/*.lcov.info، و** لأي عمق — فيبحث حيث يقول تمامًا، كما كان من قبل.
- مراقبة حيث سيظهر التقرير. تشمل المراقبة المجلدات التي تسمّيها الإعدادات، سواء كان فيها تقرير بعدُ أم لا: مجلد الملف المطلق، والمجلدات التي تسبق حرف البدل — مع كل ما تحتها حين يمتد النمط إلى المجلدات الفرعية — والمجلد الأساسي لحرف البدل النسبي. والتقرير الذي تكتبه عملية بناء هناك يُحمَّل من تلقاء نفسه، والكتابة في أي ملف آخر في تلك المجلدات تُتجاهل.
أُصلح
- كان تقرير llvm-cov بصيغة JSON يُرفض بوصفه تنسيقًا غير مدعوم. يُتعرَّف على التنسيق من أول 4096 حرفًا، ويكتب llvm-cov علامته
"type": "llvm.coverage.json.export" في النهاية تمامًا؛ والتصدير الذي يحمل سجلُّ ملفه الأول فروعًا كثيرة وتوسيعات ماكرو متداخلة لم يكن في بدايته شيء آخر يمكن التعرّف عليه. يُعرف مثل هذا التقرير الآن من افتتاحيته، {"data":[{"files":[، التي لا يملكها أي تنسيق آخر.
- والأمر نفسه مع
gcov --json-format. يكتب gcov دوالّ الملف قبل أسطره، والملف ذو الدوالّ الاثنتي عشرة لا يحوي هو الآخر مدخل سطر في البداية المفحوصة؛ ويعرّفه الآن مفتاح gcc_version الخاص بالمستند.
Coverage Studio لـ VS Code 1.2026.6 — حرف بدل في مسار كامل، ومراقبة حيث سيظهر التقرير
2026-09-28
أُضيف
- حرف بدل في مدخل
coverageFile.paths مطلق. يحمّل ${workspaceFolder}/build/coverage-merged/*.lcov.info كل ملف من هذا النوع في ذلك المجلد، ويعني ** أي عمق: يُبحث في المجلدات التي تسبق حرف البدل الأول، والباقي هو النمط تحتها، كما قرأ إصدار Visual Studio مثل هذا المدخل دائمًا. من قبل كان المدخل المطلق يُبحث عنه كما كُتب، فالمدخل الذي يحوي نجمة لا يطابق شيئًا — ولأنه حرف بدل، لم يُبلَّغ قط عن أنه لا يطابق شيئًا أيضًا. والتقرير الذي يظهر هناك لاحقًا يحمّله المراقب أو الاستطلاع كمدخل حرفي؛ وحرف البدل الذي لا يطابق شيئًا لا يُبلَّغ عنه، لأنه قد ينتظر عملية بناء.
أُصلح
- كان تقرير llvm-cov بصيغة JSON يُرفض بوصفه تنسيقًا غير مدعوم. يُتعرَّف على التنسيق من أول 4096 حرفًا، ويكتب llvm-cov علامته
"type": "llvm.coverage.json.export" في النهاية تمامًا؛ والتصدير الذي يحمل سجلُّ ملفه الأول فروعًا كثيرة وتوسيعات ماكرو متداخلة لم يكن في بدايته شيء آخر يمكن التعرّف عليه. يُعرف مثل هذا التقرير الآن من افتتاحيته، {"data":[{"files":[، التي لا يملكها أي تنسيق آخر.
- والأمر نفسه مع
gcov --json-format. يكتب gcov دوالّ الملف قبل أسطره، والملف ذو الدوالّ الاثنتي عشرة لا يحوي هو الآخر مدخل سطر في البداية المفحوصة؛ ويعرّفه الآن مفتاح gcc_version الخاص بالمستند.
Coverage Studio لـ Visual Studio 1.2026.4 — تقريران وجواب واحد، والأخضر حيث توجد التغطية
2026-09-26
أُضيف
- اختر تقارير الملف أو ادمجها. انقر بزر الماوس الأيمن على ملف في نافذة Coverage واختر Choose Coverage Source... — ويُعرض حيث يقيس الملفَ أكثرُ من تقرير محمَّل — أو استخدم Tools > Coverage Studio > Choose Coverage Source for This File...: كل تقرير بأرقامه، ثم Combine them — agree (مغطى فقط حيث نفّذ كل تقرير السطر: قاعدة شفرة واحدة ومترجمان) و— union (مغطى حيث نفّذه أيٌّ منها: عدة مجموعات اختبار لبناء واحد)، للملف أو مجلده أو نمط. وتظهر الأسطر التي تختلف فيها التقارير باللون الأزرق المخضر في الهامش وفي Annotated Source، مع ما قاله كل تقرير؛ ويسمّي صف الملف التقارير وعدد الأسطر المختلف عليها، ويذكر شريط الحالة والبطاقتان كلتاهما من أين تأتي الأرقام.
- الأحمر والكهرماني والأخضر. يلوّن Gutter: Coverage كل سطر مغطى بالأخضر إلى جانب الأحمر والكهرماني — الوضع لكل من توقّع أن يكون الملف ذو الـ 100% أخضر. ودرجات الخريطة الحرارية الخمس إعدادات (
heatmap.colors وheatmap.colorsDark)، وتعاين نافذة الإعدادات كل لون أثناء اختياره.
أُصلح
- رقم الملف في شريط الحالة هو رقم بطاقته. المقياس الذي لا شيء فيه — MC/DC في ملف بلا قرارات — كان يُحسب 100% في العنصر ولا يُحسب إطلاقًا في البطاقة التي يفتحها.
- لم يعد ملف ترويسة من الثوابت يُظهر 0% أو 100%. تُحسب توجيهات المعالج المسبق بلا شفرة، كالتعليقات، عند تفعيل
excludeComments.
Coverage Studio لـ VS Code 1.2026.5 — تقريران وجواب واحد، والأخضر حيث توجد التغطية
2026-09-26
أُضيف
- اختر تقارير الملف أو ادمجها. يقرّر
coverageFile.sources، لكل ملف، أيّ التقارير المحمَّلة يتحدث باسمه — أو يدمجها: agree لا يعدّ السطر مغطى إلا حيث نفّذه كل تقرير، ويعلّم الأسطر المختلف عليها باللون الأزرق المخضر؛ وunion حيث نفّذه أيٌّ منها. ويكتب Choose Coverage Source... على صف في عرض Coverage أو للملف المفتوح القاعدةَ نيابةً عنك. جزء من الخطط المدفوعة؛ في Community يقرّر أحدث تقرير.
- الأحمر والكهرماني والأخضر، ووضع للهامش بنقرة واحدة. يلوّن وضع
coverage الأسطر المغطاة بالأخضر؛ ودرجات الخريطة الحرارية إعدادات مع معاينة حية في لوحة الإعدادات؛ ويتنقّل زر في شريط الحالة وAlt+G بالهامش بين الإيقاف وغير المغطى والتغطية والخريطة الحرارية.
أُصلح
- رقم الملف في شريط الحالة هو رقم بطاقته. المقياس الذي لا شيء فيه — MC/DC في ملف بلا قرارات — كان يُحسب 100% في العنصر ولا يُحسب إطلاقًا في البطاقة التي يفتحها.
- لم يعد ملف ترويسة من الثوابت يُظهر 0% أو 100%. تُحسب توجيهات المعالج المسبق بلا شفرة، كالتعليقات، عند تفعيل
excludeComments.
Coverage Studio لـ Visual Studio 1.2026.3 — لا شيء تختاره سوى الرمز
2026-09-24
تغيّر
- مربع حوار Licence يطلب الرمز فقط. أُزيلت أزرار الخطط الأربعة: رمز الاشتراك أو الدعوة يسمّي مجموعة، والمجموعة تعرف خطتها، فلم يكن هناك ما يجيب به المرء أفضل من الرمز نفسه — وكانت دعوة Business الملصقة بينما Pro لا يزال محددًا تُرفض بسبب الخطة الخاطئة. الصق الرمز واضغط Activate.
Coverage Studio لـ VS Code 1.2026.4 — لا شيء تختاره سوى الرمز
2026-09-24
تغيّر
- Enter Subscription Code يطلب الرمز فقط. أُزيل سؤال الخطة: الرمز يسمّي مجموعة والمجموعة تعرف خطتها، فيتولى الخادم الأمر من هناك ولم يعد يرفض رمزًا بحجة أنه لخطة خاطئة. روابط النقرة الواحدة في الرسائل لم تتغير؛ ولم تعد رسائل التفعيل تتضمن خطوة "اختر خطتك"، والرمز نفسه يفعّل Coverage Studio لـ Visual Studio دون الحاجة إلى VS Code.
Coverage Studio لـ Visual Studio 1.2026.2 — كل تشغيل للاختبارات، وكل تقرير، وما تحرّك
2026-09-24
أُضيف
- التغطية بعد كل تشغيل للاختبارات. يضع Collect Coverage in Test Explorer… ملف
.runsettings واحدًا يحوي جامع Cobertura من Microsoft بجانب الحل — يُلتقط من تلقاء نفسه عندما يكون Tools → Options → Test → Auto detect runsettings files مفعّلًا، أو يُختار مرة واحدة تحت Test → Configure Run Settings؛ ومن ثَمّ يكتب كل تشغيل من Test Explorer تقريرًا تحت مشروع الاختبار، ويُحمَّل لحظة ظهوره، مدمجًا مع كل ما تسمّيه الإعدادات. لا شيء يتشعّب في Test Explorer، فيعمل Visual Studio 2026 وMicrosoft.Testing.Platform كما هما. يتعرّف Run Tests with Coverage على dotnet test وvitest وjest وpytest وgo وcargo وmaven وgradle وphpunit وctest، ويشغّلها مع تفعيل التغطية في نافذة Output ويحمّل ما كتبته؛ ومشروع الاختبار الذي يخلو من coverlet.collector يُشغَّل بالجامع الذي تشحنه حزمة SDK للاختبار.
- منذ آخر تشغيل. يُقارن كل تحميل بالذي قبله: مثلث في الهامش على كل سطر بدأ يعمل أو توقّف عن العمل، والاتجاه بجانب النتيجة، وCompare with Last Run للملفات التي تحرّكت أرقامها. يحفظ
history.enabled التشغيلات عبر إعادات التشغيل؛ ويقلّص gitDiff.enabled التشغيل إلى الأسطر التي غيّرها فرعك.
- البوابات وError List. يحكم Check Coverage Thresholds على التشغيل بـ
threshold.*؛ ومع compliance.diagnostics أو problems.enabled أو problems.perLine أو deadCode.enabled تستقر النتائج في Error List بجانب نتائج المترجم نفسه، ويفتح كل منها ملفه.
- التقارير والتصديرات وشارة. يفتح Show Annotated Source الملف النشط صفحةً في منطقة المستندات — كل سطر بلونه، والنتائج بجانبه — تتمرّر مع المحرر في الاتجاهين. يكتب Open HTML Report وGenerate Full HTML Report التشغيل إلى
htmlReport.outputDir ويفتحان المتصفح. يكتب Export Coverage Report… CSV لكل ملف أو لكل دالة، أو Markdown، أو LCOV، أو Cobertura، أو SARIF، أو شارة SVG، أو Fucini JSON. ويُبقي Generate Coverage Badge الشارة في المستودع، بعد كل تحميل مع badge.autoUpdate.
- Risk hotspots ومرشّحات الصفوف في نافذة Coverage، كما في VS Code: الدوال التي يلتقي فيها الكود المعقّد بتغطية قليلة، الأسوأ أولًا؛ وقائمة منسدلة بجانب الفرز لكل الملفات، أو الملفات ذات الثغرات، أو الملفات غير المختبَرة، أو الملفات التي تغيّرت منذ آخر تشغيل.
- ملف إعدادات في جذر الحل. يُقرأ
fucini-coverage.json بجانب الحل بعد .vscode/settings.json وتكتبه نافذة الإعدادات عندما يكون هو الملف الموجود — للفريق الذي يفضّل ألا يحتفظ بمجلد .vscode. ويقرؤه كلا الإصدارين.
- .NET بلا تكلّف. يُبقي
ignore.generated ملفات المصمّم والملفات المولَّدة وobj\ وملفات الترحيل خارج كل مجموع؛ ويُبقي testRun.skipWhenTestsFail آخر تغطية سليمة على الشاشة عندما ينتهي التشغيل بالأحمر.
ليس بعد في هذا الإصدار
- لوحة Test Coverage واجهة VS Code، ولا يستطيع Solution Explorer عرض الشارات. ويأتي Compare Two History Runs عندما يطلبه المشتركون.
Coverage Studio for VS Code 1.2026.3 — بؤر الخطر والمرشّحات و.NET بلا حزمة
2026-09-24
أُضيف
- أي الملفات تُعرض. قائمة منسدلة ثانية في شريط أدوات عرض Coverage، بجانب الفرز: كل الملفات، أو الملفات ذات الثغرات، أو الملفات غير المختبَرة، أو الملفات التي تحرّكت أرقامها منذ التشغيل السابق. تتبع المجلدات ملفاتها وتحتفظ بأرقامها. في كل الخطط.
- Risk hotspots. تحت الشجرة: الدوال التي يلتقي فيها الكود المعقّد بتغطية قليلة، الأسوأ أولًا، ويفتح كل منها ملفه عند الدالة. تتأهل الدالة بدرجة CRAP —
hotspots.crapThreshold، وهي 30 افتراضيًا، الرقم الذي اقترحه واضعو هذا المقياس — أو بالتعقيد الدوري وحده، hotspots.complexityThreshold، وهو معطَّل افتراضيًا. ترى Community العدد والدرجة الأسوأ؛ أما القائمة المرتّبة فهي في Pro.
dotnet test بلا حزمة. يقرأ Run Tests with Coverage ملفات المشاريع أولًا: حيث لا يشير أي منها إلى Coverlet، يستخدم التشغيل جامع Microsoft نفسه — --collect:"Code Coverage;Format=cobertura" — الذي يأتي مع Microsoft.NET.Test.Sdk، ويُحمَّل تقريره كتقرير Coverlet.
- ملفات .NET المولَّدة تُستبعد. يُسقط
ignore.generated، المفعّل افتراضيًا، *.Designer.cs و*.g.cs و*.generated.cs و*.razor.g.cs وAssemblyInfo وتوجيهات using العامة وكل ما تحت Migrations/ وتحت obj/ من كل مجموع وصفحة وتصدير. ولم يعد ملف مصمّم لا يختبره أحد يكلّف الحل بوابته.
- التشغيل الفاشل يحتفظ بآخر تغطية سليمة. مع
testRun.skipWhenTestsFail، يترك التشغيل الذي ينتهي باختبار فاشل التغطية على الشاشة كما كانت، ويقول ذلك في جزء Output. معطَّل افتراضيًا.
تغيّر
- تشغيل Test Explorer يُعثر عليه من تلقاء نفسه. دون أي تهيئة، تشمل الأسماء المعروفة الآن مجلد
TestResults/<run>/ لكل مشروع اختبار، لا مجلد مساحة العمل نفسه فحسب، و<user>_<machine>_<date>.cobertura.xml الخاص بجامع Microsoft بجانب ملف Coverlet. وحل .NET الذي شُغّلت اختباراته في Visual Studio يعرض تغطيته عند أول فتح؛ ويُحمَّل كل مجلد تشغيل، ويُبقي الدمج كلمة أحدث تشغيل على كل ملف.
Coverage Studio لـ Visual Studio 1.2026.1 — التغطية نفسها في البيئة الأخرى
2026-09-23
أُضيف
- إضافة ثانية لـ Visual Studio 2022 و2026 — Community وProfessional وEnterprise. القارئ نفسه الذي في إصدار VS Code، فيعطي التقرير نفسه الأرقام نفسها، إلى الرقم، في كلا المحررين؛ وإعدادات
fuciniCoverage.* نفسها، تُقرأ من .vscode/settings.json ومن إعدادات مستخدم VS Code نفسه إن كان على الجهاز. لا يستخدم تغطية الكود الخاصة بـ Visual Studio: في Visual Studio 2022 هي ميزة لإصدار Enterprise، وعلى Community وProfessional هذه هي التغطية الوحيدة التي ستعرضها البيئة. - في المحرر: شريط في الهامش لكل سطر — أحمر لم يُنفَّذ قط، كهرماني جزئيًا، خريطة حرارية بعدد الزيارات — عدّادات تنفيذ مضمّنة، سطر فوق كل دالة بتغطيتها وتعقيدها ودرجة CRAP وMC/DC، خطوط على شريط التمرير، تلميح يقول أي فرع لم يُسلك، ونقطة على سطر حررته بعد التقرير.
- نافذة Coverage (View → Other Windows → Coverage): كل ملف بمقاييسه ونتيجة واحدة لها جميعًا، قابلة للترتيب، والملفات غير المقيسة تحتها؛ عنصرا شريط الحالة
Coverage وFile، كل منهما يفتح البطاقة الكاملة. - الأوامر تحت Tools → Coverage Studio، بأوتار بضغطتين بعد
Ctrl+Shift+U: N/P للسطر غير المغطى التالي والسابق، وB للقرار التالي المختبَر جزئيًا، وR لإعادة التحميل. يعيد وضع المراقبة التحميل عند تغيّر الملف الذي يكتبه بناؤك. - Getting Started، الخطوات الست بزر لكل منها، بـ 18 لغة؛ تُفتح من تلقاء نفسها في المرة الأولى.
- الإعدادات من الترس في شريط أدوات نافذة Coverage، الذي يكتب إعدادات المستخدم لهذا الإصدار أو
.vscode/settings.json الخاص بالمجلد ويحافظ على تعليقات الملف الذي يحرره. - الترخيص: مشمول في كل خطة مدفوعة. الجهاز الذي فُعِّل فيه Coverage Studio لـ VS Code لا يحتاج إلى شيء آخر — يُعثر على المفتاح من تلقاء نفسه؛ وفي أي مكان آخر يقبل Tools → Coverage Studio → Licence… رمز الاشتراك من رسالة التفعيل. دون اشتراك لا تُقرأ تغطية: لا مستوى مجانيًا في Visual Studio.
ليس بعد في هذا الإصدار
- Run Tests with Coverage ولوحة Test Coverage واجهات VS Code؛ ولا يستطيع Solution Explorer عرض الشارات. عرض Annotated Source وتقرير HTML والتصديرات وCheck Thresholds ومدخلات Error List والسجل والاتجاه وتغطية الفروق تأتي بالترتيب الذي يطلبه المشتركون.
Coverage Studio for VS Code 1.2026.2 — البدء، ومحرران باشتراك واحد
2026-09-23
أُضيف
- جولة إرشادية. Get started with Coverage Studio — تحت Help → Welcome → Walkthroughs، وتُفتح من تلقاء نفسها بعد التثبيت — تأخذ المستخدم الجديد في ست خطوات من تقرير التغطية إلى الأسطر التي لا يختبرها أحد، لكل خطوة زر للأمر الذي تتناوله. بجميع اللغات الثماني عشرة.
- يُترك معرّف التثبيت حيث يقرؤه Coverage Studio لـ Visual Studio. يتحقق إصدار Visual Studio من المفتاح في
license.key بالبصمة نفسها ولا يستطيع قراءة مخزن حالة هذه الإضافة؛ صار المعرّف يُكتب الآن عند كل تفعيل بجانب التخزين العام للإضافة أيضًا، فلا يحتاج الجهاز المفعَّل في VS Code إلى تفعيل ثانٍ في Visual Studio. معرّف UUID عشوائي، غير مرتبط بشيء، لا يُرسل إلى أي مكان.
تغيّر
- الاسترداد ينهي الاشتراك. الاسترداد أو رد المبلغ المعتمد يلغي الاشتراك الآن فورًا ولا يُصدر رمز تفعيله مزيدًا من المفاتيح؛ والاستردادات واحدة لكل عميل. المفاتيح الموجودة أصلًا على جهاز تستمر حتى انتهاء صلاحيتها كما في السابق. تقول سياسة الاسترداد بالضبط ما يحدث.
Coverage Studio for VS Code 1.2026.1 — أسماء ملفات يمكنك قراءتها دائمًا
2026-09-21
أُصلح
- أسماء الملفات في عرض Coverage مقروءة بأي عرض. كان الاسم هو الجزء الوحيد من الصف الذي ينكمش — إلى سبعة أحرف في شريط جانبي عادي. صار يُرسم كاملًا، وتنزلق أعمدة المقاييس والنتيجة والشريط تحته من اليسار وتتلاشى عند حدّ القطع كي لا يُقرأ نصف رقم على أنه رقم كامل. وما زالت كل قيمة موجودة في تلميح الصف.
- علامة «تغيّر الملف» تواكب الملف. بعد التحميل كانت تتبع أول تعديل وأول استعادة، ثم لا يحرّكها شيء حتى التحميل التالي. الآن يصل كل حفظ وكل تغيير على القرص.
- شريط أدوات عرض Coverage لم يعد يكسر تسميات أزراره. في الشريط الجانبي الضيق ينتقل شريط الأدوات الآن إلى سطر جديد بين عناصر التحكم، وينتقل مربع الفرز إلى سطر خاص به.
- شارة التغطية مجانية في منتقي التصدير أيضًا. كان Generate Coverage Badge يكتب شارة SVG دائمًا في كل مستوى، بينما كان Export Coverage Report… يرفض الملف نفسه في Community. الآن يكتبه كلاهما.
- Show Worst-Covered Folders مرخَّص مثل القائمتين الأخريين. لا يتغيّر شيء في Community، حيث الثلاث مجانية وغير محسوبة، ولا لأي مفتاح صدر من قبل.
أُضيف
- حدّ أدنى للإصدار المدعوم. تقرأ الإضافة الآن، مرة في الأسبوع تقريبًا، سياسة صغيرة موقّعة من خادم التراخيص لدينا. عندما يكون الإصدار أقدم من أقدم إصدار ما زال مدعومًا، تتوقف الفترة التجريبية والمستوى المجاني ويطلبان التحديث؛ أما الترخيص المدفوع فيُبلَّغ بالتاريخ ويستمر في العمل أولًا خلال مهلة سماح. لا ترسل هذه القراءة أي شيء عنك أو عن تثبيتك، ولا يُوقَف أبدًا لهذا السبب تثبيتٌ لا يستطيع الوصول إلى الخادم. لا يوجد حدّ أدنى محدَّد اليوم.
تغييرات
- الترخيص احتكاري بدءًا من هذا الإصدار. كانت الإضافة تُنشر بشروط MIT، وهو ما لم يناسب يومًا منتجًا يُباع بالاشتراك. يمكنك تثبيت النسخة المنشورة واستخدامها ضمن حدود خطتك، وتجاريًا أيضًا؛ ولا يجوز لك نسخها أو تعديلها أو إعادة توزيعها أو إجراء هندسة عكسية عليها. ما تنتجه من بياناتك — التقارير والتصديرات والشارات — ملكك، وقد أُلغي شرط الإسناد القديم. وتبقى نسخة من إصدار سابق خاضعة للشروط التي جاءت معها.
- زر إجراءات المسار (⋯) لا يشغل حيزًا حتى تشير إلى صف. صارت البكسلات الـ25 التي كان يحجزها في كل صف لاسم الملف؛ ويظهر بعد الاسم مباشرة عند التمرير، ولا يتحرك شيء في الصف.
Coverage Studio for VS Code 1.2026.0 — الشروط والطفرات والاختبارات وراء السطر
2026-09-20
أُصلح
- ملفات تتبّع LCOV 2 تذكر كل دالة مرة واحدة. تُقرأ
FN:<السطر>,<سطر النهاية>,<الاسم> كما يكتبها lcov 2.0 — وكانت كل دالة تظهر مرتين قبل ذلك: مرة كأنها لم تُستدعَ قط ومرة عند السطر 0 — وتُقرأ معها أزواج FNL:/FNA: في lcov 2.2.
- لم يعد قالب C++ يُرسم كأنه لم يُنفَّذ قط لأن نسخة واحدة منه لم تُنفَّذ، والدالة المليئة بوحدات الماكرو صارت دالة واحدة من جديد بدل واحدة لكل ماكرو.
- نصوص الموافقة تقول ما يرسله التثبيت فعلًا: لا صفحة شهرية من شيفرتك، وملخّص الاستخدام يحمل رمز الطلب الذي صدر مفتاحك بناءً عليه.
أُضيف
- تغطية الشروط صارت مقياسًا قائمًا بذاته. فـ
a && b قرار واحد وشرطان، وقد تسلك مجموعة الاختبارات كلا الفرعين دون أن ترى b خاطئًا قط. صار لها صفّها وعمودها وتصديرها وشارتها ووزنها في الدرجة (3، بين الفروع وMC/DC) وبوابتها — تُقرأ من BullseyeCoverage ومن تصدير cond في TRACE32 ومن -fcondition-coverage في GCC 14.
- الطفرات حيث هي. تُقرأ تقارير PIT وStryker طفرةً طفرة: تُعلَّم الناجية في سطرها داخل المحرّر، ويظهر عند التحويم ما الذي تغيّر وأي اختبارات نفّذت ذلك السطر، وتُسرد في تقرير HTML وفي الشيفرة المشروحة.
- أي الاختبارات نفّذت هذا السطر. coverage.py المكتوب بـ
--show-contexts وOpenCover المجموع بـ-coverbytest كلاهما يذكر أي اختبارات بلغت السطر، وتلميحة عدد المرات تسمّيها.
- الجزء الذي لم يُنفَّذ قط من سطر نُفِّذ يُظلَّل في المحرّر، وتنال دوال C وC++ تعقيدًا ودرجة CRAP محسوبَين من بيانات الفروع التي يحملها llvm-cov أصلًا.
- مشاريع JaCoCo وCobertura وCoverlet تُحمَّل عند أول فتح دون أي إعداد — بما في ذلك المواضع التي يكتب فيها Maven وGradle و
dotnet test افتراضيًا.
- كل مقياس بجوار كل ملف، وبأي عرض، مرتّبًا حسب وزنه في درجتك، وما لا يتّسع ينزلق بدل أن يختفي — ويظهر عدد على أيقونة Coverage حين يُعاد تحميل ملف تتبّع وأنت تنظر إلى شيء آخر.
- قناة إصدارات مبكرة يمكنك التطوّع لها، وزر واحد في شريط عنوان المحرّر يُطفئ تلوين التغطية ويعيد ما كان تمامًا.
تغييرات
- Bullseye وTRACE32: لم تعد تغطية الفروع تشمل الشروط. صارت القرارات تغطيةَ فروع والشروط تغطيةَ شروط، لذا يتغيّر رقم الفروع في مثل هذه المشاريع، وتتغيّر معه الدرجة المركّبة. اضبط
whmWeights.conditions على 0 لتعود الدرجة كما كانت.
- للمستوى المجاني Community حصة أسبوعية: خمس لكل إجراء من الإجراءات المحسوبة أسبوعيًا، بعد أن كانت عشرين يوميًا، وعند الحدّ يُعرض اشتراك أو تصريح لسبعة أيام. أما التثبيت المستخدَم فعلًا فيحتفظ بحدوده القديمة 30 يومًا ويُخبَر بذلك مرة واحدة مع التاريخ.
- تحتفظ الفترة التجريبية والمستوى المجاني بسجل استخدام لدى خادم التراخيص: بصمة لمعرّف الجهاز في VS Code، والإصدارة، ويوم بدء التقييم، وعدّادات الإجراءات المحسوبة — لا شيء غير ذلك، ولا يحدث أبدًا على ترخيص مدفوع، ولا يُنتظر قط. وصارت مقايضة القياس عن بُعد 30 يومًا لمرة واحدة.
- اختفت صفحة الشيفرة الشهرية — لم تعد تُجمع ولا تُحفظ ولا تُرسل لأي أحد، وتُحذف عند أول تشغيل لهذه النسخة أي صفحة احتفظت بها نسخة سابقة.
0.2026.82 — عتبات تناسب مشروعك، وكل ما تحمله تقاريرك
2026-09-17
أُصلح
- الخريطة الحرارية تُقرأ بالاتجاه الصحيح في السمة الداكنة. كان تدرّجها يمتد من الأصفر الباهت إلى البني الداكن، فكانت الحلقة الأكثر تنفيذًا تحصل على أخفت شريط. للسمة الداكنة الآن تدرّج خاص بها، من الزيتوني الخافت إلى البرتقالي الزاهي.
- تلميح MC/DC يعرض تفاصيله من جديد، وقرار llvm-cov يَعُدّ شروطه بشكل صحيح. كان الإصدار الحالي من VS Code يطوي التلميح في سطر واحد؛ وكان
(a && b) || c يُدرَج بشرط واحد بنسبة 100% تحت عنوان يقول بحقّ: زوجان من 3 أزواج. - دوال C++ تُسمّى كما كتبتها:
clamp_to<int> و gearbox::next_gear بدلًا من اسم الرابط ??$clamp_to@H@@YAHHHH@Z، وذلك في llvm-cov و lcov و gcov. - أعداد الأسطر في Istanbul تطابق nyc، ويُقرأ ملف XML الخاص بـ
dotnet-coverage، وتُستبعد أسطر :nocov: في SimpleCov بدلًا من أن تتعطّل، والتقرير الذي لا يحمل سوى ملخّص يحتفظ بأرقامه أيًّا كان ترتيب قراءة التقارير. - مساحات العمل متعددة الجذور: لم يعد تقرير HTML يذكر اسم المجلد مرتين، وعرض Coverage يُعنوِن مجلد مساحة العمل باسمه، ويمكن لقاعدة
pathRemap أن تستخدم ${workspaceFolder} إضافةً إلى ${workspaceRoot}.
أُضيف
- كل ما يحمله التقرير يُعرَض. تحصل استدعاءات الدوال والشيفرة الهدف ودرجة الطفرات على عمود في عرض Coverage وتقرير HTML وتصديرَي CSV و Markdown، وعلى صف في بطاقات شريط الحالة، وعلى شارة في المصدر المشروح — والمقياس الذي لا يحمله التقرير يُحذف بدلًا من أن يُطبع صفرًا.
- التعقيد و CRAP. حيثما يحمل التقرير التعقيد الدوري (OpenCover و JaCoCo و Clover و Cobertura)، تحصل كل دالة على درجة CRAP في CodeLens الخاص بها، ويحصل الملف على Max CRAP يرتبط بالتابع المعني، ويسرد تقرير HTML قائمة Riskiest Methods.
- المزيد من كل تنسيق: أذرع الفروع المسمّاة، والأسطر المستبعدة، ونطاقات الأعمدة داخل السطر، وأداة التقرير وإصدارها وتاريخه، والتحذيرات التي كتبتها الأداة فيه.
- أوزان اختيارية للشيفرة الهدف ودرجة الطفرات في الدرجة المركّبة، وكلاهما
0 ما لم تضبطهما.
تغييرات
- العتبات الافتراضية لم تعد 100%. العتبة التي لم تضبطها تساوي الآن 80 للأسطر، و80 للدوال، و75 للمناطق، و70 للفروع، و75 للدرجة المركّبة، بلا بوابة على MC/DC أو عمليات الاستنساخ أو استدعاءات الدوال أو الشيفرة الهدف — وهو ما يمكن أن يُطالَب به مشروع عادي. الإعداد
fuciniCoverage.threshold.profile: "safety" يعيد كل بوابة إلى 100، تمامًا كما كانت، والعتبة التي ضبطتَها بنفسك تتغلّب على أيٍّ من الملفّين التعريفيّين. إذا كنت تعتمد على القيم الافتراضية القديمة فسيُحكَم عليك بتساهل أكبر إلى أن تختار safety؛ والتثبيت الذي كان يعمل من قبل يُبلَّغ بذلك مرة واحدة، مع زر يضبط هذا الإعداد. - المقياس الذي ليست له بوابة يعرض شَرطة محايدة في البطاقات بدلًا من علامة صح أو علامة خطأ، وتعرض لوحة الإعدادات معاينة للحكم وفق البوابات السارية فعلًا.
0.2026.81 — نسب مئوية دقيقة، وتقرير يمكنك إرساله
2026-09-16
أُصلح
- التغطية في مخزن مؤقت به تغييرات غير محفوظة تعود إلى محاذاتها. كان تشغيلٌ يُحمَّل بينما في الملف تعديلات غير محفوظة يزيح كل علامة وتلميح و CodeLens بعدد الأسطر التي دفعتها تلك التعديلات. تُستعاد التعديلات الآن من الملف على القرص، ولم يعد لصق سطر كامل فوق سطر يَعُدّ ذلك السطر معدَّلًا.
- عمليات الدمج وسجلات LCOV المكررة تُجمع بشكل صحيح. لم يعد ملف التتبّع الأحدث يحتفظ بملخصات الفروع و MC/DC للتشغيل الأقدم، والملف المذكور مرتين في ملف تتبّع واحد يُدمج كما يدمجه genhtml.
- مفتاح الترخيص يبقى على جهازه. لم يعد Settings Sync ينقله إلى عمليات التثبيت الأخرى حيث كان يحجب التغطية؛ ومفتاح Business أو Enterprise أو Pro Plus المنتهي يجدّد نفسه حتى 45 يومًا بعد انتهائه.
- ملفات التتبّع البعيدة تُجلب بعناية أكبر. تبقى
remote.headers على مصدرها عبر عمليات إعادة التوجيه، ويستسلم الجلب بعد 30 ثانية، وتُرفض صفحة تسجيل الدخول بدل تخزينها مؤقتًا، والنافذة المفتوحة دون اتصال تحمّل آخر نسخة منزَّلة. التحديث الذاتي يثبّت إصداره فقط. - المحلّلات: عدّ أسطر llvm-cov يطابق
llvm-cov show، وقرارات OpenCover من طرق مختلفة لم تعد تكتب فوق بعضها، و xccov و TRACE32 و EMMA تحتفظ بأرقام أسطرها، وفئات Cobertura التي تتشارك ملفًا هي ملف واحد، وتقارير JaCoCo المجمّعة تُقرأ، وتعيين المسارات يحلّ .. ويطابق المقاطع كاملة. - في المحرر: يُحفظ السجل لكل مساحة عمل، وتبقى العلامات على الملفات الحقيقية لا على جزء HEAD في محرر الفروق، ولا تُرسم الأسطر بعد نهاية الملف، وشارات المستكشف في Windows تعمل مع مسارات
C:\…، والتشغيلات الكبيرة يُبحث فيها أسرع.
أُضيف
- إرسال تقرير تشخيصي. تعرضه إشعارات فشل التحميل أو الجلب البعيد أو الدمج أو مقارنة السجل أو الدردشة. يعاين بالضبط JSON الذي سيُرسل، مع عينة ملف اختيارية بحجم 4 كيلوبايت وتعليق وعنوان للرد، ولا يرسل شيئًا حتى تنقر على إرسال.
- تقارير الأخطاء. يُبلَّغ عن خطأ
FUCINI_* دون محتوى الملفات أو المسارات أو الأسماء عندما يكون مستوى القياس عن بُعد في VS Code هو all أو error. ثلاثة أسطر في السجل لها الآن رموزها الخاصة: FUCINI_REMOTE_002 و FUCINI_REMOTE_003 و FUCINI_GITDIFF_002، وكل منها موصوف في دليل المستخدم.
تغييرات
- لكل نسبة تغطية منزلتان عشريتان، مقتطعتان لا مقرّبتان:
87.43%، و 100.00% فقط عندما تكون التغطية 100 بالضبط. - البوابات تقرّر على القيمة الدقيقة. حتى الآن كانت كل نسبة تُقرَّب أولًا إلى عدد صحيح، فكانت 89.6% تجتاز بوابة 90%. المشروع الذي كان يجتاز بفضل التقريب فقط سيُظهر الآن NON-COMPLIANT حتى تبلغ تغطيته العتبة فعلًا.
- القياس عن بُعد يومي. كل تثبيت يرسل رسالة ترخيص صغيرة يوميًا عند مستوى القياس عن بُعد
all في VS Code؛ ومع تشغيل telemetry.enabled يخرج ملخص الاستخدام يوميًا بدل شهريًا. عمليات التثبيت التي فتحت ميزات مقابل القياس عن بُعد تُسأل قبل أن تتغير شروطها.
0.2026.80 — تحديث تراه
2026-09-14
أُضيف
- أصبح عرض Coverage يُعلمك بوجود تحديث، ويواصل إعلامك. يعرض شريط فوق شعار الترخيص الإصدار الجديد بجانب إصدارك، مع الأزرار الثلاثة نفسها الموجودة في إشعار التحديث: «تنزيل & تثبيت» و«عرض سجل التغييرات» و«تخطي هذا الإصدار». وتحمل أيقونة العرض في شريط النشاط شارة أيضًا، فتراها حتى والعرض مغلق. كان الإشعار يظهر مرة واحدة فقط، عند الفحص التلقائي، وكانت نقرة في أي مكان آخر تُخفيه حتى الفحص التالي بعد يوم؛ أما الشريط فيبقى حتى يُثبَّت التحديث أو يُتخطّى أو يُعطَّل
fuciniCoverage.update.checkForUpdates، ويبقى بعد إعادة تحميل النافذة.
0.2026.79 — إشارة واحدة في اليوم
2026-09-14
تغييرات
- تُرسَل الإشارات الصغيرة الآن مرة واحدة في اليوم على الأكثر، مجتمعةً. كان التحديث وتغيير الترخيص وتنسيق التغطية الجديد والملف الذي تعذّرت قراءته يُرسَل كلٌّ منها في إشارة مستقلة لحظة ملاحظته — وفي بعض التثبيتات كان يُلاحَظ من جديد في كل جلسة: فالمقعد الملغى كان يُبلغ عن إلغائه عند كل تشغيل، والتنقل بين مساحات عمل تستخدم تنسيقات مختلفة كان يُبلغ في كل مرة عن مجموعة «جديدة». أصبحت الآن تُجمَع وتُرسَل في إشارة واحدة، مرة واحدة في اليوم على الأكثر. واليوم الذي لا يوجد فيه ما يُبلَغ عنه لا يُرسل شيئًا.
- لا يُبلَغ إلا عمّا تغيّر فعلًا. الترخيص الذي يتغيّر ثم يعود إلى حاله خلال اليوم لا يُبلغ عن شيء، والتنسيقات هي كل التنسيقات التي حمّلها التثبيت يومًا، لا تنسيقات مساحة العمل الأخيرة وحدها. أما إشارة التثبيت وإشعار الإزالة فما زالا يُرسَلان فورًا، ولا يُجمَع أي شيء جديد.
- أصبح مفتاح القياس عن بُعد الخاص بـ VS Code يشمل الإشارات الصغيرة أيضًا. عندما تكون قيمة
telemetry.telemetryLevel هي off، لا يُجمَع شيء للإشارة اليومية ولا يُرسَل شيء؛ وحتى الآن لم يكن يلتزم به إلا الملخّص الشهري وإشعار الإزالة. أما إشارة التثبيت التي تُرسَل مرة واحدة فلم تتغيّر.
- الشهر الذي ينتهي والمحرّر خامل يُبلَغ عنه مع ذلك. كان الملخّص الشهري لا يُفحَص إلا بعد تحميل التغطية، فالتثبيت الذي توقّف استخدامه لم يكن يُرسل شهره الأخير أبدًا. أصبح الآن يُفحَص أيضًا كل ساعة ما دام VS Code مفتوحًا — وما زال ذلك مع تشغيل القياس عن بُعد فقط، ومرة واحدة كل 30 يومًا على الأكثر.
إصلاحات
- الإشارة التي رفضها الخادم لم تعد تُعَدّ مُرسَلة. كان أي ردّ من الخادم، بما في ذلك الخطأ، يُعَدّ تسليمًا، فكانت الإشارة اليومية المرفوضة تفقد ما جمعته، ولا تُعاد محاولة إشارة التثبيت المرفوضة. أصبح لا يُحتسَب الآن إلا الردّ الناجح؛ وتُحفَظ الإشارة اليومية أو الملخّص الشهري المرفوض وتُعاد محاولته بعد يوم.
0.2026.78 — أربعة عشر يومًا جديدة
2026-09-13
تغييرات
- كل تقييم يحصل على 14 يومًا جديدة، مرة واحدة. عند أول تشغيل لهذا الإصدار، يُعاد فتح الفترة التجريبية على كل تثبيت Pro لا يملك ترخيصًا مدفوعًا — سواء انتهت منذ زمن بعيد أو كانت لا تزال فيها بضعة أيام — وتستمر 14 يومًا من ذلك اليوم. ويُشير إشعار قصير إلى ذلك عند حدوثه. والترخيص المدفوع لا يتأثر، وإصدار Community، الذي لا فترة تجريبية فيه، لم يتغيّر.
- الترخيص المدفوع يعرض «مُفعَّل» باللون الأخضر. كان شريط الترخيص يعرض للمشترك «مُفعَّل — يتبقى 30 يومًا». مفتاح الاشتراك يسري حتى نهاية الفترة المدفوعة ويُجدَّد معها، لذا ما كان ذلك العدّ التنازلي ليكفّ عن أن يُقرأ كفترة تجريبية على وشك الانتهاء. صار العنوان الآن يقول مُفعَّل فحسب، ويظهر التاريخ في التفاصيل بعبارة «صالح حتى»، ولا يعود العدّ التنازلي إلا في الأسبوع الأخير قبل انتهاء صلاحية المفتاح، بجوار ملاحظة التجديد القريب التي كانت موجودة أصلًا.
0.2026.77 — الصق رمزك، وهذا كل شيء
2026-09-12
أُضيف
- «Enter Subscription Code» — ولا يُسأل عن شيء آخر. اختر خطتك، والصق الرمز من رسالة الشراء، وأكّد؛ فيُصدر مفتاح الترخيص ويُطبَّق عنك. حتى الآن كان الطريق الوحيد من داخل المحرِّر هو استبيان التقييم — الاسم والبريد ونوع الحساب والشركة واستطلاع — وهو النموذج الخطأ ليُوضع أمام من دفع بالفعل. والطريق الآخر كان رابط
vscode:// في البريد، والحذر من النقر عليه تصرّف معقول لا جبن: رابط كهذا يمكن أن تُشغّله أي صفحة تزورها، ولهذا بالضبط يطلب التفعيل تأكيدًا منك. الأمر موجود في لوحة الأوامر، وهو أيضًا زرّ في شريط الترخيص بلوحة التغطية وفي مربّع حوار التفعيل — في كل حال، لأن الترخيص ينتقل بين الأجهزة، ولأن الشراء في منتصف فترة التجربة هو الحالة المعتادة لا الاستثناء.
- طريق لرؤية الخطط من داخل فترة التجربة نفسها. كانت صفحة الأسعار متاحة من شاشات الإصدار المجاني، لكنها لم تكن متاحة من مربّع حوار التفعيل ولا من شريط الترخيص — المكان الوحيد الذي ينظر إليه فعلًا من يقرأ «بقيت 3 أيام». كان ذلك القارئ يُعرض عليه استبيان وتلميح عن
settings.json، ولا سعر على الإطلاق.
تغييرات
- مربّع حوار التفعيل وشريط الترخيص لم يعودا يبدآن بـ
FCK1. كان كلاهما يبدأ برمز الطلب الخاص بك وبعبارة «الصق المفتاح في settings.json»، وهذا هو المسار المخصّص لحين تعذّر الوصول إلى خادم التراخيص لدينا أصلًا. وبعرضه أولًا كان يُقرأ كأنه التعليمات — فيُرسَل عميل يحمل رمز اشتراك FCB1… إلى «Enter Activation Key»، الحقل الوحيد الذي سيرفضه حتمًا. وكلاهما لا يزال موجودًا، أسفل المسارات التي تناسب من اشترى، وموصوفًا بما هو عليه حقًّا.
0.2026.76 — الأمر الذي ذكره البريد
2026-09-12
أُصلح
- «Request Activation Key» صار أمرًا حقيقيًا. رسالة الشراء — وصفحة التفعيل، بكل اللغات — تخبرك أنه إذا لم ينجُ رابط النقرة الواحدة من برنامج البريد لديك، فيمكنك تنفيذ Fucini Coverage: Request Activation Key من لوحة الأوامر، واختيار خطتك ولصق رمزك. لكن ذلك الاسم كان يخصّ شريط عنوان اللوحة والرابط نفسه، ولم يكن يومًا اسم أمر، فلم يظهر في لوحة الأوامر شيء تحته — وأقرب تطابق بالاسم، Enter Activation Key، يستقبل مفتاح
FCK1… الذي يصدره خادمنا، لا رمز FCB1… الذي يحمله بريدك. واتّباع التعليمات كان يوصلك إلى الحقل الوحيد الذي سيرفض حتمًا ما بين يديك. أما الآن فهو أمر حقيقي.
- مربّع حوار التفعيل يعرض طلب ترخيص… بينما لا تزال فترة التجربة أو المفتاح ساريين. كان يُحجب حتى انتهاء أحدهما، بحجّة أن التثبيت العامل لا سبب لديه للاتصال بخادم التراخيص. لكن الشراء في منتصف فترة التجربة هو الحالة المعتادة لا الاستثناء، ومن كان في هذا الموضع لم يكن لديه من المربّع أي طريق إلى الحقل الذي يُدخل فيه رمزه: الزرّان المتبقيان كانا يطلبان مفتاحًا لا ينتج إلا عن استبدال الرمز.
0.2026.75 — لوحة ألوان لمصابي عمى الألوان
2026-09-12
أُضيف
- لوحة ألوان لمصابي عمى الألوان. اضبط
colorScale.preset على colorblind لتُرسم التغطية بالقرمزي والبرتقالي والأزرق (لوحة Okabe–Ito) بدل الأحمر والكهرماني والأخضر — في التدرّج وأشرطة الهامش وإبراز الأسطر وشارات المستكشف وعلامات التغيير منذ آخر تشغيل. واللون الذي تضبطه بنفسك له الأولوية.
0.2026.74 — التغطية مصفّاة حسب الاختبار
2026-09-12
أُضيف
- تصفية التغطية حسب الاختبار في عرض Test Coverage الخاص بـ VS Code. عندما يسمّي ملف التتبع اختباراته — أقسام
TN: في lcov — يصبح كل اختبار عنصرًا تحت Fucini Coverage في Test Explorer، ويسرد كل ملف في عرض Test Coverage الاختبارات التي نفّذت فيه شيئًا، واختيار أحدها يعرض الأسطر التي وصل إليها ذلك الاختبار. ${command:…} في إعدادات المسارات. يتبع ${command:cmake.buildDirectory}/coverage.info مجموعة CMake المحددة. يُشغَّل الأمر قبل كل عملية اكتشاف، لمدة خمس ثوانٍ على الأكثر وفي مساحة عمل موثوقة فقط؛ والأمر الذي يفشل يترك المتغير كما كُتب، ويوضح المُخرَج السبب.- بداية سريعة في 30 ثانية ومقارنة بالبدائل تفتتحان الآن صفحة Marketplace والصفحة الرئيسية.
أُصلح
- ملف التتبع الذي سجّل ملفًا مرة لكل اختبار كان يعدّه مرة لكل اختبار. تُجمع السجلات الآن معًا لكل ملف تتبع، كما يقرؤها genhtml: يُعدّ الملف مرة واحدة في المجاميع، ومع تحميل عدة ملفات تتبع لا تضيع أسطر أي اختبار.
0.2026.73 — تحديثات موقَّعة، ومفتاح يبقى صالحًا بعد التبديل
2026-09-11
أُصلح
- يُحفظ معرّف التثبيت الآن قبل أن يستخدمه أي شيء. أوقف الإصدار 2 من 0.2026.72 إعادة تحديد المعرّف عند كل استدعاء، لكن بدء التشغيل ظل لا ينتظر اكتمال كتابته، فكان بإمكان نافذة أُغلقت بعد فتحها مباشرة أن تفقده — ومعه بصمة الجهاز التي يرتبط بها مفتاح التفعيل. أصبح بدء التشغيل ينتظر الآن.
- لم يعد التبديل من Pro إلى Community يُبطل مفتاح التفعيل. لكل إصدار مساحة تخزين خاصة بالإضافة، لذلك كان Community يبدأ بمعرّف تثبيت جديد وبصمة جديدة، بينما كان المفتاح الموجود في إعداداتك — بما فيه المفتاح الذي طلبه التبديل للتو لفتح الميزات مجانًا — مرتبطًا بالمعرّف القديم. صار التبديل الآن ينقل المعرّف.
الأمان
- التحديثات القادمة من fucini.software موقَّعة ويجري التحقق منها قبل تثبيتها. يحمل كل ملف
.vsix في قناة التحديثات تجزئة SHA-256 وتوقيع Ed25519 أُنشئ بمفتاح لا يوجد أبدًا على خادم الويب. يتحقق المحدِّث المدمج والتبديل إلى Community من كليهما مقابل الملف الذي نُزِّل، ويرفضان أي شيء آخر — صفحة خطأ من وكيل، أو تنزيلًا مبتورًا، أو إصدارًا أقدم من ذاكرة التخزين المؤقت، أو ملفًا ليس منا. لا يكفي HTTPS وحده هنا: فالوكيل المؤسسي الذي يفحص TLS يعيد توقيع كل اتصال يمر عبره. - أصبح لكل إصدار اسم ملف خاص به. تشير قناة التحديثات الآن إلى ملف
.vsix يحمل رقم الإصدار بدلًا من ملف يُستبدل مع كل إصدار، فلا يمكن لذاكرة تخزين مؤقت تتجاهل Cache-Control أن تقدّم إصدار الشهر الماضي على أنه إصدار هذا الشهر. لم تتغير الروابط في صفحة التنزيل.
0.2026.72 — القرارات التي اختُبرت في اتجاه واحد فقط
2026-09-10
أُضيف
- الانتقال إلى القرارات التي اختُبرت في اتجاه واحد فقط. يمرّ أمرا Next Partly-Tested Decision والسابق على التفرّعات التي نُفِّذ بعض أذرعها ولم يُنفَّذ بعضها الآخر قط. وهذه هي الفجوة التي لا يستطيع التنقّل بين الأسطر غير المغطاة إظهارها: السطر الذي نُفِّذت عبارته يُعدّ مغطى، ويبقى مغطى مهما بلغ عدد أذرعه التي لم تُسلَك قط — فـ
if (a && b) الذي بُلغ مرة واحدة وa خاطئة مغطّى بنسبة 100% على مستوى الأسطر ومختبَر إلى النصف. محطة واحدة لكل قرار لا لكل ذراع، لأن أذرع if/else قد تفصلها صفحات، ولأن القفز إلى الذراع الخامسة في switch يقول أقل من القفز إلى switch نفسه. أما القرارات التي لم تبلغها أي ذراع فتُترك لأوامر الأسطر غير المغطاة، وهي تتوقف عندها أصلًا — والملف الذي لا يسجّل تقريره أي تفرّع يقول ذلك، بدل ادّعاء أن كل قرار اختُبر في الاتجاهين.
Reload Coverage تعيد قراءة ما هو محمَّل بالفعل. مع إيقاف المراقبة، كان السبيل الوحيد للعودة إلى أرقام حديثة بعد إعادة تشغيل الاختبارات هو Load Coverage، وهو يعيد تشغيل الاكتشاف وقد يعود بمجموعة مختلفة عمّا هو على الشاشة. أما هذا الأمر فيعيد قراءة ما هو محمَّل الآن بالضبط، بما في ذلك ملفات التتبّع المختارة يدويًا التي لن يعثر عليها الاكتشاف مرة أخرى أبدًا.
Copy Coverage Summary يضع التشغيل في جدول Markdown. الملف الأقل تغطية أولًا، مع صف للمجاميع، جاهزًا للّصق في طلب سحب. ولا يظهر عمودا التفرّع وMC/DC إلا إذا قاسهما شيء في التشغيل: فعمود من الشرطات يُقرأ على أنه تغطية صفرية لا على أنه غير مقيس، وهو عكس الحقيقة.
أُصلح
- كان معرّف التثبيت قد يتغيّر بين جلسة وأخرى — ومنه تحديدًا تُشتقّ بصمة الترخيص. كان يُحدَّد من جديد عند كل استدعاء ويُحفظ دون أن ينتظر أحد اكتمال الكتابة، فكان استدعاء ثانٍ، أو نافذة محرّر أُغلقت بُعيد بدء التشغيل، قد ينتج معرّفًا جديدًا. والمعرّف الذي يتغيّر يعني مفتاح تفعيل لم يعد مطابقًا؛ كما أنه ضخّم كل رقم يُحسب لكل تثبيت. صار الآن يُحدَّد مرة واحدة في الجلسة ويُحفظ قبل أن يستخدمه أي شيء. الإصدار 2.
0.2026.71 — أي ملف تتبّع غطّى هذا السطر
2026-09-08
أُضيف
- نسب المصدر على مستوى السطر. عند تحميل أكثر من ملف تتبّع، تنتهي تلميحة عدد مرات التنفيذ الآن بعبارة مغطّى بواسطة: والتقارير التي سجّلت تنفيذًا على ذلك السطر — والنقر على صف ملف تتبّع في عرض Coverage يضيء الآن الأسطر التي أسهم بها، في كل محرّر مفتوح، كما كان يضيء الملفات التي قاسها. هذا هو السؤال الوحيد الذي يستطيع تشغيل مدمج الإجابة عنه ولا يستطيعه تقرير واحد: ملفّا تتبّع يقيسان الملف نفسه يختلفان في أسطره، وحتى الآن كان الدمج يسوّي ذلك الاختلاف ولا يُظهره أبدًا. الدمج ما زال على مستوى الملف — التقرير الأحدث يربح الملف المشترك بالكامل — لذلك تُفهرس مصادر الأسطر قبل الدمج. تُحتسب الأسطر المغطاة فقط: التقرير الذي سجّل سطرًا بقيمة
0 لم يغطّه.
- سجل
TN: في lcov يُقرأ أخيرًا. ملف التتبّع الذي يسمّي مجموعة اختباراته — TN:integration — يظهر بوصفه coverage.info (integration) في كل موضع يُذكر فيه المصدر، ويبقى الاسم عند التصدير إلى lcov بدل أن يُكتب فارغًا. معظم الأدوات تكتب TN: فارغًا ولا يتغير شيء؛ والأدوات التي تملؤه هي بالضبط تلك التي تُدمج ملفات تتبّعها، وعندئذ يكون الاسم الشيء الوحيد الذي يقول أيّها أيّ.
fuciniCoverage.lineHighlight يلوّن الأسطر نفسها. off | uncovered | heatmap، معطّل افتراضيًا: لون شبه شفاف خلف كل سطر غير مغطّى ومغطّى جزئيًا، وفي وضع heatmap خلف كل سطر نُفِّذ أيضًا، أدفأ كلما زاد تنفيذه. إعداد مستقل بدلًا من قيمة رابعة لـeditorGutter.mode، لأن الناس يريدونهما في تركيبات مختلفة: الفجوات ملوّنة والهامش نظيف، أو أعمدة بلا لون خلف الشفرة. شبه شفاف لأنه يقع تحت النص، ويلوّن الفجوات لا الأسطر المغطاة، للسبب نفسه الذي يفعله الهامش.
fuciniCoverage.overviewRuler يقرّر بمفرده شأن الشريط في شريط التمرير. follow (الافتراضي) يفعل ما كان يفعله دائمًا: شريط حيثما رسم الهامش عمودًا غير مغطى أو جزئيًا، ولا شيء لخريطة الحرارة. وuncovered يرسمه حتى مع إيقاف editorGutter.mode — خريطة لفجوات الملف على امتداد شريط التمرير ولا شيء بجوار الشفرة. وoff يُبقي الأعمدة ويحذف الشريط. كان المسطرة مرتبطة بالهامش من قبل، فلم يكن هذان التركيبان ممكنين.
أُصلح
- ملف التتبّع الذي يتعذّر تحليله يقول الآن كيف قُرئ. عبارة «…ليس حسن التكوين» كانت تترك القارئ يخمّن ما إذا كان الملف قد تُعرِّف أصلًا على أنه الصيغة التي يظنّها — ومستند Cobertura الذي يرفضه محلّل VectorCAST مشكلة مختلفة عن مستند Cobertura مبتور فعلًا. صار الإشعار ينتهي بعبارة قُرئ الملف على أنه cobertura. عندما يتولّى الملفَّ محلّلٌ ما. وإن لم يتولّه أحد فلا يُضاف شيء: عبارة «ليس بصيغة يقرؤها هذا الامتداد» تقول ذلك كاملًا.
0.2026.70 — إشعار البيانات القديمة يعرض أيقونته من جديد
2026-09-08
أُصلح
- يعرض إشعار البيانات القديمة في تلميح شريط الحالة أيقونة الساعة من جديد بدلاً من النص
$(history). الإشعار الذي يقول إن الأرقام تحته تصف نسخة أقدم من الملفات يحمل العلامة $(history) نفسها التي يحملها شريط الحالة. في شريط الحالة تُرسم هذه العلامة أيقونةَ ساعة، لأن StatusBarItem.text يستبدل الأيقونات من تلقاء نفسه؛ أما التلميح فهو MarkdownString، وعليه أن يطلب ذلك عبر supportThemeIcons، وهو ما لم يفعله قط — فبدأ السطر الوحيد الذي يشرح لماذا لا يمكن تصديق التغطية بقطعة من الصياغة الخام. والتلميح يطلبه الآن.
0.2026.69 — أوضاع الهامش، وملفات التتبع البعيدة، ومساحات العمل متعددة الجذور، والملفات غير المقيسة
2026-09-08
أُضيف
- صار هامش المحرر نفسه يستطيع إظهار الأسطر غير المغطّاة، أو خريطة حرارية لأعداد الإصابات. ما زال يعرض افتراضيًا النتائج وحدها — أشرطة MC/DC، ومثلثات «منذ آخر تشغيل»، ونقاط الأسطر المحرَّرة — ويبقى العرض الملوّن للملف كله هو Annotated Source. يتيح
fuciniCoverage.editorGutter.mode المزيد: يضع uncovered شريطًا على كل سطر لم يُنفَّذ قط وشريطًا كهرمانيًا على كل سطر فيه فرع لم يُسلك قط، ولا شيء على الأسطر المغطّاة، فلا يحجب جدار أخضر الأسطر الحمراء الثلاثة؛ ويضيف heatmap ظلًّا دافئًا على كل سطر نُفِّذ، أشدّ حرارةً كلما كثر تنفيذه. ويبدّل Choose Editor Gutter Mode... بين الأوضاع الثلاثة من لوحة الأوامر أو من قائمة شريط الحالة. كان README يدّعي «هوامش أصلية» دون تحفّظ؛ وصار يقول ما هو موجود فعلًا. - أعداد الإصابات المضمّنة. يكتب
fuciniCoverage.hitCounts.inline القيمة ×12 بعد كل سطر تبدأ عنده عبارة، بما في ذلك ×0 — الرقم الذي كان دائمًا عند التحويم، من دون تحويم. يبدّله Toggle Inline Hit Counts؛ وتعرضه قائمة شريط الحالة بصيغة إظهار أو إخفاء، أيهما ينطبق. ${env:NAME} و${config:section.key} و${userHome} و${workspaceFolderBasename} في كل إعداد مسار، إلى جانب ${workspaceFolder} الذي كان موجودًا من قبل. المتغيّر الذي لا يعرفه الامتداد يُترك كما كُتب، فيظهر الخطأ المطبعي في سجل الاكتشاف بوصفه المسار الذي بُحث عنه بدل أن يختفي. - يجوز أن يكون مدخل
coverageFile.paths عنوان http(s)://. يُجلب الملف الناتج إلى مساحة تخزين الامتداد عند كل تحميل ويُحمَّل من هناك؛ ويذكر عرض Coverage العنوان، لا مسار الذاكرة المؤقتة. كل جلب مشروط (ETag / Last-Modified)، فإعادة جلب ملف لم يتغيّر لا تنزّل شيئًا، وحين يفشل الجلب تُحمَّل آخر نسخة منزَّلة بدلًا منه ويُذكر السبب في المخرجات. يضيف fuciniCoverage.remote.headers ترويسات Name: value مع توسيع المتغيّرات — Authorization: Bearer ${env:CI_TOKEN} يُبقي الرمز خارج settings.json — ويعيد fuciniCoverage.remote.refreshMinutes الجلب على مؤقّت. أضف #lcov.info (أو اسم ملف آخر) جزءًا مُلحقًا بالعنوان حين لا ينتهي العنوان نفسه باسم ملف، ليُعرف التنسيق. - يعرض التحميل وGenerate Full HTML Report التقدّم، ويمكن إلغاؤهما. تحميل عشرة ملفات تتبع أو أكثر، أو 8 ميغابايت أو أكثر منها، يجري تحت إشعار تقدّم بزر Cancel يسمّي الملف الذي يُقرأ والمرحلة (القراءة، ثم فحص المصادر)؛ أما التحميل الأصغر فلا يفعل سوى تدوير شريط الحالة كما كان. والإلغاء يُبقي التشغيل السابق محمَّلًا ويقول ذلك. ويفعل تقرير HTML الشيء نفسه لكل صفحة تُرسَم وتُكتب.
- سببان آخران لإعادة التحميل. مدخل
coverageFile.paths المطلق الواقع خارج مساحة العمل — شجرة بناء بجوار النسخة المسحوبة، أو جذر مخرجات Bazel — صار يُستطلع أيضًا، فالملف الذي يظهر هناك بعد فتح النافذة يُحمَّل بدل ألّا يُنظر إليه ثانيةً أبدًا؛ إذ لم يكن المراقب يرى سوى مساحة العمل. ويسمّي fuciniCoverage.watch.reloadAfterTasks مهامّ (label من tasks.json، أو source: name كما تعرضها قائمة Run Task، مثل npm: test) يعيد انتهاؤها تحميل التغطية، سواء كان watch.enabled مفعّلًا أم لا — لعمليات البناء التي لا يستطيع المراقب متابعتها: تشغيل يستبدل شجرة مخرجات مربوطة برابط رمزي، أو تقرير على مشاركة شبكية، أو خطوة تغطية تعالج ملفها بعد إنتاجه. - مساحات العمل متعددة الجذور. صار كل مجلد في مساحة العمل يُكتشف بشروطه هو: تُقرأ
coverageFile.defaultLocation وcoverageFile.paths وpathRemap وignore وwatch.* وremote.* وbadge.* ومجلدات التقارير وgitDiff.* وproblems.perLine وeditorGutter.mode وhitCounts.inline لكل مجلد على حدة، فيسري ملف .vscode/settings.json الخاص بالمجلد أو مدخله في .code-workspace؛ ويعني ${workspaceFolder} مجلد المدخل نفسه؛ وتندمج ملفات التتبع الموجودة في كل المجلدات في تشغيل واحد، ويجمّع عرض Coverage الملفات حسب المجلد. ويجرّب ${workspaceRoot} في قاعدة pathRemap مجلد ملف التتبع نفسه أولًا، ثم المجلدات الأخرى. وكل ما يحتاج إلى مجلد واحد — مربعات حوار الملفات، ومخرجات التقرير والشارة، وبيانات git الوصفية، وRun Tests with Coverage — يأخذ مجلد المحرر النشط، ومع عدة مجلدات وبلا محرر يسأل تشغيل الاختبارات أيَّها يقصد. والمجلد الذي يُضاف إلى مساحة العمل أو يُزال منها يعيد تحميل التغطية من تلقاء نفسه. قبل هذا كان اثنا عشر موضعًا يأخذ المجلد الأول، فيحصل الجذر الثاني على أساس خاطئ لكل شيء. - يُنشر التشغيل إلى عرض Test Coverage الخاص بـ VS Code نفسه. مع
fuciniCoverage.testCoverage.publish (مفعّل افتراضيًا) يذهب كل تشغيل محمَّل أيضًا إلى لوحة Test Coverage الأصلية، ونسبها المئوية لكل ملف في Explorer، ومفتاح «Show Inline Coverage» الخاص بالمحرر نفسه — الأسطر وفروع القرارات والدوال، مع تحميل التفاصيل عند الطلب. ينشر Show in Test Coverage View التشغيل النشط ويفتح اللوحة أيًّا كان الإعداد؛ وتعرضه قائمة شريط الحالة خلف quickActions.showTestCoverage. - تُقترح قاعدة إعادة تعيين مسارات حين لا تتطابق الملفات. أشيع حالات «حُمِّل لكن لا شيء يضيء» هي ملف تتبع تأتي مساراته من حاوية أو من نسخة CI مسحوبة (
/build/src/a.c، /home/runner/work/repo/repo/src/a.c، C:\agent\_work\1\s\src\a.c) بينما في مساحة العمل src/a.c. حين يترك التحميل ملفات بلا تطابق، يبحث الامتداد عن أسماء الملفات في مساحة العمل، ويستنتج قاعدة البادئة التي تفسّر أكبر عدد منها، ويسجّلها بوصفها [FUCINI_REMAP_002]، وتعرض نتيجة التحميل Apply Suggested Remap — نقرة واحدة تُلحق القاعدة بـ fuciniCoverage.pathRemap وتعيد التحميل. ويجري Suggest Path Remap Rule التحليل نفسه عند الطلب. ولا يُكتب شيء من دون النقرة. fuciniCoverage.ignore: ملفات لا تُحتسب أبدًا. الملفات المورَّدة أو المولَّدة أو ملفات الأطراف الثالثة (vendor/**، **/*.generated.ts، build/**) تُسقَط من التشغيل عند تحميله، فيَعُدّ عرض Coverage وشريط الحالة والعتبات والشارات وCodeLens والسجل والتصديرات كلها من دونها؛ وتقول نتيجة التحميل كم ملفًا استُبعد وتسمّيها المخرجات. تُطابَق الأنماط مع المسار النسبي لمساحة العمل ومع المسار المطلق؛ والنمط الخالي من / يطابق اسم مجلد أو ملف على أي عمق، مثل .gitignore. هذا للملفات كاملةً — أما الأسطر داخل الملف فتظل تستخدم علامات الاستبعاد الخاصة بالأداة نفسها. - مدخلات Problems لكل سطر، اختياريًا. يضع
fuciniCoverage.problems.perLine (off أو uncovered أو uncoveredAndPartial؛ معطّل افتراضيًا) تشخيص Information على كل كتلة متّصلة من الأسطر التي لم تُنفَّذ قط — فالدالة الميتة ذات الأربعين سطرًا مدخل واحد لا أربعون — وفي الوضع الثاني على كل سطر فيه فرع لم يُسلك قط. للمستندات المفتوحة فقط، فلا يستطيع تشغيل من ألفي ملف أن يُغرق اللوحة؛ وتتبع المدخلات أسطرها مع تحرير المخزن المؤقت وتزول عند إغلاق المستند. ومدخل الملف الواحد خلف problems.enabled لم يتغيّر. - شارة تغطية لملف README. يكتب Generate Coverage Badge شارة SVG على طراز shields للتشغيل النشط في مساحة العمل (
fuciniCoverage.badge.outputPath، افتراضيًا coverage-badge.svg)، ليضمّنها README بـ  من دون خدمة مستضافة. يختار badge.metric الأسطر أو الفروع أو MC/DC أو الدرجة المرجّحة؛ ويتبع اللون مستويات colorScale؛ ويعيد badge.autoUpdate كتابتها بعد كل تحميل. وشارة SVG التي كان Export Coverage Report يقدّمها أصلًا صارت تشترك في المُصيِّر نفسه. - غير مقيس مقابل غير مغطّى. الملف الذي لم يحمّله أي اختبار غير موجود في ملف التتبع أصلًا، ولذلك ظل الامتداد دائمًا يفصله عن ملف مقيس بصفر إصابة — ويُبقيه خارج الأرقام، وهذا بالضبط ما يجعل مشروعًا نصف وحداته بلا اختبارات يُقرأ «92%». صار الفرق ظاهرًا: فتح ملف كهذا يضع
not measured في شريط الحالة، ويقرّر fuciniCoverage.unmeasured.mode ما يحدث غير ذلك. يضيف list مجموعة Unmeasured إلى عرض Coverage تضم كل ملف في مساحة العمل من نوع قاسه التشغيل ولا يحويه التشغيل، ويعدّها في نتيجة التحميل، ويعلّمها بـ ? في Explorer حين تكون الشارات مفعّلة، ويتيح لـ threshold.unmeasuredFiles إفشال Check Coverage Thresholds بعد عدد تختاره. ويذهب count أبعد: ينضم كل ملف كهذا إلى التشغيل بنسبة 0% — سطر غير مغطّى مقابل كل سطر شيفرة — فيرى شريط الحالة والعتبات والشارات والسجل والتصديرات وعرض Test Coverage كلها الرقم الصادق؛ ويُرسم الملف بوصفه غير مقيس في كل مكان، لا بوصفه «لم يعد يطابق تغطيته». ويُبقي unmeasured.exclude الترويسات وأمثالها خارجًا (**/*.h و**/*.hpp و**/*.hh و**/*.inl و**/*.d.ts افتراضيًا). معطّل افتراضيًا؛ وحالة شريط الحالة هي التغيير الوحيد المفعّل دائمًا. - عرض التغطية يُظهر ما فعله الدمج. منذ 0.2026.63، إعادة تشغيل وحدة بمفردها محمّلة فوق تشغيل المشروع كله تستبدل أرقام ذلك التشغيل لملفات الوحدة، وكان كل صف يذكر التقرير الذي يُعرض منه — لكن الصف الذي طغت أرقامه على تقرير أقدم كان يبدو تمامًا كصف قاسه تقرير واحد من بين عدة تقارير، ولم يكن شيء يذكر كم طُغي عليه من تقرير. الآن تُحاط شارة ملف التتبع في مثل هذا الصف بإطار؛ وكل صف ملف تتبع فوق الشجرة يعدّ ما فعله الدمج بملفاته («42 ملفًا · 7 طغى عليها تقرير أحدث»، «7 ملفات · يطغى على 7 في تقارير أقدم»)؛ والنقر على صف ملف تتبع يُبرز الملفات التي قاسها في الشجرة الكاملة ويُخفّت البقية حتى يُنقر عليه مرة أخرى.
fuciniCoverage.coverageView.mergedMarks (مفعّل افتراضيًا) يوقف الإطار والإبراز؛ وتبقى الأعداد.
0.2026.68 — مقاعد الفرق تطلب رمز الدعوة
2026-09-07
أُصلح
- يُطلب الآن من مستخدم Business أو Enterprise رمز دعوته، لا رمز الشركة. منذ 2 سبتمبر يرفض خادم الترخيص رمز الشركة المشترك لمقعد Business أو Enterprise: فالمقعد المُطالَب به عبره لم يكن يسمّي أحدًا، ولذلك صار كل مقعد في الفريق مرتبطًا بالعنوان الذي دُعي عليه، والرمز الذي يفعّله هو رمز الدعوة
FCI1… الوارد في تلك الرسالة. لكن الاستبيان ظل يسمّي الحقل «رمز الشركة»، ويلمّح إلى طلبه من المدير، ويعرض عنصرًا نائبًا بصيغة FCB1… — فيرسل الناس للصق الرمز الوحيد الذي لم يعد يعمل، ثم يطلب منهم إدخال رمز الشركة إن تركوه فارغًا. في خطط الفرق يُقرأ الحقل الآن «رمز الدعوة»، ويبيّن التلميح من أين يأتي الرمز وأن رمز الشركة المشترك لا يفعّل مقعدًا، ويعرض العنصر النائب صيغة FCI1…، وتطلب رسالة التحقق رمز الدعوة. أما Pro فيطلب رمز اشتراكه بهذا الاسم. ولا تغيير في Pro Plus: فهي تحتفظ بالرمز المشترك عن قصد. وتحمل لغات العرض الـ 17 كلها الصياغة الجديدة.
0.2026.67 — ${workspaceFolder} يعمل في كلا إعدادَي المسارات
2026-09-05
أُصلح
${workspaceFolder} يعمل الآن في coverageFile.paths، كما كان يعمل دائمًا في coverageFile.defaultLocation. الإعدادان متجاوران ولم يوثّق المتغيّر سوى أحدهما، فكتبه الناس في كليهما — والمدخل الذي يبدأ بـ ${ ليس مطلقًا، فكان يدخل نمط الاكتشاف حرفيًا تحت المجلد الأساسي، ولا يطابق شيئًا، وتقول الإضافة إنه لا توجد تغطية. يُوسَّع مثل هذا المدخل الآن أولًا، فيصبح مسارًا مطلقًا، ويُتحقّق منه ببساطة. يبقى في الإعداد كما كُتب، ولا يُكتب مرة ثانية بصيغة أخرى عند اختيار الملف نفسه، ويخرج من الإعداد تلقائيًا عند إلغاء تحميله من عرض Coverage.- ملف التتبّع المُعدّ وغير الموجود يُذكر الآن في المخرجات. كان المدخل الذي يسمّي مسارًا خاطئًا يفشل بالطريقة الوحيدة التي لا يبلّغ عنها شيء: «لم يُعثر على تغطية»، بما لا يمكن تمييزه عن مشروع لا تغطية له فعلًا. يذكر
[FUCINI_DISCOVERY] الآن كل مدخل لم يُعثر له على ملف والمسار الذي بحث فيه، مرة واحدة لكل مدخل بدلًا من كل إعادة تحميل؛ ولا يُبلَّغ عن مدخل يحوي حرف بدل، لأنه قد ينتظر أن تكتب عملية بناء شيئًا.
0.2026.66 — الفروع وMC/DC ودرجة على CodeLens الدالة
2026-08-29
أُضيف
- صار CodeLens الخاص بكل دالة يعرض الفروع وMC/DC ودرجة مركّبة، لا الأسطر والإصابات فحسب — «add: مغطّاة بنسبة 92% (12/13 سطرًا، 52 إصابة، الدرجة 88%، الفروع 3/4 (75%)، MC/DC 2/3 (66%))». يُحذف كلٌّ منها عن دالة معيّنة حين لا يكون في ملف التتبع ما يُبلَّغ عنه هناك — بناء C خالص بلا بيانات فروع، أو بناء لم يُجهَّز بـ
-fcoverage-mcdc — بدل إظهار 0/0 مضلِّل؛ وكذلك لا تُعرض الدرجة إلا إلى جانب واحد على الأقل من الاثنين الآخرين، إذ إنها حين تكون الأسطر المقياس الوحيد هي بحكم التعريف الرقم نفسه الذي تبدأ به العدسة أصلًا.
- تلميح شارة المصدر يقول منذ متى كُتب كل ملف تتبع، لا طابعه الزمني فحسب — «قاسه module.info (2026-08-15 14:32 · قبل 3 ساعات)، بديلًا عمّا قاله lcov.info (2026-08-01 09:10) عنه.» تتدرّج الفئات نزولًا حتى «الآن»؛ وبعد 30 يومًا لا يُعرض سوى التاريخ المطلق.
- تعادل mtime بين ملفَي تتبع لم يعد يمرّ بصمت. تقريران يهبطان في خطوة البناء نفسها، أو نظام ملفات دقّة mtime فيه أخشن من الثانية، قد يبلّغان عن الطابع الزمني نفسه للملفات التي يقيسها كلاهما — وكان الفائز من قبل يعود إلى ترتيب
coverageFile.paths دون شيء على الشاشة يفسّر ذلك. صارت قناة الإخراج تقول ذلك: [FUCINI_MERGE_TIE] يسمّي ملفَي التتبع كليهما وعدد الملفات المشتركة بينهما.
- «Show What Changed Since Last Run» في قائمة
… لصف الملف، متى وُجد تشغيل سابق يُقارَن به — هو الفرق نفسه لكل ملف الذي يحسبه Compare with Last Run أصلًا، موجَّهًا إلى الملف الواحد الذي سألت عنه لا إلى الشجرة كلها. والملف الذي لم يتحرّك فيه شيء يقول ذلك صراحةً بدل ألا يقدّم شيئًا.
- أمر Tune Colour Scale: جرّب ألوان
colorScale.* وعتباتها على عرض Coverage الحيّ قبل اعتمادها. كل تعديل يُكتب مباشرةً في الإعداد — فالعرض يُعاد رسمه أصلًا عند أي تغيير في colorScale/threshold، لذا كتابة القيمة هي المعاينة — ويختم الأمر «إبقاء» أو «العودة إلى القيم الأصلية».
- فجوات التغطية لكل ملف في لوحة Problems، مُدخل واحد لكل ملف مصدر محمَّل دون
threshold.statement، خلف الإعداد الجديد fuciniCoverage.problems.enabled (معطّل افتراضيًا — فعتبة العبارات الافتراضية 100). يلخّص كل مُدخل ما لم يُغطَّ («62% من الأسطر مغطّاة — 14 سطرًا غير مغطّى، دالتان غير مغطّاتين») ويحمل إصلاحًا سريعًا يفتح أيّ امتداد دردشة مثبّت (Copilot أو Claude Code أو …) بطلب لكتابة اختبار لتلك الفجوة — فتشخيصٌ لكل سطر كان سيُغرق Problems في قاعدة شيفرة حقيقية، لذا يبقى هذا على مستوى الملف، وهو المستوى الذي يستطيع القارئ فعلًا التصرّف عنده.
أُصلح
- سبب الملف المفقود أو غير المتطابق أو المتحقَّق منه، في عرض Coverage، صار يمكن تحديده ونسخه. كان يعيش فقط في تلميح
title الأصلي للصف، وهو — لكونه تلميح المتصفح نفسه — لا يمكن تحديده؛ فمن أراد لصق السبب بحرفه في تقرير خلل اضطُرّ إلى إعادة كتابته يدويًا. صار التحويم يُظهر النص نفسه في لوحة حقيقية منسّقة، يمكن السحب فوقها كأي محتوى آخر في الصفحة. وتلميح الملف العادي (مساره فقط) لم يتأثّر.
- الدالة التي تمتدّ قائمة معاملاتها على عدة أسطر لم تعد تُبلَّغ خطأً بأنها نُقلت. كان
detectMismatch يسمح بأن يختلف السطر المسجّل للتصريح عن موضع العثور على اسمه فعلًا بسطرين على الأكثر — وهو ما يكفي للاختلاف المعتاد بين سطر التوقيع وسطر نوع الإرجاع والقوس المفتوح، لا لقائمة معاملات متعددة الأسطر قد تباعد بين الاثنين إلى أي حدّ. void LOG_Emit(...) — سبعة معاملات، واحد في كل سطر — المسجّلة عند قوسها المفتوح في السطر 163، أُبلغ عنها بـ "LOG_Emit" is at line 3: أقرب تطابق نصّي، وقد صادف أنه اسم الدالة نفسها مذكورًا في تعليق ترويسة الملف، بعيدًا كل البعد عن السطر 163 وعن التصريح الحقيقي في السطر 156. صار الفحص يقبل أيضًا اسمًا وُجد أبعد إلى الخلف حين يُقرأ كل سطر بينه وبين السطر المسجّل كتصريح واحد متّصل — بلا سطر فارغ، وبلا سطر يُنهي العبارة أو الكتلة السابقة — وهو ما تفعله قائمة المعاملات دائمًا ولا تفعله الدالة المنقولة فعلًا إلا نادرًا. وحيث يبقى عدم التطابق حقيقيًا، صار السطر المُبلَّغ عنه أقرب تطابق إلى السطر المسجّل، لا أول ما يُعثر عليه في الملف دائمًا.
- شارة المصدر لم تعد تقول «+N». تحميل تقرير الوحدة نفسها فوق تشغيل أوسع كان يضع على شارة الملف اسم الوحدة مع عدد ملفات التتبع الأخرى التي غطّته أيضًا — قُصد بها «هذا العدد جرى تجاوزه» فقُرئت «هذه التقارير متّفقة»، ولم يكن من سبيل لمعرفة أيٍّ من الـ n تعنيه فعلًا من الشجرة. صارت الشارة لا تسمّي إلا ملف التتبع الذي أرقامه على الشاشة؛ وما زال التلميح يفصّل ما جرى تجاوزه، ومتى.
- شارة المصدر لم تعد تدفع اسم الملف المجاور لها خارج حافة اللوحة. كان عرض الشارة ثابتًا (
flex: none)، فما إن يضيق الصف حتى يمتصّ اسم الملف العجز كله ويُختصر أولًا، مع أن الشارة هي الأقل أهمية من الاثنين. صارت الشارة تتنازل عن عرضها قبل أن يفقد اسم الملف حرفًا واحدًا؛ أما النسبة المئوية والشريط، اللذان يتقدّمان اسم الملف أصلًا، فلم يتأثّرا.
0.2026.65 — إعادة تشغيل الوحدة تحلّ محلّ ما قاله تشغيل أوسع
2026-08-15
تغييرات
- إعادة تشغيل الوحدة نفسها تحلّ محلّ ما قاله عنها تشغيل أوسع، بدل أن تُضاف إليه. تحميل تقرير يشمل المشروع كله ثم تقرير وحدة واحدة فوقه كان يجمع عدد إصاباتهما لكل ملف مشترك بينهما — فإعادة تشغيل اختبارات تلك الوحدة وحدها كانت تضخّم أرقامًا سبق أن أبلغ عنها تشغيل أوسع صار قديمًا، بدل أن تجدّدها. صار ملف التتبع الأحدث mtime على القرص يفوز فوزًا تامًّا في أي ملف يقيسه: العبارات والفروع والتصريحات والملخّصات لكل ملف (ملخّصات الفروع وMC/DC والدوال واستدعاءات الدوال والكائنات والطفرات) كلها تأتي من ذلك التقرير وحده، أيًّا كان موضع المسارين في
coverageFile.paths — تفوز إعادة تشغيل الوحدة لأنها أحدث فعلًا، لا لأنها صادف أن تُحمَّل أخيرًا. أما ملف تتبع لا يبلّغ عن أي عبارات لملف ما — تصدير شيفرة كائنية من TRACE32، أو تقرير طفرات Stryker محمَّل إلى جانب تقرير حقيقي — فما زال لا يسهم إلا بالملخّص الذي يحمله فعلًا، تاركًا تفاصيل الأسطر/الفروع في تقرير أسبق دون مساس؛ فتلك الحالة لم تتأثّر. ويزيل هذا أيضًا خللًا قائمًا كان فيه ملخّص MC/DC (أو الدوال/استدعاءات الدوال/الطفرات) لكل ملف، إذا قاسه تشغيلان، يُجمع مقامه مع بسطه فتُبخَس النسبة الحقيقية. وصار تلميح شارة المصدر يقول «بديلًا عمّا قاله _ عنه» بدل «مجموعة معًا».
أُصلح
- اسم الملف الطويل في عرض Coverage صار يُختصر بدل أن يفيض. كان span الاسم في الصف يفتقر إلى
min-width: 0، التصريح الوحيد الذي يتيح لـ overflow/text-overflow: ellipsis في عنصر flex أن يعمل فعلًا — ومن دونه كان الاسم الطويل يحتفظ بعرضه الكامل متى ضاقت اللوحة بما يكفي، فيجري تحت شارة المصدر والنسبة المئوية والشريط التي تليه.
0.2026.64 — ترتيب عرض Coverage بالدرجة
2026-08-01
أُضيف
- رتّب عرض Coverage بالدرجة، لا بالاسم فحسب. كل صف يحمل أصلًا درجة WHM وتفصيلًا لكل مقياس؛ لكن العثور على أسوأ ملف في شجرة كبيرة كان يعني قراءة قائمة أبجدية نزولًا بحثًا عنه. قائمة منسدلة بجوار Collapse all / Expand all تقدّم الآن اسم الملف والدرجة المركّبة والأسطر والفروع وMC/DC — وكل وضع عدا اسم الملف يخلط المجلدات والملفات معًا، الأسوأ أولًا بحسب النسبة المئوية لذلك المقياس نفسه، فيُرتَّب المجلد الرديء الاختبار تمامًا كما يُرتَّب الملف الرديء الاختبار بدل أن يُفرز بعيدًا عنه. والملف الذي لا بيانات له في المقياس المعروض (تنسيق لا يبلّغ عن الفروع أبدًا، مثلًا) يهبط إلى الأسفل بدل أن يُقرأ 0%. يُكتب الاختيار في الإعداد الجديد
fuciniCoverage.coverageView.sortBy فور اتخاذه، فيصمد أمام إعادة تحميل النافذة بدل أن يعود دائمًا إلى اسم الملف.
أُصلح
- توقيع الدالة الممتدّ على عدة أسطر لم يعد يُعلَّم خطأً بأنه «نُقل». يعطي
fnMap في Istanbul الدالة مرجعَي سطر — حيث يقع اسمها، وحيث يبدأ جسمها — وكان المحلّل يفضّل سطر الجسم لفحص عدم التطابق الذي يبحث لاحقًا عن الاسم في نص المصدر. ولأي دالة تمتدّ قائمة معاملاتها على أكثر من سطرين (أمر معتاد في قاعدة شيفرة تُلفّ عند 100 عمود)، كان السطر الحقيقي للاسم أبعد مما ينبغي عن المسجّل، فيخفت الملف في عرض Coverage مع تحذير زائف «لم يعد يطابق تغطيته». صار المحلّل يفضّل سطر الاسم نفسه، وهو ما كان فحص عدم التطابق يبحث عنه دائمًا.
0.2026.63 — كل صف يذكر ملف التتبع الخاص به
2026-07-20
أُضيف
- كل صف يذكر ملف التتبع الذي قاسه. تحميل تقرير وحدة واحدة فوق تشغيل يشمل المشروع كله يعني الملفات نفسها مقيسة مرتين، ولم تكن الشجرة تقول شيئًا عن التقرير الذي يقرأه الصف. عندما يكون أكثر من ملف تتبع محمّلًا، صار كل صف ملف يحمل اسم التقرير الذي قاسه — آخر ما حُمِّل، إن قاسه أكثر من واحد — مع
+1 لكل تقرير آخر وتلميح يسمّيها. الدمج يجمع إصاباتها معًا بدل أن يُغلّب أحدها، والتلميح يقول ذلك. ومع ملف تتبع واحد لا يُرسم شيء، إذ لا شيء يُميَّز.
تغييرات
- صفحة الامتداد نفسها تذكر كل إعداد بقيمته الافتراضية الحقيقية. عشرون إعدادًا لم يكن لها صف أصلًا — اللغة، وثلاث عتبات، ووزن واحد، وخمسة عشر مفتاحًا للإجراءات السريعة — وكان صف القياس عن بُعد يزعم أنه مفعّل افتراضيًا مع أنه معطّل منذ فترة. صار اختبار يقارن الصفحة بالبيان، بما في ذلك القيم الافتراضية.
أُصلح
- إعادة فحص المصادر الواقعة تحت
files.watcherExclude، التي أُضيفت في الإصدار السابق، صارت تتبع staleWarning.enabled مثل بقية ذلك الفحص، لا اسم إعداد خاصًّا بها.
0.2026.62 — تُرك المستكشف وشأنه، وإعادة فحص المصادر المكتومة
2026-07-06
تغييرات
- يُترك المستكشف وشأنه. شارات التغطية بجوار الملفات في المستكشف معطّلة افتراضيًا. ذلك العمود ملك لمن يستخدمه — إذ يضع VS Code فيه حرفَي git M وU، ولا تتّسع سوى شارة واحدة — وعرض التغطية يسرد الملفات نفسها بالأرقام نفسها، في مكان وُجد لها. و
explorerBadges.enabled يعيدها كما كانت.
أُصلح
- يُعاد فحص المصدر الواقع تحت
files.watcherExclude أيضًا. المطابقة الحيّة بين الملف وتغطيته يقودها الحفظ ومراقب نظام الملفات، وهو صامت تجاه كل ما استُثني — وخاصةً المصادر المولَّدة تحت build/، حيث يصعب أكثر ما يكون ملاحظة علامة قديمة. تُستطلع هذه الملفات الآن على النبضة نفسها كل ثانيتين مثل ملفات التتبع، ولا يُعاد قراءتها إلا حين تتغيّر فعلًا. وبعد مئتين منها يقول ذلك سجل الإخراج بدل أن يُنفق النبضة.
0.2026.61 — سؤال واحد عن مشغّل الاختبارات، لا سؤال مع كل تشغيل
2026-06-09
أُضيف
- يُسأل عن مشغّل الاختبارات مرة واحدة، لا مع كل تشغيل. مساحة عمل فيها أكثر من مشغّل معروف — إعداد jest وملف
go.mod مثلًا — كانت تضع القائمة أمام كل Run Tests with Coverage، فتطلب ضغطة مقابل قرار اتُّخذ من قبل. صار الجواب يُحفظ لمساحة العمل، والسؤال يقول ذلك. وForget the Test Runner يعيد السؤال، أما مشغّل محفوظ لم يعد موجودًا في مساحة العمل فيُتجاهل بدل أن يُشغَّل.
تغييرات
- صفحة الامتداد نفسها تذكر كل أمر. أربعة عشر من أصل أربعة وثلاثين انسلّت من جدولها — موثّقة هنا وفي الدليل، لا في الصفحة التي تُقرأ قبل التثبيت. صارت كلها مُدرجة، واختبار يُبقيها كذلك.
0.2026.60 · بناء 3 — التراجع يزيل النقاط من جديد
2026-06-01
أُصلح
- التراجع يزيل نقاط الأسطر المحرَّرة من جديد. المخزن المؤقت الذي حُرِّر بعد التشغيل يُظهر نقاطًا رمادية على الأسطر المعاد كتابتها، وتنسحب التغطية عنها. وكان التراجع عن تلك التحريرات يُبقي النقاط مكانها: فكل تغيير كان يُحسب، بما فيه تغيير يعيد النص كما كان. صار يُحفَظ ما كان المخزن يحويه قبل أن يكتب أحد، وما إن يحويه ثانيةً حتى تزول النقاط وتعود الأرقام تنطبق عليه.
- تُقارَن أرقام الإصدار بعضها ببعض. البيان، وأعلى مُدخل في سجل التغييرات، ووسم الإصدار، كلها تحمل رقم الإصدار ورقم البناء، وتُكتب الثلاثة يدويًا، وقد تباعدت من قبل. صارت مجموعة الاختبارات تقارنها وتتحقق أن المُدخلات تنحدر من الأحدث، ولكلٍّ منها تاريخ حقيقي.
0.2026.59 — إلغاء تحميل يدوم
2026-05-12
تغييرات
- ملف التتبع الذي أُلغي تحميله يبقى كذلك. إخراج ملف من القائمة في عرض التغطية كان يدوم بقدر النافذة تمامًا: فمع عدم ضبط أي شيء يعود الاكتشاف إلى الأسماء المعروفة، فيجد
lcov.info من جديد في صباح اليوم التالي، ولم تكن هناك طريقة لقول غير ذلك سوى ضبط مسار كي يُستثنى واحد. صار القرار يُحفظ لمساحة العمل. ويُلغى باختيار الملف من جديد أو بذكره في coverageFile.paths — فالملف الذي يسمّيه الإعداد لا يُحجب أبدًا، ولا يمكن أن يغيب شيء دون أن يقول أحد ذلك.
أُصلح
- إعادة رسم أسرع للمخزن المؤقت المحرَّر. كانت قائمة الأسطر المعاد كتابتها تُحسب من جديد من كل التحريرات المسجّلة عند كل إعادة رسم، فيدفع ملف طويل حُرِّر طوال بعد الظهر عدد الأسطر في عدد التحريرات مقابل جواب لم يتغيّر منذ آخر ضغطة مفتاح. صار يُحسب مرة واحدة لكل ضغطة.
0.2026.58 · بناء 2 — تشغيل الاختبارات يتذكّر ملف التتبع الخاص به
2026-05-01
تغييرات
- تشغيل الاختبارات يتذكّر ملف التتبع الخاص به، مثل الاختيار اليدوي تمامًا. كان Run Tests with Coverage يحمّل ما كتبه التشغيل ثم يسأل عن إضافته إلى
coverageFile.paths. والملف المختار يدويًا يُكتب هناك من تلقاء نفسه منذ 0.2026.56، وتشغيل الاختبارات هو الفعل نفسه من طريق آخر، فصار يكتبه بالطريقة نفسها. يحكم الاثنين إعداد واحد هو coverageFile.rememberPicks؛ وصف ملف التتبع في عرض التغطية هو المكان الذي يُزال منه أيٌّ منهما.
أُصلح
- مؤقتات الخلفية تتوقّف عند توقّف الامتداد. كان مراقب ملف التتبع يُتخلَّص منه مع النافذة، لكن الاستطلاع كل ثانيتين خلفه وأي إعادة فحص مصدر معلّقة مؤقتات عادية لا يتخلّص منها شيء. فتعطيل الامتداد، أو إعادة تحميل نافذة وهو معطّل، كان يتركها تعمل وتقرأ مساحة عمل لم يعد للامتداد شأن بها.
0.2026.57 · بناء 4 — معاينة حية موسومة، أعلام مرسومة، كل التنسيقات في مربع الاختيار
2026-04-24
أُضيف
- المعاينة الحية تقول ما الذي تعاينه. تبدأ معاينة لوحة الإعدادات الآن بـالتشغيل: coverage/lcov.info · 12 ملفًا، وعندما يعرض المحرّر النشط ملفًا يغطّيه التشغيل، بـالملف النشط: src/a.c مع حكم ذلك الملف الخاص تحت حكم التشغيل. تتبع المحرّر وكل تحميل وفق ما يحمله النموذج — بما فيه التعديلات غير المحفوظة. عندما تكون اللوحة في المقدمة، تُحوّل نقرة في عرض التغطية المعاينة إلى ذلك الملف بدل فتحه.
- مربع الاختيار يسمّي كل تنسيق. أولًا كل تنسيقات التغطية، ثم LCOV؛ JSON (llvm-cov وIstanbul/nyc وcoverage.py وSimpleCov وCoveralls وgcov وxccov وStryker)؛ XML (Cobertura وJaCoCo وClover وOpenCover وGNATcoverage وBullseye وSonarQube وVectorCAST وTRACE32 وEMMA وUCIS/UCDB وNCover وdotCover وPIT)؛ ملف تعريف تغطية Go؛ قائمة gcov وTestwell CTC++ — ولم تعد
.lcov و.gcov و.txt و.coveragexml معطّلة.
تغييرات
- تلميحات شريط الحالة ترتدي مقياس الألوان. تأخذ أشرطة المقاييس في تلميحات التشغيل والملف ألوان
colorScale.* الثلاثة، مدرّجة حسب عتبة كل مقياس حيث تكون مضبوطة وحسب نقاط المقياس خلاف ذلك؛ وتحتفظ شارات الحكم بألوان الحالة الثابتة.
- أعلام مرسومة في إعداد اللغة. تظهر رموز الأعلام التعبيرية من 0.2026.56 على Windows كحرفين مجرّدين. تسمّي القائمة الآن كل لغة باسمها الخاص — Nederlands (nl) — مع صف من الأعلام المرسومة الصغيرة تحتها يختار في القائمة عند النقر.
0.2026.56 · بناء 3 — تُحفظ الاختيارات، ملفات التتبّع في عرض التغطية، أعلام في إعداد اللغة
2026-04-08
أُضيف
- الاختيار يُحفظ. كان الملف المختار عبر Pick Coverage File يعيش في النافذة التي اختير فيها فقط. الآن يدخل من تلقاء نفسه في
coverageFile.paths ضمن إعدادات مساحة العمل — نسبيًا إلى المجلد الأساسي إن كان تحته، ومطلقًا خلاف ذلك — فتحمّله النافذة التالية ويعيد المراقب تحميله. يحافظ coverageFile.rememberPicks (مفعّل افتراضيًا) على السلوك القديم لمن يريده. المدخل المطلق في ذلك الإعداد يسمّي الآن ملفًا واحدًا أينما كان.
- ملفات التتبّع في عرض التغطية. فوق الشجرة، صف لكل ملف تتبّع محمَّل مع عدد ملفاته وزر إلغاء تحميل يزيله من التشغيل ومن الإعدادات؛ وزر اختيار… بجانبها يضيف واحدًا. إلغاء تحميل آخر ملف تتبّع يمسح التشغيل.
- أعلام في إعداد اللغة. كانت قائمة اللغات في لوحة الإعدادات تعرض رموزًا مجرّدة؛ يحمل كل مدخل الآن علمًا واسم اللغة بلغتها — 🇳🇱 Nederlands (nl)، 🇯🇵 日本語 (ja)، 🌐 تلقائي.
0.2026.55 — السطر الأخير في ملف PHP ليس تغطية تتجاوز نهاية الملف
2026-03-27
أُصلح
- لم يعد السطر الأخير في ملف PHP يُحتسب تغطية تتجاوز نهاية الملف. يسجّل Xdebug وPCOV عبارة return الضمنية لنهاية الملف في السطر التالي لآخر فاصل أسطر، فيكتب php-code-coverage إصابة في «السطر 252» من ملف يتألف من 251 سطرًا — وكان فحص عدم التطابق يعدّ ذلك تناقضًا في كل ملف PHP ينتهي بفاصل أسطر. أصبح سطر واحد بعد فاصل الأسطر الأخير مقبولًا؛ أما الإشارة إلى ما بعده، أو إلى ما بعد ملف بلا فاصل أسطر أخير، فتبقى التناقض الذي كانته.
0.2026.54 · بناء 2 — صف تجربة في What Community Includes
2026-03-24
أُضيف
- صف تجربة في What Community Includes، في إصدار Community. لم تكن لذلك الإصدار تجربة قط، لذا تبدأ قائمته الآن بـبدء تجربة Pro لمدة 14 يومًا… الذي يفتح صفحة Pro؛ ثم يعرض تفعيل إصدار Pro إزاحة إصدار Community عن الطريق. يبقى Community مجانيًا مهما كان القرار.
0.2026.53 — Show Worst-Covered Folders
2026-03-03
أُضيف
- Show Worst-Covered Folders. الإجابة على مستوى المجلدات لـ Show Worst-Covered Files: كل مجلد مرتّب حسب تغطية كل ما تحته، الأسوأ أولًا، من الفهرس نفسه الذي تُرسم منه شارات المستكشف؛ الاختيار يُظهر المجلد في المستكشف. في قائمة شريط الحالة عبر
quickActions.worstCoveredFolders.
0.2026.52 — فحص العتبات في لوحة المشكلات
2026-01-23
أُضيف
- فحص العتبات في لوحة المشكلات. مع تفعيل
compliance.diagnostics، يصبح كل مقياس threshold.* لم يتحقق خطأً واحدًا في المشكلات، على ملف التتبّع الذي أخفق فيه، يُحدَّث مع كل تحميل وبأمر Check Coverage Thresholds، ويُمسح عندما ينجح الفحص. معطّل افتراضيًا لأن عتبة العبارات المضمّنة هي 100.
تغييرات
- وصف
watch.enabled لم يعد يعد بسؤال. كان لا يزال يقول إن المستوى المجاني يُسأل قبل إعادة التحميل — صحيح حتى 0.2026.48، وليس بعده. أُعيدت كتابته بكل اللغات الـ18.
0.2026.51 · بناء 2 — Run Tests with Coverage
2025-12-08
أُضيف
- Run Tests with Coverage. يتعرّف على vitest أو jest أو pytest أو go أو cargo أو dotnet أو maven أو gradle أو phpunit أو ctest من جذر مساحة العمل، ويشغّله مع تفعيل التغطية في مهمة طرفية، ويحمّل ما كتبه سواء نجحت الاختبارات أم لا، ويعرض مرة واحدة إضافة ذلك المسار إلى
coverageFile.paths ليتولّى المراقب التحميل من ذلك الحين. تُعرض عدة مشغّلات للاختيار؛ ولا يرسلك أيّ منها إلى الوصفات.
0.2026.50 — التغطية تتبع النص في مخزن مؤقت معدَّل
2025-10-23
أُضيف
- التغطية تتبع النص في مخزن مؤقت معدَّل. تُحفظ التعديلات على كل مخزن مؤقت مفتوح منذ تحميل التشغيل، وكل واجهة تقرأ أرقام أسطر التشغيل — عدد الإصابات عند التحويم، شريط MC/DC، مثلث «منذ آخر تشغيل»، CodeLens، Next Uncovered — تقرأ من خلالها: تتحرك العلامة مع سطرها وتنسحب من سطر أُعيدت كتابته، حيث تقول نقطة رمادية صغيرة السبب.
dirtyMarks.enabled يوقف النقاط.
0.2026.49 — منذ آخر تشغيل، في الهامش
2025-09-26
أُضيف
- منذ آخر تشغيل، في الهامش. كل سطر نُفِّذ في التشغيل السابق ولم يُنفَّذ في هذا يحمل مثلثًا أحمر في هامش المحرّر، وكل سطر سار في الاتجاه المعاكس مثلثًا أخضر، مع شريط في مسطرة النظرة العامة وأعداد الإصابات عند التحويم. الأسطر التي لم تتغيّر لا تعرض شيئًا.
sinceLastRun.enabled يوقفه.
تغييرات
- مرجع «آخر تشغيل» يبقى بعد إعادة التشغيل. مع تفعيل
history.enabled، يتولّى أحدث تشغيل في السجل هذا الدور عند أول تحميل للنافذة، فيظلّ البناء الذي انتهى قبل فتح النافذة يُظهر ما غيّره — في الهامش وفي Compare with Last Run.
0.2026.48 · بناء 6 — إعادة تحميل تلقائية في كل مكان، العلامة تتبع الملف، الفرق الدقيق عند التحويم
2025-09-19
أُضيف
- الحكم على الملف يبقى محدّثًا بعد التحميل. كان الملف يُقارن بتغطيته مرة واحدة عند تحميل ملف التتبّع ثم لا يُقارن أبدًا: حرّره طوال فترة الظهيرة وتبقى الهوامش ترسم أرقامًا عن نسخة لم تعد موجودة. الآن يعيد الحفظ في المحرّر فحص ذلك الملف فورًا، ويعيد أي تغيير من خارج المحرّر —
git checkout، أداة تنسيق، مولّد — فحصه من القرص بعد لحظة. الملف الذي يصبح متناقضًا مع تشغيله يحصل على العلامة؛ وسحب يعيد النسخة المقيسة يزيلها.
- الفرق الدقيق عند التحويم. حيث لم يعد الملف مطابقًا لتغطيته، يذكر عرض التغطية وتلميح المستكشف بدقة ما أثبت ذلك: السطر كما يُقرأ الآن مقابل ما سجّله التقرير إذا احتفظ ملف التتبّع بالنص، والسطر ومجموع تحقق فاشل إذا احتفظ بملخّص، وتغطية تتجاوز نهاية الملف، ودالة لم تعد حيث يضعها التقرير. التفصيل نفسه يذهب إلى قناة الإخراج، سطر لكل ملف، حيث يقود زر إظهار أيها في نتيجة التحميل.
- مفتاح لشارات المستكشف.
explorerBadges.enabled (مفعّل افتراضيًا) يخفي الدرجة و✓ و⚠ بجوار كل ملف مغطّى في المستكشف، ومعها تلميح المقاييس. الهوامش وشريط الحالة وعرض التغطية لا تتأثر.
تغييرات
- كل مستوى يعيد التحميل تلقائيًا عند تغيّر ملف التتبّع. منذ 2026-09-02 كان المستوى المجاني يتوقف عند سؤال اكتُشفت تغطية جديدة — تحميلها؟ بينما تعيد التراخيص المدفوعة التحميل بصمت. تنتهي عملية البناء، والأرقام جديدة، ومن فعّل المراقبة أجاب عن السؤال مسبقًا — لذا أُزيل السؤال في كل مستوى، ومعه الإشعار الذي كان يشرحه.
- عمليات التحميل التي يجريها المنتج بنفسه لم تعد تُحتسب ضمن الحد اليومي للمستوى المجاني. إعادة التحميل من المراقب أو الاكتشاف عند بدء التشغيل ليست تحميلًا طلبه أحد؛ احتسابها كان سيستنفد حصة تثبيت Community في صباح واحد من تشغيل الاختبارات ثم يترك تشغيلًا قديمًا على الشاشة دون أي إشارة. الحد الآن يقيس الأمر ومنتقي الملفات فقط.
- تغيّر الطابع الزمني وحده لم يعد يميّز ملفًا. كان تحذير N ملف (ملفات) تغيّرت منذ هذا التشغيل مستمدًا من mtime كل مصدر، و
git pull أو أداة التنسيق تغيّر كل mtime دون تغيير ما قِيس. أُزيل التحذير مع علامته في شريط الحالة. يُسمّى الملف الآن متغيّرًا فقط عندما يناقض محتواه التشغيل، وشريط الحالة ونتيجة التحميل وسطر الإخراج الجديد FUCINI_MISMATCH_001 تقرأ كلها من ذلك. يحتفظ staleWarning.enabled باسمه ويصف الآن فحص المحتوى تحديدًا.
- مراقبة مجلد تحت
files.watcherExclude تُذكر في الإخراج. مخرجات البناء أول ما يستبعده الناس من مراقب VS Code، وبعدها لا يلاحظ التشغيل الجديد سوى الاستطلاع كل ثانيتين. تذكر قناة الإخراج الآن المجلد والنمط عند بدء المراقب.
0.2026.47 · بناء 2 — المسارات غير المطابقة على الشاشة، وتلميح عند أول تشغيل، ومفتاحان إضافيان
2025-08-09
أُضيف
- تلميح عند أول تشغيل لمساحة عمل لا شيء فيها للتحميل. المراقبة مفعّلة افتراضيًا وتحميل بدء التشغيل صامت، لذا لم يكن تثبيت جديد في مشروع بلا ملف تتبع يقول شيئًا. أول تحميل صامت يعود فارغًا يقول ذلك الآن — مرة واحدة، إلى الأبد — مع الأمرين اللذين يستحقان الفعل: اختيار ملف تغطية يدويًا، أو فتح الوصفات لمعرفة كيف تنتجه سلسلة أدواتك. التحميل الذي يشغّله أحد يدويًا يحتفظ برسالته الخاصة.
- مفاتيح لـ Toggle Annotated Source وLoad Coverage.
Alt+A يبدّل التبويب النشط بين المصدر وعرضه المشروح؛ وAlt+Shift+R يعيد اكتشاف التغطية وتحميلها (Ctrl+Alt+A / Ctrl+Alt+R على macOS). قابلان لإعادة التعيين مثل المفتاحين المضافين في 0.2026.45.
تغييرات
- المسارات التي لا تطابق شيئًا في مساحة العمل تُعدّ على الشاشة. مسار ملف تتبع لا يُحلّ إلى أي ملف في مساحة العمل يُحمَّل ولا يضيء أبدًا — أشيع «نجح لكن لا شيء يظهر» على الإطلاق — وحتى الآن كان الأثر الوحيد سطر
FUCINI_REMAP_001 في قناة المخرجات، مع قاعدة pathRemap التي كانت ستصلحه، دون أن يُقرأ. تعدّها نتيجة التحميل الآن، مع أيّها؟ للأسماء والقاعدة المقترحة، وفتح إعداد pathRemap للمكان الذي توضع فيه. - منتقي الملفات في قائمة شريط الحالة يسمّي التنسيقات التي يقرؤها. كان وصفه لا يزال يسرد التنسيقات الخمسة من الإصدار الأول؛ وهو يقول الآن خمسة وعشرين، من lcov وCobertura وJaCoCo إلى gcov وllvm-cov وTRACE32 وتقارير الطفرات.
0.2026.46 — مخرج من تعارض الإصدارين، وحدٌّ أهدأ
2025-08-06
تغييرات
- الإصداران مثبَّتان معًا: زرّان بدل التعليمات. عند وجود Pro وCommunity معًا لا يمكن لأيٍّ منهما التفعيل — فهما يعرّفان الأوامر والعروض نفسها — وكانت الرسالة التي تقول ذلك تنتهي بإرشادات نحو عرض الإضافات. كلا العلاجين أمرٌ واحد، لذا صارا زرّين: إبقاء هذا يزيل الإصدار الآخر ويعرض إعادة التحميل؛ وإظهار كليهما في الإضافات يفتح عرض الإضافات على هذين تحديدًا. إن فشلت الإزالة تُعرض إعادة التحميل على أي حال — فهي ما يحسم أي إصدار هو الفعّال.
- يُعلَن حد الاستخدام كاملًا مرة واحدة، ثم في شريط الحالة فقط. أول مرة يُبلغ فيها حد Community يستحق الجواب الكامل — الأرقام، الخطة، فتح القفل بالقياس عن بُعد، قائمة ما يتضمنه المستوى. أما المرة الخامسة بعد عشر دقائق فلا. ضمن الجلسة الواحدة، تضع الاصطدامات اللاحقة بالحد نفسه سطرًا لثماني ثوانٍ في شريط الحالة ولا تقاطع شيئًا. إدخال مفتاح يبدأ من جديد، لأن الترخيص الجديد مجموعة حدود جديدة.
0.2026.45 — مفاتيح لـ Next / Previous Uncovered
2025-07-26
أُضيف
- صار لـ Next / Previous Uncovered مفاتيح. هما الأمران اللذان يُضغطان مرارًا أثناء قراءة ملف، وحتى الآن كانت كل ضغطة تعني فتح لوحة الأوامر وكتابة الاسم.
Alt+N ينتقل إلى النطاق غير المغطّى التالي وAlt+P إلى السابق (Ctrl+Alt+N / Ctrl+Alt+P على macOS حيث يكتب Option حروفًا). كلاهما يعمل فقط في محرر نص مُركَّز ويمكن إعادة تعيينهما تحت Keyboard Shortcuts كأي إعداد افتراضي آخر.
0.2026.44 · بناء 3 — حدود المستوى المجاني، في قائمة واحدة
2025-07-24
أُضيف
- ما يتضمنه Community، كقائمة واحدة. يحدّ المستوى المجاني ثمانية إجراءات ويحجب اثنتي عشرة ميزة، وكان كل قرار منها يُطبَّق عند بابه الخاص — فكانت الطريقة الوحيدة لمعرفة شكل المستوى هي الاصطدام بكل جدار على حدة في منتصف العمل. أمر جديد، What Community Includes، يعرض كل ذلك دفعة واحدة: كل إجراء محدود مع ما استُهلك من يومه أو شهره، كل ميزة محجوبة باسمها، والطريقتين لرفع ذلك — خطة مدفوعة أو فتح القفل بالقياس عن بُعد.
- يُعرض حيثما يطرح السؤال نفسه. بند في قائمة شريط الحالة، وزر في لافتة الترخيص بعرض Coverage، وزر على الرسالتين اللتين يصادفهما تثبيت Community عند الجدار — تم بلوغ حد الاستخدام وهذا الإجراء غير مضمَّن. تُشتق الصفوف من مجموعة الصلاحيات نفسها التي تطبّقها البوابات، فما تقوله القائمة هو ما سيحدث.
تغييرات
- وضع المراقبة يقول ما سيفعله في المستوى المجاني. كان بند شريط الحالة يعد الجميع بـ"إعادة تحميل التغطية تلقائيًا"، وفي Community هذا وعد لا يفي به المراقب — إذ يلاحظ ويسأل. يقول البند ذلك الآن هناك، وصار عنوان الأمر Toggle Tracefile Watch، لأن "Toggle Watch" لم يقل يومًا ما الذي يُراقَب. السلوك نفسه لم يتغير.
0.2026.43 · بناء 3 — التحميل الفاشل يقول السبب، والملفات المخفية تُعدّ
2025-06-25
تغييرات
- ملف التتبع الذي لا يُحمَّل يقول الآن السبب وما يمكن تجربته. كان كل فشل ينتج الإشعار نفسه — "no coverage could be parsed. See output." — والسبب على بُعد قناة كرمز ورسالة محلّل. يبدأ الإشعار الآن بالملف ويصنّف الرفض بحسب حقيقته: ليس بتنسيق تقرؤه هذه الإضافة، ليس حسن التكوين (السبب المعتاد بناء كان لا يزال يكتبه)، حسن التكوين لكنه لا يسجّل شيئًا (التشغيل لم ينفّذ أي شيفرة مُجهَّزة)، أو تعذّرت قراءته. ترافقه كلمات المحلّل نفسه، وتُعدّ الملفات المتعددة، وتُعرض قناة المخرجات خلف زر إظهار المخرجات بدل فتحها قسرًا.
- الملفات التي يسردها ملف التتبع ولا شيء فيها يُقاس تُعدّ الآن على الشاشة. ظل الترويسة المحتوية على تصريحات فقط تُبقى دومًا خارج عرض Coverage بدل تسجيل 100% من 0 من 0 — وكان اسمها يُكتب في قناة المخرجات ولا مكان آخر. تقول نتيجة التحميل الآن لا يُعرض N ملف(ات) ليس فيها ما يُجهَّز، مع زر أيّها؟ يفتح القناة التي فيها الأسماء.
0.2025.42 · بناء 3 — NCover وdotCover: تغطية .NET التي لم يكن لها وجهة
2025-06-08
أُضيف
- NCover وJetBrains dotCover. كانت Cobertura الخاصة بـ Coverlet وOpenCover تُقرأ هنا بالفعل، وهو ما يغطي معظم أعمال .NET الجديدة ولا شيء من النوع الأقدم. أما بناء لا يزال يكتب
Coverage.xml الخاص بـ NCover، أو فريق يقيس باستخدام dotCover، فكان لديه على القرص تغطية لا يستطيع هذا الامتداد فتحها. لا يحتاج أي من الصيغتين إلى محوّل: كلتاهما تحملان بالفعل أسماء الملفات وأرقام الأسطر. - تُهمَل نقطة NCover المستبعدة، ولا تُحتسب على أنها غير منفَّذة. يُشير
excluded="true" إلى شيفرة أُخرجت عمدًا من القياس — عضو يحمل [ExcludeFromCodeCoverage]، أو مرشِّح NCoverExplorer. واحتسابها غير مغطاة سيجعل الاستبعاد يخفض الرقم الذي كُتب أصلًا لتصحيحه. - يحتاج dotCover إلى
/ReportType=DetailedXML. تقريره الآخر بصيغة XML هو تجميع لا يحمل أي رقم سطر على الإطلاق؛ يُتعرَّف على ذلك التقرير ويُرفض مع الإشارة إلى العلم الذي يصلح الأمر، بدلًا من أن يفشل بوصفه صيغة غير معروفة. يسجّل dotCover نعم أو لا فقط لكل عبارة، ولا يسجّل أبدًا عدد الزيارات، فتصل العبارة المغطاة كإصابة واحدة.
0.2025.41 · بناء 4 — اختبار الطفرات: PIT وStryker
2025-05-28
أُضيف
- اختبار الطفرات. تقول التغطية إن سطرًا ما نُفِّذ؛ وتقول درجة الطفرات إن شيئًا ما فشل حين تغيّر ذلك السطر. يمكن لمجموعة اختبارات أن تنفّذ كل سطر في ملف ولا تكتشف أيًا من العيوب المزروعة، ولن يخبرك أي رقم تغطية بذلك. تغطي PIT لغات Java وKotlin وScala؛ وتغطي Stryker لغات JavaScript وTypeScript وC# وScala.
- لا يُحسب متوسطها مع التغطية أبدًا. مزج «هل نُفِّذ هذا السطر» مع «هل لاحظ شيء ذلك حين غيّرته» لا يجيب عن أي منهما، لذا لا وزن له في الدرجة المركّبة، ويُضبط بشكل مستقل عبر
fuciniCoverage.threshold.mutation — بقيمة افتراضية 0، لأن درجة الطفرات هدف يُرفَع لا عتبة يجب تجاوزها منذ اليوم الأول. - الطفرة التي لم تحظَ قط بتشغيل عادل لا تُحتسب في أي من النصفين. حالة
NON_VIABLE في PIT وحالتا CompileError وIgnored في Stryker هي طفرات لم تستطع الأداة إحداثها؛ واحتسابها غير مكتشَفة سيعاقب مجموعة الاختبارات على عيب لم يُعرض عليها قط.
0.2025.40 — قائمة gcov النصية العادية، لمترجمات أقدم من GCC 9
2025-05-16
أُضيف
- قائمة
.gcov المشروحة. ظهر gcov --json-format مع GCC 9، والمترجمات المتقاطعة المضمّنة كثيرًا ما تكون أقدم من ذلك بكثير؛ كان الحل حتى الآن هو تثبيت lcov أو gcovr أولًا. لعداد التنفيذ خمس صيغ، اثنتان منها فقط أرقام، وتنتمي شروح branch/call/function إلى السطر المجاور لا إلى سطرها هي — وكل ذلك يُقرأ الآن بشكل صحيح. - تتحول شروح الاستدعاء إلى تغطية لمواقع الاستدعاء. السطر
call N returned X% هو بالضبط مقياس استدعاءات الدوال الذي أُضيف في 0.2025.38، وكانت هذه الصيغة تحمله منذ زمن طويل قبل أن يوجد هنا مكان له.
0.2025.39 · بناء 2 — تغطية الشيفرة الهدف، ومعها لغة التجميع
2025-04-27
أُضيف
- تغطية الشيفرة الهدف — كم من الملف الثنائي المبني نُفِّذ فعليًا. المقياس الوحيد هنا الذي لا يُقاس من المصدر إطلاقًا: يأتي من مُنقِّح يرصد تدفق التعليمات على الهدف الحقيقي، دون أي أثر للمجس على التوقيت. وهو أيضًا الإجابة الصادقة عن سؤال "هل يغطي هذا لغة التجميع؟" — فشيفرة التجميع المكتوبة يدويًا لا تُجهَّز أبدًا، ولا يصل إليها أي مقياس آخر هنا.
- هذا متطلَّب، لا وزن إضافي. تغطية الشيفرة الهدف تشمل تغطية العبارات — فنسبة 100% هنا تعني 100% هناك، لكن العكس غير صحيح — لذا ليس لها أي وزن في الدرجة المركّبة، وتُضبط بدلًا من ذلك بعتبة، تمامًا كما يطلبها المستوى A من DO-178C بالإضافة إلى MC/DC.
- الفجوة هي المُخرَج. تشغيلٌ بتغطية أسطر 100% وتغطية شيفرة هدف أقل من 100% يكون قد حدّد بدقة الشيفرة التي ولّدها المترجم ولا يقابلها شيء في مصدرك؛ تقول بطاقة الامتثال "312 بايت لم تُنفَّذ قط، مع تغطية أسطر 100%" بدل دفنها تحت "94%". أما الحالة العكسية — أن يُبلَّغ عن تنفيذ الملف الثنائي بأكمله بينما لم يُنفَّذ مصدره — فتُبلَّغ كتناقض لا كدرجة منخفضة.
0.2025.38 · بناء 2 — تغطية استدعاءات الدوال، واكتمال VectorCAST وTRACE32
2025-04-01
أُضيف
- تغطية استدعاءات الدوال — هل نُفِّذ كل موقع استدعاء. سؤال مختلف عن تغطية الدوال: دالة استُدعيت مرة واحدة من أحد مواقع استدعائها الثلاثة تكون مكتملة تحت الدوال ومكتملة بمقدار الثلث هنا. كانت VectorCAST وTRACE32 وCantata جميعها تُبلِّغ عن ذلك بينما لم يكن لهذا النموذج مكان يضع فيه الرقم.
- هذا يُكمل VectorCAST وTRACE32. رفضت الإصدارات السابقة عمدًا طيّ هذه البيانات في تغطية التفرّعات، لأن تضخيم نسبة التفرّعات يضخّم رقمًا ينتهي به المطاف في تدقيق. تُحمِّل الصيغتان الآن ما كانتا ترسلانه دائمًا.
تغييرات
- أصبحت بوابة الامتثال والدرجة الموزونة تعرفان سبعة مقاييس لا ستة — إعدادان جديدان،
fuciniCoverage.whmWeights.functionCalls وfuciniCoverage.threshold.functionCalls، بأوصاف في جميع اللغات الـ17.
0.2025.37 — تغطية الدوال كعدد، لا كموقع فقط
2025-02-16
تغييرات
- تُحتسب تغطية الدوال الآن حتى عندما لا تُخبر الأداة بمكان الدوال. تصدير
func من TRACE32، وعناصر <method> ذاتية الإغلاق في VectorCAST، وتجميع method, % في EMMA — تذكر جميعها عدد الدوال دون أي مكان لوضع CodeLens فيه — وكانت الثلاثة تُهمَل عند الإدخال. تبقى التصريحات المصدر المفضَّل حيثما وُجدت؛ أما حيث لا توجد، فيُستخدم الآن العدد الذي تُبلِّغ به الأداة كبديل احتياطي.
0.2025.36 · بناء 4 — UCIS وAldec UCDB، والمحلِّلات الجديدة مغطاة بالاختبارات حتى السطر
2025-02-03
أُضيف
- UCIS وUCDB XML — لغتا VHDL وVerilog، مباشرة من المحاكي. يستجيب مستندان لهذا الاسم، ويملك المشروع أيًا كان ما كتبه محاكيه، فتُقرأ الصيغتان: صيغة التبادل القياسية لـAccellera
<UCIS>، وصيغة Aldec الخاصة ux:ucdb، وهو ما تُنتجه acdb2xml فعليًا من Active-HDL وRiviera-PRO. تنتقل تغطية العبارات والتفرّعات؛ أما تغطية التبديل وآلات الحالة والتأكيدات والتغطية الوظيفية فلا تُقرأ، ويُعلن مستند يحمل تلك فقط عن ذلك بدلًا من التحميل فارغًا. - لم يكن VHDL مفتوح المصدر يحتاج أصلًا إلى شيء هنا: الواجهة الخلفية لـGCC في GHDL تُجهِّز عبر
-Wc,-ftest-coverage -Wc,-fprofile-arcs، وتمرّ النتيجة عبر gcov أو gcovr أو lcov. هذا الإصدار مخصص للمحاكيات التجارية.
0.2025.35 · بناء 3 — EMMA XML، وأخيرًا صار لدلفي طريق إلى هنا
2025-01-22
أُضيف
- EMMA XML. لم يكن لدلفي أي طريق إلى هنا إطلاقًا — لا lcov ولا Cobertura — وتكتب DelphiCodeCoverage هذا المخطط بالتحديد عبر
-xml. وهذا أيضًا ما لا يزال يُصدره قدر لا بأس به من أدوات Java الأقدم، فيفتح محلِّل واحد لغةً ويزيل إرثًا في آن معًا. - أضِف
-xmllines فيكتسب التقرير أعداد إصابات حقيقية لكل سطر، فتعمل الهوامش؛ وبدونها لا توجد سوى نسبة إجمالية، تحصل على ملخص للملف وبلا هوامش بدل التخمين. لا يصبح اسم الحزمة المنقّط دليلًا إلا حين يكون الملف مصدرًا من عائلة Java؛ وفي تقرير دلفي يكون الحقل نفسه اسم وحدة، وإضافة بادئة إليه ستخترع مجلدًا لا يملكه أحد على القرص.
0.2025.34 · بناء 3 — Lauterbach TRACE32: مقياس واحد لكل تصدير
2025-01-01
أُضيف
- صادرات تغطية TRACE32. يكتب
COVerage.EXPORT.ListModule ما قاسه مُنقِّح من تتبّع على الهدف نفسه — لا مصدرًا مجهَّزًا، بل تدفق التعليمات الذي نفّذه المعالج فعليًا، على الهدف الحقيقي، دون أي أثر للمجس على التوقيت. يحمل التصدير الواحد مقياسًا واحدًا في كل مرة: يصبح stmt تغطية أسطر؛ ويصبح dec/cond تغطية تفرّعات؛ ويصبح mcdc تغطية MC/DC. حمّل تصديرين لنفس التشغيلة ليندمجا حسب اسم الوحدة. - كانت الصادرات التي تحمل تغطية
func أو call أو object تُرفض بالاسم بدل تحميلها فارغة، مع ذكر أي مقياس يحمله الملف — والآن أصبح لكل الثلاثة موطن، في 0.2025.37 و0.2025.38 و0.2025.39 على التوالي.
0.2025.33 · بناء 4 — Testwell CTC++: يُقرأ حسب العمود لأن النص غير مفصول بمسافات
2024-12-19
أُضيف
- قوائم ملف تعريف التنفيذ لـTestwell CTC++. يحوّل
ctcpost ملفي MON.sym وMON.dat إلى قائمة نصية ذات عرض ثابت — الأداة التي تقف في مواجهة Bullseye في تقييمات الأنظمة المضمّنة والسلامة الأوروبية، والتي تقيس تغطية الشروط المتعددة. تُقرأ حسب موضع العمود لا بتقسيم النص عند الفراغات، لأن الوصف نفسه قد يبدأ برقم. - الشروط المتعددة ليست MC/DC، ولا تُبلَّغ على أنها MC/DC. يحسب CTC++ توليفات الشروط؛ بينما يسأل MC/DC عمّا إذا ظهر أن كل شرط يؤثر في النتيجة على نحو مستقل. ووضع هذه الأعداد خلف بوابة MC/DC سيمنح المدقّق رقمًا تحت اسم لا يعنيه، فهي هنا تغطية تفرّعات، وهذا ما هي عليه فعلًا.
0.2025.32 · بناء 4 — VectorCAST XML، وMC/DC الذي كان يُهمَل بصمت
2024-12-08
أُضيف
- VectorCAST XML. يكتب VectorCAST تقرير Cobertura وصولًا إلى doctype، ثم يضيف سمات لما لا تستطيع Cobertura العادية قوله. وهذا يعني أن هذه الملفات كانت تُحمَّل هنا بالفعل وتبدو كاملة — بينما كان
mcdcpair-coverage يُهمَل بصمت عند الإدخال، وتحديدًا من الجمهور الذي اشترى أداة خصيصًا لإنتاجه. تنجو هذه الأعداد المزدوجة الآن. وهي تغذي بوابة MC/DC والنسبة المئوية والدرجة المركّبة. - لا تُقرَّب تغطية استدعاءات الدوال عمدًا. طيّها في تغطية التفرّعات سيضخّم رقمًا ينتهي به المطاف في تدقيق؛ إنها تنتظر أن يكون للنموذج اسم لها، وهو ما يحدث في 0.2025.38.
تغييرات
- أصبحت قارئة Cobertura تحمل الآن لهجة: فـ
<coverage line-rate=…> عائلة لا صيغة واحدة، وتنتقل معرفة اللهجة المقروءة مع عملية التحليل بدل تخمينها لكل عنصر على حدة.
0.2025.31 — لغة Ada وسويفت، وتغطية تُعيد تحميل نفسها
2024-11-07
أُضيف
- GNATcoverage XML — لغة Ada أخيرًا. فرق الطيران بمعيار DO-178C وفرق السكك بمعيار EN 50128 هي تحديدًا الفئة التي بُنيت لأجلها الدرجة المرجّحة بالسلامة ودعم MC/DC في هذا المنتج، وحتى الآن لم يكن بوسعها تحميل أي شيء هنا ما لم يكن
gnatcov لديها حديثًا بما يكفي لإخراج Cobertura أيضًا — وهي صيغة تُسقط كل ما دون السطر. يكتب gnatcov coverage --annotate=xml مجلدًا لا ملفًا: حمّل ملفات *.xml الخاصة بكل ملف مصدر — وفتح index.xml يخبرك أين توجد التغطية فعليًا بدلًا من إخفاق غامض. يبقى السطر المغطّى جزئيًا سطرًا مغطّى مع قرار غير مغطّى: يظهر النقص في تغطية الفروع وMC/DC، حيث ينتمي فعلًا. تتحول مناطق الإعفاء إلى أسطر مستبعَدة، ويُحتسب الالتزام غير المحدَّد غير مغطّى لا مغطّى، ومع --level=stmt+mcdc تُحتسب MC/DC لكل شرط وتغذّي الحد الأدنى والدرجة المركّبة.
- BullseyeCoverage وVisual Studio
.coveragexml. Bullseye هي أداة C/C++ التجارية التي تمتلكها فعليًا فرق الأنظمة المدمجة والحرجة للسلامة؛ شغّل أداة covxml الخاصة بها وحمّل الناتج. مقياسها الرئيسي هو تغطية الشروط/القرارات لا تغطية الأسطر، ويظل الاثنان منفصلين هنا — كما يُقيَّم المجس ذو النتيجة الواحدة من واحد لا من اثنين، حتى لا تظهر عبارة switch المختبرة بالكامل وكأنها مغطاة إلى النصف. وتُكمل صيغة .coveragexml من Visual Studio جانب .NET للفرق التي تستخدم MSTest وvstest بدل Coverlet: حوّل ملف .coverage الثنائي أولًا بأمر dotnet-coverage convert. والأسطر المغطاة جزئيًا تنجو من الرحلة في الحالتين.
- تغطية SonarQube العامة — وإجابة صريحة عن Xcode. أربع سمات على عنصرين، وأهميتها أن كل أداة تقريبًا تعجز عن إخراج أي من الصيغ الأخرى تستطيع إخراج هذه: فالمشروع الذي لم تسمع هذه الإضافة يومًا بأداة تغطيته صار له طريق للدخول. وهي أيضًا ما يكتبه
xcresultparser، وبذلك تصل مشاريع Swift وObjective-C إلى هنا: فملف .xcresult نفسه بلا محلّل، والتوثيق يقول الآن لماذا بدل أن يترك لك التخمين — إذ يبلّغ xccov نسبًا مئوية لا بيانات لكل سطر، ولا يمكن قراءة أرشيف بيانات الأسطر إلا ملفًا تلو الآخر، في مستند لا يذكر أبدًا اسم الملف الذي يصفه.
- ملفات التتبع المضغوطة بـ gzip تُحمَّل كما هي. يكتب
gcov --json-format افتراضيًا ملف .gcov.json.gz، فكانت الصيغة التي أعلن عنها التوثيق هي تحديدًا ما عجز معظم الناس عن تحميله. ويتم التعرف عبر البايتات السحرية للملف نفسه لا عبر اسمه، فيظل التقرير المضغوط الذي فقد لاحقة .gz صالحًا للعمل — وصار بإمكان أي صيغة مدعومة أن تصل مضغوطة، لا صيغة gcov وحدها.
- سويفت وObjective-C من تقرير Xcode نفسه. الأمر
xcrun xccov view --report --json هو مستند التغطية الوحيد الذي ينتجه بناء iOS أو macOS دون أدوات إضافية. تحصل على نِسَب لكل ملف، وعدّادات تنفيذ لكل دالة، وCodeLens. لا يحمل بيانات على مستوى السطر، وStudio لا يختلقها، لذا تبقى الحواشي فارغة في هذه الصيغة — فالحاشية المُختلقة لا تُميَّز عن المقيسة. للحصول على تغطية سويفت سطرًا بسطر استخدم llvm-cov export -format=lcov أو slather، وكلاهما كان يعمل من قبل.
- Coveralls JSON — تكتبه أدوات الإبلاغ في Elixir وRuby وPython وRust وGo وJavaScript على حدّ سواء. وهو على مستوى السطر، فتعمل الحواشي.
- الأيام النشطة، وحالات حجب البوابات، والترخيص الذي ينتمي إليه الملخّص — ثلاث إضافات إلى ملخّص الاستخدام الشهري، للتثبيتات التي فعّلت القياس عن بُعد.
تمت الإزالة
- لم يعد اسم الجهاز يُرسَل. كان
hostname ضمن أساس بيانات القياس عن بُعد منذ البداية — خارج كل تحقّق، ويُرسَل من كل من فعّل القياس عن بُعد. واسم الجهاز غالبًا ما يكون اسم شخص أو رقم مكتب أو مشروع عميل، ولم يكن يجيب عن أي سؤال حول الاستخدام لا يجيب عنه نظام التشغيل بصورة أفضل. صار التثبيت يُعرَّف الآن بمعرّف تثبيت عشوائي فحسب. وبذلك لا يغادر جهازك أي شيء يسمّيك أو يسمّيه: لا اسم الجهاز، ولا اسم مستخدم نظام التشغيل، ولا المجلد الشخصي، ولا واجهات الشبكة، ولا مسارات ملفاتك، ولا اسم مجلد مشروعك، ولا وسم حساب مسجّل الدخول. يبقى نظام التشغيل وإصداره وبنيته — أي نوع من الأجهزة، لا أي جهاز بعينه.
- تُحذف بيانات القياس عن بُعد الآن خلال 90 يومًا كحد أقصى، بينما كانت السياسة تكتفي سابقًا بالقول إنها «تُحفظ ما دامت مفيدة»، وهذه ليست مدة على الإطلاق.
تغييرات
- الترخيص المدفوع يعيد الآن تحميل التغطية من تلقاء نفسه. كانت مراقبة ملف التتبّع تعني دائمًا أن يُسأل المرء «رُصدت تغطية جديدة، أأحمّلها؟» بعد كل بناء، في كل المستويات — سؤال له إجابة معقولة واحدة، يُطرح عدة مرات في الساعة. صار هذا السؤال سلوك مستوى Community المجاني؛ أما الترخيص المدفوع فيحمّل ببساطة. ويحتفظ Community بالمراقبة والرصد والسؤال الذي كان لديه دائمًا.
- يُسمّى الملف غير المطابق، مع الفحص الذي أثبت ذلك، في الترخيص المدفوع. الرصد نفسه غير مقيّد ولن يكون: إخبار أحدهم بأن تغطيته لم تعد تصف ملفه ليس شيئًا يُباع له. ولا يزال Community يحصل على النتيجة، ويظل الصف باهتًا. ما يضيفه الترخيص المدفوع هو الإشارة — العلامة، وشارة المستكشف، والسطر أو الدالة أو مجموع التحقّق وراءها.
- يرسل القياس أقل، ويقول لمن يعود. لم يعد الملخّص الشهري يحمل مسارات ملفات ولا اسم مجلّد مشروعك ولا اسم حساب مسجَّل الدخول. وصارت مبادلة الميزات بالقياس تطلب عنوان بريد إلكتروني، حتى يُخبَر من وافق عليها بما ترسله نسخته ويُحذف ذلك عند الطلب.
- تصحيح ثلاثة أوصاف إعدادات. ابتعد كل من
watch.enabled وstaleWarning.enabled وtelemetry.enabled عما يفعله الكود — وأكثرها telemetry.enabled: كان يصف إرسال أكثر بكثير مما يُرسَل فعلًا.
أُصلح
- لم يعد منتقي الملفات يُخفي صيغًا يقرؤها. كان Pick Coverage File يرشّح إلى
info وjson وxml فقط، فظهر ملف coverage.out الخاص بـ Go وملف .gcov.json.gz الخاص بـ gcov — وكلاهما صيغتان تقرؤهما هذه الإضافة — باهتين في المربع نفسه الذي يطلب منك اختيار ملف.
- لم تعد نسخة Community العادية ترسل صفحة من شفرتها المصدرية. كان الفحص الذي يحمي عيّنة الشفرة المُعلَّمة يعامل كل نسخة Community كما لو أنها قبلت مبادلة القياس، لا تلك التي قبلتها فعلًا فحسب.
- تحذير واحد لكل تحميل بدل اثنين — فالملف الذي لم يعد مطابقًا لتغطيته يكون قد عُدِّل غالبًا بعد التشغيل أيضًا، وكان كل أمر يُبلَّغ عنه على حدة.
- لم تعد عملية الإزالة تُبلِّغ عن اسم مستخدم نظام التشغيل ولا الدليل الرئيسي لمن يمنع ترخيصه ذلك.
0.2025.30 · بناء 3 — ما تكتبه عمليةُ بنائك أصلًا
2024-10-18
أُضيف
- ملفات تعريف تغطية Go. إن
go test -coverprofile هو مخرَج التغطية الوحيد الذي تنتجه سلسلة أدوات Go القياسية — ولا يوجد lcov يُلجأ إليه كما في Rust وDart وElixir — فلم يكن لدى مشروع Go شيء يستطيع هذا الامتداد قراءته. يسجّل الملف كتلًا لا أسطرًا، وكل سطر تمتد إليه الكتلة يأخذ عدّادها، بما في ذلك القوس المعقوف الختامي، تمامًا كما يبرزها go tool cover -html. وقد انضم coverage.out إلى أسماء البحث الافتراضية، فصار مشروع Go بلا أي إعداد يجد ملفه كما يجد مشروع C ملف lcov.info.
- Clover XML وOpenCover XML. Clover هو ما تملكه مشاريع PHP فعلًا: يستطيع
php-code-coverage إخراج Cobertura، لكن الافتراضي عنده هو Clover وهو ما يضبطه كل phpunit.xml تقريبًا — فكانت تغطية PHP غير قابلة للقراءة هنا بينما ينتظر محلّل Cobertura إلى جوارها مخرجًا لا يكاد أحد ينتجه. ومُبلِّغ clover في Istanbul يكتب المستند نفسه، فمشروع Jest المضبوط هكذا مشمول أيضًا. أما OpenCover فهو النظير في .NET: كانت C# وVB.NET تصلان بالفعل بصيغة Cobertura التي تسطّح القرار إلى النص condition-coverage="50% (1/2)"، فيضيع أي فرع نُفِّذ قبل أن يراه المحلّل. يحتفظ OpenCover بعدّاد زيارات لكل فرع — وهو الفرق بين معرفة أن نصف التفرّع مغطّى ومعرفة أي نصف.
- JSON من coverage.py ومن gcov/gcovr. يضطر تصدير coverage.py إلى Cobertura وlcov إلى وصف سطر
# pragma: no cover بأنه مغطّى أو مفقود، إذ لا كلمة لديهما تعني «مستبعَد عمدًا» — وهذه الكلمة موجودة في هذا الامتداد: الراية نفسها التي تضعها علاماته LCOV_EXCL. فصارت تعليمات pragma في مشروع Python تعني هنا ما تعنيه في تقرير coverage.py نفسه. أما تغطية GCC فلم تكن تصل إلا بعد المرور عبر lcov أو gcovr -x: أداة ثانية تُشغَّل لتحويل بيانات كان GCC قد أنتجها بالفعل. ويُخرج gcov --json-format --stdout وgcovr --json مستندين شبه متطابقين، وصار محلّل واحد يقرأ كليهما.
أُصلح
- تُقرأ التعليقات باللغة التي كُتب بها الملف. كُتب ماسح الأسطر غير البرمجية للغة C وطُبِّق على كل ملف، وكان ذلك صحيحًا ما دامت كل صيغة يقرؤها هذا الامتداد تصف لغة من عائلة C. لم يعد كذلك: ماسح C حين يصادف
# don't يرى الفاصلة العليا تفتح سلسلة نصية، ولا يراها تُغلق أبدًا، فيَعُدّ سطر التعليق شفرةً — رقم خاطئ قليلًا في صمت، ولا شيء يشير إلى ذلك. صار الآن # للغات Python وRuby والصدفة وPerl وR وElixir وJulia؛ والأشكال الثلاثة كلها لـ PHP التي تقبلها جميعًا؛ و// مع /* */ فيما عدا ذلك، وهو ما يبقى الافتراضي لامتداد غير معروف — فـ #define شفرة، واستبعادها سيكون خطأً في الاتجاه المعاكس.
0.2025.29 · بناء 4 — كل إعداد، مشروحًا
2024-10-15
أُضيف
- صار لكل إعداد
fuciniCoverage.* مكان في تلك اللوحة، لا لإعدادات الامتثال الثلاثة عشر وحدها. الخمسة والخمسون كلها مُجمَّعة في الأقسام نفسها وبالترتيب نفسه الذي في مرجع الإعدادات المنشور، فتتفق الصفحة التي تضبط منها والصفحة التي تقرؤها على موضع كل إعداد. مربع بحث يُرشِّح بالاسم أو المفتاح أو الوصف، وقائمة انتقال تنقلك بين الأقسام. يُشتق النموذج في وقت التشغيل من بيان الامتداد المرفق نفسه — الأنواع والقيم الافتراضية والحدود وقوائم القيم وكل كلمة من النص — فلا يُكتب شيء عن الإعداد مرتين، ولا يمكن للوحة أن تنحرف عن الامتداد الذي تحرره.
- الأوصاف تتبع اللغة التي ثبَّتها. يحسم VS Code ترجمة البيان من لغة عرض المحرر عند تحميل الامتداد، ولا يتيح تجاوز ذلك لكل امتداد على حدة — لذا كان ضبط
fuciniCoverage.language على الألمانية داخل محرر بالإنجليزية يترجم كل شيء إلا الإعدادات. ولأن اللوحة تقرأ تلك الملفات وتحسمها بنفسها، فهي المكان الوحيد الذي يستطيع احترام ذلك التثبيت.
- عناصر التحكم التي لا يستطيع مخطط JSON طلبها. لا شيء في مخطط الإعدادات يشير إلى أن سلسلة نصية هي مسار، فلا تستطيع الواجهة الأصلية تقديم مُحدِّد لها؛ والإعدادات الثلاثة التي تحمل مجلدًا صار لها زر استعراض…. وحصل
coverageFile.paths وpathRemap على محرِّري قوائم حقيقيين بدل مربع JSON الخام، وحصل كل لون في colorScale على عيّنة لونية بجوار قيمته الست عشرية.
تغيّر
- الحفظ يكتب ما غيّرته، لا أكثر. مع ثلاثة عشر إعدادًا لم يكن يهم كثيرًا أن يكتب الحفظ الثلاثة عشر جميعًا؛ ومع خمسة وخمسين يعني ذلك أن تعديلًا واحدًا يطبع مساحة الأسماء بأكملها في ملف
settings.json لم يكن فيه سوى سطرين. لا تُكتب إلا الإعدادات التي تغيّرت قيمتها فعلًا، والقيمة المساوية للقيمة الافتراضية تمسح التجاوز بدل أن تعيد ذكر ما يوفره الامتداد أصلًا.
- مفتاح الترخيص يذهب دائمًا إلى إعدادات المستخدم، والصف يقول ذلك.
license.key مُعلَن بنطاق التطبيق، أي أن VS Code لا يقرؤه إلا من هناك — وكتابته في مساحة عمل حفظٌ يبدو ناجحًا ولا يغيّر شيئًا. وإعادة التعيين صارت تمسح المفاتيح الخمسة والخمسين كلها في النطاق المختار بدل ثلاثة عشر، ولذلك تسأل أولًا. كما أن أي تعديل يجري خارج اللوحة لم يعد يكلفك موضعك: تقارن الصفحة قبل إعادة الرسم، فلم يعد الضغط على حفظ يعيد خمسة وخمسين صفًا إلى الأعلى.
0.2025.28 · بناء 3 — ثلاثة عشر صفًّا، قرار واحد
2024-10-12
أُضيف
- وضع الامتثال، ومعايير العتبة السبعة، وأوزان الدرجة المركّبة الستة، صار لها محرّر واحد. هي في واجهة الإعدادات ثلاثة عشر صفًّا لا رابط بينها، وهي في الواقع قرار واحد: تبقى العتبة بلا أثر ما لم يرجع إليها الوضع النافذ، ويبقى الوزن بلا أثر ما لم يكن المعيار المرجّح هو الذي يحكم. وFucini Coverage: Configure Coverage Compliance & Thresholds...، من زر الترس في شريط عنوان عرض Coverage، يجمع الثلاثة، ويشرح كل وضع في الموضع نفسه الذي يُختار فيه الوضع، ويسمّي الطرق التي يُضبط بها معيار فلا يفحص شيئًا — وضع صارم بلا أي عتبة لكل مقياس، ووضع مرجّح عتبته
0، وأوزان كلها 0 — بوصفها تحذيرات، وأنت تنظر إليها.
- يعاين الحكم، ويكتب عبر VS Code. إن حكم COMPLIANT / NON-COMPLIANT الذي سيصدر عن النموذج غير المحفوظ مقابل التشغيل المحمّل يحسبه محرّك الامتثال الخاص بالإضافة نفسها، لا نسخة ثانية من القواعد، لأن معاينة قد تخالف المعيار أسوأ من ألا تكون هناك معاينة. وتمرّ التغييرات عبر واجهة التهيئة المعتادة إلى
settings.json — للمستخدم أو لمساحة العمل، والخيار لك — فيتولى VS Code تنسيق الملف والحفاظ على تعليقاته؛ وأي تعديل يجري يدويًا أو في نافذة أخرى يعود إلى النموذج المفتوح، سواء كان هناك تشغيل محمّل أم لا. ولا حاجة إلى ترخيص: تحصل Community على المحرّر نفسه الذي تحصل عليه Pro.
إصلاحات
- كان زر إشعار التحديث يعرض
Download && Install. علامة العطف المضاعفة هي هروب المفاتيح المختصرة، وهي صحيحة في عناوين package.json وفي الحوارات النمطية — أما أزرار الإجراءات في الإشعار فتأخذ تسميتها نصًّا صرفًا، فطُبع الحرفان تمامًا كما كُتبا، في اللغات السبع عشرة جميعها، لكل من عُرض عليه تحديث.
0.2025.27 · بناء 7 — مقايضة تختارها أنت
2024-09-30
تغييرات
- بيانات الاستخدام مُعطَّلة افتراضيًا. كانت تُشحن مُفعَّلة، بحجة أن فترة التقييم بحاجة إلى تلك البيانات. وقد سقطت هذه الحجة ما إن جعل مستوى Community تفعيلَ بيانات الاستخدام هو ما يفتح كل ميزات Pro بلا مقابل: فالمقايضة لا تعني شيئًا إلا إذا أجراها الشخص بنفسه، ومقايضة لم يخترها أحد ليست مقايضة. لا يُرسَل شيء حتى تفعّلها، ويواصل Community العمل على أي حال بمجموعة ميزاته القياسية.
- إعداد بيانات الاستخدام يقول ما الغرض منه، ويحيل إلى الباقي برابط. كان وصفه يعدّد كل حقل يحمله الإرسال، أي نسختين من تلك القائمة — واحدة في الإعداد وأخرى في سياسة الخصوصية — كان عليهما أن تبقيا متطابقتين إلى الأبد ولم تبقيا. صار الآن يقول ما الذي يمنحك إياه التفعيل ويحيل إلى سياسة الخصوصية لقائمة الحقول، فصارت قائمة واحدة يجب إبقاؤها صحيحة بدل اثنتين.
- تثبيت هذا الإصدار يعيد فتح نافذة التقييم لديك، مرة واحدة. كل من انتهت فترته التجريبية يحصل على 14 يومًا جديدة، لأن هذا الإصدار يغيّر الشروط التي جرى التقييم بموجبها: فترة تجريبية قضاها المستخدم وبيانات الاستخدام مفعَّلة افتراضيًا لم تكن تجربةً للمنتج المعروض الآن. وهي مرتبطة عمدًا برمز يُستخدم مرة واحدة لا بالإصدار — فإعادة التعيين مع كل إصدار تعني أن الفترة التجريبية لا تنتهي أبدًا لمن يواظب على التحديث، وذلك ليس تجربةً بل ترخيصًا بلا ثمن مع خطوات إضافية. يُستهلك الرمز عند أول تفعيل ثم تعود القواعد المعتادة. والترخيص المدفوع لا يُمَس، لأن التحقق من المفتاح ينتهي قبل الرجوع إلى الفترة التجريبية أصلًا، وCommunity غير متأثر لأن تلك النسخة لا فترة تجريبية لديها لإعادة فتحها.
- لم يعد مفتاح الترخيص يكلّف استبيانًا. كانت رسائل التفعيل، وإعداد مفتاح الترخيص، ونافذة انتهاء الفترة التجريبية، جميعها تقدّم المفتاح بوصفه شيئًا يُصدَر مقابل الإجابة عن أسئلة. وليس الأمر كذلك: يُصدَر المفتاح تلقائيًا عند الطلب، واستبيان الملاحظات اختياري ومنفصل تمامًا.
إصلاحات
- ثلاثة مواضع كانت لا تزال تَعِد بفترة تجريبية «حتى 2026-12-31». لم يوجد قط مثل هذا التاريخ في المنتج — فالفترة التجريبية 14 يومًا، تُحتسب لكل تثبيت من أول استخدام. وقد التقط إصداران سابقان هذا الادعاء في أوصاف الإعدادات وفي ملف README؛ لكنه بقي في مربع التقييم في هذه الصفحة نفسها، وفي دليل المستخدم، وفي ملف README الخاص بأدوات الترخيص. وكان دليل المستخدم أسوأ الثلاثة: إذ ذكر أن النافذة تسري «على كل تثبيت، في العالم كله، دفعةً واحدة (لا عدًّا تنازليًا لكل تثبيت)»، وهو عكس الصواب تمامًا، وقال إن عرض التغطية يتوقف عند انتهاء الفترة التجريبية، بينما ينتقل الامتداد في الواقع إلى مستوى Community المجاني.
- رسائل إشعارات بيانات الاستخدام كانت تُرسَل من نطاق خاطئ. كانت ترويسة
From: صندوق بريد على fucini.consulting بينما الخادم المرسِل لها هو fucini.software — وهو بالضبط التوافق الذي يحذّر منه تعليق الإعداد نفسه، وطريقة مضمونة لأن يُصفّى البريد بوصفه مزعجًا أو يُرفض تمامًا.
0.2025.26 · بناء 2 — رماديّ، لا مفقود
2024-08-27
تغييرات
- الملف الذي يذكره التقرير ولا يوجد على القرص يُعرض حيث ينتمي، بلون رمادي، ويقول السبب. أوقف الإصدار 0.2025.25 اختلاق مواضع لمثل هذه الملفات، وكان ذلك صوابًا، لكنه تركها بمسار نسبي ليس موضعًا أصلًا — فظلت الشجرة تصنع مشروعًا من أول جزء فيه، وجلست ثلاثة مصادر محذوفة لوحدة فرعية في
app شبحي بجوار الوحدة الفرعية التي جاءت منها فعلًا. كان التعارض ظاهرًا، وهذا هو المقصود، لكنه كان ظاهرًا في المكان الخطأ ولا يقول شيئًا عمّا هو غير صحيح.
- يظهر الآن داخل المشروع الذي قيس منه، في المجلد الذي يضعه فيه التقرير — مرسومًا بالرمادي المتوسط للسمة وبخط مائل بدل لون المقدمة المعتاد. وعند المرور فوقه يظهر المسار الذي كان سيكون له، مع توضيح أن لا شيء هناك — على الأرجح أُعيدت تسميته أو حُذف بعد إنشاء التقرير — وأن أرقامه لا تزال محتسبة. لا يُسقط شيء ولا يتزحزح أي إجمالي: الصف هو إفادة التقرير عن نفسه، والتلوين بالرمادي هو ما يمنعه من أن يُقرأ كصف يُفتح.
- يبقى التخمين داخل العرض. المسار المسجَّل للملف لا يزال تمامًا ما قاله التقرير، لأن كل ما عداه مفهرس عليه — إثراء التقرير الخارجي يقارن به، والقياس عن بُعد يجعله نسبيًا، والعرض المشروح يفتحه — ومنحها موضعًا مفترضًا يعني مقايضة المعلوم بالمختلق. الشجرة وحدها تجمع الاثنين، ولمسار لا يسمّي موضعًا خاصًا به فقط: أما المسار المطلق غير الموجود ببساطة فيحتفظ بما قاله التقرير ويُلوَّن بالرمادي في مكانه.
0.2025.25 · بناء 4 — أين جرى القياس
2024-08-07
إصلاحات
- تغطية الوحدة الفرعية تحطّ حيث توجد الوحدة الفرعية فعلًا، وصفوفها تُفتح. تبني وحدة git الفرعية تقريرها الخاص بجوار شجرتها الخاصة، ويكتب gcovr فيه
<source>.</source> — "المجلد الذي يوجد فيه هذا الملف" — وتحته أسماء مثل app/Application.cpp. ولم يكن شيء يربط تلك . بأي مكان: كانت المسارات تُحلّ مرة واحدة، بعد الدمج، وعندها لم يعد التشغيل يعرف من أي مدخل جاء كل ملف، فلم يبقَ أساس سوى جذر مساحة العمل. تجربة <workspace>/app/Application.cpp لم تجد شيئًا، وبقي كل مسار نسبيًا، ورسمها عرض التغطية كمشروع اسمه app — على اسم أول جزء من مسار لم يكن قط موضعًا — وكان كل صف فيه ينسخ ويفتح مكانًا لا ملف فيه.
- تُحلّ المسارات الآن لكل ملف تتبع على حدة، قبل الدمج. يُربط
sourceRoot النسبي بالمجلد الذي يوجد فيه ملف التتبع الخاص به، فتعني . المجاورة لملف coverage.xml لوحدة فرعية تلك الوحدة نفسها. وإن لم يجد ذلك المصادر، يصعد البحث إلى أعلى انطلاقًا من ملف التتبع — إذ يكتب تخطيط CMake المعتاد التغطية على عدة مستويات داخل build/، وأيّ الشكلين يستخدمه المشروع غير مدوَّن في التقرير في أي موضع، فيجيب عنه نظام الملفات بدل الإعدادات. ويتوقف الصعود عند جذر مساحة العمل: تجاوزه قد يجعل src/main.c المجرّد يُحلّ في نسخة مجاورة تشترك في التخطيط نفسه — جواب خاطئ يبدو صحيحًا. أما المسار المطلق الموجود أصلًا فيبقى كما هو، فلا تتغير عمليات lcov المعتادة.
- تبقى الوحدة الفرعية مشروعًا مستقلًا في عرض التغطية. الملفات التي صارت تُحلّ داخل مساحة العمل كانت ستنصهر في شجرتها — فتتشابك مجلدات الوحدة الفرعية مع مجلدات الأصل، وتُضاف أرقامها إلى إجمالي الأصل كأن قاعدة شيفرة واحدة قيست مرتين. يسجّل كل ملف الجذر الذي قيس منه، ويجمّع العرض على أساسه، فتحتفظ الوحدة الفرعية بعنوانها الخاص وإجمالياتها الخاصة رغم وجودها داخل المجلد المفتوح. أما التشغيل الذي مساراته مطلقة أصلًا فلا جذر له من هذا النوع ويُجمَّع تمامًا كما كان.
- الملف الذي يذكره التقرير وقد اختفى يظل يُبلَّغ عنه كمفقود. ولا يُمنح مسارًا معقولًا هو ليس فيه: فالتقرير الذي يذكر ملفات حُذفت منذ ذلك الحين تقرير قديم، ورسمها في مواضع مختلقة يُخفي ذلك. ويُذكر كل منها في قناة الإخراج تحت
FUCINI_REMAP_001، مع المسار الذي كان سيكون له.
0.2025.24 · بناء 3 — لماذا اختفى مقعدك
2024-07-27
تغييرات
- المقعد الذي يختفي يوضّح الآن السبب. كان كل إلغاء يعرض السطر نفسه — لم يعد مقعدك في هذه الخطة نشطًا — وهو ما يُقرأ كاتهام موجّه إلى الشخص الخطأ. الاشتراك الجماعي الذي يُخفَّض إلى أقل من عدد المقاعد المستخدمة يحرّر الآن الفائض بعد مهلة سماح، ومن يفقد مقعدًا لم يفعل شيئًا سوى أنه كان الأطول عهدًا بعدم استخدامه. وحيثما كان لدى خادم التراخيص ما يستحق القول، يقوله الامتداد: فالمقعد الذي حُرِّر ليتناسب مع اشتراك مخفَّض يشرح ذلك تحديدًا ويشير إلى من يدير الاشتراك، مع إبقاء طلب مفتاح جديد معروضًا — لأن طريق العودة حقيقي: يتوفر مكان في المجموعة فور أن يحرّر ذلك الشخص مقعدًا.
- الاشتراك المنتهي لا يعرض أي زر. لا يمكن إصدار مفتاح جديد من اشتراك منتهٍ، لذا كان الإجراء الوحيد في ذلك الإشعار لا يمكن إلا أن يفشل — وهو ما يُقرأ كامتداد معطَّل لا كاشتراك انتهى. أصبح الآن يقول ما حدث ويتوقف عند ذلك. وأي سبب لا تعرفه هذه النسخة يحتفظ بالصياغة العامة: فخادم التراخيص يُنشر باستمرار بينما الامتداد المثبَّت لا يُنشر، ومن ثم فإن مصادفة سبب غير معروف هي الحالة المعتادة لا الاستثنائية — فلا يظهر معرّف خام أبدًا، ولا يسود الصمت أبدًا. وقد تُرجمت الرسالتان الجديدتان إلى اللغات السبع عشرة جميعها.
0.2025.23 · بناء 5 — خارج الامتداد
2024-07-17
أُضيف
- يمكن للتشغيل أن يخرج أخيرًا — بستة تنسيقات إضافية. حتى الآن كان هناك مخرجان فقط: Fucini JSON، الذي لا يقرأه شيء سوى الامتداد، وتقرير HTML، الذي لا يقرأه شيء آليًا. يفتح Export Coverage Report... منتقي تنسيقات ويكتب التشغيل النشط بصيغة CSV لكل ملف (المغطّى/الإجمالي/النسبة للأسطر والتفرّعات والدوال وMC/DC والمناطق والتنفيذات، الأسوأ أولًا، مع صف
TOTAL)، أو CSV لكل دالة (عدد مرات التنفيذ، وهل نُفّذت، والتفرّعات غير المغطّاة داخلها، وأزواج MC/DC)، أو ملخّص Markdown للصقه في طلب سحب، أو ملف تتبع LCOV، أو Cobertura XML، أو SARIF، أو شارة SVG مستقلة لملف README. تجده في لوحة الأوامر، وفي شريط عنوان عرض Covered Files بجوار Generate Full HTML Report، وفي القائمة السريعة لشريط الحالة بمجرد تفعيل quickActions.exportReport.
- صار محوّلًا، لا عارضًا فحسب. يقرأ الامتداد أصلًا lcov وllvm-cov JSON وCobertura وJaCoCo وIstanbul/nyc وSimpleCov؛ ومع كاتبَي LCOV وCobertura صار يسير في الاتجاه المعاكس أيضًا. حمّل تقرير JaCoCo، أو عدة تقارير مدموجة في تشغيل واحد، وأصدر ملف التتبع الوحيد الذي يقبله genhtml وCodecov وCoveralls وSonarQube جميعًا — أو ملف XML الذي تستوعبه Jenkins وGitLab وAzure DevOps أصلاً. كلاهما يعود عبر محلّلات الامتداد نفسها، وتُفرَد نطاقات الأسطر سطرًا سطرًا حتى تتطابق قيم
LF/LH المكتوبة مع النسبة المعروضة بدل أن تقاربها.
- كل كاتب يصرّح بما يُسقطه. كلها عدا ملفات CSV فاقدة للبيانات، وبصمت: لا تمثيل لـMC/DC ولا لمناطق الشيفرة ولا لتنفيذات C++ في LCOV أو Cobertura أو SARIF، وCobertura يسجّل كم شرطًا من شروط السطر جرت تغطيته، لا أيّ فرع. يبقى Fucini JSON وملفا CSV هما التنسيقين اللذين يحملان كل ما جرى قياسه. في ملفات CSV، يترك المقياس الذي لا يملكه التشغيل خلاياه فارغة بدل أن تكون صفرًا — الخلية الفارغة تقول "لم يبلّغ هذا الأداة عن بيانات تفرّع"، أما
0 فتقول "لم يُصَب أي تفرّع"، ولن يميّز جدول البيانات بينهما لاحقًا. وكل ما قد ينفّذه جدول البيانات كصيغة — حقل يبدأ بـ= أو + أو - أو @، أي كل مسار بنطاق npm — يوضع بين علامتي اقتباس ويُبطَل مفعوله قبل الكتابة.
- SARIF يعلّق على الفروق؛ والشارة لا تحتاج شبكة. تُبلَّغ النطاقات غير المغطّاة عند المستوى
note لا warning: الشيفرة غير المغطّاة معلومة عن حزمة الاختبارات، وفحص الشيفرة يعامل التحذير كشيء ينبغي أن يوقف الدمج — والبوابة التي توقف تظل Check Coverage Thresholds. تُرسم الشارة هنا بدل جلبها من shields.io، فتعمل في مستودع معزول أو محلي، وتأخذ لونها من colorScale نفسه الذي تستخدمه الهوامش وشريط الحالة. في إصدار Community المجاني يفتح المنتقي ويعمل ملفا CSV، بحد أقصى 20 تصديرًا يوميًا مثل Export Fucini JSON؛ أما تنسيقات التبادل فهي في المستوى المدفوع، على الخط نفسه الذي رسمه هذا الإصدار دائمًا: قراءة أرقامك مجانية، وتغذية خط تكامل مستمر ليست كذلك.
0.2025.22 · بناء 3 — لا شيء لقياسه
2024-06-24
إصلاحات
- لم يعد الملف الذي لا يحتوي على ما يمكن قياسه يُعرض بتغطية 100%. ملف ترويسة يحتوي على تصريحات فقط — نماذج دوال وماكرو وحُرَّاس التضمين — لا يحتوي أجسام دوال، لذا لا يُصدر المترجم له أي بيانات تغطية، وكل ما يقسم صفرًا على صفر يجيب بـ 100%. كان يظهر باللون الأخضر في الشجرة إلى جانب شيفرة اختُبرت فعلًا. يأخذ القارئان الآن مجاميع الأداة نفسها بوصفها إفادة الملف عن نفسه —
LF/FNF/BRF في lcov، وكتلة summary في JSON الخاص بـ llvm-cov — ويُترك الملف الذي تساوي كل مجاميعه صفرًا خارج التشغيل بدل أن يُقيَّم. أما السجلات السطرية أسفل تلك المجاميع فتُتجاهل عن قصد: تُنسب توسعة الماكرو إلى السطر الذي يعرّفه، بينما يعود العدّ إلى السطر الذي يستخدمه في ملف آخر، وذلك السطر المستعار كان السبب الوحيد لظهور مثل هذه الترويسة كأنها مقيسة. وتفقده المجاميع الكلية أيضًا، فيصبح الرقم المعروض أقل قليلًا وأصدق كثيرًا. ويُذكر كل مسار مُستبعد في قناة الإخراج، أما التقرير الذي تكون فيه كل الملفات تصريحات فقط فيحتفظ بها جميعًا.
تغييرات
- اختيار ملف تغطية يُضاف إلى ما هو محمَّل بالفعل بدل أن يحل محله. البناء الذي يكتب تقريرًا لكل وحدة ليس له ملف واحد يُثبَّت، وكان اختيار تقرير الوحدة الثانية يُلغي تحميل الأولى بصمت. صار مربع الحوار يقبل عدة ملفات دفعة واحدة، وكل اختيار يُضاف إلى المجموعة، ويُدمج كل ما اختير في تشغيل واحد — يُرسم في اللوحة تحت اسم كل مشروع. وتشمل المراقبة جميع الملفات، ولم يعد إعادة توليد أحد التقارير يزيح البقية عن الشاشة. وينتهي Show Loaded Coverage Files بالخيار إلغاء تحميل الملفات التي اخترتها، الذي يعيدك إلى الاكتشاف المعتاد.
- صار للدعم عنوان على نطاق المنتج نفسه:
support@fucini.software. حين يتعذّر إتمام التفعيل تلقائيًا، كانت لوحة الترخيص ورسالة رمز الطلب تعطيك عنوانًا على fucini.consulting — نطاق مختلف عن كل رابط آخر في الامتداد، ويُقرأ كأنه شركة أخرى. ويبقى license@fucini.software كما هو: منه تُرسل المفاتيح، وليس صندوقًا للمراسلة.
0.2025.21 — لمن هذا الـ src
2024-06-21
أُضيف
- كل شجرة في عرض Coverage تقول الآن إلى أي مشروع تنتمي. أعطت 0.2025.19 التشغيل المدمج كتلةً مسمّاة لكل مشروع، لكن التشغيل العادي ظل يرسم شجرة عارية — فمساحة عمل مقتَطعة إلى مجلدها الخاص كانت تُفتح على
src دون أن يقول شيء فوقه أي src هذا. صارت كل شجرة تحمل جذرها: المجلدات المؤدية إلى المشروع باللون الخافت، ومجلد المشروع نفسه بعدها باللون الكامل. والشجرة المقتطعة إلى مجلد مساحة العمل ما زالت تقول إلى أين اقتُطعت، وقاعدتا شفرة مدمجتان في تشغيل واحد لا تُقرآن أبدًا كشجرة واحدة. إنه عنوان لا صف — لا شيء هناك ليُوسَّع، والمجلدات تحته تُطوى تمامًا كما كانت. وفي لوحة ضيقة تُختصر الأدلة الأولى أولًا، فيكون المجلد الذي يسمّي المشروع فعليًا آخر ما يختفي، ويُظهر التحويم المسار كاملًا.
0.2025.20 · بناء 7 — القائمة التي توقّعتها
2024-06-08
أُضيف
- صفوف عرض Coverage صار لها قائمة النقر بالزر الأيمن الخاصة بمستكشف الملفات نفسه. كان النقر بالزر الأيمن على ملف أو مجلد يفتح قص/نسخ/لصق الخاصة بواجهة الويب — ثلاثة عناصر لا شيء في الصف تعمل عليه. أصبحت تفتح الآن قائمة VS Code الحقيقية: فتح، Open to the Side، فتح باستخدام…، Reveal in Explorer View، Reveal in File Explorer، Open in Integrated Terminal، وبحث في المجلد… للمجلدات، إضافة إلى Copy Path / Copy Relative Path — وبجانبها على Windows صيغ الشرطات المائلة حيث تختلف الصيغتان. زر
⋯ وقائمته لم يتغيّرا، وهما آخر عنصر في القائمة الجديدة.
تغييرات
- المقياس الذي لا يحمل ملف التغطية بيانات له لم يعد يُحكم عليه. كان وضع حدّ لـ MC/DC مع خلوّ البناء منه يُحتسب إخفاقًا — فيجلس ملف حقّق 100% في كل مقياس قاسه البناء فعلًا تحت بطاقة تقول «تحقّق 3 من 5»، أمام حدّ لا يستطيع أي شيء في ذلك الملف تجاوزه أبدًا. تُتخطّى المقاييس بلا بيانات الآن في كل موضع يتشكّل فيه حكم: شريط الحالة لكل ملف، وبطاقة التشغيل كاملة، ولافتة المصدر المُعلَّق، وتقرير HTML. ولا يزال Check Coverage Thresholds يسمّي المقياس الغائب صراحةً، وهذا موضعه الصحيح.
- الملفات التي لا يوجد فيها ما يُقاس صارت خارج عرض Coverage. ملف ترويسة من تصريحات، وملف لا يحوي سوى إعادة تصدير، ووحدة أنواع فقط: لن يغيّر أي اختبار تكتبه رقمها، وفتحها لا يُظهر أي مقياس إطلاقًا. كانت تُدرج بشَرطة في 0.2025.19؛ أما الآن فلا تُدرج ببساطة، وتذهب معها المجلدات التي تُصبح فارغة. أما التشغيل الذي لا شيء فيه قابل للقياس فما زال يعرض كل شيء.
إصلاحات
- كان حرف محرك الأقراص قد يتصدّر الشجرة. مع تغطية لا تقع مساراتها تحت مجلد العمل المفتوح — ملف تغطية مدمج من مشروع آخر، أو نافذة بلا مجلد مفتوح — كانت الشجرة تبدأ من
W:، وعلى Linux وmacOS من صف بلا اسم إطلاقًا: صف واحد بابن واحد فقط، توسيعه بلا فائدة. لم يعد جذر نظام الملفات يُرسم أبدًا مهما كانت المسارات، ويظل كل صف حاملًا مساره المطلق الحقيقي من أجل القائمة والمحرّر.
0.2025.19 · بناء 6 — مسارات، لا مقدّمات
2024-05-16
أُضيف
- قائمة صف لكل ملف ومجلد في عرض Coverage. يَنسخ الزر الموجود في نهاية الصف ذلك المسار بأيٍّ من الصيغ الأربع التي قد يطلبها محرِّر أو صَدَفة أو مطالبة — مطلقًا أو نسبةً إلى مساحة العمل، بفواصل النظام أو بالشرطات المائلة — ويوفّر Reveal in File Explorer وOpen in Integrated Terminal، مع فتح الطرفية في مجلد الملف نفسه. ولا تظهر مدخلات الشرطة المائلة إلا حيث تختلف عن الصيغة الأصلية، فتكون القائمة أقصر ببندين على Linux وmacOS. وكان نسخ مسار يعني حتى الآن العثور على الملف نفسه مرة ثانية في المستكشف.
- زرّا طيّ الكل وتوسيع الكل فوق الشجرة. طيّ كل شيء ثم فتح المجلد الوحيد الذي يعنيك هو أسرع طريق عبر شجرة كبيرة، وكان يكلّف حتى الآن نقرة لكل مجلد. وما تطويه بهذه الطريقة يُحفَظ تمامًا كمجلد أغلقته بيدك، فإعادة التحميل لا تُلغيه.
- صار التشغيل المدمج الذي يمتد إلى أكثر من مشروع يرسم كل مشروع على حدة، تحت اسمه الخاص. فدمج ملف تتبع من قاعدة شفرة ثانية كان يعلّق مجلداتها على الشجرة نفسها التي تحمل مجلدات مساحة العمل، فيظهر
src مرتين دون بيان السبب، وتتداخل أدلة المشروعين أبجديًا. أما الآن فلكل مشروع كتلته المسماة، يفصلها خط، ويأتي مشروع مساحة العمل أولًا. والتشغيل الذي يغطي مشروعًا واحدًا لم يتغير ولا يحمل عنوانًا — إذ لا شيء يُميَّز عنه.
إصلاحات
- كان الملف الذي لا يحتوي على أي شيء قابل للتنفيذ يُبلَّغ عنه بتغطية 0%. فالوحدة التي لا تضم سوى إعادة تصدير
export *، أو إعلانات أنواع فقط، تُترجَم إلى شيء لا تستطيع أي أداة تغطية قياسه — أي أن ملف التتبع لا يسجّل لها أي تعليمة على الإطلاق. وكان عرض Coverage يمنح ذلك 0% ويضع الملف بالأحمر إلى جانب شفرة غير مختبَرة فعلًا، مع أنه لا يوجد ما يُكتب له اختبار؛ في حين كان المستكشف يمنح الملف نفسه 100% خضراء، لأن المجموع الفارغ يُقرأ كأن "كل العدم مغطى". ولم يكن أي من الرقمين صحيحًا، ولم يعد أي منهما يُعرض: يحصل الصف في اللوحة على شرطة وإطار متقطع مع تلميح يوضّح السبب، ويُحذف شارة المستكشف تمامًا. كما يبقى المجلد الذي لا يضم سوى مثل هذه الملفات بلا تقييم. أما الملف الذي بلغ 0% من شيء جرى قياسه فعلًا فما زال يُظهر 0% — فالشرطة تعني "لا شيء لقياسه"، لا "قِيس وأُخفق فيه". - كانت صفوف المشروع المدمج تشير إلى المكان الخطأ. إذ كانت مساراتها تُبنى من جذر مساحة العمل بدلًا من جذرها هي، فيَنسخ منها قائمة الصف — ويفتح "Reveal in File Explorer" — مسارًا لم يكن الملف فيه قط، إن كان خارج مساحة العمل. أما الآن فهي تحمل الجذر الذي أتت منه فعلًا.
تغييرات
- لم يعد عرض Coverage يرسم جذر مساحة العمل. كانت الشجرة تبدأ من جذر نظام الملفات وتنزل عبر كل مجلد فوق المشروع — القرص، ثم الدليل الذي يضم مشاريعك، ثم المشروع نفسه — قبل أن تصل إلى أول مجلد يخصك فعلًا. كان ذلك عدة مستويات من الإزاحة، في كل صف، تكرّر ما قاله عنوان النافذة أصلًا. صارت المسارات تبدأ الآن من مجلد مساحة العمل. أما المسار المطلق الكامل فما زال هو ما تنسخه قائمة الصف وما يفتحه المحرِّر.
0.2025.18 · بناء 4 — يبقى حيث تركته
2024-04-30
إصلاحات
- كانت المجلدات التي طويتها في عرض Coverage تنفتح من جديد مع كل إعادة تحميل. المراقبة مفعّلة افتراضيًا، لذا فإن أي بناء يعيد توليد التغطية يعيد رسم اللوحة — ولأن كل مجلد كان يُرسم مفتوحًا، لم يكن طيّ أي مجلد يدوم إلا حتى البناء التالي. وفي شجرة كبيرة كان ذلك يعني تكرار العمل نفسه عدة مرات في الساعة. صارت اللوحة تتذكّر المجلدات التي أغلقتها وتُبقيها مغلقة. أما الدليل الذي يظهر لأول مرة في تشغيل لاحق فما زال يُعرض مفتوحًا كأي دليل آخر: فما يُتذكَّر هو فعل الإغلاق المتعمَّد، لا الحالة الافتراضية.
- لم يكن إيقاف القياس عن بُعد يمنع إشعار إلغاء التثبيت. يُرسل هذا الإشعار سكربت صغير مستقل يشغّله VS Code عند إلغاء تثبيت الامتداد. لا يستطيع هذا السكربت الوصول إلى واجهة VS Code البرمجية ولا قراءة إعداداتك، ولذلك فإن الشيء الوحيد الذي يخبره بألّا يرسل هو غياب ملف يكتبه الامتداد ما دام القياس عن بُعد مفعّلًا — ولم يكن هذا الملف يُحذف قط عند إيقافك القياس عن بُعد. فكل من فعّله ثم أوقفه لاحقًا كان سيرسل مع ذلك، عند إلغاء التثبيت، اسم مستخدم نظام التشغيل واسم المضيف والمجلد الرئيسي. صار الملف يُحذف فور إيقاف القياس عن بُعد.
- كان تجديد Pro قد يُبلغ بالنجاح لمفتاح استبدلته للتو. كان التجديد الصامت يقرأ مفتاحك المُعدّ مرتين: مرة ليقرّر هل يجدّد، ومرة أخرى بعد ذلك ليقرّر هل يعرض أي رسالة. فإذا لُصق مفتاح جديد أثناء تجديد جارٍ، رأت القراءة الثانية مفتاحًا مختلفًا، ووصفت رسالة «تم تجديد اشتراك Pro الخاص بك» المفتاحَ الذي كان قد استُبدل. صار المفتاح يُقرأ مرة واحدة.
تغييرات
- صارت كل وحدة في الامتداد مغطّاة باختباراتها الخاصة. بالنسبة إلى أداة كل عملها أن تخبرك إلى أين تصل اختباراتك فعلًا، بدا أن الأمر يستحق أن يُنجز كما ينبغي: 53 من ملفات المصدر الـ 54 عند 100% في التعليمات والفروع والدوال والأسطر، والملف المتبقي — طبقة الربط مع VS Code — عند 95% من دواله. وكشفت كتابتها الأعطال المذكورة أعلاه، ومعها أكثر من عشرين حارسًا لم يكن من الممكن أن يُنفَّذ أبدًا: مسارات بديلة تقف خلف فحوص كانت قد استبعدتها أصلًا، فتبدو كشبكات أمان وهي لا تلتقط شيئًا. وقد أُزيلت بدل أن تُغطّى باختبار لا يمكن أن يفشل.
0.2025.17 — سُئل في لحظة تستحق الإجابة
2024-04-27
تغييرات
- يَنتظر الاستبيان الاختياري الآن حتى تستخدم الامتداد فعليًا، ويسأل في لحظة أفضل. كان يَعُدّ الأيام منذ التثبيت، فيقيس متى ثبَّتَّه لا ما إذا كنت قد رأيته يعمل — فكان يُطلب من تثبيتٍ لم يُمَسّ شهرًا أن يقيّم منتجًا لم يُظهر له شيئًا قط. صار يلزم الآن تحميلات تغطية حقيقية إلى جانب الوقت المنقضي، ولم يعد يظهر أثناء بدء تشغيل المحرر: بل ينتظر نجاح عملية تحميل. وبعد عام يأتي دعوة ثالثة وأخيرة، لأن دعوتين داخل الربع الواحد كانتا تستبعدان نهائيًا كل من صادف أن كان مشغولًا حينها.
- لم تعد الترجمة الهولندية رسمية. كانت تخاطبك بـ«u» في كل موضع، وهو ما يبدو جافًا لأداة مطوّرين ولا يتسق مع بقية نبرة المنتج. تستخدم جميع النصوص الهولندية الآن «je»، وقد أُعيدت كتابتها جملةً جملة لأن التغيير يجرّ معه صيغ الأفعال.
0.2025.16 — رمز، لا شركة
2024-04-23
تغييرات
- كان نموذج التفعيل يطلب «company code» من المطوّرين المستقلين. شراء Pro أو Pro Plus كشخص واحد يمنحك رمزًا من اشتراكك أنت — لا توجد شركة خلفه، والسؤال عنها يوحي بأنك في النموذج الخطأ. صار هذا الحقل يُسمّى Subscription code في Pro وPro Plus، ويبقى Company code في Business وEnterprise حيث يتشارك الفريق رمزًا واحدًا فعلًا. أما التلميحات أسفله فكانت مكتوبة لكل خطة على حدة أصلًا؛ التسمية وحدها هي التي ظلت عامة.
0.2025.15 · بناء 3 — يُقاس بما حدّدته أنت
2024-03-25
تم الإصلاح
- كان تقرير HTML المُولَّد يحكم على شفرتك وفق 100% مهما كانت العتبات التي حدّدتها. فقد كان عمود الحالة يقارن كل مقياس بعتبة 100 مخفية، حتى إن مشروعًا ضبط عتباته على 80 وحققها كان يرى شريط COMPLIANT الأخضر فوق عمود من العلامات الحمراء مباشرة — للتشغيل نفسه وفي الصفحة نفسها. وكان مفتاح المقاييس يفعل الشيء ذاته. الآن يستخدم كلاهما العتبات التي ضبطتها، وحيث لا تنطبق أي عتبة يظهر شرطة باهتة بدلًا من اختلاق حكم.
- كان شريط الامتثال يدّعي أكثر مما فحص. فقد كان يقول دائمًا «تم استيفاء جميع العتبات المُهيّأة»، حتى في الوضع الافتراضي الذي لا يفحص سوى الدرجة المرجّحة — أي أن تشغيلًا ما كان بإمكانه الادعاء باستيفاء كل العتبات بينما إحداها تفشل بوضوح في الجدول أدناه. الآن يذكر كل وضع القاعدة التي طبّقها فعلًا.
- كان ملف README يقول إن الامتداد «يعمل مجانًا حتى 2026-12-31». لا وجود لهذا التاريخ في المنتج. صحّح إصدار سابق هذه العبارة في أوصاف الإعدادات لكنه أغفل README — وهو أول ما يُقرأ في Marketplace. الآن يذكر ما يحدث فعلًا: تجربة مدتها 14 يومًا من أول استخدام، ثم فئة Community المجانية، دون أي تاريخ يتوقف بعده شيء.
0.2025.14 — التمييز بينهما
2024-03-15
تم التغيير
- لم تعد النسختان تبدوان متطابقتين في Marketplace. تُبنى Pro وCommunity من شجرة مصدر واحدة، وحتى الآن كان ذلك يشمل الأيقونة أيضًا — فكان الإدراجان الصورة نفسها بعنوانين مختلفين، جنبًا إلى جنب في نتائج البحث ذاتها. الآن لكل نسخة أيقونتها: الرسم نفسه مع شريط ملوّن في الأسفل، فيروزي لـ Pro ورمادي أردوازي لـ Community. الكلمة هي ما يميّزهما حين تُعرض الأيقونة كبيرة؛ أما في صف نتائج البحث فالكلمة أصغر من أن تُقرأ، فيتولى اللون المهمة بدلًا منها.
0.2025.13 — متاح من حيث تقف
2024-02-26
تم الإصلاح
- فتح العرض المشروح لم يعد يمنعك من إعادة فتحه. لوحة المصدر المشروح هي عرض ويب وليست محرّر نصوص، لذا ما دام التركيز عليها لم يكن الامتداد يرى أي «ملف حالي» — وكان تشغيل Open Annotated Source من هناك يردّ بـ«افتح أولًا ملفًا بتغطية محمّلة»، لشخص ينظر تحديدًا إلى العرض المشروح لملف له تغطية بوضوح. الآن يعود إلى الملف الذي خلف اللوحة التي أمامك. الكتلة نفسها كانت تتخطى بصمت إعادة الفحص التي من أجلها يوجد تشغيل ثانٍ أصلًا: عند ضبط تقرير HTML من llvm-cov، فإن إعادة تشغيل الأمر هي ما ينقل اللوحة إلى صفحة ذلك التقرير — أي أنه إذا انتهى بناء التغطية بعد فتحك اللوحة، لم يكن هناك سبيل لالتقاطه من اللوحة نفسها.
0.2025.12 · بناء 2 — أن نقول ما هو صحيح
2024-02-15
أُضيف
- اشتراك Pro المدفوع يجدّد نفسه الآن. كل مفتاح تفعيل يدوم بقدر الفترة المدفوعة فعليًا. تلتقط خطط الفرق الفترة المجدَّدة عند اتصالها التالي، لكن Pro الفردي لا يتصل أبدًا — فهو يعمل دون اتصال تمامًا — لذا لم يكن هناك ما يوصل التجديد إليه، وكان مفتاح المشترك الشهري سينتهي كل شهر تقريبًا مهما التزم بالدفع. صار الامتداد الآن يطلب مفتاحًا جديدًا بهدوء، في الأيام المحيطة بانتهاء صلاحيته فقط، وفقط حين يملك الرمز الذي يثبت أن اشتراكًا قد دفع ثمنه. ولا يكلّفك البقاء دون اتصال في تلك الفترة شيئًا: يظل المفتاح يعمل حتى ينتهي فعلًا، والمحاولة التالية بعدها تستعيده.
- التفعيل من بريد الشراء بنقرة واحدة. يسلّم الرابط خطتك ورمزك إلى الامتداد مباشرة، بدل فتح VS Code والبحث عن الأمر ولصق الرمز يدويًا. ويطلب التأكيد دائمًا قبل استخدام مقعد. وإدخال الرمز بنفسك ما زال يعمل تمامًا كالسابق — فالرابط اختصار وليس الطريق الوحيد — وهو يعمل في نسخة Community أيضًا.
تم الإصلاح
- وصف أحد الإعدادات ادّعى أن الامتداد "مجاني حتى 2026-12-31". لا وجود لهذا التاريخ في المنتج إطلاقًا. ما يحدث فعلًا هو فترة تجريبية مدتها 14 يومًا تُحتسب من أول استخدام، يعود بعدها الامتداد إلى مستوى Community المجاني. وهذا ما يقوله الوصف الآن، بكل اللغات.
- لم تعد إعدادات العتبات تذكر الإصدار الذي غيّر قيمها الافتراضية — رقم إصدار في منتصف الجملة يجيب عن سؤال لا يطرحه أحد وهو يقرأ وصف إعداد.
- عدة أوصاف مترجمة ذكرت أمرًا لا يعرضه أي VS Code مترجم. كانت تشير إلى أمر التفعيل باسمه الإنجليزي، فيُرسَل كل من لا يعمل بالإنجليزية للبحث في لوحة الأوامر عن نص غير موجود فيها.
0.2025.11 · بناء 3 — أن نَعُدّ ما يستحق العدّ
2023-12-26
تم الإصلاح
- كان بإمكان مشروع بلا قرارات MC/DC أن يُظهر تغطية إجمالية بنسبة 0%. بعض الأدوات تُبلّغ عن قسم MC/DC حتى عندما لا يوجد فيه ما يُقاس، وكان ذلك يُقرأ على أنه «0% مُغطّى» بدلاً من «لا شيء لتغطيته». وبما أن الدرجة الإجمالية تهبط إلى الصفر بمجرد أن يبلغ أي مقياس صفرًا، كان بإمكان مشروع مُغطّى بالكامل أن يُظهر 0%. المقياس الذي لا يوجد فيه ما يُقاس لم يعد يدخل في الدرجة إطلاقًا، ويختفي صفّه بدلاً من الظهور بصيغة «0 / 0 شرط مُغطّى».
- حالة الترخيص مُترجَمة الآن إلى اللغات السبع عشرة كافة. كانت تبقى بالإنجليزية، ولأنها ترد داخل جُمل مُترجَمة أصلًا، كانت النتيجة سطرًا نصفه مُترجَم في شريط الحالة وفي الإشعارات وفي لوحة الملفات المُغطّاة.
- كما تُرجِمت طريقة عرض المصدر المُعلَّق وتلميحات التغطية — جدول تفصيل الامتثال، وأزرار التنقل وتلميحاتها، وتفاصيل الفروع و MC/DC.
تم التغيير
- يمكن الآن تفعيل اشتراك Pro المدفوع برمزه الخاص. أُضيف خيار Pro إلى قائمة الخطط في طلب المفتاح، فأصبح للرمز المرافق لاشتراك Pro مكان يُدخَل فيه أخيرًا. ولا تزال مفاتيح Pro الفردية تعمل دون اتصال بالكامل ولا تتصل بالخادم بعد التفعيل.
- أيقونة شريط الأنشطة أكبر وأوضح إلى جانب الأيقونات المدمجة.
- الانتقال إلى إصدار Community يُثبّته الآن من fucini.software. كانت المحاولة تتم سابقًا عبر Marketplace حيث لا يُنشَر إصدار Community، وهو ما كان قد يتركك دون أي امتداد مُثبَّت.
0.2025.10 · بناء 5 — هبوط أكثر سلاسة
2023-12-08
تم التغيير
- الاشتراك المنتهي يستقر الآن على الفئة المجانية — عند انتهاء مفتاح تفعيل فردي، كان الامتداد يطلب منك التجديد بلا نهاية. اختيار عدم التجديد نهاية طبيعية للاشتراك وليس عطلًا، ولذلك ينتقل الامتداد الآن بدلًا من ذلك إلى فئة Community المجانية الدائمة. أما خطط الفرق فلا تتأثر عن قصد: يظل مفتاح Pro Plus أو Business أو Enterprise المنتهي يُبلَّغ عنه على أنه منتهٍ، لأن تجديده هناك من مسؤولية المسؤول، ولأن خفض الشركة بأكملها بهدوء إلى الفئة المجانية سيخفي ذلك.
تم الإصلاح
- يُحترم إيقاف القياس عن بُعد الآن في جميع الحالات. كان أحد مسارات الشيفرة قد يتخطى هذا التحقق عندما يكون وضع التشخيص التفصيلي الداخلي للامتداد مفعَّلًا. هذا الوضع مُعطَّل في كل بنية منشورة، ولذلك لم يسلك أي إصدار هذا السلوك قط، لكن التحقق أصبح الآن غير مشروط.
- تُطبَّق الإعدادات فورًا بدلًا من انتظار إعادة التحميل. تعديل إعادة تعيين المسارات أو استبعاد التعليقات أو التصفية حسب git-diff أو مجاميع الملفات المستبعدة يعيد الآن تحميل التغطية على الفور — وخصوصًا إعادة تعيين المسارات، فهي بالضبط الإعداد الذي تلجأ إليه لأن المسارات لا تتطابق.
- "Unlock Full Features" و"Switch to Community" كان من الممكن أن يتوقفا في منتصف الطريق دون الإشارة إلى ذلك. وكلاهما يعمل الآن حتى الاكتمال.
- يظل مفتاح التفعيل الخاص بك مرتبطًا بهوية الجهاز نفسها. كان من الممكن سابقًا إعادة توليد هذه الهوية بين الجلسات في بعض الإعدادات، مما كان يُبطل مفتاحًا صادرًا بالفعل.
0.2025.9 — ترجمات كاملة
2023-12-02
أُضيف
- ترجمات كاملة عبر جميع اللغات الـ 17 المتوفرة — نحو مئة من نصوص الواجهة الأحدث، بما في ذلك مربعات حوار التفعيل والترخيص، واستبيان الملاحظات الاختياري، ومسار فتح ميزات Community، وإشعارات التحديث الذاتي، كانت لا تزال تعود إلى الإنجليزية في كل حزمة غير إنجليزية. أصبحت اللغات الـ 17 جميعها تغطي الآن واجهة التشغيل الكاملة للامتداد.
تم التغيير
- مراجعة تنظيمية لتعليقات الكود المصدري، وتوثيق سكربتات البناء، وقائمة ملفات التحزيم. مجموعة الملفات المرفقة في الامتداد لم تتغير؛ ولا توجد أي تغييرات وظيفية أو سلوكية.
0.2025.8 — لم يعد بإمكان الإصدارين التعارض
2023-11-20
تم الإصلاح
- كان تثبيت إصداري Pro وCommunity معًا قد يؤدي إلى تعطّل أحدهما عند بدء التشغيل — فكلاهما يسجّل الأوامر نفسها وعرض ملفات التغطية نفسه. يتم الآن اكتشاف ذلك مسبقًا: إذا كان الإصدار الآخر مثبتًا أيضًا، يتوقف التفعيل بشكل سليم مع رسالة تطلب منك إلغاء تثبيت أحدهما، بدلًا من فشل تفعيل غير مفسَّر.
0.2025.7 — أعمال تنظيم داخلية
2023-10-30
إصدار تنظيم داخلي؛ بلا أي تغييرات وظيفية.
0.2024.6 — فئة Community وخطط الفرق
2023-10-17
فئة مجانية دائمة، وخطط للفرق تتشارك مجمّع مقاعد، وإصدار Community منفصل من الامتداد.
أُضيف
- فئة Community مجانية ودائمة — بدلًا من التوقف التام بمجرد انتهاء الفترة التجريبية البالغة 14 يومًا، ينتقل الامتداد الآن إلى Community: جميع الميزات باستثناء MC/DC، وقدر شهري محدود من Full HTML Report وعروض Annotated Source الدائمة، وحدود يومية سخية على عدد قليل من الإجراءات القابلة للأتمتة، وكل ما عدا ذلك بلا حدود.
- افتح جميع الميزات مجانًا — يقايض أمر "Unlock Full Features" الجديد بيانات قياس عن بُعد تفصيلية عن الاستخدام مقابل منح كامل وغير مقيّد، ويمكن التراجع عنه في أي وقت. أما استبيان الملاحظات الاختياري داخل التطبيق فيكافئك بدلًا من ذلك بمفتاح كامل الميزات لمدة 30 يومًا، دون أي شروط.
- خطط الفرق: Pro Plus وBusiness وEnterprise — تتشارك هذه الخطط مجمّع مقاعد (رمز شركة إضافة إلى عدد المقاعد) بدلًا من مفتاح لكل جهاز، مع تسجيل دخول دوري في الخلفية يبقي منح المقعد محدَّثًا ويشير تلقائيًا إلى أي مقعد تم سحبه أو تقليصه.
- Fucini Coverage Studio Community — إدراج منفصل ومخصص مبني من المصدر نفسه، مع غياب فعلي لكود الفترة التجريبية والتفعيل وخطط الفرق الخاص بالفئات المدفوعة، لا مجرد إخفائه. راجع صفحة التنزيل.
تم التغيير
- أصبح إنشاء Full HTML Report وعروض Annotated Source الدائمة (العادي وجنبًا إلى جنب) من ميزات الفئات المدفوعة ضمن خط الأساس في Community — ولم يبقَ سوى عرض التبديل في المكان نفسه، بسقف شهري كما في السابق. ولا يزال فتح الميزات يمنحك كل ذلك.
- أصبح تحذير حد الاستخدام في فئة Community يعرض الآن كلا المسارين في رسالة واحدة: عرض الخطط المدفوعة، أو فتح الميزات عبر القياس عن بُعد.
تم الإصلاح
- لم يعد بالإمكان إرسال بيانات القياس عن بُعد التفصيلية التي قد تكشف الهوية (اسم مستخدم نظام التشغيل، والدليل الرئيسي، ومواصفات المعالج/الذاكرة، وواجهات الشبكة، ومحتوى التقرير/الكود المصدري كاملًا) إلا من Community أو من منح مجاني مشروط بالقياس عن بُعد — ولا يمكن إرسالها أبدًا من ترخيص مدفوع من نوع Pro/Pro Plus/Business/Enterprise، مهما كانت إعدادات القياس عن بُعد المحلية.
- لم يعد أي تثبيت يعمل بإصدار أقدم يحصل على فترة تجريبية جديدة لمجرد أنه رُقّي — بل ينتقل الآن بشكل صحيح إلى فئة Community إذا كانت فترته التجريبية القديمة قد انتهت بالفعل.
- أصبح إشعار التحديث وتقدم التنزيل ورسائل الخطأ تعرض الآن رقم الإصدار البسيط
Major.Year.Minor (المطابق لما يظهر في عرض الامتدادات في VS Code) بدلًا من كشف رقم البناء الداخلي، مثل 0.2024.6 بدلًا من 0.2024.6.2.
0.2024.5 — مفاتيح ترخيص دقيقة الضبط
2023-09-03
أصبح بإمكان مفاتيح التفعيل الآن تحديد سقف لكل ميزة على حدة، ويمكن لمشرفي التراخيص إصدار مفتاح دقيق الضبط يدويًا من لوحة التحكم.
أُضيف
- سقوف استخدام لكل ميزة — أصبح بإمكان مفاتيح التفعيل الآن تحديد سقف لكل ميزة/إجراء على حدة (مثل تصدير تقارير HTML بمعدل مرة واحدة شهريًا) بدلًا من حد مشترك واحد لتحميل التغطية. وتستمر المفاتيح الحالية في العمل دون تغيير.
- إصدار المفاتيح يدويًا — أصبح بإمكان مشرفي التراخيص الآن إصدار مفتاح يدويًا مقابل رمز طلب ورد من خارج الاستبيان الموجود داخل المحرر، مع اختيار الميزات الممنوحة بدقة وتاريخ انتهاء الصلاحية والسقوف الخاصة بكل ميزة، ويُرسَل المفتاح بالبريد الإلكتروني تلقائيًا عند تقديم عنوان بريد.
0.2024.4 — موثوقية موجز التحديثات
2023-07-24
يصلح خللًا في التخزين المؤقت كان قد يخفي الإصدارات الجديدة عن المستخدمين خلف بعض الوكلاء المؤسسيين.
تم الإصلاح
- موثوقية موجز التحديث الذاتي — يُقدَّم بيان التحديث الآن مع ترويسة no-cache صارمة، بحيث لم يعد بإمكان أي وكيل تخزين مؤقت بين fucini.software والقارئ تقديم نسخة قديمة تخفي الإصدارات الجديدة.
0.2024.3 — إصلاحات طفيفة وتحسينات في الأداء
2023-07-13
إصدار صيانة صغير: بعض إصلاحات الأخطاء الطفيفة وتحسينات الأداء.
تم الإصلاح
- إصلاح الأخطاء — إصلاحات طفيفة للأخطاء وتحسينات في الاستقرار.
- الأداء — تحسينات طفيفة في الأداء عند تحميل التغطية وعرضها.
0.2024.2 — التفعيل الآلي
2023-06-20
أصبحت مفاتيح التفعيل الآن تُصدر وتُطبَّق تلقائيًا — لا مزيد من انتظار البريد الإلكتروني.
إصدار للتقييم. يحصل كل تثبيت على فترة تجريبية مجانية مدتها 14 يومًا بكل الميزات مفتوحة، تُحتسب من أول استخدام؛ وبعدها ينتقل إلى مستوى Community المجاني بدلًا من التوقف. ويُصدر مفتاح الترخيص تلقائيًا عند الطلب. اعرف المزيد →
تم التغيير
- التفعيل الآلي — يؤدي طلب مفتاح الآن إلى إرسال استبيان قصير وتطبيق المفتاح المستلم على إعداداتك تلقائيًا، دون أي تبادل للبريد الإلكتروني.
- تجديدات أسرع — يطرح طلب التجديد أسئلة عن الاستخدام والرغبات فقط؛ يُعاد استخدام بيانات الاتصال الخاصة بك من طلب سابق، ولا يُطلب إدخالها مجددًا.
- نافذة تقييم ثابتة — تستمر الفترة التجريبية الآن للجميع حتى 31-12-2026، لتحل محل العد التنازلي السابق لمدة 14 يومًا من التثبيت.
- تدفق التفعيل المترجم — أصبح استبيان التجديد وتأكيدات التفعيل مترجمة الآن إلى جميع اللغات الـ 18 المدعومة، تمامًا مثل بقية الامتداد.
0.2024.1 · بناء 3 — فحص أذكى للتحديثات
2023-06-02
يتحقق الامتداد الآن من التحديثات في كل من fucini.software وسوق VS Code، ويقدم دائمًا الإصدار الأحدث.
تم الإصلاح
- فحص من مصدرين — يستعلم الآن من كل من fucini.software وسوق VS Code، ويقدم الإصدار الأحدث.
0.2024.0 — الإصدار الأولي
2023-04-26
أول إصدار عام لـ Fucini Coverage Studio — تغطية أصلية لـ VS Code تستوعب ملفات تتبع معايير الصناعة، وتنظّمها في نموذج قانوني واحد، وتدمج عمليات التشغيل بشكل حتمي، وتُصدر التقارير عبر Test Coverage API المدمج في VS Code.
أُضيف
- استيعاب صيغ متعددة — LCOV وllvm-cov JSON وCobertura XML وJaCoCo XML وIstanbul/nyc وSimpleCov JSON، يتم اكتشافها تلقائيًا.
- دمج حتمي — يتم دمج عدة ملفات تتبع في تشغيل واحد مع تسجيل المصدر، بشكل مستقر بغض النظر عن ترتيب التحميل.
- واجهة تغطية أصلية — مؤشرات الأسطر/الفروع/الدوال، ومسطرة النظرة العامة، ولوحة Test Coverage المدمجة.
- تغطية MC/DC — تفصيل لكل قرار عند التمرير، ومؤشر هامش ملوّن اختياري.
- درجة مركّبة — متوسط توافقي مرجّح حسب SIL عبر الأسطر والفروع والدوال والمناطق وMC/DC ونسخ C++.
- حكم الامتثال — بوابة COMPLIANT / NON-COMPLIANT بأوضاع
strict وwhm وboth وeither.
- إعادة تعيين المسارات، وتغطية الفروقات، وشارات Explorer، وشريط حالة على مستوى المشروع.
- التحليل داخل المحرر — CodeLens للدوال، والتمرير فوق الفروع، وتحذيرات الكود الميت، وتحذيرات التغطية القديمة، وNext/Previous Uncovered.
- عرض الملفات المغطاة، وتقارير HTML، والسجل والاتجاهات، ووضع المراقبة، وتصدير Fucini JSON.