Files
MahdiandCursor 4b3a8a1d6c docs: record SuperAdmin-only git push policy in AGENTS.md
Khanegi/Hamkar product repos require explicit approval before commit/push.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-10 14:28:59 +03:30

11 KiB
Raw Permalink Blame History

AGENTS.md — SuperAdmin آبشده + همکار + خانگی

این فایل برای ادامه کار در Cursor است (از جمله Workspace سه‌پروژه‌ای).
قبل از تغییر معماری یا اتصال API، این سند را بخوان.

پروژه‌ها

نام مسیر تقریبی نقش
SuperAdminAbshode E:\projeha\SuperAdminAbshode کنترل‌پنل مرکزی شرکت
Hamkar E:\projeha\Hamkar محصول همکار (نسخه‌های فروشی)
Khanegi E:\projeha\Khanegi (عمدتاً KhanegiModular) محصول خانگی

Workspace پیشنهادی: E:\projeha\Abshode-suite.code-workspace

قانون Git / دیپلوی (اجباری)

به‌خاطر حساسیت اپ‌های خانگی و همکار:

  1. فقط سوپرادمین (apps/api و apps/web) را بدون پرسیدن کامیت و پوش کن.
  2. برای یوزر / ادمین / سرور خانگی و همکار (userModular, userTheme, admin, server, و معادل‌های Hamkar):
    • اول بیلد و تست روی سرور؛
    • قبل از هر commit/push حتماً از کاربر اجازه بگیر؛
    • بدون تأیید صریح، روی گیت نگذار.
  3. جریان کار محصولات: تغییر محلی → دیپلوی/تست روی سرور → اگر OK بود → با اجازه کاربر روی گیت.

هدف کسب‌وکار

مدیر شرکت نرم‌افزاری است؛ محصولات به‌صورت نسخه فروشی (white-label) فروخته می‌شوند.
نیاز اصلی: مدیریت متمرکز نسخه‌ها، برند، ظاهر، پیامک، سرور/تمدید/پشتیبانی (جایگزین گوگل‌شیت).

تصمیم‌های قطعی تا الان

  1. استک سوپرادمین: NestJS + Prisma + Vue 3 + Ant Design Vue + فونت Dana — نه Laravel.
  2. UI: داشبورد نرم روشن، RTL، بدون سایدبار منو؛ کارت‌های ماژول در صفحه اول.
  3. منبع حقیقت برند/ظاهر: سوپرادمین و GET /get_user (نه SSH/DB برای روزمره).
  4. /get_user عمومی است → رمز/گلوگاه SMS داخلش نرود.
  5. SMS: پنل کامل داخل سوپرادمین ساخته می‌شود؛ فعلاً پنل SMS داخل همکار/خانگی دست نخورده می‌ماند تا تست جواب بدهد؛ بعد حذف/غیرفعال.
  6. منبع حقیقت SMS (پیشنهاد قطعی): کیف پول / تعرفه / مسدودسازی در سوپرادمین؛ ارسال همچنان با SmsGatewayService همان نسخه.
  7. مسئول فنی: برای برند به DB لوکال نیاز نیست؛ اطلاعات رجیستری از /get_user؛ SMS سوپرادمین از صفر.
  8. برای اتصال دوطرفه واقعی اپ‌ها به سوپرادمین، این پروژه باید روی سرور با دامنه HTTPS باشد. لوکال برای توسعه و push به نسخه‌های آنلاین کافی است.
  9. دیتابیس پروداکشن: PostgreSQL (نه SQLite). دامنه هدف: https://adm.montzar.ir روی سرور مشترک montime؛ API روی پورت 3010. جزئیات: deploy/DEPLOY.md.

وضعیت فعلی کد سوپرادمین

ساختار

  • apps/api — NestJS + Prisma (PostgreSQL؛ تاریخچه SQLite در prisma/migrations_sqlite_archive/)
  • apps/web — Vue 3 + Vite + Ant Design Vue
  • ورود پیش‌فرض: موبایل SEED_ADMIN_MOBILE / SEED_ADMIN_PASSWORD (مثلاً 09128081392 / Admin@12345)
  • دیپلوی: deploy/ داخل همین ریپوی API (nginx + pm2 + راهنما)

