> ## Documentation Index
> Fetch the complete documentation index at: https://docs.befailproof.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# السياسات المدمجة

> 39 سياسة مدمجة تمنع أنماط فشل الوكلاء الشائعة

يأتي failproofai مع 39 سياسة مدمجة تمنع أنماط فشل الوكلاء الشائعة. تعمل كل سياسة على نوع حدث hook محدد واسم أداة معين. تقبل تسع عشرة سياسة معاملات تتيح لك ضبط سلوكها دون كتابة أكواد. تفرض خمس سياسات سير عمل خط أنابيب التزام → دفع → طلب دمج → CI قبل توقف Claude.

***

## نظرة عامة

يتم تجميع السياسات في فئات:

| الفئة                                    | السياسات                                                                                                                                     | نوع Hook    |
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| [الأوامر الخطرة](#dangerous-commands)    | block-sudo, block-rm-rf, block-curl-pipe-sh, block-failproofai-commands                                                                      | PreToolUse  |
| [أوامر البنية التحتية](#infra-commands)  | block-kubectl, block-terraform, block-aws-cli, block-gcloud, block-az-cli, block-helm, block-gh-pipeline                                     | PreToolUse  |
| [الأسرار (معقّمات)](#secrets-sanitizers) | sanitize-jwt, sanitize-api-keys, sanitize-connection-strings, sanitize-private-key-content, sanitize-bearer-tokens                           | PostToolUse |
| [البيئة](#environment)                   | block-env-files, protect-env-vars                                                                                                            | PreToolUse  |
| [الوصول إلى الملفات](#file-access)       | block-read-outside-cwd, block-secrets-write                                                                                                  | PreToolUse  |
| [Git](#git)                              | block-push-master, block-work-on-main, block-force-push, warn-git-amend, warn-git-stash-drop, warn-all-files-staged                          | PreToolUse  |
| [قاعدة البيانات](#database)              | warn-destructive-sql, warn-schema-alteration                                                                                                 | PreToolUse  |
| [تحذيرات](#warnings)                     | warn-large-file-write, warn-package-publish, warn-background-process, warn-global-package-install                                            | PreToolUse  |
| [مديري الحزم](#package-managers)         | prefer-package-manager                                                                                                                       | PreToolUse  |
| [سير العمل](#workflow)                   | require-commit-before-stop, require-push-before-stop, require-pr-before-stop, require-no-conflicts-before-stop, require-ci-green-before-stop | Stop        |

* **`block-`** — إيقاف الوكيل عن المتابعة.
* **`warn-`** — إعطاء الوكيل سياق إضافي حتى يتمكن من تصحيح نفسه.
* **`sanitize-`** — إزالة البيانات الحساسة من مخرجات الأداة قبل أن يراها الوكيل.

### الأسماء الموصوفة

تقع كل سياسة في فتحة `<namespace>/<name>`. تنتمي السياسات المدمجة إلى الفضاء الموصوف
**`failproofai/`** — على سبيل المثال، `failproofai/sanitize-jwt`. يمنع الفضاء الموصوف
التصادمات عند تحميل سياسات مخصصة أو من طرف ثالث
بأسماء قصيرة متشابهة.

في ملف التكوين الخاص بك، يمكنك الإشارة إلى سياسة مدمجة باستخدام اسمها القصير أو اسمها
المؤهل؛ كلا الشكلين يحل لنفس السياسة:

```json theme={null}
{
  "enabledPolicies": [
    "sanitize-jwt",
    "failproofai/block-rm-rf"
  ]
}
```

إذا لم يكن للاسم أي `/`، يعامل failproofai اسمه كتابعاً للفضاء الموصوف الافتراضي
`failproofai`. الأسماء التي تحتوي بالفعل على `/` (مثل `myorg/foo`،
`custom/my-hook`) تُبقى كما هي.

* **`require-`** — منع حدث Stop حتى يتم استيفاء الشروط.

***

<Tip>
  تدعم كل سياسة حقل `hint` اختياري في `policyParams`. يتم إلحاق hint بعنوان الرفض أو التعليمات الذي يراه Claude، مما يوفر إرشادات قابلة للتنفيذ دون تعديل كود السياسة. يعمل مع السياسات المدمجة والمخصصة والاتفاقية. راجع [الإعدادات → hint](/ar/configuration#hint-cross-cutting) للحصول على التفاصيل.
</Tip>

***

## الأوامر الخطرة

منع الوكلاء من تشغيل العمليات التي يصعب التراجع عنها أو التي قد تضر بنظام الكمبيوتر.

### `block-sudo`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أي أمر `sudo`.

يمنع الاستدعاءات التي تتضمن كلمة `sudo`. يتم مطابقة النمط على رموز الأوامر المحللة، وليس السلسلة الأصلية، لمنع الالتفافة عبر حقن عامل الأغلاف.

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                                                                         |
| --------------- | ---------- | --------- | ----------------------------------------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`      | بادئات الأوامر الدقيقة المسموحة. يتم مطابقة كل إدخال مقابل رموز argv المحللة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-sudo": {
      "allowPatterns": ["sudo systemctl status", "sudo journalctl"]
    }
  }
}
```

مع هذا التكوين، يُسمح بـ `sudo systemctl status nginx`، لكن `sudo rm /etc/hosts` مرفوض.

<Note>
  يتم مطابقة الأنماط مقابل الرموز المحللة، وليس السلسلة الأصلية للأمر. يمنع هذا الالتفافة عبر عوامل الأغلاف المرفقة (مثل `sudo systemctl status x; rm -rf /` لا يطابق `sudo systemctl status *`).
</Note>

***

### `block-rm-rf`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر `rm -rf`، `rm -fr`، وأشكال الحذف المتكررة المماثلة.

**المعاملات:**

| Param        | النوع      | الافتراضي | الوصف                                                   |
| ------------ | ---------- | --------- | ------------------------------------------------------- |
| `allowPaths` | `string[]` | `[]`      | المسارات التي يمكن حذفها بشكل متكرر بأمان (مثل `/tmp`). |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-rm-rf": {
      "allowPaths": ["/tmp", "/var/cache"]
    }
  }
}
```

***

### `block-curl-pipe-sh`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر `curl <url> | bash`، `curl <url> | sh`، `wget <url> | bash`، والأنماط المماثلة.

لا توجد معاملات.

***

### `block-failproofai-commands`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر الأوامر التي ستلغي تثبيت أو تعطيل failproofai نفسه (مثل `npm uninstall failproofai`، `failproofai policies --uninstall`).

لا توجد معاملات.

***

## أوامر البنية التحتية

منع وكلاء البرمجة من تشغيل CLI البنية التحتية أو بدء خطوط أنابيب CI/CD. جميع السياسات في هذه الفئة **اختيارية** (`defaultEnabled: false`) — الوكلاء الذين يحتاجون فعلاً إلى استدعاء `kubectl`، `terraform`، إلخ. لن يتعطلوا ما لم تفعّل السياسة. عند التفعيل، يتم رفض كل استدعاء للأداة المطابقة ما لم يطابق الأمر إدخالاً في `allowPatterns`.

نحو النمط هو نفسه [`block-sudo`](#block-sudo): يتم مطابقة الرموز مقابل argv المحللة، `*` هو حرف بدل لرمز واحد، وأي أمر يحتوي على عامل أغلاف مستقل (`&&`، `||`، `|`، `;`) أو رمز يحتوي على أحرف أغلاف مضمنة يُرفض قبل مطابقة القائمة البيضاء لمنع التفافات الحقن.

### `block-kubectl`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أي استدعاء `kubectl`.

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                          |
| --------------- | ---------- | --------- | ------------------------------ |
| `allowPatterns` | `string[]` | `[]`      | بادئات أوامر kubectl المسموحة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-kubectl": {
      "allowPatterns": ["kubectl get *", "kubectl describe *", "kubectl logs *"]
    }
  }
}
```

مع هذا التكوين، يُسمح بـ `kubectl get pods` لكن `kubectl apply -f deploy.yaml` مرفوض.

***

### `block-terraform`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أي استدعاء `terraform` أو `tofu` (OpenTofu).

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                                 |
| --------------- | ---------- | --------- | ------------------------------------- |
| `allowPatterns` | `string[]` | `[]`      | بادئات أوامر terraform/tofu المسموحة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-terraform": {
      "allowPatterns": ["terraform plan", "terraform validate", "terraform show *"]
    }
  }
}
```

***

### `block-aws-cli`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أي استدعاء CLI `aws`.

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                          |
| --------------- | ---------- | --------- | ------------------------------ |
| `allowPatterns` | `string[]` | `[]`      | بادئات أوامر aws CLI المسموحة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-aws-cli": {
      "allowPatterns": ["aws s3 ls *", "aws sts get-caller-identity"]
    }
  }
}
```

***

### `block-gcloud`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أي استدعاء CLI `gcloud` (Google Cloud).

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                         |
| --------------- | ---------- | --------- | ----------------------------- |
| `allowPatterns` | `string[]` | `[]`      | بادئات أوامر gcloud المسموحة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-gcloud": {
      "allowPatterns": ["gcloud auth list", "gcloud config list"]
    }
  }
}
```

***

### `block-az-cli`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أي استدعاء CLI `az` (Azure).

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                         |
| --------------- | ---------- | --------- | ----------------------------- |
| `allowPatterns` | `string[]` | `[]`      | بادئات أوامر az CLI المسموحة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-az-cli": {
      "allowPatterns": ["az account show", "az group list"]
    }
  }
}
```

***

### `block-helm`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أي استدعاء `helm`.

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                       |
| --------------- | ---------- | --------- | --------------------------- |
| `allowPatterns` | `string[]` | `[]`      | بادئات أوامر helm المسموحة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-helm": {
      "allowPatterns": ["helm list", "helm status *"]
    }
  }
}
```

***

### `block-gh-pipeline`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر أوامر CLI `gh` الفرعية التالية التي تغيّر الحالة أو تبدأ خطوط أنابيب:

* `gh workflow run`, `gh workflow enable`, `gh workflow disable`
* `gh run rerun`, `gh run cancel`
* `gh pr merge`
* `gh release create`, `gh release delete`
* `gh cache delete`
* `gh secret set`, `gh secret delete`

أوامر `gh` الفرعية للقراءة فقط مثل `gh pr view`, `gh pr list`, `gh run list`, `gh release view`, و `gh api repos/.../...` **لا** يتطابقون مع هذه السياسة — يُحتاج إليهم بشكل منتظم لفحوصات سير العمل (بما في ذلك `require-ci-green-before-stop` الخاص بـ failproofai).

**المعاملات:**

| Param           | النوع      | الافتراضي | الوصف                                                   |
| --------------- | ---------- | --------- | ------------------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`      | استدعاءات برمجية محددة للسماح بها رغم أنها كانت ستُرفض. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-gh-pipeline": {
      "allowPatterns": ["gh run rerun *"]
    }
  }
}
```

***

## الأسرار (معقّمات)

منع الوكلاء من تسرب بيانات الاعتماد إلى سياقهم أو مخرجاتهم. تعمل سياسات المعقّم على أحداث **PostToolUse**. عندما يشغّل Claude أمر Bash، أو يقرأ ملف، أو يستدعي أي أداة، تفحص هذه السياسات المخرجات قبل إرجاعها إلى Claude. إذا تم كشف نمط سري، تعود السياسة برار الرفض الذي يمنع إرجاع المخرجات.

### `sanitize-jwt`

**الحدث:** PostToolUse (جميع الأدوات)\
**الافتراضي:** يزيل رموز JWT (ثلاثة أجزاء base64url مفصولة بـ `.`).

لا توجد معاملات.

***

### `sanitize-api-keys`

**الحدث:** PostToolUse (جميع الأدوات)\
**الافتراضي:** يزيل تنسيقات مفاتيح API الشائعة: Anthropic (`sk-ant-`)، OpenAI (`sk-`)، GitHub PATs (`ghp_`)، مفاتيح AWS (`AKIA`)، مفاتيح Stripe (`sk_live_`, `sk_test_`)، ومفاتيح Google API (`AIza`).

**المعاملات:**

| Param                | النوع                                | الافتراضي | الوصف                               |
| -------------------- | ------------------------------------ | --------- | ----------------------------------- |
| `additionalPatterns` | `{ regex: string; label: string }[]` | `[]`      | أنماط regex إضافية لتعاملها كأسرار. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "sanitize-api-keys": {
      "additionalPatterns": [
        { "regex": "myco_[A-Za-z0-9]{32}", "label": "MyCo internal API key" },
        { "regex": "pat_[0-9a-f]{40}", "label": "Internal PAT" }
      ]
    }
  }
}
```

