العودة إلى التحديثات
New releaseSep 4, 2026

sonar v0.4.1

أداة سطر أوامر لفحص وإدارة الخدمات التي تستمع على منافذ localhost

مشاركة
``` ███████╗ ██████╗ ███╗ ██╗ █████╗ ██████╗ ██╔════╝██╔═══██╗████╗ ██║██╔══██╗██╔══██╗ ███████╗██║ ██║██╔██╗ ██║███████║██████╔╝ ╚════██║██║ ██║██║╚██╗██║██╔══██║██╔══██╗ ███████║╚██████╔╝██║ ╚████║██║ ██║██║ ██║ ╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝ ``` اعرف ما الذي يعمل على جهازك.

يعرض Sonar كل ما يستمع على localhost ويرتبه: كل منفذ ينتمي إلى مجموعة — عادةً المستودع الذي تم تشغيله منه — وداخل تلك المجموعة إلى خدمة مسماة. ابدأ خوادم التطوير الخاصة بك باستخدام sonar start وسيصبح المشروع بأكمله شيئًا واحدًا يمكنك عرضه كشجرة، والانتظار عليه، وتتبعه، وإيقافه بأمر واحد. كما يتم التقاط حاويات Docker ومشاريع Compose والعمليات التي بدأتها يدويًا، دون أي إعداد.``` $ sonar list --tree my-app (3 ports, running) ~/code/my-app ├─ 5432 db postgres:17 http://localhost:5432 ├─ 5173 frontend vite (v5.4) http://localhost:5173 └─ 8000 api uvicorn app:app http://localhost:8000 ungrouped (1 port) └─ 3000 next-server (v16.1.6) http://localhost:3000

## التثبيت

### Homebrew (macOS / Linux)```sh
brew install raskrebs/sonar/sonar

Homebrew 6 يرفض الصيغ من النقرات (taps) التابعة لجهات خارجية حتى تثق في النقرة مرة واحدة (Error: Refusing to load formula raskrebs/sonar/sonar from untrusted tap):```sh brew trust raskrebs/sonar

### سكربت التثبيت```sh
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | bash

يُنزّل أحدث ملف ثنائي إلى ~/.local/bin ويضيفه إلى PATH الخاص بك إذا لزم الأمر. أعد تشغيل الطرفية أو نفّذ source ~/.zshrc.

على ويندوز (PowerShell):```powershell irm https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.ps1 | iex

مخصص تثبيت الموقع:```sh
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | SONAR_INSTALL_DIR=/usr/local/bin bash

تثبيت إصدار معين:```sh curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | SONAR_VERSION=vX.Y.Z bash

بعد ذلك، يمكنك استخدام `--output` لتحديد ملف الإخراج، و`--format` لتحديد التنسيق المطلوب (JSON أو YAML أو CSV). إذا لم يتم تحديد تنسيق، فسيتم استخدام JSON افتراضيًا.

```bash
python3 script.py --input data.txt --output results.json --format json

الخيارات المتاحة

الخيارالوصف
--inputمسار ملف الإدخال (مطلوب)
--outputمسار ملف الإخراج (اختياري)
--formatتنسيق الإخراج: json، yaml، أو csv (افتراضي: json)
--verboseتفعيل وضع الإخراج التفصيلي
--quietتعطيل جميع الرسائل غير الضرورية

أمثلة إضافية

لتحليل ملف نصي وعرض النتائج في المحطة الطرفية:

python3 script.py --input sample.txt

لحفظ النتائج بتنسيق YAML مع تفعيل الوضع التفصيلي:

python3 script.py --input sample.txt --output results.yaml --format yaml --verbose

متطلبات التشغيل

يتطلب هذا السكربت Python 3.6 أو أحدث، ولا يحتاج إلى أي مكتبات خارجية إضافية. جميع الوحدات المستخدمة مدمجة في Python القياسي.

ملاحظات هامة

  • تأكد من أن ملف الإدخال موجود وله صلاحيات قراءة مناسبة.
  • إذا كان ملف الإخراج موجودًا مسبقًا، فسيتم استبداله دون تحذير.
  • في حالة وجود أخطاء في التحليل، سيتم عرض رسالة خطأ واضحة مع رقم السطر المسبب للمشكلة.```powershell $env:SONAR_VERSION="vX.Y.Z"; irm https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.ps1 | iex
### استخدام Go```sh
go install github.com/raskrebs/sonar@latest

إكمالات الصدفة (إكمال أرقام المنافذ بالضغط على Tab):```sh sonar completion zsh > "${fpath[1]}/_sonar" # zsh sonar completion bash > /etc/bash_completion.d/sonar # bash sonar completion fish | source # fish

## ستون ثانية

أضف البادئة `sonar start` إلى الأوامر في ملف `dev.sh` الخاص بك:```sh
#!/usr/bin/env bash
sonar start --name db       --port 5432 -- docker compose up db &
sonar start --name api      --port 8000 -- uv run uvicorn app:app &
sonar start --name frontend --port 5173 -- npm run dev &
wait

اسم المجموعة يأتي من المستودع، لذلك لا حاجة لتكوين أي شيء آخر. في طرفية أخرى:```sh sonar list --tree

أداة `subfinder` هي أداة اكتشاف نطاقات فرعية سلبية مصممة للحصول على نطاقات فرعية صالحة لمواقع الويب من خلال استخدام مصادر سلبية. إنها أداة خفيفة الوزن وسهلة الاستخدام للغاية للباحثين في مجال الأمن السيبراني وصائدي الثغرات.

**ميزات الأداة:**

- **اكتشاف سلبي بالكامل:** لا يتصل مباشرة بالهدف، مما يقلل من خطر اكتشافه.
- **مصادر متعددة:** يستخدم أكثر من 30 مصدرًا مختلفًا لجمع المعلومات، بما في ذلك محركات البحث وقواعد بيانات الشهادات وخلاصات DNS.
- **سرعة عالية:** مصمم للأداء، مع معالجة متزامنة للاستعلامات.
- **سهولة التكامل:** يمكن استخدامه كأداة مستقلة أو دمجه في خطوط أنابيب أتمتة أكبر.
- **تنسيقات إخراج متعددة:** يدعم الإخراج بتنسيقات نصية عادية، JSON، وCSV لسهولة المعالجة.

**حالات الاستخدام الشائعة:**

- **تقييم سطح الهجوم:** تحديد جميع النطاقات الفرعية المرتبطة بمؤسسة ما لفهم سطح الهجوم بشكل أفضل.
- **إدارة الأصول:** تتبع الأصول الرقمية للشركة أو المؤسسة.
- **الاستخبارات مفتوحة المصدر (OSINT):** جمع معلومات حول البنية التحتية للهدف.
- **الاختبارات الأمنية:** كخطوة أولى في عملية اختبار الاختراق أو تقييم الثغرات الأمنية.

**مثال على الاستخدام:**

```bash
subfinder -d example.com -all -o results.txt

يقوم هذا الأمر بالبحث عن جميع النطاقات الفرعية لـ example.com باستخدام جميع المصادر المتاحة وحفظ النتائج في ملف باسم results.txt.``` my-app (3 ports, running) ~/code/my-app ├─ 5432 db postgres:17 http://localhost:5432 ├─ 5173 frontend vite (v5.4) http://localhost:5173 └─ 8000 api uvicorn app:app http://localhost:8000

وعندما تنتهي، أوقف المشروع بأكمله — الخوادم والمراقبون والعمال:```sh
sonar kill -g my-app

أمثلة أدناه مُعلَّمة بـ # check يتم تنفيذها ضد بناء جديد بواسطة scripts/readme-check.sh في كل تشغيل من تشغيلات CI.

الأوامر

