
احمِ ضد التعليمات البرمجية الخبيثة المثبتة عبر npm وyarn وpnpm وnpx وpnpx وpip وuv وpoetry باستخدام Aikido Safe Chain. مجاني للاستخدام، لا يتطلب رموزًا.
Aikido Device Protection يبني على Safe Chain، ويوسّع أمان الحزم والإضافات ليشمل المزيد من النظم البيئية: npm، PyPI، VS Code، Open VSX - (Cursor، Windsurf، Kiro، Vs Codium، ...)، Maven، NuGet، إضافات Chrome، Go، مهارات Skills.sh AI، Ruby، Rust، والمزيد.
احصل على إدارة مركزية للسياسات، وسير عمل للطلب والموافقة، ورؤية عبر كل محطة عمل للمطورين في مؤسستك. مدعوم من نفس مصدر بيانات Aikido Intel. انشره يدويًا أو أدره عبر أداة MDM الخاصة بك (Jamf أو Fleet أو Iru).
يدعم Aikido Safe Chain مديري الحزم الآتية:

تثبيت Aikido Safe Chain سهل باستخدام سكربت التثبيت.
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c -
&& sh /tmp/install-safe-chain.sh
&& rm /tmp/install-safe-chain.sh
### Windows (PowerShell)```powershell
$installer = Join-Path $env:TEMP "install-safe-chain.ps1"
Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing
$expectedHash = "5FC22EEF74814BEF6828AA07C0EAEC79598F343F98B94A4ACAB823769AD56DA1"
if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne $expectedHash) {
Remove-Item $installer -ErrorAction SilentlyContinue
throw "Checksum verification failed for install-safe-chain.ps1"
}
& $installer
Remove-Item $installer
أوامر التثبيت أعلاه تشير دائمًا إلى إصدار محدد. لتثبيت إصدار مختلف، استبدل الإصدار برقم الإصدار الذي تريده. جميع الإصدارات المتاحة موجودة في صفحة الإصدارات.
يتم تقديم نصوص التثبيت من رابط إصدار مُرقّم (releases/download/1.5.15/...). إصدارات GitHub غير قابلة للتغيير — بمجرد نشر ملف على رابط مُرقّم لا يمكن تعديله أو استبداله، لذا فإن الملف الذي تنزّله مضمون ليكون مطابقًا تمامًا لما تم إصداره.
❗أعد تشغيل الطرفية لبدء استخدام Aikido Safe Chain.
تحقق من التثبيت عن طريق تشغيل أمر التحقق: ```shell npm safe-chain-verify pnpm safe-chain-verify pip safe-chain-verify uv safe-chain-verify
(اختياري) اختبار حظر البرمجيات الخبيثة من خلال محاولة تثبيت حزمة اختبار:
لـ JavaScript/Node.js: ```shell npm install safe-chain-test
لـ Python: ```shell pip3 install safe-chain-pi-test
- يجب أن يُظهر الناتج أن Aikido Safe Chain يمنع تثبيت حزم الاختبار هذه لأنها مُعلَّمة كبرمجيات خبيثة.
عند تشغيل أوامر `npm`، `npx`، `yarn`، `pnpm`، `pnpx`، `rush`، `rushx`، `bun`، `bunx`، `pip`، `pip3`، `uv`، `uvx`، `poetry`، `pipx` و `pdm`، ستتحقق Aikido Safe Chain تلقائيًا من وجود برمجيات خبيثة في الحزم التي تحاول تثبيتها. كما تعترض استدعاءات وحدات Python النمطية لأداة pip عند توفّرها (مثل: `python -m pip install ...`، `python3 -m pip download ...`). إذا تم اكتشاف أي برمجية خبيثة، فسيتم مطالبتك بالخروج من الأمر.
يمكنك التحقق من الإصدار المثبّت عن طريق تشغيل:```shell
safe-chain --version
يعمل Aikido Safe Chain عن طريق تشغيل خادم وكيل خفيف الوزن يعترض تنزيلات الحزم من سجل npm وPyPI. عند تشغيل أوامر npm أو npx أو yarn أو pnpm أو pnpx أو rush أو rushx أو bun أو bunx أو pip أو pip3 أو uv أو uvx أو poetry أو pipx أو pdm، يتم توجيه جميع تنزيلات الحزم عبر هذا الوكيل المحلي، الذي يتحقق من الحزم في الوقت الفعلي مقابل Aikido Intel - Open Sources Threat Intelligence. إذا تم اكتشاف برمجيات خبيثة في أي حزمة (بما في ذلك التبعيات العميقة)، يقوم الوكيل بحظر التنزيل قبل وصول الكود الخبيث إلى جهازك.
يطبّق Safe Chain فحوصات الحد الأدنى لعمر الحزمة على الأنظمة البيئية المدعومة.
يختلف التنفيذ الحالي حسب النظام البيئي:
افتراضيًا، الحد الأدنى لعمر الحزمة هو 48 ساعة. وهذا يوفّر طبقة أمان إضافية خلال الفترة الحرجة التي تكون فيها الحزم المنشورة حديثًا الأكثر عرضة لاحتواء تهديدات غير مكتشفة. يمكنك ضبط هذه العتبة أو تجاوز هذه الحماية تمامًا - راجع قسم الحد الأدنى لتكوين عمر الحزمة أدناه.
يتكامل Aikido Safe Chain مع الصدفة لديك لتوفير تجربة سلسة عند استخدام npm وnpx وyarn وpnpm وpnpx وrush وrushx وbun وbunx ومديري حزم Python (pip وuv وuvx وpoetry وpipx وpdm). يقوم بإعداد أسماء مستعارة لهذه الأوامر بحيث يتم تغليفها بأوامر Aikido Safe Chain، التي تدير خادم الوكيل قبل تنفيذ الأوامر الأصلية. ندعم حاليًا:
يمكن العثور على مزيد من المعلومات حول التكامل مع الصدفة في وثائق التكامل مع الصدفة.
لإلغاء تثبيت Aikido Safe Chain، استخدم أداة إلغاء التثبيت المكونة من سطر واحد:
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/uninstall-safe-chain.sh | sh
### Windows (PowerShell)```powershell
iex (iwr "https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/uninstall-safe-chain.ps1" -UseBasicParsing)
❗أعد تشغيل الطرفية بعد إلغاء التثبيت لضمان إزالة جميع الأسماء المستعارة.
يمكنك التحكم في مخرجات Aikido Safe Chain باستخدام الخيار --safe-chain-logging أو متغير البيئة SAFE_CHAIN_LOGGING.
يمكنك تعيين مستوى التسجيل من خلال مصادر متعددة (بترتيب الأولوية):
وسيطة سطر الأوامر (أعلى أولوية):
--safe-chain-logging=silent - يمنع جميع مخرجات Aikido Safe Chain إلا عند حظر البرمجيات الخبيثة. تتم كتابة مخرجات مدير الحزم إلى stdout بشكل طبيعي، ولا يكتب Safe Chain إلا رسالة قصيرة إذا قام بحظر برمجيات خبيثة ويتسبب في خروج العملية.
npm install express --safe-chain-logging=silent
--safe-chain-logging=verbose - يتيح مخرجات تشخيصية مفصّلة من Aikido Safe Chain. مفيد لاستكشاف الأخطاء وإصلاحها أو فهم ما يفعله Safe Chain خلف الكواليس.
npm install express --safe-chain-logging=verbose
متغير البيئة: ```shell export SAFE_CHAIN_LOGGING=verbose npm install express
القيم الصالحة: silent, normal, verbose
هذا مفيد لتعيين مستوى تسجيل افتراضي لجميع أوامر مدير الحزم في جلسة الطرفية أو بيئة CI/CD لديك.
يمكنك عكس مخرجات Aikido Safe Chain إلى ملف سجل باستخدام العلم --safe-chain-log-file أو متغير البيئة SAFE_CHAIN_LOG_FILE. تسجيل الملفات معطّل افتراضيًا ويتم تفعيله عند تعيين مسار. يتم التحكم في تنسيق الملف (--safe-chain-log-file-format) ومستوى التفصيل (--safe-chain-log-file-verbosity) بشكل مستقل عن مخرجات الطرفية.
يمكن الإعداد عبر أي من هذه (حسب ترتيب الأولوية):
~/.safe-chain/config.json): ```json
{
"logFile": "~/safe-chain.log",
"logFileFormat": "plain",
"logFileVerbosity": "normal"
}
logFileFormat — json (الافتراضي) أو plain.
logFileVerbosity — silent أو normal أو verbose (الافتراضي). مستقل عن --safe-chain-logging.
يمكنك تكوين المدة التي يجب أن توجد فيها الحزم قبل أن يسمح Safe Chain بتثبيتها. افتراضيًا، يجب أن يكون عمر الحزم 48 ساعة على الأقل قبل أن يمكن تثبيتها.
بالنسبة لمديري الحزم القائمة على npm، يحتوي هذا الفحص حاليًا على وضعين للتنفيذ:
بالنسبة لمديري حزم Python، يحتوي هذا الفحص حاليًا على وضعين للتنفيذ:
يمكنك تعيين الحد الأدنى لعمر الحزمة من خلال مصادر متعددة (حسب الأولوية):
~/.safe-chain/config.json): ```json
{
"minimumPackageAgeHours": 48
}
استبعد الحزم الموثوقة من تصفية الحد الأدنى للعمر عبر متغير بيئة أو ملف إعدادات (يتم دمج كلاهما). استخدم @scope/* للثقة بجميع الحزم من مؤسسة ما:```shell
export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="@aikidosec/*"
## الحل: التشغيل الآلي باستخدام Playwright
- يتمثل الحل في استخدام **Playwright** لتشغيل متصفح بدون واجهة رسومية لكل خطوة تتطلب JavaScript.
- داخل سكريبت Playwright، يمكنك تخزين ملفات تعريف الارتباط ورؤوس الطلبات في متغيرات، ثم تطبيقها للطلبات اللاحقة.
- يمكن تحقيق ذلك إما باستدعاء **python requests** في دالة `page.evaluate()` أو باستخدام واجهة برمجة التطبيقات **`playwright.request`** لإرسال طلبات HTTP مباشرة ضمن سياق المتصفح.```json
{
"npm": {
"minimumPackageAgeExclusions": ["@aikidosec/*"]
},
"pip": {
"minimumPackageAgeExclusions": ["requests"]
}
}
قم بتكوين Safe Chain لفحص الحزم من السجلات المخصصة أو الخاصة.
الأنظمة البيئية المدعومة:
يمكنك تعيين السجلات المخصصة عبر متغير بيئة أو ملف إعداد. يتم دمج كلا المصدرين معًا.
~/.safe-chain/config.json): ```json
{
"npm": {
"customRegistries": ["npm.company.com", "registry.internal.net"]
},
"pip": {
"customRegistries": ["pip.company.com", "registry.internal.net"]
}
}
إذا كنت تعتمد على ملف pip.conf لإعداد pip، فيجب عليك توجيه pip إليه صراحةً عبر متغير البيئة PIP_CONFIG_FILE حتى تتمكن Safe Chain من دمجه.
تقوم Safe Chain بتشغيل pip خلف وكيل MITM الخاص بها وتكتب ملف تكوين pip مؤقتًا لحقن شهادة وإعدادات الوكيل الخاصة بها. عندما يكون PIP_CONFIG_FILE معينًا، تقوم Safe Chain بدمج إعداداتها في نسخة من ملفك (لا يتم تعديل ملفك الأصلي أبدًا) بحيث يتم الحفاظ على index-url وبيانات الاعتماد والخيارات الأخرى. عندما لا يكون PIP_CONFIG_FILE معينًا، قد يتم استبدال إعدادات المستخدم الخاصة بـ pip (مثل ~/.config/pip/pip.conf) بملف Safe Chain المؤقت ولن يتم أخذ إعداداتك في الاعتبار.
قم بتكوين Safe Chain لجلب قواعد بيانات البرامج الضارة وقوائم الحزم الجديدة من عنوان URL مخصص للمرآة. يتيح لك ذلك استضافة نسختك الخاصة من قاعدة بيانات البرامج الضارة Aikido.
يمكنك تعيين عنوان URL الأساسي لقائمة البرامج الضارة من خلال عدة مصادر (حسب الأولوية):
~/.safe-chain/config.json): ```json
{
"malwareListBaseUrl": "https://your-mirror.com"
}
يجب أن يشير عنوان URL الأساسي إلى خادم يعكس بنية https://malware-list.aikido.dev/، بما في ذلك المسارات التالية:
/malware_predictions.json (قاعدة بيانات البرمجيات الخبيثة في نظام JavaScript البيئي)/malware_pypi.json (قاعدة بيانات البرمجيات الخبيثة في نظام Python البيئي)/releases/npm.json (قائمة الحزم الجديدة في JavaScript)/releases/pypi.json (قائمة الحزم الجديدة في Python)بالإضافة إلى ملف الإعدادات في الدليل الرئيسي (~/.safe-chain/config.json)، يدعم Safe Chain ملف إعدادات المشروع بحيث يمكن إيداع الإعدادات في مستودع ومشاركتها عبر الفريق، بدلاً من تكوينها لكل جهاز على حدة.
أضف قسم safe-chain: إلى ملف .aikido في جذر المستودع الخاص بك (نفس الملف الذي تستخدمه أدوات Aikido الأخرى؛ يقرأ Safe Chain قسم safe-chain: الخاص به فقط ويتجاهل الباقي). عند العثور عليه، يتم دمج إعداداته فوق ملف الإعدادات في الدليل الرئيسي: القيم المحددة في إعدادات المشروع لها الأولوية، ويتم دمج المصفوفات (مثل customRegistries) من كلا الملفين بدلاً من أن يحل أحدهما محل الآخر.
يمكن ضبط الإعدادات التالية فقط من ملف إعدادات المشروع:```yaml safe-chain: minimumPackageAgeHours: 48 npm: customRegistries: - npm.company.com minimumPackageAgeExclusions: - "@aikidosec/*" pip: customRegistries: - pip.company.com minimumPackageAgeExclusions: - requests
الإعدادات مثل `scanTimeout` و`malwareListBaseUrl` وخيارات `logFile*` لا يمكن تعيينها من ملف إعدادات المشروع - يمكنها فقط أن تأتي من إعدادات دليل منزلك، أو وسائط سطر الأوامر، أو متغيرات البيئة.
## دليل التثبيت المخصص
افتراضيًا، يقوم Safe Chain بتثبيت نفسه في `~/.safe-chain`. يمكنك تغيير ذلك عن طريق تمرير دليل تثبيت صريح إلى أداة التثبيت. هذا مفيد للتثبيتات على مستوى النظام (مثل داخل صورة Docker) أو عندما تحتاج إلى تجنب التعارضات مع الأدوات الأخرى.
عند الضبط، يتم وضع جميع بيانات Safe Chain (الملف الثنائي، والروابط، والبرامج النصية، والإعدادات) تحت الدليل المخصص بدلاً من `~/.safe-chain`.
### Unix/Linux/macOS```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c - \
&& sh /tmp/install-safe-chain.sh --install-dir /usr/local/.safe-chain \
&& rm /tmp/install-safe-chain.sh
$installer = Join-Path $env:TEMP "install-safe-chain.ps1" Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing $expectedHash = "5FC22EEF74814BEF6828AA07C0EAEC79598F343F98B94A4ACAB823769AD56DA1" if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne $expectedHash) { Remove-Item $installer -ErrorAction SilentlyContinue throw "Checksum verification failed for install-safe-chain.ps1" } & $installer -InstallDir 'C:\ProgramData\safe-chain' Remove-Item $installer
# Usage in CI/CD
You can protect your CI/CD pipelines from malicious packages by integrating Aikido Safe Chain into your build process. This ensures that any packages installed during your automated builds are checked for malware before installation.
## Installation for CI/CD
Use the `--ci` flag to automatically configure Aikido Safe Chain for CI/CD environments. This sets up executable shims in the PATH instead of shell aliases.
### Unix/Linux/macOS (GitHub Actions, Azure Pipelines, etc.)```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c - \
&& sh /tmp/install-safe-chain.sh --ci \
&& rm /tmp/install-safe-chain.sh
$installer = Join-Path $env:TEMP "install-safe-chain.ps1" Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing $expectedHash = "5FC22EEF74814BEF6828AA07C0EAEC79598F343F98B94A4ACAB823769AD56DA1" if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne $expectedHash) { Remove-Item $installer -ErrorAction SilentlyContinue throw "Checksum verification failed for install-safe-chain.ps1" } & $installer -ci Remove-Item $installer
## المنصات المدعومة
- ✅ **GitHub Actions**
- ✅ **Azure Pipelines**
- ✅ **CircleCI**
- ✅ **Jenkins**
- ✅ **Bitbucket Pipelines**
- ✅ **GitLab Pipelines**
## مثال GitHub Actions```yaml
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: "npm"
- name: Install safe-chain
run: |
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c -
sh /tmp/install-safe-chain.sh --ci
rm /tmp/install-safe-chain.sh
- name: Install dependencies
run: npm ci
task: NodeTool@0 inputs: versionSpec: "22.x" displayName: "Install Node.js"
script: | curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c - sh /tmp/install-safe-chain.sh --ci rm /tmp/install-safe-chain.sh displayName: "Install safe-chain"
script: npm ci displayName: "Install dependencies"
## مثال CircleCI```yaml
version: 2.1
jobs:
build:
docker:
- image: cimg/node:lts
steps:
- checkout
- run: |
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c -
sh /tmp/install-safe-chain.sh --ci
rm /tmp/install-safe-chain.sh
- run: npm ci
workflows:
build_and_test:
jobs:
- build
ملاحظة: يفترض هذا أن Node.js وnpm مثبتان على وكيل Jenkins.```groovy pipeline { agent any
environment { // Jenkins does not automatically persist PATH updates from setup-ci, // so add the shims + binary directory explicitly for all stages. // If you installed into a custom directory, replace ~/.safe-chain with that path here. PATH = "${env.HOME}/.safe-chain/shims:${env.HOME}/.safe-chain/bin:${env.PATH}" }
stages { stage('Install safe-chain') { steps { sh ''' set -euo pipefail
# Install Safe Chain for CI
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c -
sh /tmp/install-safe-chain.sh --ci
rm /tmp/install-safe-chain.sh
'''
}
}
stage('Install project dependencies etc...') {
steps {
sh '''
set -euo pipefail
npm ci
'''
}
}
} }
## مثال على Bitbucket Pipelines```yaml
image: node:22
steps:
- step:
name: Install
script:
- |
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c -
sh /tmp/install-safe-chain.sh --ci
rm /tmp/install-safe-chain.sh
- export PATH=~/.safe-chain/shims:~/.safe-chain/bin:$PATH
- npm ci
بعد الإعداد، ستكون جميع أوامر مدير الحزم اللاحقة في خط أنابيب CI الخاص بك محمية تلقائيًا بواسطة كشف البرمجيات الخبيثة من Aikido Safe Chain.
لإضافة safe-chain في خطوط أنابيب GitLab، تحتاج إلى تثبيته في الصورة التي تشغّل خط الأنابيب. يمكن القيام بذلك عن طريق:
تعريف ملف dockerfile لتشغيل البناء الخاص بك ```dockerfile FROM node:lts
RUN curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c -
&& sh /tmp/install-safe-chain.sh --ci
&& rm /tmp/install-safe-chain.sh
ENV PATH="/root/.safe-chain/shims:/root/.safe-chain/bin:${PATH}"
قم ببناء صورة Docker في خط أنابيب CI الخاص بك ```yaml build-image: stage: build-image image: docker:latest services: - docker:dind script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:latest
استخدم الصورة في خط أنابيبك: ```yaml npm-ci: stage: install image: $CI_REGISTRY_IMAGE:latest script: - npm ci
يبدو خط الأنابيب الكامل لهذا المثال كما يلي:```yaml stages:
build-image: stage: build-image image: docker:latest services: - docker:dind script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:latest
npm-ci: stage: install image: $CI_REGISTRY_IMAGE:latest script: - npm ci
# استكشاف الأخطاء وإصلاحها
هل تواجه مشكلات؟ راجع [دليل استكشاف الأخطاء وإصلاحها](https://github.com/aikidosec/safe-chain/blob/HEAD/docs/troubleshooting.md) للحصول على مساعدة بشأن المشكلات الشائعة.
# الإبلاغ عن المشكلات
إذا واجهت مشكلات:
1. قم بزيارة [GitHub Issues](https://github.com/AikidoSec/safe-chain/issues)
2. قم بتضمين:
* نظام التشغيل والإصدار
* نوع Shell والإصدار
* مخرجات `safe-chain --version`
* مخرجات أوامر التحقق
* سجلات مفصّلة للأمر الفاشل (أضف الوسيط `--safe-chain-logging=verbose`)