***

### `sanitize-connection-strings`

**الحدث:** PostToolUse (جميع الأدوات)\
**الافتراضي:** يزيل سلاسل اتصال قاعدة البيانات التي تحتوي على بيانات اعتماد مضمنة (مثل `postgresql://user:password@host/db`).

لا توجد معاملات.

***

### `sanitize-private-key-content`

**الحدث:** PostToolUse (جميع الأدوات)\
**الافتراضي:** يزيل كتل PEM (`-----BEGIN PRIVATE KEY-----`, `-----BEGIN RSA PRIVATE KEY-----`، إلخ).

لا توجد معاملات.

***

### `sanitize-bearer-tokens`

**الحدث:** PostToolUse (جميع الأدوات)\
**الافتراضي:** يزيل رؤوس `Authorization: Bearer <token>` حيث يكون الرمز 20 حرفاً أو أكثر.

لا توجد معاملات.

***

## البيئة

حماية إعدادات البيئة الحساسة من القراءة أو الكشف بواسطة الوكلاء.

### `block-env-files`

**الحدث:** PreToolUse (Bash, Read)\
**الافتراضي:** ينكر قراءة ملفات `.env` عبر `cat .env`، استدعاءات أداة Read بـ `.env` كمسار ملف، إلخ.

لا يمنع `.envrc` أو ملفات بيئية أخرى — فقط الملفات المسماة بالضبط `.env`.

