قائمة تدقيق الإصدار (npm + macOS)
استخدمpnpm (Node 22+) من جذر المستودع. احرص على أن تكون شجرة العمل نظيفة قبل وضع الوسوم/النشر.
مشغل المشغل
عندما يقول المشغّل «release»، نفّذ فورًا فحص ما قبل التنفيذ التالي (من دون أسئلة إضافية إلا إذا وُجد عائق):- اقرأ هذا المستند و
docs/platforms/mac/release.md. - حمّل متغيرات البيئة من
~/.profileوتأكد من ضبطSPARKLE_PRIVATE_KEY_FILE+ متغيرات App Store Connect (يجب أن يوجد SPARKLE_PRIVATE_KEY_FILE في~/.profile). - استخدم مفاتيح Sparkle من
~/Library/CloudStorage/Dropbox/Backup/Sparkleعند الحاجة.
- الإصدار والبيانات الوصفية
- زيادة إصدار
package.json(مثلًا:2026.1.29). - شغّل
pnpm plugins:syncلمواءمة إصدارات حزم الامتدادات + سجلات التغييرات. - حدّث سلاسل CLI/الإصدار:
src/cli/program.tsووكيل مستخدم Baileys فيsrc/provider-web.ts. - أكّد بيانات الحزمة الوصفية (الاسم، الوصف، المستودع، الكلمات المفتاحية، الرخصة) وأن خريطة
binتشير إلىopenclaw.mjsلـopenclaw. - إذا تغيّرت التبعيات، شغّل
pnpm installبحيث تكونpnpm-lock.yamlمُحدَّثة.
- البناء والمُخرجات
- إذا تغيّرت مدخلات A2UI، شغّل
pnpm canvas:a2ui:bundleوثبّت أي تحديثات علىsrc/canvas-host/a2ui/a2ui.bundle.js. -
pnpm run build(يعيد توليدdist/). - تحقّق من أن حزمة npm
filesتتضمن جميع مجلداتdist/*المطلوبة (وخاصةdist/node-host/**وdist/acp/**لعقدة بدون واجهة + ACP CLI). - تأكّد من وجود
dist/build-info.jsonوأنه يتضمن تجزئةcommitالمتوقعة (يستخدمها شعار CLI لتثبيتات npm). - اختياري:
npm pack --pack-destination /tmpبعد البناء؛ افحص محتويات ملف tarball واحتفظ به لإصدار GitHub (لا تقم بتثبيته في المستودع).
- سجل التغييرات والوثائق
- حدّث
CHANGELOG.mdمع أبرز النقاط الموجّهة للمستخدم (أنشئ الملف إن لم يكن موجودًا)؛ حافظ على ترتيب الإدخالات تنازليًا حسب الإصدار. - تأكّد من أن أمثلة README/الأعلام تطابق سلوك CLI الحالي (لا سيما الأوامر أو الخيارات الجديدة).
- التحقّق
-
pnpm build -
pnpm check -
pnpm test(أوpnpm test:coverageإذا كنت تحتاج مخرجات التغطية) -
pnpm release:check(يتحقق من محتويات npm pack) -
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke(اختبار دخاني لتثبيت Docker، المسار السريع؛ مطلوب قبل الإصدار)- إذا كان إصدار npm السابق مباشرةً معروفًا بأنه معطّل، اضبط
OPENCLAW_INSTALL_SMOKE_PREVIOUS=<last-good-version>أوOPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS=1لخطوة preinstall.
- إذا كان إصدار npm السابق مباشرةً معروفًا بأنه معطّل، اضبط
- (اختياري) اختبار دخاني كامل للمُثبّت (يضيف تغطية مستخدم غير الجذر + CLI):
pnpm test:install:smoke - (اختياري) اختبار E2E للمُثبّت (Docker، يشغّل
curl -fsSL https://openclaw.ai/install.sh | bash، يُجري التهيئة الأولية، ثم يشغّل استدعاءات أدوات حقيقية):pnpm test:install:e2e:openai(يتطلبOPENAI_API_KEY)pnpm test:install:e2e:anthropic(يتطلبANTHROPIC_API_KEY)pnpm test:install:e2e(يتطلب كلا المفتاحين؛ يشغّل كلا الموفّرين)
- (اختياري) فحص سريع لبوابة الويب إذا كانت تغييراتك تؤثر في مسارات الإرسال/الاستقبال.
- تطبيق macOS (Sparkle)
- ابنِ تطبيق macOS ووقّعه، ثم اضغطه للتوزيع.
- أنشئ appcast لـ Sparkle (ملاحظات HTML عبر
scripts/make_appcast.sh) وحدّثappcast.xml. - احتفظ بملف zip للتطبيق (وملف dSYM zip الاختياري) جاهزًا للإرفاق بإصدار GitHub.
- اتبع إصدار macOS للأوامر الدقيقة ومتغيرات البيئة المطلوبة.
- يجب أن يكون
APP_BUILDرقميًا وأحادي الزيادة (من دون-beta) حتى يقارن Sparkle الإصدارات بشكل صحيح. - عند التوثيق، استخدم ملف تعريف سلسلة المفاتيح
openclaw-notaryالمُنشأ من متغيرات بيئة واجهة App Store Connect البرمجية (راجع إصدار macOS).
- يجب أن يكون
- النشر (npm)
- تأكيد حالة git نظيفة؛ الالتزام والدفع حسب الحاجة.
-
npm login(تحقّق من 2FA) عند الحاجة. -
npm publish --access public(استخدم--tag betaللإصدارات ما قبل النهائية). - تحقّق من السجل:
npm view openclaw version،npm view openclaw dist-tags، وnpx -y [email protected] --version(أو--help).
استكشاف الأخطاء وإصلاحها (ملاحظات من إصدار 2.0.0-beta2)
- تعليق npm pack/publish أو إنتاج tarball ضخم: يتم سحب حزمة تطبيق macOS في
dist/OpenClaw.app(وحِزَم الإصدار المضغوطة) إلى داخل الحزمة. عالج ذلك عبر إدراج محتويات النشر في القائمة البيضاء باستخدامpackage.jsonfiles(تضمين مجلدات dist الفرعية، والوثائق، و skills؛ واستبعاد حِزَم التطبيقات). أكّد عبرnpm pack --dry-runأنdist/OpenClaw.appغير مُدرج. - حلقة مصادقة npm عبر الويب لوسوم التوزيع: استخدم المصادقة القديمة للحصول على مطالبة OTP:
NPM_CONFIG_AUTH_TYPE=legacy npm dist-tag add [email protected] latest
- فشل التحقق من
npxمعECOMPROMISED: Lock compromised: أعد المحاولة مع ذاكرة تخزين مؤقتة جديدة:NPM_CONFIG_CACHE=/tmp/npm-cache-$(date +%s) npx -y [email protected] --version
- الحاجة إلى إعادة توجيه الوسم بعد إصلاح متأخر: حدّث الوسم قسرًا وادفعه، ثم تأكّد من أن أصول إصدار GitHub ما زالت متطابقة:
git tag -f vX.Y.Z && git push -f origin vX.Y.Z
- إصدار GitHub + appcast
- ضع الوسم وادفعه:
git tag vX.Y.Z && git push origin vX.Y.Z(أوgit push --tags). - أنشئ/حدّث إصدار GitHub لـ
vX.Y.Zبعنوانopenclaw X.Y.Z(وليس الوسم فقط)؛ يجب أن يتضمن المتن قسم سجل التغييرات الكامل لذلك الإصدار (أبرز النقاط + التغييرات + الإصلاحات)، مضمّنًا (من دون روابط مجردة)، ويجب ألا يكرر العنوان داخل المتن. - أرفق المُخرجات: ملف tarball لـ
npm pack(اختياري)، وOpenClaw-X.Y.Z.zip، وOpenClaw-X.Y.Z.dSYM.zip(إن تم توليدهما). - ثبّت وادفع
appcast.xmlالمُحدَّث (تغذّي Sparkle من الفرع main). - من دليل مؤقت نظيف (من دون
package.json)، شغّلnpx -y [email protected] send --helpللتأكد من عمل التثبيت/نقاط دخول CLI. - أعلن/شارك ملاحظات الإصدار.
نطاق نشر الإضافات (npm)
ننشر فقط إضافات npm الموجودة مسبقًا ضمن نطاق@openclaw/*. الإضافات المضمّنة التي ليست على npm تبقى على شجرة القرص فقط (ولا تزال تُشحن ضمن extensions/**).
عملية استخلاص القائمة:
npm search @openclaw --jsonوالتقط أسماء الحزم.- قارن مع أسماء
extensions/*/package.json. - انشر فقط التقاطع (الموجود بالفعل على npm).
- @openclaw/bluebubbles
- @openclaw/diagnostics-otel
- @openclaw/discord
- @openclaw/feishu
- @openclaw/lobster
- @openclaw/matrix
- @openclaw/msteams
- @openclaw/nextcloud-talk
- @openclaw/nostr
- @openclaw/voice-call
- @openclaw/zalo
- @openclaw/zalouser
tlon).