`sonar list````sh

sonar list sonar list --tree sonar list --group my-app sonar list --json

check

Since I don't see any actual content in your message after "INPUT:", I cannot translate anything. Please provide the chunk content you'd like translated from English to Arabic.```sh
sonar list --stats             # CPU, memory, threads, uptime, state
sonar list --health            # HTTP health checks
sonar list --filter docker     # only Docker ports
sonar list --sort name         # port | pid | name | type
sonar list -a                  # include desktop apps
sonar list -c port,process,group,cpu,mem
sonar list --host user@server  # scan a remote machine over SSH

الأعمدة الافتراضية هي port، process، group، container، image، containerport، url، حيث يُظهر process الاسم الذي أعطيته للمنفذ (sonar rename)، ثم اسم الخدمة، ثم ما تم اكتشافه.

الأعمدة المتاحة: port، process، pid، type، url، group، cpu، mem، threads، uptime، state، connections، health، latency، container، image، containerport، compose، project، user، bind، ip.

تطبيقات سطح المكتب وخدمات النظام التي تصادف أنها تستمع — Figma، Discord، Spotify، ControlCenter، حزم .app الخاصة بنظام macOS، وخدمات /System/Library/ — تكون مخفية ما لم تمرر -a.

sonar start

تشغيل أمر كخدمة مسماة ضمن مجموعة:```sh sonar start -- npm run dev sonar start --group my-app --name frontend -- npm run dev sonar start --port 5173 -- npm run dev # expected port, before it binds sonar start --detach --name api -- uv run uvicorn app:app sonar start --list

لا حاجة لتمرير أي شيء:

- **المجموعة** — `--group`، وإلا فإن `name` في أقرب `.sonar.yaml`، وإلا فإن
  اسم دليل جذر git (يصبح العمل الشجري `repo@worktree`)، وإلا فإن اسم
  الدليل الحالي.
- **الاسم** — `--name`، وإلا فإن خدمة `.sonar.yaml` التي يطابقها `cmd`، وإلا
  يُستنتج من الأمر (`npm run dev` → `dev`، `uv run api` → `api`،
  `python -m uvicorn` → `uvicorn`، `./dev.sh` → `dev.sh`).
- **المنفذ** — `--port` هو تلميح وليس ربطًا: يظهر التشغيل كحالة `starting`
  حتى يصبح المنفذ يستمع فعليًا، ويستخدمه الخفي لمطابقة
  العملية مع المنفذ.

ترث العملية الفرعية stdin وstdout وstderr وcwd والبيئة، بالإضافة إلى
`SONAR_GROUP` و`SONAR_NAME` و`SONAR_RUN_ID`. تحصل على مجموعة عمليات خاصة بها،
لذا فإن `sonar kill` يُنهي الشجرة بأكملها — خادم تطوير مع مراقبيه
وعماله. يتم تمرير Ctrl+C، ويخرج sonar برمز خروج العملية الفرعية.

يعود `--detach` فورًا ويكتب المخرجات إلى
`~/.config/sonar/logs/<group>/<name>.log`. يُظهر `--list` ما بدأه sonar
(`--json` للصيغة القابلة للقراءة آليًا):```sh
sonar start --list
sonar start --detach --name demo --port 8123 -- sleep 5
sonar start --list --json
# check

.sonar.yaml

يُعرّف المشروع نفسه وخدماته في ملف .sonar.yaml في جذر المستودع. وهو اختياري — إذ يقوم sonar بالتجميع حسب جذر git بدونه — ومن المفترض أن يتم الالتزام به:```yaml name: my-app services:

  • name: db cmd: docker compose up db port: 5432 health: / description: Postgres 17 icon: database color: "#4f8cc9"
  • name: api cmd: uv run uvicorn app:app --port 8000 cwd: backend port: 8000 health: /healthz depends_on: [db]
  • name: frontend cmd: npm run dev port: 5173 depends_on: [api] ports: [9229] # ports that belong to this project without a service
- `name` — اسم المجموعة. بدون شرطات مائلة أو مسافات.
- `cmd`, `cwd`, `port` — كيف يبدأ `sonar up` الخدمة. `cwd` نسبي للملف ولا يجوز له تجاوز دليله.
- `health` — مسار HTTP يستقصيه الخفي أثناء تشغيل الخدمة، بحيث يمكن أن تكون الخدمة *قيد التشغيل* ولكن ليست *سليمة* بعد. يبلّغ عن `ok` أو `fail` أو `unknown`، مع سبب الفشل.
- `description`, `icon`, `color` — بيانات وصفية حرة لتطبيق سطح المكتب؛ لا يستنتجها sonar أبدًا.
- `depends_on` — ترتيب البدء. تسمية خدمة غير موجودة في الملف، أو دورة، تُعد خطأً؛ يتم الإبلاغ عن ملف غير صالح مرة واحدة ولا يوقف الفحص أبدًا.

يُقرأ `.sonar.yml` إذا كان هذا هو تهجئته؛ يكتب `sonar init` دائمًا `.sonar.yaml`. يراقب الخفي المشاريع التي يعرفها ويلتقط التعديلات على الملف دون إعادة تشغيل. كل تعديل يقوم به sonar — من تطبيق سطح المكتب، من `sonar groups add` و`rename` و`remove`، من وكيل — يمر عبر الخفي، الذي يعيد عرض الملف من شجرة الصياغة الخاصة به، لذا تبقى التعليقات وترتيب المفاتيح والتخطيط سليمة بعد تعديل يضيف أو يعيد تسمية أو يزيل خدمة، تمامًا كما تبقى سليمة بعد تغيير البيانات الوصفية. الاستثناء الوحيد: المسافات الإضافية التي تحاذي تعليقًا لاحقًا (`cmd: x     # note`) تنكمش إلى مسافة واحدة، لأن مكتبة YAML تحتفظ بالتعليق ولكن ليس بعموده.

### `sonar up````sh
sonar up                       # the .sonar.yaml at or above this directory
sonar up my-app                # a group by name
sonar up --only api,frontend
sonar up --json

يبدأ كل خدمة تُعلن عنها ملف .sonar.yaml الخاص بالمجموعة، بترتيب depends_on: تنتظر الخدمة المنافذ التي تُعلن عنها تبعياتها قبل أن تبدأ، ويتم تخطي الخدمة التي تستمع بالفعل. تعمل كل خدمة بشكل منفصل في مجموعة العمليات الخاصة بها، مع إخراجها في ~/.config/sonar/logs/<group>/<service>.log.``` ✓ db pid 41022 ~/.config/sonar/logs/my-app/db.log

  • api already running ✓ frontend pid 41108 ~/.config/sonar/logs/my-app/frontend.log

2 started, 1 already running

خدمة تفشل في البدء تُبلَّغ في سطر خاص بها وتجعل الأمر
يخرج برمز غير صفري، مهما ظهر غيره. أوقفها جميعًا مرة أخرى باستخدام
`sonar kill -g my-app`. يحتاج `sonar up` إلى الخفيّة ويبدأها إذا لم تكن
قيد التشغيل بالفعل.

### `sonar groups` و `sonar init````sh
sonar init --dry-run
sonar init --service api:8000:/healthz --service web:5173
sonar groups
sonar groups --json

group=$(basename "$PWD")           # sonar init names the group after the directory
sonar groups add "$group" worker --port 9000 --cmd 'uv run worker' --depends-on api
sonar groups rename "$group" worker jobs
sonar groups remove "$group" jobs
# check

sonar groups يسرد كل مجموعة يمكن أن يراها sonar ومن أين جاء كل اسم: manual (قمت بتثبيته باستخدام sonar assign)، start (تشغيل sonar start)، file (ملف .sonar.yaml) أو auto (جذر git أو مشروع Compose). sonar groups <name> يعرض منافذ وخدمات مجموعة واحدة، والخدمات المعلنة ولكنها غير قيد التشغيل.

sonar init يكتب ملف .sonar.yaml في جذر git بناءً على ما يستمع حالياً — مع استبعاد تطبيقات سطح المكتب والمنافذ الأقل من 1024. يرفض الكتابة فوق الملف بدون --force، و--dry-run يطبع الملف بدلاً من كتابته. --merge يضيف إلى ملف موجود بالفعل بدلاً من الرفض، و --service name:port[:health] — قابل للتكرار — يكتب الخدمات التي تسميها بدلاً من تلك التي وجدها، مع الاحتفاظ بالأمر الذي خمّنه لمنفذ أبقيت عليه. --force و--merge متنافيان.