لا توجد معاملات.

***

### `protect-env-vars`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر الأوامر التي تطبع متغيرات البيئة: `printenv`, `env`, `echo $VAR`.

لا توجد معاملات.

***

## الوصول إلى الملفات

إبقاء الوكلاء يعملون داخل حدود المشروع وبعيداً عن الملفات الحساسة.

### `block-read-outside-cwd`

**الحدث:** PreToolUse (Read, Bash)\
**الافتراضي:** ينكر قراءة الملفات خارج جذر المشروع. الحد هو `CLAUDE_PROJECT_DIR` (يُعيّن مرة واحدة لكل جلسة بواسطة Claude Code)، مع تراجع إلى مجلد العمل الحالي للجلسة عندما يكون المتغير غير مُعيّن. استخدام جذر المشروع بدلاً من `cwd` المباشر يعني أن الحد يبقى ثابتاً حتى بعد أن يقوم Claude بـ `cd` إلى مجلد فرعي.

**المعاملات:**

| Param        | النوع      | الافتراضي | الوصف                                                          |
| ------------ | ---------- | --------- | -------------------------------------------------------------- |
| `allowPaths` | `string[]` | `[]`      | بادئات المسارات المطلقة المسموحة حتى لو كانت خارج جذر المشروع. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-read-outside-cwd": {
      "allowPaths": ["/shared/data", "/opt/company/config"]
    }
  }
}
```

***

### `block-secrets-write`

**الحدث:** PreToolUse (Write, Edit)\
**الافتراضي:** ينكر الكتابة إلى الملفات المستخدمة بشكل شائع للمفاتيح الخاصة والشهادات: `id_rsa`، `id_ed25519`، `*.key`، `*.pem`، `*.p12`، `*.pfx`.

**المعاملات:**

| Param                | النوع      | الافتراضي | الوصف                                       |
| -------------------- | ---------- | --------- | ------------------------------------------- |
| `additionalPatterns` | `string[]` | `[]`      | أنماط أسماء ملفات إضافية (نمط glob) لمنعها. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-secrets-write": {
      "additionalPatterns": [".token", ".secret"]
    }
  }
}
```

