مرجع الأداة
كل أمر في @dukkan.one/cli للثيمات والتطبيقات مع خياراته، ورموز الخروج، ومخرجاته، وملفاته، ومتغيرات البيئة، وحلّ المشكلات.
في هذه الصفحة
الحزمة @dukkan.one/cli هي سطر أوامر مطوّري دكان للثيمات والتطبيقات؛ الأمر الثنائي dukkan. تتطلب Node.js 18.17 أو أحدث، وتعمل على متجر تجريبي واحد فقط ولا تلمس أي متجر حقيقي. ما زالت @dukkan.one/theme-cli تُثبَّت وتحوّل إليها مع تنبيه إهمال؛ انقل سكربتاتك إلى الاسم الجديد.
npx @dukkan.one/cli COMMAND
# or, after a global install: dukkan COMMANDرموز الخروج#
| الرمز | المعنى |
|---|---|
0 |
نجاح |
1 |
أي فشل: خطأ تحقّق، أو رفض من الخادم، أو انتهاء مهلة تسجيل الدخول، أو خطأ غير متوقّع |
كل رسالة فشل تبدأ بـ ✗، والنجاح بـ ✓، والتحذير بـ !.
login#
npx @dukkan.one/cli loginتسجيل دخول بتدفق رمز الجهاز (RFC 8628):
Open: https://developer.dukkan.one/cli/authorize?code=DKN-7RX2MK
Code: DKN-7RX2MK
Waiting for approval in the portal…
✓ Signed in. The CLI can now push themes to your sandbox store.- الرمز بصيغة
DKN-XXXXXXمن الحروف والأرقام غير الملتبسة (BCDFGHJKMNPQRSTVWXYZ23456789)، وصالح 10 دقائق. - تفتح الرابط، تؤكّد الرمز، وتختار المتجر التجريبي. تستطلع الأداة البوابة كل 5 ثوانٍ (وتزيد ثانيتين عند
slow_down). - ينتج زوج رموز
dk_cli_at_(ساعة) وdk_cli_rt_(30 يوماً) مربوط بذلك المتجر التجريبي، ويُجدَّد تلقائياً عند401؛ إعادة استخدام رمز تحديث قديم تلغي السلسلة.
| الرسالة | السبب |
|---|---|
✗ could not start sign-in (STATUS) |
البوابة لم تصدر رمز جهاز؛ تحقّق من DUKKAN_PORTAL_URL |
✗ sign-in was denied in the portal. |
رفضت الطلب في البوابة |
✗ sign-in timed out. Run dukkan login again. |
انقضت 10 دقائق دون تأكيد |
✗ sign-in failed (expired_token) |
تجاوز الاستطلاع 200 مرة أو انتهى الرمز |
✗ Not signed in. Run: dukkan login |
لا ملف اعتمادات |
✗ Session expired. Run: dukkan login |
فشل تجديد الرمز (سلسلة ملغاة أو متجر تجريبي منتهٍ) |
أخطاء الخادم 5xx أثناء الاستطلاع لا تُنهي التسجيل؛ تتراجع الأداة حتى 15 ثانية وتواصل حتى انتهاء الرمز.
أوامر الثيمات#
لم تتغيّر عن @dukkan.one/theme-cli؛ الدليل الكامل في ابنِ ثيماً.
theme init [dir]#
npx @dukkan.one/cli theme init my-themeينشئ 4 ملفات: layout/theme.liquid وtemplates/home.liquid وconfig/settings_schema.json وlocales/ar.json. يطبع ✓ Starter theme created (4 files).
تحذير
في الإصدار 0.1.0 يستخدم الهيكل المولَّد صيغة قديمة لا يدعمها المحرّك؛ استبدله بالزوج الصحيح من ابنِ ثيماً قبل أول معاينة.
theme check [dir] [--remote]#
npx @dukkan.one/cli theme check
npx @dukkan.one/cli theme check --remoteيتحقّق من المجلد محلياً بالشيفرة نفسها التي يطبّقها الخادم عند الدفع، ويطبع ✓ Bundle valid — N files, hash … أو قائمة ✗. مع --remote يرسل الحزمة إلى POST /theme-api/v1/theme/check لتصيير تجريبي (يتطلب تسجيل دخول) ويطبع ✓ Server sandbox render passed.. القواعد ونصوص الأخطاء في فحص الثيم. لا يحتاج الفحص المحلي إلى تسجيل دخول.
theme push [dir] [--name <name>]#
npx @dukkan.one/cli theme push --name "Damascus Gold"يتحقّق محلياً ثم يرسل الحزمة إلى PUT /theme-api/v1/theme/draft. كل محتوى جديد يصبح إصداراً ثابتاً ببصمة تجزئة ويُثبَّت مسودةً للمتجر التجريبي؛ الحزمة المطابقة لا تنشئ شيئاً.
✓ Pushed version 7 (3f9a1c2b7d4e…)
✓ No changes — version 7 already on the server.--nameاسم العرض (حتى 80 حرفاً)؛ الافتراضيExternal theme. الاسم في الإدراج المراجَع هو ما يراه التاجر.- هوية الثيم تُشتق على الخادم من المتجر التجريبي (
sandbox-<id>)؛ متجر تجريبي واحد لكل ثيم. - رفض الخادم يظهر كـ
✗ Theme bundle rejected — {"errors":[…]}.
theme pull [dir]#
npx @dukkan.one/cli theme pull ./restoredينزّل مسودة المتجر التجريبي الحالية ويطبع ✓ Pulled N files (version …). ترفض الأداة أي مسار يخرج عن المجلد الهدف.
theme dev [dir]#
npx @dukkan.one/cli theme devيدفع مرة، يطلب رابط معاينة من POST /theme-api/v1/theme/preview، ثم يراقب المجلد ويدفع عند كل تغيير:
✓ Version 7 live in preview:
https://dukkan.one/stores/YOUR_SANDBOX_SLUG?__preview=TOKEN
Watching for changes — Ctrl+C to stop.
✓ 14:05:12 version 8 — https://dukkan.one/stores/YOUR_SANDBOX_SLUG?__preview=NEW_TOKENيصلح رابط المعاينة 24 ساعة ويُبطَل تلقائياً عندما تتغيّر المسودة (draft_rev)، فتطبع الأداة رابطاً جديداً بعد كل دفعة مغيّرة فقط. التغييرات المتلاحقة تُدمج؛ الدفعة الفاشلة تطبع ✗ وتستمر المراقبة.
أوامر التطبيقات#
تبني أوامر app تطبيق دكان على @dukkan.one/app-sdk وتشغّله وتضبطه على متجرك التجريبي. تعدّل مسودات الإصدارات فقط، ولا تفعّل إصداراً أبداً، ولا تتعامل مع أسرار توقيع Webhooks أبداً. يقبل كل أمر --json لكائن JSON واحد في كل سطر بلا رموز.
app init [dir]#
npx @dukkan.one/cli app init my-appينشئ هيكل تطبيق Nuxt 4 على @dukkan.one/nuxt: ملف dukkan.app.toml و.env.example وserver/dukkan.ts وصفحة هبوط بحالات التاجر (متصل، إعادة الاتصال، مُزال، غير مثبّت) وقائمة إعداد للمطوّر. يسأل عن الاسم والقالب والنطاقات؛ ولكل سؤال راية للسكربتات.
| الخيار | المعنى |
|---|---|
-t, --template <name> |
nuxt-minimal (التثبيتات في الذاكرة، مناسب لأول تشغيل) أو nuxt-postgres (رموز مختومة، وصندوق وارد دائم، وترحيل) |
-n, --name <name> |
اسم العرض |
-s, --scopes <list> |
نطاقات مفصولة بفواصل؛ الافتراضي orders:read |
-p, --port <port> |
منفذ خادم التطوير المكتوب في الملف؛ الافتراضي 3000 |
-y, --yes |
قبول الافتراضيات بلا أسئلة |
✓ Created my-app in /home/dev/my-app (14 files, template nuxt-minimal).
Next:
cd my-app && npm install
cp .env.example .env # then fill in the client secret from the portal
dukkan login # once, binds the CLI to your sandbox store
dukkan app dev # tunnel, install link, live eventsطلب clients:read يطبع تحذيراً: تتطلب البوابة قبول اتفاقية معالجة البيانات قبل أن تحمله مسودة (النطاقات).
app list#
npx @dukkan.one/cli app listتطبيقات فريقك مع أرقام إصدارات المسودة والنشط ومعرّفاتها. المعرّف هو ما يأخذه --app؛ وتتذكره الأوامر في .dukkan/state.json بعد أول استخدام.
app config pull وapp config push#
npx @dukkan.one/cli app config pull
npx @dukkan.one/cli app config pushيكتب pull مسودة إصدار البوابة (أو الإصدار النشط عندما لا توجد مسودة) في dukkan.app.toml، بما فيها app.client_id. ويرسل push الملف إلى المسودة: ينشئها عندما لا توجد، ويطبع الفرق، ويسأل قبل إزالة نطاق، ولا يفعّل أبداً. تعرض البوابة الإصدار بعدها على أنه يُدار من الملف. القواعد وتنبيه الاختلاف و--force في ملف dukkan.app.toml.
| الخيار | المعنى |
|---|---|
-a, --app <id> |
التطبيق، عندما لم يُستخدم المجلد من قبل |
-f, --force |
في push فقط: استبدال مسودة عُدّلت في البوابة منذ آخر سحب |
-y, --yes |
في push فقط: تأكيد إزالة النطاقات بلا سؤال |
Updating draft version 4 of Order notifier:
+ scope: orders:write
- topic: product.updated
✓ Updated draft version 4; the portal now shows it as managed by dukkan.app.toml.
Make it active in the portal when ready: https://developer.dukkan.one/dashboard/apps/APP_IDapp dev [dir]#
npx @dukkan.one/cli app devيشغّل التطبيق، ويفتح نفق cloudflared سريعاً، ويسجّل جلسة تطوير في البوابة (رابط إعادة التوجيه ونقطة نهاية النفق، صالحة 8 ساعات على الأكثر، للمتجر التجريبي فقط)، ويخبر التطبيق العامل برابطه العام، ويطبع رابط تثبيت لمتجرك التجريبي، ثم يبثّ كل تسليم للمتجر التجريبي حتى Ctrl+C. تُحذف الجلسة عند الخروج. الشرح الكامل في البداية السريعة.
| الخيار | المعنى |
|---|---|
-a, --app <id> |
التطبيق |
-p, --port <port> |
منفذ خادم التطوير؛ الافتراضي من dukkan.app.toml |
--tunnel-url <url> |
استخدام هذا الرابط العام HTTPS بدلاً من تشغيل cloudflared |
--no-tunnel |
بلا رابط عام؛ لا تصل Webhooks إلى التطبيق (استخدم webhook trigger --local) |
--command <cmd> |
الأمر الذي يشغّل التطبيق؛ الافتراضي npx nuxi dev --port <port> |
--no-app |
عدم تشغيل التطبيق؛ الالتحاق بواحد يعمل أصلاً على المنفذ |
✓ 14:05:12 order.created 9f3a1c2b 200 test
✗ 14:06:40 order.paid 0b7e55d1 500كل سطر تسليم: رمز الحالة، والوقت، والموضوع، وأول 8 أحرف من معرّف الحدث، وحالة الاستجابة التي أجاب بها تطبيقك (أو رمز خطأ المنصّة)، وtest للتجارب. تعني 500 أن معالجك أطلق خطأ؛ تعيد المنصّة المحاولة وفق جدولها.
| الرسالة | السبب |
|---|---|
✗ Fix the configuration above (.env), then run dukkan app dev again. |
أقلع التطبيق لكنه أبلغ عن متغيرات ناقصة؛ تسمّيها الأسطر أعلاه |
✗ The app did not answer on http://localhost:3000/_dukkan/dev/status |
التطبيق ليس على @dukkan.one/nuxt، أو استغرق أكثر من 90 ثانية للإقلاع |
cloudflared غير موجود |
ثبّته، أو مرّر --tunnel-url |
app webhook trigger <topic>#
npx @dukkan.one/cli app webhook trigger order.createdيطلب من المنصّة إطلاق تجربة موقّعة واحدة للموضوع إلى التطبيق العامل، عبر صندوق الصادر وعامل التسليم الحقيقيين، بعيّنة مبنية من بيانات متجرك التجريبي المزروعة. المتاجر التجريبية فقط؛ ويجب أن يتضمن الاشتراك الموضوع. لا ترى الأداة سر التوقيع أبداً.
| الخيار | المعنى |
|---|---|
-p, --port <port> |
منفذ التطبيق العامل |
-i, --install <id> |
التثبيت، عندما يعرف التطبيق عدة تثبيتات |
-d, --data <file> |
ملف JSON بقيم تُدمج فوق الحمولة العيّنة |
--local |
توقيع عيّنة محلياً وإرسالها مباشرة إلى التطبيق، من دون اتصال |
--secret <secret> و--store <id> |
سر التوقيع ومعرّف المتجر لـ --local |
✓ order.created queued as event 9f3a1c2b… (1 delivery). Watch it arrive in `dukkan app dev`.
→ https://lively-otter-1234.trycloudflare.com/dukkan/webhooks (delivery 4c1d9e0a…)--local موجود لاختبارات الوحدة غير المتصلة لمعالجك: تمرّر السر الذي خزّنه تطبيقك فيتحقق التسليم، لكن لا شيء يمرّ عبر المنصّة.
app logs#
npx @dukkan.one/cli app logs --followتاريخ تسليمات تطبيقك على متجرك التجريبي، الأحدث أولاً، بصيغة الأسطر نفسها في app dev. يواصل --follow المتابعة، ويحدد -n, --limit <n> عدد الأسطر (الافتراضي 30)، ويبدأ --since <iso> بعد لحظة معيّنة.
الملفات#
| المسار | المحتوى |
|---|---|
~/.config/dukkan/credentials.json |
الاعتمادات، بصلاحيات 0600 داخل مجلد 0700 |
.dukkan/state.json في مجلد التطبيق |
معرّف التطبيق وبصمة آخر dukkan.app.toml مزامَن؛ آمن للإيداع |
{
"portal_url": "https://developer.dukkan.one",
"api_url": "https://dukkan.one",
"access_token": "dk_cli_at_REDACTED",
"refresh_token": "dk_cli_rt_REDACTED",
"development_store_id": "5d2f8c1e-9a44-4e8b-b7a9-3065a1f20c4d"
}تسريب الملف يعرّض مسودات ثيم متجر تجريبي واحد فقط، وتلغي سلسلة التحديث نفسها عند إعادة الاستخدام. لا تطبع الأداة قيم الرموز أبداً.
متغيرات البيئة#
| المتغير | الغرض | الافتراضي |
|---|---|---|
DUKKAN_PORTAL_URL |
بوابة المطوّرين لتدفق تسجيل الدخول | https://developer.dukkan.one |
DUKKAN_API_URL |
مضيف المنصّة (واجهة الثيمات وواجهة المنصّة) | https://dukkan.one |
DUKKAN_JSON |
أي قيمة: مثل --json |
غير مضبوط |
DUKKAN_CONFIG_DIR |
مجلد الاعتمادات | ~/.config/dukkan |
DUKKAN_CLI ليس متغيراً للأداة نفسها بل لأدوات مستودع dukkan-themes: يوجّهها إلى نسخة غير منشورة (DUKKAN_CLI=/path/to/app/cli/dist/index.js)؛ راجع تأخّر المدقّق.
حلّ المشكلات#
| العرض | السبب والحل |
|---|---|
Missing or invalid CLI token من الخادم |
المتجر التجريبي منتهٍ أو محذوف، أو الرمز ملغى؛ جدّد المتجر من البوابة ثم login |
429 أثناء theme dev |
تجاوزت 120 طلباً في الدقيقة لرمز الأداة؛ التغييرات المتلاحقة كثيرة |
render failed: template_missing |
لا templates/home.liquid |
Theme preview is not configured on this server |
خادم محلي بلا سرّ معاينة |
رفض band محلياً وقبوله بعيداً |
تأخّر المدقّق في 0.1.0؛ راجع الملاحظة |