السكربتات
مخرجات JSON، والتدفقات، ورموز الخروج، ومتغيرات البيئة، والتشغيل دون إشراف أو في CI.
مخرجات JSON
مع --json لا يحتوي stdout إلا على JSON بإزاحة مسافتين، بينما تبقى الملاحظات والتقدم على stderr، ولا يُطرح أي سؤال. تطبع القائمة { items, hasMore, nextCursor }، ويُطبع كائن API كما أعادته API، ويطبع الأمر المكتوب يدويًا الكائن الذي تصفه مساعدته.
openemail whoami --json | jq -r .workspaceIdopenemail emails list --status failed --json | jq -r ".items[].id"يذهب الخطأ إلى stderr كسطر JSON واحد، ورمز الخروج هو نفسه الذي كان سيحصل عليه الشخص:
{"error":{"type":"permission_error","code":"insufficient_scope","message":"This API key does not have the domains:write scope.","hint":"The credential is missing a scope this call needs. Use a key that has it, or sign in again with openemail login.","next":null,"status":403,"requestId":"req_7Hc2kQ","param":null,"docUrl":"https://openemail.uk/docs/api/errors#insufficient_scope","exitCode":4}}| الحقل | ما يحتويه |
|---|---|
| type | نوع خطأ API، أو cli_error أو network_error أو internal_error لفشل داخل CLI |
| code | رمز ثابت مثل insufficient_scope أو not_signed_in أو unknown_flag |
| message | ما الذي حدث خطأً، في جملة واحدة |
| hint, next | ما يمكن تجربته، والأمر الذي يُشغَّل بعد ذلك، أو null |
| status, requestId, param, docUrl | من API حين يأتي الخطأ منها، وإلا null |
| exitCode | رمز الخروج الذي تنتهي به العملية |
التدفقات
بعض المخرجات تدفق من كائنات JSON، واحد في كل سطر، كي يعالج خط المعالجة كل عنصر فور وصوله:
- قائمة موارد مع
--allحين لا يكون stdout طرفية، أو مع--ndjson. ويتوقف--max <n>بعد هذا العدد من العناصر. openemail temp watch --json، سطر واحد لكل رسالة جديدة.openemail mcp serve، رسالة JSON-RPC واحدة في كل سطر في كل اتجاه.
openemail contacts list --all > contacts.ndjsonopenemail emails list --status failed --all --max 500 | jq -r .idرموز الخروج
| الرمز | المعنى |
|---|---|
| 0 | تم |
| 1 | فشل غير متوقع، أو خطأ في الخادم، أو إرسال فشل |
| 2 | خطأ استخدام: وسيط خاطئ، أو أمر أو خيار مجهول، أو قيمة أو تأكيد تعذّر طلبه، أو أصل أو مسار لن ترسل إليه CLI بيانات اعتماد |
| 3 | لم يُسجَّل الدخول، أو رُفض تسجيل الدخول أو انتهت صلاحيته أو سُجّل الخروج منه أثناء عمل الأمر |
| 4 | غير مسموح: نطاق أو إذن ناقص، أو رمز تحقق تعذّر طلبه أو موقوف مؤقتًا، أو مفتاح API حيث يلزم تسجيل دخول عبر المتصفح |
| 5 | غير موجود |
| 6 | تعارض مع الحالة الحالية |
| 7 | المُدخل غير صالح |
| 8 | تجاوز حد المعدل، أو استُنفدت حصة الذكاء الاصطناعي |
| 9 | فشلت الشبكة أو انتهت المهلة |
| 10 | أُلغي: رفضت تأكيدًا أو مطالبة |
| 130, 143 | أُوقف عبر Ctrl+C، أو عبر SIGTERM |
متغيرات البيئة
| المتغير | ما تفعله |
|---|---|
| OPENEMAIL_API_KEY | مفتاح API يُستخدم بدلًا من أي ملف شخصي محفوظ |
| OPENEMAIL_PROFILE | الملف الشخصي المحفوظ الذي يُستخدم |
| OPENEMAIL_BASE_URL | أصل API لـ OPENEMAIL_API_KEY و--api-key والأوامر التي لا ترسل بيانات اعتماد. وتسجيل الدخول المحفوظ لا يذهب إلا إلى الـ API الذي سجّل الدخول إليه |
| OPENEMAIL_APP_URL | أصل تطبيق الويب، لتسجيل الدخول وopen وروابط التوثيق |
| OPENEMAIL_CONFIG_DIR | مكان حفظ الملفات الشخصية ورموز الصناديق، وهو ~/.openemail ما لم يُضبط |
| OPENEMAIL_NO_UPDATE_CHECK | عدم البحث في npm عن إصدار أحدث أبدًا. وOPENEMAIL_DISABLE_UPDATE_NOTICE يفعل الشيء نفسه |
| NO_COLOR, FORCE_COLOR=0 | بلا ألوان |
| CI | عدم السؤال أبدًا، وعدم فتح متصفح أبدًا، وعدم البحث عن تحديثات أبدًا. ومعظم خدمات CI تُعرف من دونه |
| VISUAL, EDITOR | المحرر الذي يفتحه send وreply لكتابة الجسم |
التشغيل دون إشراف
لا تطرح CLI أسئلة إلا حين يكون stdin وstdout كلاهما طرفية، ولا ينطبق أي من --json أو --no-input أو CI. وإلا:
- القيمة المطلوبة الناقصة تتوقف برمز الخروج
2وتسمّي الخيار الذي يجب تمريره. - الأمر المدمّر يتوقف بالرسالة
Refusing to run unattended. Pass --yes to confirm.ورمز الخروج2، ما لم تمرّر--yes. - التغيير الذي يحتاج إلى رمز تحقق يتوقف برمز الخروج
4، لأن لا أحد يستطيع كتابته. استخدم مفتاح API، أو شغّلopenemail verifyأولًا.
في CI
امنح المهمة مفتاح API بالنطاقات التي تحتاجها فقط، واحفظه في سرّ، ودع OPENEMAIL_API_KEY يحمله. لا يُحفظ شيء، ولا يُطرح أي سؤال، ولا يجري أي تحقق من التحديثات.
- name: Tell the team env: OPENEMAIL_API_KEY: ${{ secrets.OPENEMAIL_API_KEY }} run: | npx -y @openemail/[email protected] send \ --from [email protected] \ --to [email protected] \ --subject "Deployed ${{ github.sha }}" \ --text "Build ${{ github.run_number }} is live." \ --idempotency-key "deploy-${{ github.run_id }}"ADDRESS=$(npx -y @openemail/[email protected] temp new --ttl 15)./signup-test.sh "$ADDRESS"npx -y @openemail/[email protected] temp watch --first --json | jq -r .snippetnpx -y @openemail/[email protected] temp delete --yesfailed=$(openemail emails list --status failed --json | jq ".items | length")test "$failed" -eq 0مرّر --idempotency-key في أي إرسال قد يعيد خط المعالجة محاولته، واشتقّه مما جعل الإرسال ضروريًا، مثل معرّف التشغيل. عندها تعيد إعادة الخطوة الإرسال الأول بدلًا من الإرسال مرتين.