***

## Git

منع الدفع العرضي والدفع القسري وأخطاء الفرع التي يصعب التراجع عنها.

### `block-push-master`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر `git push origin main` و `git push origin master`.

**المعاملات:**

| Param               | النوع      | الافتراضي            | الوصف                                         |
| ------------------- | ---------- | -------------------- | --------------------------------------------- |
| `protectedBranches` | `string[]` | `["main", "master"]` | أسماء الفروع التي لا يمكن الدفع إليها مباشرة. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "block-push-master": {
      "protectedBranches": ["main", "master", "release", "prod"]
    }
  }
}
```

<Tip>
  للسماح بالدفع إلى جميع الفروع (تعطيل هذه السياسة فعلياً دون إزالتها من `enabledPolicies`)، عيّن `protectedBranches: []`.
</Tip>

***

### `block-work-on-main`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر `git commit`، `git merge`، `git rebase`، و `git cherry-pick` بينما تكون شجرة العمل على `main` أو `master`. إنشاء الفروع والتبديل بينها (`git checkout`, `git checkout -b`, `git switch`, `git switch -c`) لا تتأثر.

**المعاملات:**

| Param               | النوع      | الافتراضي            | الوصف                                                           |
| ------------------- | ---------- | -------------------- | --------------------------------------------------------------- |
| `protectedBranches` | `string[]` | `["main", "master"]` | أسماء الفروع التي يتم فيها رفض commit/merge/rebase/cherry-pick. |

***

### `block-force-push`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** ينكر `git push --force` و `git push -f`.

لا توجد معاملات خاصة بالسياسة. استخدم [`hint`](/ar/configuration#hint-cross-cutting) عبر جميع المشاريع لاقتراح بدائل:

```json theme={null}
{
  "policyParams": {
    "block-force-push": {
      "hint": "أنشئ فرعاً جديداً من HEAD الحالي لديك (مثل `git checkout -b <new-branch>`) وادفعه بدلاً من ذلك."
    }
  }
}
```

***

### `warn-git-amend`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يتابع بحذر عند تشغيل `git commit --amend`. لا يمنع الأمر.

لا توجد معاملات.

***

### `warn-git-stash-drop`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يؤكد قبل تشغيل `git stash drop`. لا يمنع الأمر.

لا توجد معاملات.

***

### `warn-all-files-staged`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يراجع ما يقوم بتحضيره عند تشغيل `git add -A` أو `git add .`. لا يمنع الأمر.

لا توجد معاملات.

***

## قاعدة البيانات

اكتشف العمليات SQL التدميرية قبل تنفيذها ضد قاعدة البيانات الخاصة بك.

### `warn-destructive-sql`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يؤكد قبل تشغيل SQL يحتوي على `DROP TABLE`, `DROP DATABASE`, أو `DELETE` بدون جملة `WHERE`.

لا توجد معاملات.

***

### `warn-schema-alteration`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يؤكد قبل تشغيل بيانات `ALTER TABLE`.

لا توجد معاملات.

***

## تحذيرات

إعطاء الوكلاء سياقاً إضافياً قبل العمليات المحتملة الخطورة لكن غير التدميرية.

### `warn-large-file-write`

**الحدث:** PreToolUse (Write)\
**الافتراضي:** يعلّم Claude بأن يؤكد قبل كتابة ملفات أكبر من 1024 كيلوبايت.

**المعاملات:**

| Param         | النوع    | الافتراضي | الوصف                                              |
| ------------- | -------- | --------- | -------------------------------------------------- |
| `thresholdKb` | `number` | `1024`    | عتبة حجم الملف بالكيلوبايت التي يُصدر فوقها تحذير. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "warn-large-file-write": {
      "thresholdKb": 256
    }
  }
}
```

