پرش به مطلب اصلی

توسعه


راهنمای توسعه

فقط انگلیسی را ویرایش کنید؛ ترجمه‌ها انتشار می‌یابند

مستندات را فقط زیر website/docs (انگلیسی) به‌روزرسانی کنید. ترجمه‌های زیر website/i18n/<locale>/… تولید می‌شوند و نباید به‌صورت دستی ویرایش شوند. برای تازه‌سازی محتوای محلی‌شده از وظایف ترجمه (مثلاً make translate_web_docs_batch) استفاده کنید.

پیش‌نیازها

  • Node.js 22+ و npm (با Node 22 آزمایش شده)
  • Thunderbird 128 ESR یا جدیدتر (برای تست دستی)

چیدمان پروژه (در سطح بالا)

  • ریشه: اسکریپت بسته‌بندی distribution_zip_packer.sh، مستندات، اسکرین‌شات‌ها
  • sources/: کد اصلی افزونه (پس‌زمینه، رابط گزینه‌ها/پنجره پاپ‌آپ، مانیفست‌ها، آیکن‌ها)
  • tests/: مجموعه Vitest
  • website/: مستندات Docusaurus (با i18n زیر website/i18n/de/...)

نصب و ابزارها

  • نصب وابستگی‌های ریشه: npm ci
  • مستندات (اختیاری): cd website && npm ci
  • کشف اهداف: make help

توسعه زنده (web‑ext run)

  • حلقه سریع در Firefox Desktop (فقط تست‌های سطحی رابط):
  • npx web-ext run --source-dir sources --target=firefox-desktop
  • اجرا در Thunderbird (ترجیحی برای MailExtensions):
  • npx web-ext run --source-dir sources --start-url about:addons --firefox-binary "$(command -v thunderbird || echo /path/to/thunderbird)"
  • نکته‌ها:
  • کنسول خطای Thunderbird را باز نگه دارید (Tools → Developer Tools → Error Console).
  • صفحات رویداد MV3 در حالت بیکار معلق می‌شوند؛ پس از تغییر کد افزونه را ریلود کنید یا اجازه دهید web‑ext خودکار ریلود کند.
  • برخی رفتارهای مخصوص Firefox متفاوت‌اند؛ همیشه در Thunderbird برای برابری API بررسی کنید.
  • مسیرهای باینری Thunderbird (نمونه‌ها):
  • لینوکس: thunderbird (مثلاً /usr/bin/thunderbird)
  • macOS: /Applications/Thunderbird.app/Contents/MacOS/thunderbird
  • ویندوز: "C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe"
  • جداسازی پروفایل: برای توسعه از یک پروفایل Thunderbird جداگانه استفاده کنید تا روی تنظیمات روزمره‌تان تأثیر نگذارد.

اهداف Make (به‌ترتیب حروف الفبا)

Makefile جریان‌های متداول توسعه را استاندارد می‌کند. هر زمان make help را اجرا کنید تا خلاصه یک‌خطی هر هدف را ببینید.

نکته: اجرای make بدون هدف، یک منوی ساده Whiptail برای انتخاب هدف باز می‌کند.