sonar groups add <group> <name> --port N يضيف خدمة إلى ملف .sonar.yaml لتلك المجموعة، مع --cmd، --cwd، --health، --description، --icon، --color و--depends-on قابل للتكرار لبقية الإعدادات. sonar groups rename <group> <old> <new> يعيد تسمية خدمة واحدة في كل مكان في الملف، بما في ذلك مراجع depends_on، وsonar groups remove <group> <name> يحذف خدمة واحدة و يزيلها من كل depends_on التي أشارت إليها. جميع الأوامر الثلاثة ترفض أي تعديل من شأنه أن يترك الملف غير صالح — اسم مكرر، منفذ تطالب به خدمة أخرى بالفعل، خدمة غير موجودة — ولا يكتب أي منها بايت واحد حتى يُعرف أن التعديل الكامل سليم.

الخفي (daemon) هو من يقوم بالكتابة، ولهذا يعود الملف مع تعليقاته وترتيب مفاتيحه سليماً سواء جاء التعديل من سطر الأوامر، أو تطبيق سطح المكتب أو وكيل. sonar groups add، rename وremove تحتاج إلى الخفي وتقوم بتشغيله إذا لم يكن قيد التشغيل بالفعل؛ الأسماء الثلاثة هي أوامر فرعية، لذا فإن مجموعة اسمها فعلياً add تُقرأ باستخدام sonar groups --json.

`sonar kill````sh

sonar kill 3000 # SIGTERM, then SIGKILL after 5s sonar kill 3000 5432 -f # SIGKILL both straight away sonar kill 3000 --tree # the listener and everything below it sonar kill --pid 12345 --tree # by process id sonar kill -g my-app # a whole group, confirms unless -y sonar kill --all --filter docker -y # every container publishing a port sonar kill --all --project my-app # one Compose project sonar kill 3000 --ip 127.0.0.1 # one bind address of several sonar kill --all --dry-run --json # the plan for the whole machine

`--dry-run` يأخذ أي محدد ولا يغيّر شيئًا: فهو يطبع الإجراءات التي
ستنفذها عملية القتل، الأطفال أولًا، ويترك كل شيء يعمل. من البداية إلى النهاية،
ضد مستمع خاص بك:```sh
sonar start --detach --name plan --port 8231 -- sonar map 3000 8231
sonar wait 8231
sonar kill 8231 --dry-run --json           # the plan; the mapping keeps running
sonar kill 8231 -y                         # and now for real
# check

يُقرأ الوسيط الموضعي كمنفذ، وكمعرّف عملية (pid) فقط عندما لا يكون هناك شيء يستمع على ذلك الرقم. يطابق -g المجموعة المُحلَّلة، أو وسم التشغيل القديم أو المعرّف، ومشروع Compose، دون تمييز بين الأحرف الكبيرة والصغيرة.

تُرسل إشارة SIGKILL إلى عملية تتجاهل SIGTERM إذا كان المنفذ لا يزال يستمع بعد --grace (5 ثوانٍ)؛ ويعمل --no-escalate على تعطيل ذلك. تُرسل الإشارات إلى العمليات الفرعية قبل العمليات الأم، بحيث تنتهي الشجرة بالترتيب. تُوقَف حاويات Docker باستخدام docker stop ولا تُرسل إليها إشارات أبدًا. دائمًا ما يُوقَف مستمع بدأه sonar start معًا مع مجموعة عملياته.

يطبع --json صفًا واحدًا لكل عملية: {port, bind_address, pid, name, method, ok, error}، حيث تكون method sigterm أو sigkill أو docker_stop أو map_stop أو none. يخرج المسح الفارغ برمز 0؛ وتخرج المجموعة غير المعروفة برمز 1.

`sonar map````sh

sonar map 6873 3002 # also serve the service on 6873 from port 3002

يشغّل وكيل TCP في المقدمة حتى توقفه. يُبلّغ `sonar kill` عن
تعيين أوقفه كـ `map_stop`.

### `sonar rename`, `sonar assign`, `sonar history````sh
sonar rename 3000 storefront     # a name of your own, survives restarts
sonar rename 3000 --clear
sonar assign 3000 my-app         # pin a port to a group by hand
sonar assign 3000 --clear
sonar history                    # everything that came up, went down, restarted
sonar history 3000 --since 24h --limit 20

Since no input content was provided, I cannot perform the translation. Please provide the chunk content you'd like translated.```sh sonar history --since 1h sonar history --json

check

الأسماء والمنافذ تُخزَّن في قاعدة بيانات sonar، مُفهرسةً بأكثر شيء محدد معروف عن المنفذ: التشغيل (`run:<group>/<name>`)، الحاوية (`docker:<project>/<service>`)، دليل العمل، ورقم المنفذ أخيرًا. خادم التطوير المُعاد تسميته يحتفظ باسمه عبر عمليات إعادة التشغيل؛ والاسم المثبَّت على المنفذ 3000 وحده ينطبق على أي شيء يستجيب هناك. هذه الأوامر الثلاثة تحتاج إلى الخفيّة (daemon) وتُشغّلها إذا لم تكن قيد التشغيل.

### قراءة منفذ```sh
sonar info 3000                            # command, user, bind, stats, health
sonar logs 3000                            # tail; docker logs for containers
sonar wait 5432 3000 --timeout 60s         # block until ready
sonar wait 5432 --http=/health             # wait for HTTP 200-399, not just TCP
sonar next 3000                            # first free port from 3000
sonar next 3000-3100 -n 3                  # three consecutive free ports
sonar graph                                # who is connected to whom
sonar graph --dot                          # Graphviz
sonar open 3000                            # open in the browser
sonar attach 3000                          # shell into the container, or TCP
sonar watch                                # live view
sonar watch --stats --notify

بعد اكتمال التثبيت، يمكنك التحقق من أن الأداة تعمل بشكل صحيح عن طريق تشغيل الأمر التالي:

toolname --version

يجب أن يظهر لك رقم الإصدار المثبت. إذا واجهت أي مشاكل أثناء التثبيت، فتأكد من تثبيت جميع المتطلبات الأساسية المذكورة في قسم المتطلبات.

الاستخدام

لاستخدام الأداة، اتبع الصيغة العامة التالية:

toolname [الخيارات] <الهدف>

الخيارات المتاحة

الخيارالوصف
-h, --helpعرض رسالة المساعدة والخروج
-v, --verboseتفعيل وضع الإخراج التفصيلي
-o, --output <ملف>حفظ النتائج في ملف محدد
-t, --threads <عدد>تحديد عدد الخيوط المتزامنة (الافتراضي: 10)
--timeout <ثوانٍ>تعيين مهلة الطلبات بالثواني

أمثلة

فحص هدف واحد:

toolname https://example.com

فحص أهداف متعددة من ملف:

toolname -o results.txt targets.txt

استخدام خيارات متقدمة:

toolname --threads 20 --timeout 30 -v https://example.com

الترخيص

هذا المشروع مرخص بموجب رخصة MIT - راجع ملف LICENSE للحصول على التفاصيل.

إخلاء المسؤولية

هذه الأداة مخصصة للأغراض التعليمية واختبار الاختراق الأخلاقي فقط. لا يجوز استخدامها ضد أي نظام دون الحصول على إذن صريح من مالك النظام. المستخدم مسؤول بالكامل عن أي استخدام غير قانوني أو غير مصرح به لهذه الأداة.```sh sonar next 3000 sonar next 3000-3100 -n 3 --json sonar graph --json sonar info --help

check

`sonar wait` يخرج بالرمز `0` (جاهز)، أو `1` (انتهت المهلة)، أو `2` (تمت المقاطعة)، مما يجعله
الأداة المناسبة لوضعها بين بدء شيء ما واختباره:```sh
docker compose up -d
sonar wait 5432 3000 --timeout 60s && npm run migrate && npm run test