<Note>
  معالج Hook يفرض حد أقصى 1 MB لـ stdin في حمولات الطلبات. لاختبار هذه السياسة بمحتوى صغير، عيّن `thresholdKb` إلى قيمة أقل بكثير من 1024.
</Note>

***

### `warn-package-publish`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يؤكد قبل تشغيل `npm publish`.

لا توجد معاملات.

***

### `warn-background-process`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يكون حذراً عند إطلاق عمليات الخلفية عبر `nohup`, `&`, `disown`, أو `screen`.

لا توجد معاملات.

***

### `warn-global-package-install`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** يعلّم Claude بأن يؤكد قبل تشغيل `npm install -g`, `yarn global add`, أو `pip install` بدون بيئة افتراضية.

لا توجد معاملات.

***

## مديري الحزم

فرض أي مديري حزم يُسمح للوكيل باستخدامهم.

### `prefer-package-manager`

**الحدث:** PreToolUse (Bash)\
**الافتراضي:** معطّل. عند التفعيل، يمنع أي أمر مدير حزم ليس في قائمة `allowed` ويخبر Claude بأن يعيد كتابة الأمر باستخدام مدير مسموح.

الكشف عن: pip، pip3، python -m pip، npm، npx، yarn، pnpm، pnpx، bun، bunx، uv، poetry، pipenv، conda، cargo.

| معامل     | النوع     | الافتراضي | الوصف                                                                                                       |
| --------- | --------- | --------- | ----------------------------------------------------------------------------------------------------------- |
| `allowed` | string\[] | `[]`      | أسماء مديري الحزم المسموحة. أي مدير مكتشف ليس في هذه القائمة يتم منعه. عندما تكون فارغة، السياسة بلا تأثير. |
| `blocked` | string\[] | `[]`      | أسماء مديري حزم إضافية لمنعها بخلاف القائمة المدمجة (مثل `['pdm', 'pipx']`).                                |

قائمة الحظر المدمجة تغطي: pip، pip3، npm، npx، yarn، pnpm، pnpx، bun، bunx، uv، poetry، pipenv، conda، cargo. استخدم `blocked` لإضافة مديري حزم ليسوا في هذه القائمة.