هدفتوضیح یک‌خطی
cleanحذف آرتیفکت‌های ساخت/پیش‌نمایش محلی (tmp/، web-local-preview/، website/build/).
commitقالب‌بندی، اجرای تست‌ها (ازجمله i18n)، به‌روزرسانی changelog، commit و push.
eslintاجرای ESLint از طریق پیکربندی flat (npm run -s lint:eslint).
helpفهرست همه اهداف با مستندات یک‌خطی (مرتب‌شده).
lintweb‑ext lint روی sources/ (مانیفست موقت؛ ZIPها را نادیده می‌گیرد؛ غیر بحرانی).
menuمنوی تعاملی برای انتخاب یک هدف و آرگومان‌های اختیاری.
packساخت ZIPهای ATN و LOCAL (لینتر را اجرا می‌کند؛ اسکریپت بسته‌بندی را فراخوانی می‌کند).
prettierفرمت کردن مخزن درجا (تغییرات را می‌نویسد).
prettier_checkPrettier در حالت بررسی (بدون نوشتن)؛ اگر نیاز به بازفرمت باشد، شکست می‌خورد.
prettier_writeنام مستعار برای prettier.
testPrettier (نوشتن)، ESLint، سپس Vitest (اگر پوشش پیکربندی شده).
test_i18nتست‌های فقط i18n: جای‌نگهدارها/برابری افزونه + برابری وب‌سایت.
translate_appنام مستعار برای translation_app.
translation_appترجمه رشته‌های رابط کاربری اپ از sources/_locales/en/messages.json.
translate_web_docs_batchترجمه اسناد وب‌سایت از طریق OpenAI Batch API (ترجیحی).
translate_web_docs_syncترجمه اسناد وب‌سایت به‌صورت همگام (قدیمی، غیر batch).
translate_web_indexنام مستعار برای translation_web_index.
translation_web_indexترجمه رابط صفحه اصلی/نوار ناوبری/پانوشت (website/i18n/en/code.json → .../<lang>/code.json).
web_buildساخت اسناد به website/build (پشتیبانی از --locales / BUILD_LOCALES).
web_build_linkcheckبررسی لینک آفلاین-ایمن (پیوندهای HTTP[S] دوردست را رد می‌کند).
web_build_local_previewپیش‌نمایش محلی gh‑pages؛ سرو خودکار روی 8080–8090؛ تست/بررسی لینک اختیاری.
web_push_githubارسال website/build به شاخه gh-pages.

نحو گزینه‌ها

  • از make <command> OPTS="…" برای ارسال گزینه‌ها استفاده کنید (استفاده از کوتیشن توصیه می‌شود). هر هدف در زیر مثال استفاده را نشان می‌دهد.

--

نکته‌های ساخت برای محلی‌سازی

  • ساخت زیرمجموعه‌ای از زبان‌ها: BUILD_LOCALES="en de" را تنظیم کنید یا OPTS="--locales en,de" را به اهداف وب بدهید.
  • پیش‌نمایش یک زبان خاص: http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/.

ساخت و بسته‌بندی

  • ساخت ZIPها: make pack
  • فایل‌های ATN و LOCAL ZIP را در ریشه مخزن تولید می‌کند (آرتیفکت‌ها را دستی ویرایش نکنید)
  • نکته: نسخه را پیش از بسته‌بندی در هر دو sources/manifest_ATN.json و sources/manifest_LOCAL.json به‌روزرسانی کنید
  • نصب دستی (توسعه): Thunderbird → Tools → Add‑ons and Themes → چرخ‌دنده → Install Add‑on From File… → ZIP ساخته‌شده را انتخاب کنید

تست

  • مجموعه کامل: make test (Vitest)
  • پوشش‌دهی (اختیاری):
  • npm i -D @vitest/coverage-v8
  • make test را اجرا کنید؛ برای گزارش HTML، coverage/index.html را باز کنید
  • فقط i18n: make test_i18n (کلیدها/جای‌نگهدارها/عنوان‌های رابط + برابری وب‌سایت به‌تفکیک زبان و سند با بررسی id/title/sidebar_label)

اشکال‌زدایی و لاگ‌ها

  • Error Console: Tools → Developer Tools → Error Console
  • جابه‌جایی لاگ‌های پرحجم در زمان اجرا:
  • فعال: messenger.storage.local.set({ debug: true })
  • غیرفعال: messenger.storage.local.set({ debug: false })
  • لاگ‌ها هنگام نگارش/ارسال پاسخ‌ها نمایش داده می‌شوند