تشغيل كخفيّة أو فحص مباشر. كل أمر قراءة يسأل الخفيّة إذا كانت تعمل، لأنها تملك الإجابة بالفعل ولا تحتاج إلى استدعاء lsof. إذا لم تكن أي خفيّة تعمل، يقومون بالفحص مباشرة ويطبعون ملاحظة واحدة على stderr توضح ذلك. sonar kill يتبع نفس القاعدة: الخفيّة القابلة للوصول هي التي تقوم بالإنهاء، لذا يعيد الفحص فورًا وإجابته التالية — وسجل المنافذ — يعرفان بالفعل أن المنفذ قد اختفى. لا القراءات ولا عمليات الإنهاء تبدأ خفيّة خلف ظهرك. --no-daemon يفرض الفحص المباشر بصمت ويعمل على أي أمر:```sh sonar list --no-daemon --json

check

### `sonar host````sh
sonar host          # cpu, load, memory and disk of the machine sonar watches
sonar host --json

بعد ذلك، يمكنك استخدام --output لتحديد ملف الإخراج، و--format لتحديد التنسيق المطلوب (JSON أو YAML أو CSV). على سبيل المثال:

python3 tool.py --input data.txt --output results.json --format json

إذا كنت تريد تشغيل الأداة في وضع المسح الضوئي الشامل، استخدم الخيار --scan مع تحديد النطاق الزمني:

python3 tool.py --scan --start 2024-01-01 --end 2024-12-31

لمزيد من التفاصيل حول جميع الخيارات المتاحة، يمكنك تشغيل الأمر التالي:

python3 tool.py --help

المتطلبات

  • Python 3.8 أو أحدث
  • المكتبات التالية: requests, beautifulsoup4, colorama

لتثبيت المتطلبات، استخدم:

pip install -r requirements.txt

الترخيص

هذه الأداة مرخصة بموجب رخصة MIT. راجع ملف LICENSE للحصول على التفاصيل الكاملة.

إخلاء المسؤولية

هذه الأداة مخصصة للأغراض التعليمية والاختبارات الأمنية المصرح بها فقط. لا يُسمح باستخدامها لأي أنشطة غير قانونية أو ضارة. المستخدم مسؤول بالكامل عن الامتثال لجميع القوانين واللوائح المعمول بها.```sh sonar host

check

يقيس الخفيّ جهازه الخاص على إيقاع المسح وينشره كصف
`localhost` في مجموعة `hosts` الخاصة باللقطة: نظام التشغيل والنواة، ووقت التشغيل، ونسبة
وحدة المعالجة المركزية، ومتوسط الحمل، والذاكرة، والقرص الذي يحمل `/`. نسبة وحدة المعالجة المركزية هي العمل
المُنجز بين مسحين، لذا فهي فارغة حتى يمسح الخفيّ مرتين؛ ورقم
لا يمكن لمنصة إنتاجه — متوسط الحمل على ويندوز، الذي لا يمتلك واحدًا —
يكون فارغًا وليس صفرًا. كل مضيف مُسجّل مع `sonar remote add` ينضم
إلى نفس الجدول مع حمله الخاص. يحتاج الأمر إلى خفيّ يعمل: فالخفيّ
هو من يحتفظ بالعينة السابقة التي تُقاس النسبة المئوية مقابلها.

### `sonar remote install````sh
sonar remote install [email protected]        # same version as this sonar
sonar remote install hetzner --version v0.6.0  # a Host from ~/.ssh/config
sonar remote install deploy@box --no-service   # the binary, no daemon

يضع سونار على مضيف يمكنك الوصول إليه عبر SSH ويشغّل خفيته هناك. يتم تنزيل أرشيف الإصدار والتحقق من المجموع الاختباري على المضيف البعيد — لا يُنسخ أي شيء من هذا الجهاز — ويستقر الثنائي في ~/.local/bin/sonar، لذا لا يحتاج أيٌّ من ذلك إلى صلاحيات الجذر. تعمل الخفية كوحدة مستخدم systemd حيث يتوفر ذلك على المضيف (~/.config/systemd/user/sonar.service)، وتعمل منفصلة حيث لا يتوفر؛ وتُطبع loginctl enable-linger كنصيحة عندما تنتهي جلسة المستخدم عند تسجيل الخروج وتأخذ الخفية معها.

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

يذهب الهدف إلى ssh دون تعديل: يعمل اسم مستعار Host من ~/.ssh/config، وكذلك تعمل ProxyJump وIdentityFile وPort التي يضبطها. و--identity و--ssh-arg موجودان للخيارات التي لا يغطيها ملف الإعدادات.

`sonar remote````sh

sonar remote add [email protected] # name taken from the target sonar remote add hetzner [email protected] # or given sonar remote list # status, latency, version, load sonar remote remove hetzner

sonar list --host hetzner # that host's ports sonar list --host "*" # every host, with a HOST column sonar info 3000 --host hetzner

يستضيف المضيف المُسجَّل نفس البرنامج الخفي، ويحافظ البرنامج الخفي على هذا الجهاز على
اتصال SSH واحد به — `ssh <target> sonar daemon stdio` — ويُعدِّد
ما يُبلِّغه في الحالة التي يقرؤها كل عميل بالفعل. لا شيء جديد يستمع
في أي مكان: تبقى مقبس البرنامج الخفي البعيد خاصة بمستخدم SSH، ولا يتحدث العملاء
إلى SSH بأنفسهم أبدًا.

يحمل كل صف الآن المضيف الذي جاء منه. تقول الصفوف المحلية `localhost` و
تحتفظ بالمفاتيح التي كانت لديها دائمًا، لذا لا يتغير شيء يقرأ sonar اليوم؛
تقول الصفوف البعيدة الاسم المُسجَّل وتكون مفاتيحها `<host>/<port>:<bind>`، وهو
ما يسمح للمنفذ 3000 على جهازين بأن يكون صفّين. لا يرى المشترك سوى
localhost ما لم يطلب المزيد (`state.subscribe {"hosts": ["*"]}`).

يذهب الهدف إلى `ssh` دون تغيير، لذا تنطبق أسماء `~/.ssh/config` المستعارة و`ProxyJump`
والهويات جميعها؛ ويغطي `--ssh-arg` و`--identity` و`--port` ما لا يغطيه
الإعداد. لا يخزّن sonar أي كلمة مرور ولا أي مفتاح. المضيف الذي يختفي يحتفظ
بصفّه وحالته بينما يعيد البرنامج الخفي المحاولة، متراجعًا من ثانية واحدة إلى
ثلاثين طالما بقي مُسجَّلًا.

يقبل `--host` أيضًا اسم `user@host` مجردًا لا يعرف عنه sonar شيئًا: فهو
يتراجع إلى الفحص بدون وكيل عبر `ssh` + `ss`/`lsof` ويطبع تلميحًا إلى
`sonar remote install`.

#### التصرف على جهاز آخر

يقبل كل أمر كتابة `--host` أيضًا، وينفّذ هناك بالضبط ما يفعله هنا:```sh
sonar kill 3000 --host hetzner                 # stop a port on that machine
sonar kill -g api --host hetzner               # a whole group of its services
sonar kill-all --filter docker --host hetzner  # its containers
sonar up api --host hetzner                    # start a group from its .sonar.yaml
sonar logs 3000 --host hetzner                 # tail its output here
sonar rename 3000 storefront --host hetzner    # its name, in its database
sonar assign 3000 storefront --host hetzner

الدايمون المحلي يمرّر الاستدعاء عبر جسر ذلك المضيف ويعيد ما أجابه الدايمون البعيد، في نفس الغلاف الذي يعيده استدعاء محلي — كل صف نتيجة يذكر المضيف الذي حدث عليه، وحقل affected في أمر القتل يحمل مفاتيح <host>/<port>:<bind> التي يستخدمها البث لتلك الصفوف. الأمر البثّي يبثّ: sonar up --host يطبع كل خدمة فور بدء تشغيلها على الجانب البعيد، وCtrl-C يوقف العمل البعيد بدلاً من إيقاف هذا الطرفية فقط.