قابلیت‌های پیاده‌شده

  • Auth JWT، CRUD نسخه‌ها (Tenant)، Audit
  • مدیران سوپرادمین: نام / نام‌خانوادگی / موبایل / رمز؛ ورود با موبایل؛ صفحه /admins
  • پیامک هشدار مدیران از API مرکزی اس‌ام‌اس رایگان (CENTRAL_SMS_* → createsms)؛ رویدادهای نسخه و کیف پول SMS
  • پنل سرور: هر نسخه ۰..N سرور (نام/مشخصات جدا)؛ هر کدام اختصاصی یا مدیریت‌شده؛ قیمت/مدت (۱،۳،۶،۱۲ ماه)؛ هشدار SMS نزدیک انقضا (پیش‌فرض ۳ روز، روزانه تا تمدید)
  • پنل پشتیبانی: هر نسخه ۰..N اشتراک پشتیبانی؛ مدت ۱|۳|۶|۱۲ ماه؛ امکان دوره رایگان (isFree، قیمت ۰)؛ هشدار انقضا مثل افزونه
  • پنل افزونه: هر نسخه ۰..N افزونه؛ قیمت/مدت/هشدار انقضا
  • پنل افزونه: هر نسخه ۰..N افزونه (PluginSubscription + PluginCharge)؛ نام اجباری + مشخصات/قیمت/مدت ۱،۳،۶،۱۲ ماه؛ هشدار SMS مثل سرور؛ صفحات /plugins و /plugins/:tenantId
  • GET /get_user با تطبیق دامنه اصلی + آرایه domains + app_ui_config برای خانگی
  • GET /get_version?domain= — ورژن همان نسخه فروشی (Tenant.appVersion)؛ تنظیم از صفحه مدیریت نسخه؛ جایگزین nerkh.gold/get_version
  • ایمپورت نسخه‌ها از apps/api/prisma/data/users.json (npm run prisma:import-users)
  • تشخیص محصول: app. / khanegi. → خانگی؛ hamkar. → همکار؛ overrides دستی در اسکریپت ایمپورت
  • پنل SMS مستقل سوپرادمین: SmsAccount + SmsLedger (موجودی، شارژ، تعرفه، بلاک، آستانه‌های رنگی، گلوگاه)
  • رنگ موجودی (نمایش تومان): سبز >10000، زرد 1000–10000، قرمز <1000 — ذخیره DB و API محصولات همچنان ریال (*10)
  • مبالغ در UI سوپرادمین تومان است؛ MoneyInput/formatMoney تبدیل می‌کنند. remote SMS به همکار/خانگی همان اعداد ریال را می‌فرستد/می‌گیرد.
  • داشبورد: ۵ نسخه کم‌موجودی؛ صفحه SMS: کارت‌ها → جزئیات در /sms/:tenantId
  • ظاهر اپ خانگی: صفحه UiConfigPage برای appUiConfig؛ بک‌فیل از رجیستری/users.json با npm run prisma:backfill-appearance؛ در فرانت: showNotifications / header.visible / startRoute
  • ظاهر اپ همکار: /versions/:id/ui-hamkar؛ رنگ‌ها + حالت رجیستری (registryMode)؛ settingsManaged باید true باشد تا ui_settings بیاید (وگرنه لاراول می‌ماند)

مهم

  • موجودی SMS اولیه دمو بود تا رنگ‌ها دیده شوند؛ منبع واقعی همکار/خانگی نیست مگر بعداً وصل شود.
  • چند دامنه دستی اصلاح شده (مثل 24gold.ir، limangold.ir، vahid.gold).
  • چند نسخه با تأیید کاربر از همکار به خانگی منتقل شده‌اند (لیست در FORCE_KHANEGI داخل import-users.ts).

معماری هدف اتصال به همکار/خانگی

دو جهت API:

A) اپ‌ها → سوپرادمین

  • GET /get_user — برند و ظاهر (موجود)
  • بعدی: GET/POST وضعیت SMS (status / consume) با remoteApiToken

B) سوپرادمین → اپ‌ها

  • GET/POST /super/settings روی Laravel هر نسخه — تنظیمات مدیریتی
  • اختیاری: reload برند / health

احراز هویت: Tenant.remoteApiToken در سوپرادمین + همان توکن روی نسخه.

منبع حقیقت پیشنهادی

موضوع منبع
برند / دامنه / لوگو / رنگ سوپرادمین /get_user
app_ui_config خانگی سوپرادمین → مصرف در فرانت خانگی
ورژن اپ / رفرش اجباری کش سوپرادمین /get_version (per tenant: Tenant.appVersion)
کیف پول / تعرفه / بلاک SMS سوپرادمین
ارسال SMS SmsGatewayService همان نسخه
پنل SMS داخل محصولات فعلاً دست‌نخورده

فازهای بعدی (به ترتیب)

  1. دیپلوی سوپرادمین روی adm.montzar.ir (migrate + pm2 + nginx) — DB superadmin آماده است.
  2. پایلوت برند: یک نسخه تست فقط از /get_user سوپرادمین بوت شود.
  3. ظاهر خانگی: مصرف کامل app_ui_config در خانگی.
  4. API /super/* روی Laravel همکار و خانگی با middleware توکن.
  5. SMS دوطرفه: status/consume در سوپرادمین + هوک قبل/بعد ارسال در محصولات.
  6. بعد از پایداری: کاهش/حذف پنل SMS داخلی محصولات.

قواعد کار ایجنت

  • بدون درخواست صریح کاربر: commit نکن، force push نکن، پنل SMS همکار/خانگی را حذف نکن.
  • تغییرات همکار و خانگی را فقط وقتی کاربر صریحاً خواست؛ فعلاً اولویت سوپرادمین + طراحی قرارداد API است.
  • در Workspace چندریشه: قبل از ادیت بگو در کدام ریشه کار می‌کنی (SuperAdminAbshode / Hamkar / Khanegi).
  • امنیت (همیشه): secret / توکن / رمز را در UI، لاگ، .env.example، commit، یا پاسخ چت قرار نده؛ fallback هاردکد برای secret نگذار؛ رمز را فقط hash ذخیره کن و در API برنگردان؛ ورودی‌ها را validate/normalize کن (مثل موبایل).
  • تاریخ/ساعت: همیشه شمسی (جلالی) و به وقت ایران (Asia/Tehran) — انتخابگر تاریخ شمسی و فرمت نمایش از utils/datetime / iran-time.util.
  • رمزها و secretهای users.json و CENTRAL_SMS_SECRET را وارد UI/لاگ عمومی نکن.
  • Prisma روی ویندوز: اگر EPERM روی query_engine، اول API را متوقف کن بعد prisma generate.

اجرای لوکال

DATABASE_URL باید PostgreSQL باشد (Docker لوکال یا DB سرور). نمونه: .env.example.

cd E:\projeha\SuperAdminAbshode\apps\api
npx prisma migrate deploy
npm run start:dev

cd E:\projeha\SuperAdminAbshode\apps\web
npm run dev

چت اول در Workspace جدید — پیشنهاد متن

ادامه کار سوپرادمین آبشده با همکار و خانگی.
حتماً SuperAdminAbshode/AGENTS.md (یا AGENTS.md داخل ریپوی API) را بخوان.
تصمیم‌ها و وضعیت فعلی همانجاست؛ از صفر مشورت نکن مگر برای مرحله بعد (پایلوت API / دیپلوی).

تاریخ به‌روزرسانی

2026-07-30 — Prisma → PostgreSQL؛ DB superadmin روی سرور montime؛ deploy برای adm.montzar.ir. 2026-07-25 — جمع‌بندی گفتگوهای ساخت پنل، ایمپورت نسخه‌ها، SMS مستقل، و نقشه اتصال API.