مستندات (وب‌سایت)

  • سرور توسعه: cd website && npm run start
  • ساخت سایت استاتیک: cd website && npm run build
  • معادل‌های Make (به‌ترتیب حروف الفبا): make web_build, make web_build_linkcheck, make web_build_local_preview, make web_push_github
  • مثال‌های استفاده:
  • فقط EN، پرش از تست/بررسی لینک، بدون push: make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run"
  • همه زبان‌ها، با تست/بررسی لینک، سپس push: make web_build_local_preview && make web_push_github
  • قبل از انتشار، بررسی لینک آفلاین-ایمن را اجرا کنید: make web_build_linkcheck.
  • i18n: انگلیسی در website/docs/*.md؛ ترجمه‌های آلمانی در website/i18n/de/docusaurus-plugin-content-docs/current/*.md
  • جستجو: اگر متغیرهای محیطی Algolia DocSearch در CI تنظیم شده باشند (DOCSEARCH_APP_ID، DOCSEARCH_API_KEY، DOCSEARCH_INDEX_NAME)، سایت از جستجوی Algolia استفاده می‌کند؛ در غیر این صورت به جستجوی محلی برمی‌گردد. در صفحه اصلی، / یا Ctrl+K را بزنید تا جعبه جستجو باز شود.

  • website/src/pages/donate.js
  • مسیر: /donate/<locale>/donate)
  • رفتار:
  • اگر مسیر فعلی دارای زبان باشد (مثلاً /de/donate)، از همان استفاده می‌شود
  • در غیر این صورت، بهترین تطابق از navigator.languages در برابر زبان‌های پیکربندی‌شده انتخاب می‌شود؛ در نهایت به زبان پیش‌فرض برمی‌گردد
  • تغییرمسیر به:
  • en/docs/donation
  • سایرین → /<locale>/docs/donation
  • از useBaseUrl برای مدیریت صحیح baseUrl استفاده می‌کند
  • شامل meta refresh + لینک noscript به‌عنوان پشتیبان است


نکته‌های پیش‌نمایش

  • پیش‌نمایش Node را تمیز متوقف کنید: http://localhost:<port>/__stop را باز کنید (پس از Local server started چاپ می‌شود).
  • اگر تصاویر در MDX/JSX بارگذاری نمی‌شوند، از useBaseUrl('/img/...') استفاده کنید تا baseUrl سایت رعایت شود.
  • پیش‌نمایش ابتدا شروع می‌شود؛ بررسی لینک سپس اجرا می‌شود و مسدودکننده نیست (لینک‌های خارجی شکسته پیش‌نمایش را متوقف نمی‌کنند).
  • نمونه URL پیش‌نمایش: http://localhost:<port>/Thunderbird-Reply-with-Attachments/ (پس از «Local server started» چاپ می‌شود).
  • لینک‌های خارجی در بررسی لینک: برخی سایت‌های خارجی (مثلاً addons.thunderbird.net) خزنده‌های خودکار را مسدود می‌کنند و ممکن است در بررسی لینک‌ها 403 نشان دهند. پیش‌نمایش همچنان شروع می‌شود؛ نادیده‌گرفتن آن‌ها بی‌خطر است.

ترجمه وب‌سایت

چه چیزهایی را می‌توانید ترجمه کنید

  • فقط رابط وب‌سایت: صفحه اصلی، نوار ناوبری، پانوشت و رشته‌های دیگر رابط. محتوای اسناد فعلاً فقط انگلیسی می‌ماند.

کجا ویرایش کنیم

  • website/i18n/<locale>/code.json را ویرایش کنید (از en به‌عنوان مرجع استفاده کنید). جای‌نگهدارهایی مانند {year}، {slash}، {ctrl}، {k}، {code1} را بدون تغییر نگه دارید.

تولید یا نوسازی فایل‌ها

  • ایجاد stubهای مفقود برای همه زبان‌ها: npm --prefix website run i18n:stubs
  • بازنویسی stubها از انگلیسی (پس از افزودن رشته‌های جدید): npm --prefix website run i18n:stubs:force
  • جایگزین برای یک زبان واحد: npx --prefix website docusaurus write-translations --locale <locale>

ترجمه رشته‌های رابط صفحه اصلی/نوار ناوبری/پانوشت (OpenAI)

  • اعتبارنامه‌ها را یک‌بار تنظیم کنید (شِل یا .env):
  • export OPENAI_API_KEY=sk-...
  • اختیاری: export OPENAI_MODEL=gpt-4o-mini
  • تک‌مرحله‌ای (همه زبان‌ها، به‌جز en): make translate_web_index
  • محدودکردن به زبان‌های مشخص: make translate_web_index OPTS="--locales de,fr"
  • بازنویسی مقادیر موجود: make translate_web_index OPTS="--force"

اعتبارسنجی و تلاش‌های مجدد

  • اسکریپت ترجمه شکل JSON را اعتبارسنجی می‌کند، جای‌نگهدارهای آکولادی را حفظ می‌کند و اطمینان می‌دهد URLها تغییر نکنند.
  • در صورت شکست اعتبارسنجی، حداکثر ۲ بار با بازخورد تلاش مجدد می‌کند و سپس مقادیر موجود را حفظ می‌کند.

پیش‌نمایش زبان شما

  • سرور توسعه: npm --prefix website run start
  • بازدید از http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/

ارسال

  • یک PR با فایل(های) code.json ویرایش‌شده باز کنید. تغییرات را متمرکز نگه دارید و در صورت امکان یک اسکرین‌شات سریع اضافه کنید.

نکته‌های امنیت و پیکربندی

  • sources/manifest.json را کامیت نکنید (به‌صورت موقت توسط بیلد ایجاد می‌شود)
  • browser_specific_settings.gecko.id را پایدار نگه دارید تا کانال به‌روزرسانی حفظ شود

پایداری تنظیمات

  • ذخیره‌سازی: همه تنظیمات کاربر در storage.local نگهداری می‌شوند و در به‌روزرسانی‌های افزونه پایدار می‌مانند.
  • نصب: مقادیر پیش‌فرض فقط وقتی اعمال می‌شوند که یک کلید کاملاً مفقود باشد (undefined).
  • به‌روزرسانی: یک مهاجرت فقط کلیدهای مفقود را پر می‌کند؛ مقادیر موجود هرگز بازنویسی نمی‌شوند.
  • نشانگر طرح: settingsVersion (در حال حاضر 1).
  • کلیدها و مقادیر پیش‌فرض:
  • blacklistPatterns: string[]['*intern*', '*secret*', '*passwor*']
  • confirmBeforeAdd: booleanfalse
  • confirmDefaultChoice: 'yes'|'no''yes'
  • warnOnBlacklistExcluded: booleantrue
  • کد: ببینید sources/background.jsinitializeOrMigrateSettings() و SCHEMA_VERSION.

جریان کار توسعه (افزودن یک تنظیم جدید)

  • SCHEMA_VERSION را در sources/background.js افزایش دهید.
  • کلید جدید + پیش‌فرض را به شیء DEFAULTS در initializeOrMigrateSettings() اضافه کنید.
  • هنگام مقداردهی اولیه پیش‌فرض‌ها از قاعده «فقط اگر undefined باشد» استفاده کنید؛ مقادیر موجود را بازنویسی نکنید.
  • اگر تنظیم برای کاربر قابل‌مشاهده است، آن را در sources/options.js متصل کنید و رشته‌های محلی‌سازی‌شده بیفزایید.
  • تست‌ها را اضافه/تنظیم کنید (نگاه کنید به tests/background.settings.migration.test.js).

نکته‌های تست دستی

  • شبیه‌سازی نصب تازه: دایرکتوری داده افزونه را پاک کنید یا با پروفایل جدید شروع کنید.
  • شبیه‌سازی به‌روزرسانی: settingsVersion را در storage.local به 0 تنظیم کنید و مجدداً بارگذاری نمایید؛ تأیید کنید مقادیر موجود بدون تغییر می‌مانند و فقط کلیدهای مفقود اضافه می‌شوند.

عیب‌یابی

  • اطمینان حاصل کنید Thunderbird نسخه 128 ESR یا جدیدتر است
  • برای مسائل زمان اجرا از Error Console استفاده کنید
  • اگر تنظیمات ذخیره‌شده ظاهراً به‌درستی اعمال نمی‌شوند، Thunderbird را ری‌استارت کنید و دوباره امتحان کنید. (Thunderbird ممکن است وضعیت را بین نشست‌ها کش کند؛ یک ری‌استارت تضمین می‌کند تنظیمات تازه بارگذاری شوند.)

CI و پوشش

  • GitHub Actions (CI — Tests) vitest را با آستانه‌های پوشش (۸۵٪ خطوط/توابع/شاخه‌ها/عبارات) اجرا می‌کند. اگر آستانه‌ها برآورده نشوند، کار شکست می‌خورد.
  • گردش‌کار یک آرتیفکت coverage-html با گزارش HTML بارگذاری می‌کند؛ آن را از صفحه اجرا دانلود کنید (Actions → آخرین اجرا → Artifacts).

مشارکت

  • برای راهنمای شاخه/کامیت/PR به CONTRIBUTING.md مراجعه کنید
  • نکته: برای تست، یک پروفایل توسعه Thunderbird جداگانه بسازید تا روی پروفایل روزانه‌تان تأثیر نگذارد.

ترجمه‌ها

  • اجرای کارهای ترجمه بزرگ «همه → همه» می‌تواند کند و پرهزینه باشد. با یک زیرمجموعه شروع کنید (مثلاً چند سند و ۱–۲ زبان)، نتیجه را بازبینی کنید، سپس گسترش دهید.

  • سیاست تلاش مجدد: کارهای ترجمه تا ۳ بار با backoff نمایی در خطاهای API تلاش می‌کنند؛ ببینید scripts/translate_web_docs_batch.js و scripts/translate_web_docs_sync.js.

اسکرین‌شات‌ها برای اسناد

  • تصاویر را زیر website/static/img/ ذخیره کنید.

  • آن‌ها را در MD/MDX از طریق useBaseUrl('/img/<filename>') ارجاع دهید تا مسیرها با baseUrl سایت کار کنند.

  • پس از افزودن یا تغییر نام تصاویر زیر website/static/img/، تأیید کنید همه ارجاعات همچنان از useBaseUrl('/img/…') استفاده می‌کنند و در پیش‌نمایش محلی رندر می‌شوند. فاوآیکن‌ها

  • favicon.ico چنداندازه به‌صورت خودکار در همه مسیرهای ساخت (Make + اسکریپت‌ها) از طریق website/scripts/build-favicon.mjs تولید می‌شود.

  • نیازی به گام دستی نیست؛ به‌روزرسانی icon-*.png کافی است. نکته بازبینی

  • id بخش سرآغاز را در اسناد ترجمه‌شده بدون تغییر نگه دارید؛ فقط title و sidebar_label را در صورت وجود ترجمه کنید.

clean

  • هدف: حذف آرتیفکت‌های ساخت/پیش‌نمایش محلی.
  • استفاده: make clean
  • حذف می‌کند (در صورت وجود):
  • tmp/
  • web-local-preview/
  • website/build/

commit

  • هدف: قالب‌بندی، تست، به‌روزرسانی changelog، کامیت و پوش.
  • استفاده: make commit
  • جزئیات: Prettier (نوشتن)، make test, make test_i18n را اجرا می‌کند؛ وقتی تفاوت‌های staged وجود دارد تغییرات را به changelog می‌افزاید؛ به origin/<branch> پوش می‌کند.

eslint

  • هدف: اجرای ESLint از طریق پیکربندی flat.
  • استفاده: make eslint

help

  • هدف: فهرست همه اهداف با مستندات یک‌خطی.
  • استفاده: make help

lint

  • هدف: lint افزونه MailExtension با web-ext.
  • استفاده: make lint
  • نکات: sources/manifest_LOCAL.jsonsources/manifest.json را موقتاً کپی می‌کند؛ ZIPهای ساخته‌شده را نادیده می‌گیرد؛ هشدارها باعث شکست پایپ‌لاین نمی‌شوند.

menu

  • هدف: منوی تعاملی برای انتخاب یک هدف Make و آرگومان‌های اختیاری.
  • استفاده: make را بدون آرگومان اجرا کنید.
  • نکات: اگر whiptail در دسترس نباشد، منو به make help برمی‌گردد.

pack

  • هدف: ساخت ZIPهای ATN و LOCAL (وابسته به lint).
  • استفاده: make pack
  • نکته: نسخه‌ها را در هر دو sources/manifest_*.json پیش از بسته‌بندی افزایش دهید.

prettier

  • هدف: فرمت کردن مخزن درجا.
  • استفاده: make prettier

prettier_check

  • هدف: تأیید فرمت (بدون نوشتن).
  • استفاده: make prettier_check

prettier_write

  • هدف: نام مستعار برای prettier.
  • استفاده: make prettier_write

test

  • هدف: اجرای Prettier (نوشتن)، ESLint، سپس Vitest (اگر نصب شده باشد، با پوشش).
  • استفاده: make test

test_i18n

  • هدف: تست‌های متمرکز بر i18n برای رشته‌های افزونه و اسناد وب‌سایت.
  • استفاده: make test_i18n
  • اجرا می‌کند: npm run test:i18n و npm run -s test:website-i18n.

translate_app / translation_app

  • هدف: ترجمه رشته‌های رابط کاربری افزونه از EN به سایر زبان‌ها.
  • استفاده: make translation_app OPTS="--locales all|de,fr"
  • نکات: ساختار کلید و جای‌نگهدارها را حفظ می‌کند؛ در translation_app.log لاگ می‌نویسد. شکل اسکریپت: node scripts/translate_app.js --locales ….

translate_web_docs_batch / translate_web_docs_sync

  • هدف: ترجمه اسناد وب‌سایت از website/docs/*.md به website/i18n/<locale>/....
  • ترجیحی: translate_web_docs_batch (OpenAI Batch API)
    • استفاده (فلگ‌ها): make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • شکل قدیمی positional همچنان پذیرفته می‌شود: OPTS="<doc|all> <lang|all>"
  • رفتار: JSONL می‌سازد، آپلود می‌کند، هر 30 ثانیه پول می‌زند، نتایج را دانلود و فایل‌ها را می‌نویسد.
  • نکته: یک کار batch ممکن است تا 24 ساعت طول بکشد (بر اساس پنجره batch OpenAI). کنسول در هر پول زمان سپری‌شده را نشان می‌دهد.
  • محیط: OPENAI_API_KEY (الزامی)، اختیاری OPENAI_MODEL, OPENAI_TEMPERATURE, OPENAI_BATCH_WINDOW (پیش‌فرض 24h)، BATCH_POLL_INTERVAL_MS.
  • قدیمی: translate_web_docs_sync
    • استفاده (فلگ‌ها): make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • شکل قدیمی positional همچنان پذیرفته می‌شود: OPTS="<doc|all> <lang|all>"
  • رفتار: درخواست‌های همگام برای هر جفت (بدون تجمیع batch).
  • نکات: درخواست‌های تعاملی وقتی OPTS حذف شده باشد. هر دو حالت بلوک‌های کد/کد درون‌خطی را حفظ می‌کنند و id سرآغاز را بدون تغییر نگه می‌دارند؛ لاگ‌ها در translation_web_batch.log (batch) یا translation_web_sync.log (sync) نوشته می‌شوند.

translate_web_index / translation_web_index

  • هدف: ترجمه رشته‌های رابط وب‌سایت (صفحه اصلی، نوار ناوبری، پانوشت) از website/i18n/en/code.json به همه زبان‌ها زیر website/i18n/<locale>/code.json (به‌جز en).
  • استفاده: make translate_web_index یا make translate_web_index OPTS="--locales de,fr [--force]"
  • ملزومات: export کردن OPENAI_API_KEY (اختیاری: OPENAI_MODEL=gpt-4o-mini).
  • رفتار: ساختار JSON را اعتبارسنجی می‌کند، جای‌نگهدارهای آکولادی را حفظ می‌کند، URLها را بدون تغییر نگه می‌دارد و در خطاهای اعتبارسنجی با بازخورد دوباره تلاش می‌کند.

web_build

  • هدف: ساخت سایت اسناد به website/build.
  • استفاده: make web_build OPTS="--locales en|de,en|all" (یا تنظیم BUILD_LOCALES="en de")
  • داخلی‌ها: node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …].
  • وابستگی‌ها: npm ci را در website/ فقط اگر website/node_modules/@docusaurus وجود نداشته باشد اجرا می‌کند.

web_build_linkcheck

  • هدف: بررسی لینک آفلاین-ایمن.
  • استفاده: make web_build_linkcheck OPTS="--locales en|all"
  • نکات: به tmp_linkcheck_web_pages می‌سازد؛ baseUrl صفحات GH را به / بازنویسی می‌کند؛ لینک‌های HTTP(S) دوردست را رد می‌کند.

web_build_local_preview

  • هدف: پیش‌نمایش محلی gh‑pages با تست/بررسی لینک اختیاری.
  • استفاده: make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]"
  • رفتار: ابتدا سرور پیش‌نمایش Node را امتحان می‌کند (scripts/preview-server.mjs، پشتیبانی از /__stop)، در صورت لزوم به python3 -m http.server برمی‌گردد؛ روی 8080–8090 سرو می‌کند؛ PID در web-local-preview/.server.pid.

web_push_github

  • هدف: ارسال website/build به شاخه gh-pages.
  • استفاده: make web_push_github

نکته: NPM=… را تنظیم کنید تا مدیر بسته استفاده‌شده توسط Makefile را بازنویسی کنید (پیش‌فرض npm است).