لأن مفتاح الصف يسمّي مضيفه بالفعل، يمكن للعميل إعادة تمريره مباشرة كمحدِّد — {"key": "hetzner/3000:127.0.0.1"} هو المحدِّد بأكمله، بما فيه المضيف. استدعاء واحد يعمل على جهاز واحد؛ تسمية جهازين خطأ بدلاً من قتل نصف على كل منهما.

أمران يبقيان محليين. sonar attach يضع طرفية هذه أمام عملية، لذا يرفض --host ويقول بالاتصال عبر ssh والارتباط هناك. وجلسة الوكيل هي حالة يحتفظ بها هذا الدايمون، لذا sonar kill --session ليس له صيغة بعيدة. كل شيء آخر يتطلب تشغيل الدايمون هنا — فهو مكان الاتصال بالجهاز الآخر — ويقول ذلك بدلاً من فحص هذا الجهاز بصمت.

sonar up --host يتطلب تسمية المجموعة: ملف .sonar.yaml في دليل عملك هو مسار على هذا الجهاز، والدايمون البعيد هو من يقرأ الملف ويبدأ الخدمات.

الدايمون

عملية خلفية واحدة تفحص المنافذ، وتحلّ المجموعات، وتستقصي الصحة، وتحتفظ بقاعدة البيانات، وتبثّ التغييرات لمن اشترك — واجهة الأوامر، وتطبيق سطح المكتب، والمحررات.```sh sonar serve # in the foreground sonar serve --detach # in the background sonar daemon status # pid, uptime, subscribers, scans, intervals sonar daemon path # the socket it listens on sonar daemon log -n 50 -f # what it is doing sonar daemon restart sonar daemon stop

بعد ذلك، يمكنك استخدام `--output` لتحديد ملف الإخراج، و`--format` لتحديد التنسيق المطلوب (json أو yaml أو csv). على سبيل المثال:

```bash
python3 tool.py --input data.txt --output results.json --format json

إذا كنت تريد تشغيل الأداة في وضع المسح الضوئي الشامل، استخدم الخيار --scan مع تحديد النطاق:

python3 tool.py --scan 192.168.1.0/24 --output network_scan.csv

لاحظ أن بعض الخيارات تتطلب صلاحيات مرتفعة (root) للعمل بشكل صحيح، خاصة عند فحص المنافذ أو التقاط الحزم. تأكد من تشغيل الأداة بصلاحيات مناسبة حسب الحاجة.

لمزيد من التفاصيل حول جميع الخيارات المتاحة، يمكنك استخدام الأمر:

python3 tool.py --help

سيتم عرض قائمة كاملة بالخيارات مع شرح مختصر لكل منها.```sh sonar daemon path sonar daemon status --json sonar daemon log -n 5

check

| ما | أين |
|---|---|
| المقبس (Socket) | `$XDG_RUNTIME_DIR/sonar/daemon.sock`، وإلا `~/.config/sonar/daemon.sock`؛ `\\.\pipe\sonar` على ويندوز |
| قاعدة البيانات | `~/.config/sonar/sonar.db` (يتجاوزها `SONAR_DB`) |
| سجل الخفي (Daemon log) | `~/.config/sonar/daemon.log`، يُدوَّر عند 5 ميجابايت، مع الاحتفاظ بثلاثة نسخ |
| سجلات التشغيل | `~/.config/sonar/logs/<group>/<service>.log` |
| الإعدادات | `~/.config/sonar/config.yaml` |

`SONAR_SOCKET` يتجاوز مسار المقبس في كل مكان، لكل من الخفي وعملائه — وهو مفيد لمثيل ثانٍ معزول. يُنشأ المقبس بصلاحيات 0600 داخل دليل بصلاحيات 0700، لذا لا يمكن لأحد سواك التواصل معه. يعمل خفي واحد فقط في كل مرة؛ ويتم تنظيف المقبس المتبقي من انهيار عند بدء التشغيل التالي.

يتوقف الخفي من تلقاء نفسه بعد 30 دقيقة دون عملاء ودون مشتركين. اضبط `daemon.idle_timeout` في ملف الإعدادات لتغيير ذلك، أو `0` لإبقائه قيد التشغيل.

تُفحص المنافذ كل ثانيتين بينما يتغير شيء ما؛ وعندما لا يتغير شيء، يبطئ الماسح نفسه إلى 5 ثوانٍ مع وجود مشترك متصل و10 ثوانٍ بدونه. `daemon.scan_interval` يحرّك هذا الأساس — بحد أدنى ثانية واحدة — وكلتا السقفين يتدرجان معه، لذا رفعه إلى `5s` يتراجع إلى 12.5 ثانية و25 ثانية بدلاً من تثبيت المنحنى عند الحدود القديمة. `daemon.stats_interval` هو الإيقاع المنفصل الذي تتحدث به وحدة المعالجة المركزية والذاكرة وحمل المضيف أثناء وجود اشتراك نشط. يُقرأ كلاهما عند بدء تشغيل الخفي: عدّل الملف، ثم نفّذ `sonar daemon restart`. يطبع `sonar daemon status` القيم السارية (`scan base`، `stats tick`) بجانب الفاصل التكيفي الذي يعمل عليه الماسح الآن.

المشترك الذي يطلب `include: ["health"]` يجعل الخفي يفحص **كل منفذ يستمع** بإيقاع أبطأ، وليس فقط الخدمات التي تعلن عن مسار `health:` — تلك تُستطلَع في كل نبضة وتصل إلى كل مشترك سواء طُلبت الصحة أم لا.

### الإعدادات

`~/.config/sonar/config.yaml` اختياري؛ الأعلام (flags) تفوز دائمًا.```sh
sonar config path
sonar config init
# check

بعد اكتمال التثبيت، يمكنك التحقق من أن الأداة تعمل بشكل صحيح عن طريق تشغيل الأمر التالي:

toolname --version

يجب أن يعرض هذا رقم الإصدار المثبت. إذا واجهت أي أخطاء، فتأكد من تثبيت جميع التبعيات المطلوبة وأن متغيرات البيئة الخاصة بك مضبوطة بشكل صحيح.

الاستخدام

للبدء في استخدام الأداة، راجع الأوامر المتاحة:

toolname --help

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

الأوامر الأساسية

الأمرالوصف
scanإجراء فحص على هدف محدد
reportإنشاء تقرير من نتائج الفحص
updateتحديث قواعد البيانات أو التوقيعات

مثال سريع

toolname scan --target example.com --output results.json

سيقوم هذا الأمر بفحص example.com وحفظ النتائج في ملف results.json.```sh sonar config edit # open it in $EDITOR

Since I don't see any actual content in your message after "INPUT:", I cannot translate anything. Please provide the chunk content you'd like translated from English to Arabic.```yaml
list:
  columns: [port, process, group, container, image, containerport, url]
  sort: port            # port | pid | name | type
  filter: ""            # docker | user | system | "" (all)
  all: false            # include desktop apps by default
daemon:
  idle_timeout: 30m     # 0 keeps the daemon running
  log_level: info       # debug | info | warn | error
  scan_interval: 2s     # base port-scan cadence, minimum 1s
  stats_interval: 1s    # cpu/memory refresh while subscribed, minimum 250ms
color: true
services:               # label custom/unknown ports
  9000: php-fpm
  5050: my-dashboard

القيم غير الصالحة يتم تجاهلها مع تحذير، ويواصل sonar العمل بالقيم الافتراضية. تجاوزات البيئة التي لا تملك مفتاح إعداد: SONAR_DB, SONAR_SOCKET, SONAR_NO_HINTS=1 لإسكات إشعارات الترحيل أدناه، و SONAR_NO_AUTOSTART=1 لمنع أي عميل sonar من تشغيل خفي لم يجده — مفيد في CI، حيث لا ينبغي للبناء أن يترك عملية خلفه أبدًا.