**مثال التكوين:**

```json theme={null}
{
  "enabledPolicies": ["prefer-package-manager"],
  "policyParams": {
    "prefer-package-manager": {
      "allowed": ["uv", "bun"],
      "blocked": ["pdm", "pipx"]
    }
  }
}
```

مع هذا التكوين، يتم رفض كل من `pip install flask` و `pdm install flask` برسالة تخبر Claude بأن يستخدم `uv` أو `bun` بدلاً من ذلك. أوامر مثل `uv pip install flask` مسموحة لأن `uv` موجود في قائمة التسامح ويتم التحقق منه أولاً.

***

## سلوك الذكاء الاصطناعي

اكتشف عندما يعلق الوكلاء أو يتصرفون بشكل غير متوقع.

### `warn-repeated-tool-calls`

**الحدث:** PreToolUse (جميع الأدوات)\
**الافتراضي:** يعلّم Claude بأن يعيد النظر عندما يتم استدعاء نفس الأداة 3 مرات أو أكثر بمعاملات متطابقة — علامة شائعة لأن الوكيل عالق في حلقة.

لا توجد معاملات.

***

## سير العمل

فرض سير عمل منضبط في نهاية الجلسة. تعمل هذه السياسات على حدث **Stop** وترفض الوكيل من التوقف حتى يتم استيفاء كل شرط. تتبع سلسلة تبعية طبيعية: التزام → دفع → طلب دمج → CI. إذا رفضت سياسة، يتم تخطي السياسات اللاحقة في السلسلة (الرفض يقصر الدائرة).

جميع سياسات سير العمل **تفشل مفتوحة**: إذا لم تكن الأداة المطلوبة متوفرة (مثل `gh` غير مثبتة، بدون جهاز تحكم git بعيد)، تسمح السياسة برسالة معلوماتية تشرح سبب تخطي الفحص.

### دلالات Stop لكل CLI

يبدو إنفاذ Stop مختلفاً قليلاً عبر ستة CLI مدعومة لأن كل واحد يعرّض عقد hook مختلفاً. النتيجة **متطابقة** — الوكيل لا يهرب من التوقف بينما تفشل بوابة سير العمل — لكن **الميكانيكا** تختلف. يلخص الجدول أدناه؛ فقط Pi لديه خصوصية واضحة للمستخدم تستحق الفهم قبل تفعيل سياسة `require-*-before-stop`.

| CLI                      | متى تعمل البوابة        | ما تراه                                                                                                                                                                                                                                                                                                       |
| ------------------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Claude Code              | نفس حلقة الوكيل، فوراً  | يستمر Claude في العمل — يصحح المشكلة، ثم يحاول الإنهاء مرة أخرى. لا توقف ظاهر لك.                                                                                                                                                                                                                             |
| Codex                    | نفس حلقة الوكيل، فوراً  | نفس Claude.                                                                                                                                                                                                                                                                                                   |
| GitHub Copilot CLI       | نفس حلقة الوكيل، فوراً  | نفس Claude (يستخدم قناة إعادة محاولة `{decision:"block", reason}` الخاصة بـ Copilot — تم التحقق منها تجريبياً ضد Copilot CLI 1.0.41).                                                                                                                                                                         |
| Cursor Agent             | نفس حلقة الوكيل، فوراً  | نفس Claude (يستخدم قناة `{followup_message}` الخاصة بـ Cursor — محدودة بـ `loop_limit`، افتراضي 5 إعادة محاولات).                                                                                                                                                                                             |
| OpenCode                 | نفس حلقة الوكيل، فوراً  | نفس Claude (يستخدم استدعاء SDK `client.session.prompt(...)` الخاص بـ OpenCode الموجه عبر `hookSpecificOutput.additionalContext`).                                                                                                                                                                             |
| **Pi (pi-coding-agent)** | **دور المستخدم التالي** | **يتوقف Pi بشكل واضح** عندما تعمل البوابة — تنهي حلقة الوكيل الخاصة به وتعودين إلى الموجه. تعمل البوابة بعد ذلك في المرة القادمة التي تقدّمين فيها موجهاً: يضيف failproofai توجيهاً `MANDATORY ACTION REQUIRED` إلى موجه نظام هذا الدور، يعلّم LLM بإكمال خطوة سير العمل (التزام، دفع، إلخ) قبل فعل ما طلبتِ. |

