Plugin SDK reference
إعداد Plugin وتهيئته
مرجع لتحزيم Plugin (بيانات package.json الوصفية)، والبيانات التعريفية (openclaw.plugin.json)، ومداخل الإعداد، ومخططات الإعدادات.
البيانات الوصفية للحزمة
يحتاج ملف package.json إلى حقل openclaw يوضّح لنظام Plugins ما يوفّره Plugin الخاص بك:
Plugin قناة
{ "name": "@myorg/openclaw-my-channel", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", "label": "My Channel", "blurb": "Short description of the channel." } }}Plugin موفّر خدمة / خط أساس ClawHub
{ "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "dependencies": { "typebox": "1.1.39" }, "peerDependencies": { "openclaw": ">=2026.3.24-beta.2" }, "openclaw": { "extensions": ["./index.ts"], "compat": { "pluginApi": ">=2026.3.24-beta.2", "minGatewayVersion": "2026.3.24-beta.2" }, "build": { "openclawVersion": "2026.3.24-beta.2", "pluginSdkVersion": "2026.3.24-beta.2" } }}حقول openclaw
extensionsstring[]ملفات نقاط الدخول (بالنسبة إلى جذر الحزمة). مداخل مصدر صالحة للتطوير ضمن مساحة العمل ونسخ git المستخرجة.
runtimeExtensionsstring[]نظائر JavaScript المبنية للحقل extensions، ويُفضّل استخدامها عندما يحمّل OpenClaw حزمة npm مثبّتة. راجع نقاط دخول SDK لمعرفة ترتيب تحليل المصدر/الناتج المبني.
setupEntrystringمدخل خفيف مخصّص للإعداد فقط (اختياري).
runtimeSetupEntrystringنظير JavaScript المبني للحقل setupEntry. يتطلب ضبط setupEntry أيضًا.
pluginobjectهوية Plugin الاحتياطية { id, label }، وتُستخدم عندما لا يحتوي Plugin على بيانات وصفية لقناة أو موفّر خدمة يمكن اشتقاق معرّف أو تسمية منها.
channelobjectبيانات وصفية لفهرس القنوات لواجهات الإعداد والاختيار والبدء السريع والحالة.
installobjectتلميحات التثبيت: npmSpec، وlocalPath، وdefaultChoice، وminHostVersion، وexpectedIntegrity، وallowInvalidConfigRecovery، وrequiredPlatformPackages.
startupobjectعلامات سلوك بدء التشغيل.
compatobjectنطاق إصدار pluginApi الذي يدعمه Plugin هذا. مطلوب للنشر الخارجي على ClawHub.
openclaw.channel
يمثّل openclaw.channel بيانات وصفية خفيفة للحزمة، تُستخدم لاكتشاف القنوات وواجهات الإعداد قبل تحميل بيئة التشغيل.
| الحقل | النوع | معناه |
|---|---|---|
id |
string |
معرّف القناة القياسي. |
label |
string |
التسمية الأساسية للقناة. |
selectionLabel |
string |
تسمية الاختيار/الإعداد عندما ينبغي أن تختلف عن label. |
detailLabel |
string |
تسمية تفاصيل ثانوية لفهارس القنوات وواجهات الحالة الأكثر ثراءً. |
docsPath |
string |
مسار التوثيق لروابط الإعداد والاختيار. |
docsLabel |
string |
تسمية بديلة تُستخدم لروابط التوثيق عندما ينبغي أن تختلف عن معرّف القناة. |
blurb |
string |
وصف موجز للتهيئة الأولية/الفهرس. |
order |
number |
ترتيب الفرز في فهارس القنوات. |
aliases |
string[] |
أسماء بديلة إضافية للبحث عند اختيار القناة. |
preferOver |
string[] |
معرّفات Plugins/القنوات ذات الأولوية الأدنى التي ينبغي أن تتفوق عليها هذه القناة. |
systemImage |
string |
اسم اختياري لأيقونة/صورة نظام في فهارس واجهة مستخدم القنوات. |
selectionDocsPrefix |
string |
نص بادئة قبل روابط التوثيق في واجهات الاختيار. |
selectionDocsOmitLabel |
boolean |
عرض مسار التوثيق مباشرةً بدلًا من رابط توثيق ذي تسمية في نص الاختيار. |
selectionExtras |
string[] |
نصوص قصيرة إضافية تُلحق بنص الاختيار. |
markdownCapable |
boolean |
يشير إلى أن القناة تدعم Markdown لاتخاذ قرارات تنسيق الرسائل الصادرة. |
exposure |
object |
عناصر التحكم في ظهور القناة ضمن الإعداد والقوائم المضبوطة وواجهات التوثيق. |
quickstartAllowFrom |
boolean |
تضمين هذه القناة في مسار إعداد allowFrom القياسي للبدء السريع. |
forceAccountBinding |
boolean |
اشتراط ربط صريح بالحساب حتى عند وجود حساب واحد فقط. |
preferSessionLookupForAnnounceTarget |
boolean |
تفضيل البحث في الجلسة عند تحليل أهداف الإعلانات لهذه القناة. |
مثال:
{ "openclaw": { "channel": { "id": "my-channel", "label": "My Channel", "selectionLabel": "My Channel (self-hosted)", "detailLabel": "My Channel Bot", "docsPath": "/channels/my-channel", "docsLabel": "my-channel", "blurb": "Webhook-based self-hosted chat integration.", "order": 80, "aliases": ["mc"], "preferOver": ["my-channel-legacy"], "selectionDocsPrefix": "Guide:", "selectionExtras": ["Markdown"], "markdownCapable": true, "exposure": { "configured": true, "setup": true, "docs": true }, "quickstartAllowFrom": true } }}يدعم exposure ما يلي:
configured: تضمين القناة في واجهات القوائم المضبوطة/المشابهة للحالةsetup: تضمين القناة في منتقيات الإعداد/الضبط التفاعليةdocs: الإشارة إلى أن القناة موجّهة للجمهور في واجهات التوثيق/التنقل
openclaw.install
يمثّل openclaw.install بيانات وصفية للحزمة، وليس للبيان التعريفي.
| الحقل | النوع | معناه |
|---|---|---|
clawhubSpec |
string |
مواصفة ClawHub القياسية لمسارات التثبيت/التحديث والتثبيت عند الطلب أثناء التهيئة الأولية. |
npmSpec |
string |
مواصفة npm القياسية لمسارات التثبيت/التحديث الاحتياطية. |
localPath |
string |
مسار التطوير المحلي أو التثبيت المضمّن. |
defaultChoice |
"clawhub" | "npm" | "local" |
مصدر التثبيت المفضّل عند توفر مصادر متعددة. |
minHostVersion |
string |
أدنى إصدار مدعوم من OpenClaw، بصيغة >=x.y.z أو >=x.y.z-prerelease. |
expectedIntegrity |
string |
سلسلة سلامة توزيعة npm المتوقعة، وعادةً sha512-...، للتثبيتات المثبّتة الإصدار. |
allowInvalidConfigRecovery |
boolean |
يتيح لمسارات إعادة تثبيت Plugin مضمّن التعافي من حالات محددة لفشل الإعدادات القديمة. |
requiredPlatformPackages |
string[] |
أسماء npm البديلة المطلوبة الخاصة بالمنصة التي يجري التحقق منها أثناء تثبيت npm. |
سلوك التهيئة الأولية
تستخدم التهيئة الأولية التفاعلية openclaw.install لواجهات التثبيت عند الطلب: إذا كان Plugin الخاص بك يعرض خيارات مصادقة موفّر الخدمة أو بيانات إعداد/فهرس القنوات قبل تحميل بيئة التشغيل، فيمكن للتهيئة الأولية مطالبة المستخدم بالتثبيت من ClawHub أو npm أو محليًا، ثم تثبيت Plugin أو تمكينه، ثم متابعة المسار المحدد. تستخدم خيارات ClawHub الحقل clawhubSpec وتُفضّل عند وجوده؛ وتتطلب خيارات npm بيانات وصفية موثوقة للفهرس تتضمن npmSpec من السجل (الإصدارات الدقيقة وexpectedIntegrity قيود اختيارية، ويُفرض تطبيقها عند التثبيت/التحديث عند ضبطها). احتفظ بتفاصيل «ما يجب عرضه» في openclaw.plugin.json و«كيفية تثبيته» في package.json.
فرض minHostVersion
إذا ضُبط minHostVersion، فسيُفرض عند التثبيت وعند تحميل سجل البيانات التعريفية غير المضمّنة. تتخطى المضيفات الأقدم Plugins الخارجية، وتُرفض سلاسل الإصدارات غير الصالحة. يُفترض أن Plugins المصدر المضمّنة تستخدم الإصدار نفسه لنسخة المضيف المستخرجة.
تثبيتات npm المثبّتة الإصدار
بالنسبة إلى تثبيتات npm المثبّتة الإصدار، احتفظ بالإصدار الدقيق في npmSpec وأضف سلامة العنصر البرمجي المتوقعة:
{ "openclaw": { "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}نطاق allowInvalidConfigRecovery
لا يمثّل allowInvalidConfigRecovery تجاوزًا عامًا للإعدادات المعطّلة. فهو مخصّص فقط للتعافي المحدود لـ Plugin مضمّن، إذ يسمح لإعادة التثبيت/الإعداد بإصلاح بقايا معروفة من الترقيات، مثل فقدان مسار Plugin مضمّن أو وجود إدخال channels.<id> قديم لـ Plugin نفسه. إذا كانت الإعدادات معطّلة لأسباب غير مرتبطة، فسيظل التثبيت يفشل وفق نهج الإغلاق الآمن، ويطلب من المشغّل تشغيل openclaw doctor --fix.
تأجيل التحميل الكامل
يمكن لـ Plugins القنوات الاشتراك في التحميل المؤجّل باستخدام:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}عند تمكينه، يحمّل OpenClaw الحقل setupEntry فقط خلال مرحلة بدء التشغيل السابقة للاستماع، حتى للقنوات المضبوطة مسبقًا. ويُحمّل المدخل الكامل بعد أن يبدأ Gateway الاستماع.
إذا كان مدخل الإعداد/المدخل الكامل يسجّل أساليب RPC في Gateway، فاحتفظ بها ضمن بادئة خاصة بـ Plugin. تظل نطاقات إدارة النواة المحجوزة (config.*، وexec.approvals.*، وwizard.*، وupdate.*) مملوكة للنواة، وتُطبّع دائمًا إلى operator.admin.
بيان Plugin التعريفي
يجب أن يوفّر كل Plugin أصلي ملف openclaw.plugin.json في جذر الحزمة. يستخدم OpenClaw هذا الملف للتحقق من صحة الإعدادات دون تنفيذ شيفرة Plugin.
{ "id": "my-plugin", "name": "My Plugin", "description": "Adds My Plugin capabilities to OpenClaw", "configSchema": { "type": "object", "additionalProperties": false, "properties": { "webhookSecret": { "type": "string", "description": "Webhook verification secret" } } }}بالنسبة إلى Plugins القنوات، أضف channels (وتضيف Plugins المزوّدات providers):
{ "id": "my-channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}حتى Plugins التي لا تحتوي على إعدادات يجب أن توفّر مخططًا. المخطط الفارغ صالح:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}راجع بيان Plugin للاطلاع على مرجع المخطط الكامل.
النشر على ClawHub
تستخدم حزم Skills وPlugins أوامر نشر منفصلة في ClawHub. بالنسبة إلى حزم Plugins، استخدم الأمر الخاص بالحزم:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginمدخل الإعداد
يُعد setup-entry.ts بديلًا خفيفًا لـ index.ts، ويحمّله OpenClaw عندما يحتاج فقط إلى واجهات الإعداد (التهيئة الأولية، وإصلاح الإعدادات، وفحص القنوات المعطّلة):
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);يؤدي ذلك إلى تجنّب تحميل شيفرة وقت التشغيل الثقيلة (مكتبات التشفير، وتسجيلات CLI، وخدمات الخلفية) أثناء تدفقات الإعداد.
يمكن لقنوات مساحة العمل المضمّنة التي تحتفظ بصادرات آمنة للإعداد في وحدات جانبية استخدام defineBundledChannelSetupEntry(...) من openclaw/plugin-sdk/channel-entry-contract بدلًا من defineSetupPluginEntry(...). يدعم هذا العقد المضمّن أيضًا تصدير runtime اختياريًا، بحيث تظل توصيلات وقت التشغيل في أثناء الإعداد خفيفة وصريحة.
متى يستخدم OpenClaw setupEntry بدلًا من المدخل الكامل
- تكون القناة معطّلة، لكنها تحتاج إلى واجهات الإعداد أو التهيئة الأولية.
- تكون القناة مفعّلة، لكنها غير مضبوطة.
- يكون التحميل المؤجّل مفعّلًا (
deferConfiguredChannelFullLoadUntilAfterListen).
ما يجب أن يسجّله setupEntry
- كائن Plugin القناة (عبر
defineSetupPluginEntry). - أي مسارات HTTP مطلوبة قبل بدء Gateway الاستماع.
- أي أساليب Gateway مطلوبة أثناء بدء التشغيل.
يجب أن تظل أساليب Gateway الخاصة ببدء التشغيل هذه متجنّبة لمساحات أسماء الإدارة الأساسية المحجوزة، مثل config.* أو update.*.
ما يجب ألّا يتضمنه setupEntry
- تسجيلات CLI.
- خدمات الخلفية.
- استيرادات وقت التشغيل الثقيلة (التشفير، وحِزم SDK).
- أساليب Gateway التي لا تكون مطلوبة إلا بعد بدء التشغيل.
استيرادات مساعد الإعداد المحدودة
بالنسبة إلى المسارات السريعة الخاصة بالإعداد فقط، فضّل واجهات مساعد الإعداد المحدودة على الواجهة الشاملة الأوسع plugin-sdk/setup عندما لا تحتاج إلا إلى جزء من واجهة الإعداد:
| مسار الاستيراد | استخدامه | الصادرات الرئيسية |
|---|---|---|
plugin-sdk/setup-runtime |
مساعدات وقت التشغيل في أثناء الإعداد التي تظل متاحة في setupEntry / بدء تشغيل القناة المؤجّل |
createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
اسم بديل متوافق مهمل؛ استخدم plugin-sdk/setup-runtime |
createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
مساعدات CLI والأرشيف والمستندات الخاصة بالإعداد والتثبيت | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
استخدم الواجهة الأوسع plugin-sdk/setup عندما تريد مجموعة أدوات الإعداد المشتركة الكاملة، بما في ذلك مساعدات تصحيح الإعدادات مثل moveSingleAccountChannelSectionToDefaultAccount(...).
استخدم createSetupTranslator(...) للنصوص الثابتة في معالج الإعداد. فهو يتبع لغة معالج CLI (OPENCLAW_LOCALE، ثم متغيرات لغة النظام)، ويعود إلى الإنجليزية عند التعذّر. احتفظ بنصوص الإعداد الخاصة بكل Plugin داخل الشيفرة التي يملكها ذلك Plugin، واستخدم مفاتيح الكتالوج المشتركة فقط لتسميات الإعداد العامة، ونصوص الحالة، ونصوص إعداد Plugins الرسمية المضمّنة.
تظل محوّلات تصحيح الإعداد آمنة عند استيرادها في المسار السريع. ويكون البحث في واجهة عقد ترقية الحساب الفردي المضمّنة كسولًا، لذا لا يؤدي استيراد plugin-sdk/setup-runtime إلى تحميل اكتشاف واجهة العقد المضمّنة مسبقًا قبل استخدام المحوّل فعليًا.
ترقية الحساب الفردي المملوكة للقناة
عندما تنتقل قناة من إعداد علوي لحساب فردي إلى channels.<id>.accounts.*، ينقل السلوك المشترك الافتراضي القيم المرقّاة الخاصة بالحساب إلى accounts.default.
يمكن للقنوات المضمّنة تضييق نطاق هذه الترقية أو تجاوزها عبر واجهة عقد الإعداد الخاصة بها:
singleAccountKeysToMove: مفاتيح علوية إضافية يجب نقلها إلى الحساب المرقّىnamedAccountPromotionKeys: عندما تكون الحسابات المسماة موجودة بالفعل، تُنقل هذه المفاتيح فقط إلى الحساب المرقّى؛ وتبقى مفاتيح السياسة والتسليم المشتركة في جذر القناةresolveSingleAccountPromotionTarget(...): اختيار الحساب الموجود الذي يتلقى القيم المرقّاة
مخطط الإعدادات
يُتحقق من صحة إعدادات Plugin وفق JSON Schema الموجود في البيان. يضبط المستخدمون Plugins عبر:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}يتلقى Plugin هذه الإعدادات بوصفها api.pluginConfig أثناء التسجيل.
بالنسبة إلى الإعدادات الخاصة بالقناة، استخدم قسم إعدادات القناة بدلًا من ذلك:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}إنشاء مخططات إعدادات القنوات
استخدم buildChannelConfigSchema لتحويل مخطط Zod إلى غلاف ChannelConfigSchema المستخدم في عناصر الإعدادات التي يملكها Plugin:
const accountSchema = z.object({ token: z.string().optional(), allowFrom: z.array(z.string()).optional(), accounts: z.object({}).catchall(z.any()).optional(), defaultAccount: z.string().optional(),}); const configSchema = buildChannelConfigSchema(accountSchema);إذا كنت تنشئ العقد أصلًا بصيغة JSON Schema أو TypeBox، فاستخدم المساعد المباشر لكي يتمكن OpenClaw من تجاوز التحويل من Zod إلى JSON Schema في مسارات البيانات الوصفية:
const configSchema = buildJsonChannelConfigSchema( Type.Object({ token: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), }),);بالنسبة إلى Plugins التابعة لجهات خارجية، يظل عقد المسار البارد هو بيان Plugin: انسخ JSON Schema المُنشأ إلى openclaw.plugin.json#channelConfigs بحيث تتمكن واجهات مخطط الإعدادات والإعداد وواجهة المستخدم من فحص channels.<id> دون تحميل شيفرة وقت التشغيل.
معالجات الإعداد
يمكن لـ Plugins القنوات توفير معالجات إعداد تفاعلية للأمر openclaw onboard. المعالج هو كائن ChannelSetupWizard في ChannelPlugin:
const setupWizard: ChannelSetupWizard = { channel: "my-channel", status: { configuredLabel: "Connected", unconfiguredLabel: "Not configured", resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token), }, credentials: [ { inputKey: "token", providerHint: "my-channel", credentialLabel: "Bot token", preferredEnvVar: "MY_CHANNEL_BOT_TOKEN", envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?", keepPrompt: "Keep current token?", inputPrompt: "Enter your bot token:", inspect: ({ cfg, accountId }) => { const token = (cfg.channels as any)?.["my-channel"]?.token; return { accountConfigured: Boolean(token), hasConfiguredValue: Boolean(token), }; }, }, ],};يدعم ChannelSetupWizard أيضًا textInputs وdmPolicy وallowFrom وgroupAccess وprepare وfinalize وغير ذلك. راجع src/setup-core.ts الخاص بـ Plugin Discord للاطلاع على مثال مضمّن كامل.
مطالبات allowFrom المشتركة
بالنسبة إلى مطالبات قائمة السماح للرسائل المباشرة التي لا تحتاج إلا إلى التدفق القياسي note -> prompt -> parse -> merge -> patch، فضّل مساعدات الإعداد المشتركة من openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...) وcreateTopLevelChannelParsedAllowFromPrompt(...) وcreateNestedChannelParsedAllowFromPrompt(...).
حالة إعداد القناة القياسية
بالنسبة إلى كتل حالة إعداد القناة التي لا تختلف إلا في التسميات والدرجات والأسطر الإضافية الاختيارية، فضّل createStandardChannelSetupStatus(...) من openclaw/plugin-sdk/setup بدلًا من إنشاء كائن status نفسه يدويًا في كل Plugin.
واجهة إعداد القناة الاختيارية
بالنسبة إلى واجهات الإعداد الاختيارية التي يجب أن تظهر فقط في سياقات معينة، استخدم createOptionalChannelSetupSurface من openclaw/plugin-sdk/channel-setup:
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup"; const setupSurface = createOptionalChannelSetupSurface({ channel: "my-channel", label: "My Channel", npmSpec: "@myorg/openclaw-my-channel", docsPath: "/channels/my-channel",});// Returns { setupAdapter, setupWizard }يوفّر plugin-sdk/channel-setup أيضًا أداتي الإنشاء منخفضتي المستوى createOptionalChannelSetupAdapter(...) وcreateOptionalChannelSetupWizard(...) عندما لا تحتاج إلا إلى نصف واحد من واجهة التثبيت الاختيارية هذه.
تتعطل الواجهة الاختيارية/المعالج الاختياري المُنشآن بصورة آمنة عند إجراء عمليات كتابة فعلية للإعدادات. ويعيدان استخدام رسالة واحدة تفيد بضرورة التثبيت عبر validateInput وapplyAccountConfig وfinalize، ويضيفان رابطًا للوثائق عندما تكون docsPath معيّنة.
مساعدات الإعداد المدعومة بملفات ثنائية
بالنسبة إلى واجهات الإعداد المدعومة بملفات ثنائية، يُفضّل استخدام المساعدات المشتركة المفوّضة بدلًا من نسخ منطق الملف الثنائي/الحالة نفسه إلى كل قناة:
createDetectedBinaryStatus(...)لكتل الحالة التي لا تختلف إلا في التسميات والتلميحات والدرجات واكتشاف الملف الثنائيcreateCliPathTextInput(...)لمدخلات النص المستندة إلى مسارcreateDelegatedSetupWizardStatusResolvers(...)وcreateDelegatedPrepare(...)وcreateDelegatedFinalize(...)وcreateDelegatedResolveConfigured(...)عندما يحتاجsetupEntryإلى إعادة التوجيه إلى معالج كامل أثقل بطريقة كسولةcreateDelegatedTextInputShouldPrompt(...)عندما يحتاجsetupEntryفقط إلى تفويض قرارtextInputs[*].shouldPrompt
النشر والتثبيت
الإضافات الخارجية: انشرها على ClawHub، ثم ثبّتها:
npm
openclaw plugins install @myorg/openclaw-my-pluginتُثبَّت مواصفات الحزم المجرّدة من npm أثناء الانتقال عند التشغيل، ما لم يتطابق الاسم مع معرّف إضافة مضمّنة أو رسمية، وعندئذٍ يستخدم OpenClaw تلك النسخة المحلية/الرسمية بدلًا منها. استخدم clawhub: أو npm: أو git: أو npm-pack: لاختيار المصدر بصورة حتمية — راجع إدارة الإضافات.
ClawHub فقط
openclaw plugins install clawhub:@myorg/openclaw-my-pluginمواصفة حزمة npm
استخدم npm عندما لا تكون الحزمة قد انتقلت إلى ClawHub بعد، أو عندما تحتاج إلى مسار تثبيت مباشر من npm أثناء الترحيل:
openclaw plugins install npm:@myorg/openclaw-my-pluginالإضافات داخل المستودع: ضعها ضمن شجرة مساحة عمل الإضافات المضمّنة؛ إذ تُكتشف تلقائيًا أثناء البناء.
بيانات تعريف الحزم المضمّنة صريحة، ولا تُستنتج من JavaScript المبني عند بدء تشغيل Gateway. تنتمي اعتماديات وقت التشغيل إلى حزمة الإضافة المالكة لها؛ ولا يُصلح تشغيل OpenClaw المعبّأ اعتماديات الإضافات ولا يعكسها مطلقًا.
ذو صلة
- إنشاء الإضافات — دليل بدء تدريجي خطوة بخطوة
- بيان الإضافة — مرجع مخطط البيان الكامل
- نقاط دخول SDK —
definePluginEntryوdefineChannelPluginEntry