مجموعة اختبارات sonar الخاصة تضبط SONAR_NO_AUTOSTART=1 لكل ثنائي اختبار، وبعد التشغيل، تبحث عن خفي تجاوز عمره. تلك البوابة تدّعي فقط serve بدأ من جذر مؤقت خاص بالتشغيل، لذا فإن مجموعتين تعملان جنبًا إلى جنب على جهاز واحد تتركان خفيّ بعضهما البعض دون مساس؛ SONAR_TESTENV_GATE_ALL=1 يوسّعها مرة أخرى إلى كل sonar serve في أي مكان تحت دليل المؤقت، وهو ما يريده مشغّل CI الذي يملك الجهاز بالكامل.

الوكلاء: MCP والمهارات والخطافات```sh

sonar install mcp --claude-code # merge into /.mcp.json sonar install mcp --cursor --scope user # ~/.cursor/mcp.json sonar install mcp --codex # codex mcp add sonar install skills --claude-code # the bundled sonar skill sonar install hooks --claude-code # optional, see below

بعد ذلك، يمكنك استخدام `--output` لتحديد ملف الإخراج، و`--format` لتحديد التنسيق المطلوب (JSON أو YAML أو CSV). على سبيل المثال:

```bash
python3 tool.py --input results.txt --output report.json --format json

سيقوم الأمر أعلاه بقراءة ملف results.txt، وتحليل النتائج، وإنشاء تقرير بتنسيق JSON باسم report.json في الدليل الحالي.

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

الخيارالوصف
--inputتحديد ملف الإدخال الذي يحتوي على النتائج الأولية
--outputتحديد مسار ملف الإخراج للتقرير
--formatتحديد تنسيق التقرير: json، yaml، أو csv
--verboseتفعيل وضع الإخراج التفصيلي لعرض معلومات إضافية أثناء التنفيذ
--quietتعطيل جميع المخرجات غير الضرورية، مع عرض الأخطاء فقط
--versionعرض رقم إصدار الأداة والخروج

أمثلة إضافية

لإنشاء تقرير بتنسيق YAML مع تفعيل الوضع التفصيلي:

python3 tool.py --input scan.dat --output scan.yaml --format yaml --verbose

لتصدير النتائج إلى ملف CSV بدون أي مخرجات إضافية:

python3 tool.py --input scan.dat --output scan.csv --format csv --quiet

متطلبات التشغيل

تتطلب الأداة Python 3.6 أو أحدث، بالإضافة إلى الحزم التالية:

  • requests للتعامل مع طلبات HTTP
  • pyyaml لدعم تنسيق YAML
  • colorama لتلوين المخرجات في الطرفية

يمكنك تثبيت جميع المتطلبات باستخدام الأمر:

pip install -r requirements.txt

استكشاف الأخطاء وإصلاحها

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

للحصول على قائمة كاملة برموز الخروج ومعانيها، يمكنك تشغيل الأداة مع الخيار --help:

python3 tool.py --help

الترخيص

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

المساهمة

نرحب بالمساهمات من المجتمع. إذا وجدت خطأً أو لديك اقتراح لتحسين الأداة، يرجى فتح issue أو إرسال pull request على مستودع GitHub. تأكد من اتباع إرشادات المساهمة الموجودة في ملف CONTRIBUTING.md.

الشكر والتقدير

نشكر جميع المساهمين والمستخدمين الذين ساعدوا في تطوير هذه الأداة وتحسينها من خلال ملاحظاتهم واقتراحاتهم القيمة.```sh sonar install mcp --generic --print sonar install skills --print sonar install hooks --print

check

`install mcp` يسجّل `{"command": "sonar", "args": ["mcp"]}` ويترك كل
خادم ومفتاح آخر في الملف كما هو؛ تشغيله مرتين لا يغيّر شيئًا، و
`--uninstall` يزيل بالضبط ما كتبه sonar.

`sonar mcp` هو ذلك الخادم: خادم MCP عبر stdio مدمج في الملف الثنائي يمنح
الوكيل رؤية الخفيّ للجهاز. يقرأ عبر `list_ports` و
`inspect_port`، وينتظر عبر `wait_for_port`، ويختار ويحجز المنافذ عبر
`next_free_port` و`claim_port`، ويجيب على بقية أسئلة الوكيل
عبر `tail_logs` و`health_check` و`dependency_graph` و`port_history` و
`list_sessions`؛ الإجراءات والموارد تأتي لاحقًا. يبدأ خفيًّا إذا لم يكن
قيد التشغيل ويعيد الاتصال من تلقاء نفسه إذا اختفى أحدها؛ سجلاته تذهب إلى stderr،
لأن stdout يحمل البروتوكول.

`install skills` يكتب المهارة المرفقة، التي تعلّم الوكيل بدء
الخوادم عبر `sonar start --`، والانتظار عبر `sonar wait` بدلًا من النوم، و
تنظيف ما بدأه. `install hooks` يضيف خطافَي Claude Code: أحدهما
يصدّر `SONAR_SESSION` بحيث يُنسب كل ما يبدأه جلسة إليها، والآخر
يقترح `sonar start --` عندما يكون خادم تطوير عارٍ على وشك التشغيل (إنه
ينصح، ولا يحظر أبدًا). كلاهما يقبل `--scope project|user` و`--print` و
`--uninstall`.

### `sonar doctor`

أمر واحد يفحص كل ما يعتمد عليه sonar ويقول ما يجب فعله حيال
أي شيء خاطئ. إنه ما يشغّله تطبيق سطح المكتب أثناء الإعداد، وما يجب
تشغيله بنفسك عندما يكون هناك خلل ما.```sh
sonar doctor                       # the table, and a one-line verdict
sonar doctor --json                # {ok, checks, version, daemon_version}
sonar doctor --only db_ok,tray     # just these
sonar doctor --only mcp_registered # a whole family
sonar doctor --project ~/code/api  # a project other than the working directory
sonar doctor --fix --yes           # apply the safe repairs, then check again

بعد ذلك، يمكنك استخدام --output لتحديد ملف الإخراج، و--format لتحديد التنسيق المطلوب (JSON أو YAML أو CSV). إذا لم يتم تحديد تنسيق، فسيتم استخدام JSON افتراضيًا.

python3 main.py --input /path/to/input.txt --output /path/to/output.json --format json

الخيارات المتاحة

الخيارالوصف
--inputالمسار إلى ملف الإدخال الذي يحتوي على البيانات المراد معالجتها
--outputالمسار إلى ملف الإخراج حيث سيتم حفظ النتائج
--formatتنسيق الإخراج: json أو yaml أو csv (الافتراضي: json)
--verboseتفعيل وضع الإخراج التفصيلي لعرض معلومات إضافية أثناء المعالجة
--quietتعطيل جميع الرسائل غير الضرورية، مع عرض الأخطاء فقط

أمثلة على الاستخدام

مثال 1: معالجة ملف نصي بسيط

python3 main.py --input data.txt --output results.json

مثال 2: استخدام تنسيق YAML مع وضع الإخراج التفصيلي

python3 main.py --input data.txt --output results.yaml --format yaml --verbose

مثال 3: معالجة ملف CSV مع تجاهل الرسائل غير الضرورية

python3 main.py --input data.csv --output results.csv --format csv --quiet

متطلبات النظام

  • Python 3.8 أو أحدث
  • المكتبات التالية مطلوبة (يمكن تثبيتها عبر pip):
pip install -r requirements.txt

هيكل المشروع

.
├── main.py              # نقطة الدخول الرئيسية
├── requirements.txt     # قائمة المكتبات المطلوبة
├── config/
│   └── settings.yaml    # ملف الإعدادات الافتراضية
├── modules/
│   ├── parser.py        # وحدة تحليل الإدخال
│   ├── processor.py     # وحدة معالجة البيانات
│   └── exporter.py      # وحدة تصدير النتائج
└── tests/
    ├── test_parser.py   # اختبارات وحدة التحليل
    └── test_processor.py # اختبارات وحدة المعالجة