<Note>
  **قيد Pi.** `AgentEndEvent` الخاص بـ Pi (المعادل الأعلى لـ hook `Stop` الخاص بـ Claude) لا يملك نوع Result — بحلول الوقت الذي يعمل فيه، تكون حلقة الوكيل الخاصة بـ Pi قد خرجت بالفعل. لا يمكن إجبار Pi على إعادة محاولة نفس الحلقة بالطريقة التي يمكن بها Claude / Copilot / Cursor / OpenCode. ينقل failproofai البوابة إلى حدث `before_agent_start` الخاص بـ Pi (الذي يعمل بعد الموجه التالي للمستخدم) لذا يبقى فحص سير العمل مفروضاً، فقط على الدور التالي بدلاً من الحالي.

  **ما يعنيه هذا عملياً:**

  * بعد توقف Pi، يتم التقاط رار الرفض في الذاكرة بمفتاح معرف جلسة Pi. الموجه التالي الذي تقدّمينه بالضبط في نفس عملية Pi يصرفه: يرى LLM توجيه `MANDATORY ACTION REQUIRED` في أعلى موجه النظام الخاص به، يلتزم (أو يدفع / يفتح PR / ينتظر CI)، وفقط بعد ذلك يستمر مع طلبك. رار الرفض المقبوض مرة واحدة — بمجرد صرفه، تكون البوابة واضحة.
  * البوابة محدودة بعمر عملية Pi. إذا قمتِ بـ `Ctrl+C` Pi أو أغلقتِ بين الأدوار، يتم حذف الإدخال في الذاكرة مع العملية والبوابة تُفتقد. Claude و Copilot و Cursor و OpenCode لديها نفس الحد (اقتل الوكيل والبوابة تُفتقد) — Pi فقط يجعله أكثر وضوحاً لأن الوكيل يخرج بشكل واضح قبل عمل البوابة.
  * رار الرفض المعلق يتم مسحه أيضاً على `session_shutdown` لأي سبب (`new` / `resume` / `fork` / `quit`)، لذا بوابة قديمة من جلسة سابقة لا تستطيع التسرب إلى جلسة جديدة بدأت في نفس عملية Pi.

  إذا احتجتِ إلى إعادة محاولة نفس الحلقة بأسلوب Claude، قومي بتشغيل سياسات `Stop` الخاصة بك تحت أي من خمسة CLI الأخرى المدعومة. نحن نتابع Pi في المنبع لنوع Result مستقبلي على `AgentEndEvent` الذي سيسمح لنا بإغلاق هذه الفجوة.
</Note>

### `require-commit-before-stop`

**الحدث:** Stop\
**الافتراضي:** ينكر التوقف عندما يكون هناك تغييرات غير مرتكبة (ملفات معدلة أو مرحلة أو غير تتبع). يعيد رسالة معلوماتية عندما يكون مجلد العمل نظيفاً.

لا توجد معاملات.

***

### `require-push-before-stop`

**الحدث:** Stop\
**الافتراضي:** ينكر التوقف عندما يكون هناك التزامات غير مدفوعة أو عندما لا يملك الفرع الحالي فرع تتبع بعيد. يقترح `git push -u` لإنشاء فرع تتبع إذا لزم الأمر. يفشل مفتوحاً إذا لم يكن هناك جهاز تحكم مكونة.

**المعاملات:**

| Param    | النوع    | الافتراضي  | الوصف                                   |
| -------- | -------- | ---------- | --------------------------------------- |
| `remote` | `string` | `"origin"` | اسم الجهاز البعيد الذي سيتم الدفع إليه. |

**مثال:**

```json theme={null}
{
  "policyParams": {
    "require-push-before-stop": {
      "remote": "upstream"
    }
  }
}
```

***

### `require-pr-before-stop`

**الحدث:** Stop\
**الافتراضي:** ينكر التوقف عندما لا يكون هناك طلب دمج للفرع الحالي، أو عندما يكون طلب الدمج الموجود مغلقاً دون دمج. يعلّم Claude بإنشاء PR باستخدام `gh pr create`. عندما يكون PR **مدمجاً**، تسمح السياسة (تم شحن العمل) والرسالة تلمّح إلى التبديل عن الفرع (`git checkout main && git pull`).

لا توجد معاملات.