الترخيص

هذا المشروع مرخص بموجب رخصة MIT. راجع ملف LICENSE للحصول على التفاصيل الكاملة.

المساهمة

نرحب بالمساهمات! يرجى اتباع الخطوات التالية:

  1. قم بعمل Fork للمستودع
  2. أنشئ فرعًا جديدًا (git checkout -b feature/amazing-feature)
  3. قم بتنفيذ التغييرات (git commit -m 'إضافة ميزة رائعة')
  4. ادفع التغييرات (git push origin feature/amazing-feature)
  5. افتح طلب سحب (Pull Request)

الدعم

إذا واجهت أي مشكلة أو كان لديك سؤال، يرجى فتح issue في صفحة المشروع على GitHub.```sh

check

sonar doctor --only daemon_reachable,daemon_protocol,socket_permissions,db_ok sonar doctor --json --only config_parses | grep -q '"status": "ok"' sonar doctor --only mcp_registered --project . > /dev/null

كل فحص يُرجع `ok` أو `warn` أو `fail` أو `skip`. `skip` تعني أنه لا يوجد
ما يجب فحصه — مثل عدم تثبيت Cursor، أو عدم وجود docker على الجهاز، أو أن
المنفذ (socket) هو named pipe على Windows — ولا يُحتسب أبدًا ضدك. رمز
الخروج هو 0 ما لم يحدث **فشل**، لذا فإن `sonar doctor` يناسب سكربتات
الإعداد.

| الفحص | ما يعنيه |
| --- | --- |
| `cli_on_path` | أن الملف التنفيذي الذي شغّلته هو نفسه الذي يحلّه PATH؛ ويذكر التثبيت المُظلِّل إن لم يكن كذلك |
| `cli_version_current` | مقارنة بأحدث إصدار، أو `skip` عندما لا يمكن الوصول إلى GitHub خلال ثانيتين |
| `config_parses` | أن ملف `config.yaml` الخاص بك يُحمَّل؛ ويُبلَّغ عن خطأ في الصياغة مع سطر وعمود ومؤشّر |
| `config_dir_writable` | أن الخفيّة (daemon) يمكنها كتابة سجلّها وملف القفل وقاعدة البيانات |
| `daemon_reachable` | أن شيئًا ما يستمع على المنفذ (socket) |
| `daemon_version_matches` | أن الخفيّة قيد التشغيل هي إصدار CLI الذي تستخدمه |
| `daemon_protocol` | أن الإصدار الرئيسي لبروتوكول الخفيّة يطابق إصدار هذا البناء |
| `socket_permissions` | أن المنفذ ملكك وبصلاحيات 0600، داخل دليل بصلاحيات 0700 (`skip` على Windows) |
| `db_ok` | أن قاعدة البيانات تُفتح، وهي في أحدث مخطط، وما حجمها |
| `mcp_registered.{claude_code,cursor,codex}` | أن خادم MCP الخاص بـ sonar موجود في إعدادات ذلك العميل |
| `skills_installed` | أن المهارة المرفقة مثبتة وحالية |
| `hooks_installed` | أن خطافات Claude Code الاختيارية مثبتة |
| `project_config` | أن هذا المشروع يحتوي على `.sonar.yaml` يُحمَّل |
| `docker` | أن واجهة docker CLI موجودة وأن خفيّتها تستجيب |
| `desktop_installed` | أن تطبيق سطح المكتب مثبت، وأي إصدار هو (`skip` على Windows) |
| `tray` | أن ملف `sonar-tray` الثنائي القديم لنظام macOS ما زال موجودًا |

`--fix` يطبّق فقط الإصلاحات الآمنة للتنفيذ دون مراقبة، ويسأل أولاً ما لم
تمرر `--yes`: فهو ينقل ملف `config.yaml` غير القابل للتحليل إلى
`config.yaml.broken-<timestamp>` ويكتب قالبًا جديدًا (لا يُحذف أي شيء
أبدًا)، ويعيد تشغيل خفيّة غير قيد التشغيل، وينفّذ أمر
`sonar install mcp|skills|hooks` الذي يذكره الفحص — من دليل العمل الحالي،
بالطريقة التي كنت ستكتبها بها، لذا شغّل `--fix` داخل المشروع الذي تصلحه
بدلاً من توجيه `--project` إليه. ثم يفحص مرة أخرى.
أي شيء لن يلمسه — ملف ثنائي مُظلِّل على PATH، أو مهارة لم يكتبها sonar —
يُترك لك مع الأمر الدقيق في عمود `fix`.

تطبيق سطح المكتب يستدعي نفس الفحوصات عبر طريقة `daemon.doctor` الخاصة
بالخفيّة بدلاً من استدعاء أوامر خارجية. الخفيّة تشغّل كل ما يمكنها من
عمليتها الخاصة؛ الفحوصات الثلاثة المتعلقة بملف CLI التنفيذي الذي
استدعيته (`cli_on_path` و`cli_version_current` و`daemon_version_matches`)
تعود كـ `skip` مع تفصيل يوضح ذلك.

### تطبيق سطح المكتب

تطبيق Sonar هو نفس الصورة في نافذة وفي شريط القوائم أو علبة النظام:
مجموعات على الجانب، ومنافذ في شبكة مع إحصائيات حية وحالة، وسجلات، وأزرار
لكل ما سبق. يتواصل مع نفس الخفيّة، لذا لا يختلف CLI والتطبيق أبدًا.
`sonar install desktop` يثبّته و`sonar tray` يشغّله.

حتى يصدر التطبيق، لا تزال حزم macOS للإصدارات تحمل ملف `sonar-tray`
الثنائي القديم لشريط القوائم، و`sonar tray` يتراجع إليه عندما لا يكون
التطبيق مثبتًا.

### `sonar install desktop`

التطبيق في مرحلة تجريبية ولم يُوقَّع من Apple بعد، لذا يقوم CLI بتثبيته:```sh
brew install raskrebs/sonar/sonar && sonar install desktop

هذا هو إعداد المختبر بأكمله. يجلب Sonar قائمة بنُسخ البناء المنشورة، ويختار النسخة المناسبة لجهازك، ويتحقق من sha256 الخاص بها وحجمها، ويُثبّتها، ثم يفتحها.

لهذا السبب تقوم الواجهة السطرية بالتنزيل. يضيف macOS سمة عزل (quarantine) إلى أي شيء يحفظه المتصفح، ويرفض Gatekeeper فتح تطبيق معزول لم تصادق عليه Apple. الملف الذي تنزّله هذه الواجهة السطرية لا يحصل على السمة من الأساس، لذا يفتح الإصدار التجريبي دون أي مطالبة ودون رقصة "الضغط بزر الفأرة الأيمن ثم فتح". لا يضبط Sonar سمات العزل ولا يزيلها — فلا يوجد ما يُزال.```sh sonar install desktop # install and launch sonar install desktop --no-launch # install only sonar install desktop --update # update; does nothing if current sonar install desktop --check # exit 1 when an update is available sonar install desktop --version 0.1.0-beta.1 sonar install desktop --force # ask a running Sonar to quit first sonar install desktop --json # for scripts

الأمر لا يحتاج إلى شبكة ليخبرك بما يفعله:```sh
sonar install desktop --help | grep -- '--no-launch'
# check
macOS/Applications/Sonar.app، أو ~/Applications/Sonar.app عندما لا يكون الأول قابلاً للكتابة (لا يستخدم sonar sudo أبدًا)
Linux~/.local/opt/sonar-desktop/Sonar.AppImage، بالإضافة إلى إدخال قائمة في ~/.local/share/applications ورابط sonar-desktop في ~/.local/bin
Windowsليس بعد — يقول الأمر ذلك ويخرج بالرمز 1

يتجاوز --dir الدليل في كلتا الحالتين. على Linux، يثبّت --deb ملف .deb عبر apt/dpkg بدلاً من AppImage، حيث ينشر الإصدار واحدًا.

التثبيت ذري: يتم فك ضغط التطبيق الجديد بجانب القديم ويُستبدل عبر إعادة تسمية، لذا فإن فشل التنزيل لا يتركك أبدًا بدون تطبيق يعمل. إذا كان التطبيق مفتوحًا، يرفض sonar بدلاً من استبدال حزمة تحته؛ يطلب --force إنهاءه وينتظر حتى عشر ثوانٍ.

يسجّل sonar install desktop قيمتي desktop.installed_version و desktop.installed_path في ~/.config/sonar/config.yaml، وهذا هو كيف يجد sonar tray تطبيقًا مثبتًا باستخدام --dir وكيف يعرف فحص desktop_installed في sonar doctor الإصدار. مصدر البنيات هو desktop.download_base، ويُتجاوز بواسطة SONAR_DESKTOP_BASE ثم بواسطة --base — وجّهها إلى بنيتك الخاصة لاختبار واحدة.

sonar relay

المرحّل هو الجانب الخادمي من sonar: خدمة HTTP صغيرة واحدة، تُدار بواسطتنا للتطبيق المستضاف وتُنشر كـ ghcr.io/raskrebs/sonar-relay حتى تتمكن من تشغيل خاصتك. لا علاقة له بالخفي المحلي — sonar serve يراقب منافذك، بينما sonar relay serve يجيب على HTTP لأسطول — ويُشحن في نفس الملف الثنائي فقط ليكون هناك أثر واحد للنشر.

اليوم يجمع بيانات تتبع مجهولة للمنتج: دفعة من الأحداث المسماة لكل تثبيت، بدون مسارات، بدون أسماء مضيفين، بدون عناوين URL، ويُرفض عند الباب إذا بدت قيمة حتى وكأنها واحدة. إنها نفس الخدمة التي ستنهي لاحقًا الأنفاق المكشوفة وتحتفظ بتسجيل الدخول.```sh sonar relay serve --db ./relay.db --project-keys "$(openssl rand -hex 24)"

`docs/RELAY.md` يحتوي على المسارات، وقواعد التحقق الدقيقة، ومخطط التخزين،
ونشر بأمر واحد خلف Caddy على أي جهاز يعمل بـ Docker.

## الانتقال من الأوامر القديمة

لا تزال أوامر ما قبل المجموعات تعمل وتطبع سطرًا واحدًا على stderr يوضح ما
استبدلها. ستُزال بعد إصدار ثانوي واحد من الآن. `SONAR_NO_HINTS=1`
يكتم الإشعارات، ومخرجات `--json` لا تحملها أبدًا.

| القديم | الجديد |
|---|---|
| `sonar run --tag X -- cmd` | `sonar start --group X -- cmd` |
| `sonar runs` | `sonar start --list` |
| `sonar list --tag X` | `sonar list --group X` |
| `sonar kill-all --filter docker` | `sonar kill --all --filter docker` |
| `sonar down X` | `sonar kill -g X` |
| `sonar profile create X` | `sonar init` |
| `sonar profile show X` | `sonar groups X` |
| `sonar up X` (كان يتحقق من ملف تعريف) | `sonar up X` الآن *يبدأ* المجموعة |
| `sonar tray` (تطبيق شريط قوائم Swift) | `sonar tray` يطلق تطبيق سطح المكتب |

كانت ملفات التعريف لقطة لكل جهاز للمنافذ؛ `.sonar.yaml` يُلتزم مع
المشروع. حوّل واحدًا واقرأه قبل الاحتفاظ به — لا يُكتب شيء نيابةً عنك:```sh
sonar profile list
# check

Since no input content was provided, I cannot perform the translation. Please provide the Markdown content for chunk 103 of 107 so I can translate it from English to Arabic according to the specified rules.```sh sonar profile export my-app > .sonar.yaml

لم يُسجَّل ملف تعريف مطلقًا كيف تبدأ خدمة، لذا يقترح الاقتراح منافذ،
وأسماء، ومسارات فحص الصحة، وتقوم أنت بملء `cmd`.

## استكشاف الأخطاء وإصلاحها

**هناك خطأ ما في الخفي.** استخدم `sonar daemon log -f` أثناء
إعادة إنتاج المشكلة، و`sonar daemon status` لمعرفة pid ووقت التشغيل وعدد عمليات الفحص. أوقفه
باستخدام `sonar daemon stop`؛ كل أمر قراءة يستمر في العمل بدونه.

**"الخفي غير متاح، استخدام فحص مباشر".** لا يوجد شيء يستمع على
المقبس. هذا طبيعي — القراءات لا تبدأ خفيًا. شغّل `sonar serve -d` إذا
كنت تريد واحدًا.

**مقبس متبقٍ من انهيار.** يُظهره `sonar daemon path`؛ بدء
الخفي يزيل المقبس القديم من تلقاء نفسه. إذا رفض خفي ثانٍ البدء بينما
اختفي الأول، فإن `sonar daemon restart` يمسح القفل.

**المنافذ مفقودة من القائمة.** العمليات المملوكة لمستخدم آخر
غير مرئية بدون صلاحيات؛ يوضح sonar ذلك أسفل الجدول. أعد التشغيل باستخدام
`sudo sonar list` لرؤيتها. على Linux، يجب تثبيت `ss`
(`iproute2`)؛ على Windows، يُستخدم `netstat`.

**أمر إيقاف لم يفعل شيئًا.** يتم إيقاف حاويات Docker عبر خفي
Docker: تحقق من `docker ps`. العملية التي تتجاهل SIGTERM تحتاج إلى `-f`، والعملية
التي يشرف عليها شيء آخر (systemd، أو Compose `restart: always`) تعود
بشكل مقصود — أوقف المشرف.

**لا شيء يعمل ولست متأكدًا من السبب.** يفحص `sonar doctor` الملف الثنائي،
والإعدادات، والخفي، وقاعدة البيانات، وكل تكامل دفعة واحدة، ويطبع
الأمر الذي يصلح كل شيء يجده.

**الإبلاغ عن خطأ.** أدرج هذه، بالإضافة إلى الأسطر الأخيرة من `sonar daemon log`:```sh
sonar version
sonar daemon status
sonar doctor --json
# check

المنصات المدعومة

  • macOS (يستخدم lsof)
  • Linux (يستخدم ss)
  • Windows (يستخدم netstat)

يتطلب التجميع دليل العمل لكل عملية، وكل منصة لديها الآن واحد: /proc على Linux، وlsof على macOS، وعلى Windows قراءة لـ PEB الخاص بالعملية نفسها. لذا فإن مجموعات git-root، وproject_root والأسماء المستندة إلى cwd تعمل بنفس الطريقة في كل مكان، ويمكن لـ sonar init اقتراح ملف .sonar.yaml مما يستمع على أي من الثلاثة.

تطبيق سطح المكتب أضيق نطاقًا في الوقت الحالي: sonar install desktop يثبته على macOS (Apple Silicon وIntel) وLinux (x86_64 وaarch64). على Windows، يقول الأمر إن التطبيق غير متوفر بعد ويخرج برمز 1.

الثغرة الوحيدة هي sonar.exe 32-بت على Windows 64-بت: لا يمكنه قراءة ذاكرة عملية 64-بت، لذا تعود تلك المنافذ بدون دليل عمل وتخرج من مجموعة git-root الخاصة بها. استخدم الإصدار 64-بت — فهو يقرأ عمليات 64-بت و32-بت على حد سواء. في أماكن أخرى، المنفذ الذي ترفض عمليته الوصول (خدمة تعمل كمستخدم آخر، عملية نظام محمية) يُترك ببساطة بدون دليل عمل؛ باقي الفحص لا يتأثر.

المساهمون

شكرًا لكل من ساهم في sonar!

الفئات