<Note>
  تتطلب هذه السياسة [GitHub CLI](https://cli.github.com/) (`gh`) مثبتاً ومصادقاً.
  قم بتشغيل `gh auth login` برمز الوصول الشخصي الذي يملك نطاق `repo` للوصول القراءة إلى
  طلبات السحب. إذا لم يكن `gh` مثبتاً أو مصادقاً، تفشل السياسة مفتوحة وتبلّغ عن السبب إلى Claude.
</Note>

***

### `require-no-conflicts-before-stop`

**الحدث:** Stop\
**الافتراضي:** ينكر التوقف عندما لا يمكن دمج الفرع الحالي بنظافة في فرع القاعدة. تؤكد السياسة أولاً أن هناك PR `OPEN` على GitHub للفرع — بدونها، لا يوجد هدف دمج للفرض، لذا تختصر السياسة بأكملها للسماح. عند تأكيد PR `OPEN`، يعمل مسحان مستقلان:

1. **محلي** — `git merge-tree --write-tree --name-only origin/<baseBranch> HEAD`. عند التضارب، تسمي رسالة الرفض الملفات المتضاربة حتى يعرف Claude بالضبط ما يجب حله.
2. **GitHub** — يعيد استخدام نتيجة `gh pr view --json mergeable,state` المجلوبة بالفعل في الفحص المسبق. يمسك التضاربات التي كانت `origin/<baseBranch>` محلية قديمة ستفقدها (مثل الهبوط على PR متضارب على `main` منذ آخر جلب). نتيجة `CONFLICTING` ترفض. نتيجة `UNKNOWN` ترفض أيضاً وتعلّم Claude بالانتظار \~10 ثوان وإعادة الفحص قبل محاولة التوقف مرة أخرى — يمنع السلبيات الكاذبة بينما تعيد حساب GitHub.

تخطيها بالكامل (سماح) عند: `gh` غير مثبت، لا يوجد PR للفرع، حالة PR ليست `OPEN` (مثل `MERGED`, `CLOSED`)، أو `gh pr view` يرجع مخرجات غير قابلة للتحليل. يفشل أيضاً مفتوحاً عند فقدان `origin/<baseBranch>` محلياً أو عند عدم وجود التزامات تقدماً من القاعدة — تلك أمراض مستوى الطبقة 1 تستشير قابلية دمج PR المخزنة مؤقتاً قبل السماح.

**المعاملات:**

| Param        | النوع    | الافتراضي | الوصف                            |
| ------------ | -------- | --------- | -------------------------------- |
| `baseBranch` | `string` | `"main"`  | فرع القاعدة للفحص للتضاربات ضده. |

<Note>
  يُطلب GitHub CLI (`gh`) لهذه السياسة. تستخدم السياسة `gh pr view` لتأكيد
  وجود PR `OPEN` قبل تشغيل أي مسح تضارب — بدون `gh`، تختصر السياسة للسماح. قم بتشغيل `gh auth login` برمز وصول شخصي يملك
  نطاق `repo` للوصول القراءة إلى طلبات السحب.
</Note>

***

### `require-ci-green-before-stop`

**الحدث:** Stop\
**الافتراضي:** ينكر التوقف عندما تكون فحوصات CI فاشلة أو لا تزال تعمل على الفرع الحالي. يفحص كل من تشغيلات سير عمل GitHub Actions وفحوصات الروبوت من طرف ثالث (مثل CodeRabbit، SonarCloud، Codecov). يعتبر `skipped`, `cancelled`, و `neutral` الخلاصات غير فاشلة (الأخير يغطي مثل تنبيهات Socket Security على PRs المساهمين الخارجيين، حيث يبلّغ التطبيق عن neutral بدلاً من النجاح/الفشل بقصد). يعيد رسالة معلوماتية عندما تمر جميع الفحوصات.

لا توجد معاملات.

<Note>
  تتطلب هذه السياسة [GitHub CLI](https://cli.github.com/) (`gh`) مثبتاً ومصادقاً.
  قم بتشغيل `gh auth login` برمز وصول شخصي يملك نطاق `repo` للوصول القراءة إلى
  تشغيلات سير عمل Actions وAPI الفحوصات. إذا لم يكن `gh` مثبتاً أو مصادقاً، تفشل السياسة مفتوحة وتبلّغ عن السبب إلى Claude.
</Note>

***

***

## تعطيل السياسات الفردية

أزل سياسة محددة من `enabledPolicies` في ملف التكوين الخاص بك، أو قم بتبديلها في تبويب السياسات بلوحة البيانات.

```json theme={null}
{
  "enabledPolicies": [
    "block-rm-rf",
    "sanitize-api-keys"
  ]
}
```

السياسات غير المدرجة في `enabledPolicies` لا تعمل، حتى لو كانت هناك إدخالات `policyParams` موجودة لها.
