diff --git a/.claude/prompt/global-rep-domain-site.md b/.claude/prompt/global-rep-domain-site.md new file mode 100644 index 0000000..a4c9a57 --- /dev/null +++ b/.claude/prompt/global-rep-domain-site.md @@ -0,0 +1,116 @@ +# سایت دامنه اختصاصی نماینده سراسری — تشخیص دامنه، فیلتر پزشکان/کلینیک‌ها + +## پروژه + +`nobat724_front` — **پیش‌نیاز:** پرامپت backend اول اجرا شود: `clinicpro/.claude/prompt/representation-multi-city-domain-commission.md`. این پرامپت مصرف‌کننده قراردادهای آن است: +- `GET /api/v1/site-context?domain=` (عمومی) → `{ type: "city"|"representation"|"unknown", representation: {uuid, full_name, is_global}|null, city: {...}|null }` +- پارامتر جدید `domain` روی `GET /api/v1/doctors` و `GET /api/v1/clinics` — اگر دامنه متعلق به نماینده سراسری باشد، backend فقط پزشکان/کلینیک‌های همان نماینده را برمی‌گرداند. + +## زمینه + +سایت multi-domain است و دامنه فقط با `data/city.json` تطبیق داده می‌شود (`lib/getStateInfo.js`). نماینده سراسری دامنه اختصاصی خودش را دارد (مثل `x-nobat.ir`) که در city.json نیست → الان چنین دامنه‌ای مثل «بدون شهر» رفتار می‌کند و همه پزشکان را نشان می‌دهد. باید: دامنه نماینده سراسری تشخیص داده شود و فقط پزشکان/کلینیک‌های ثبت‌شده توسط همان نماینده نمایش یابند. کمیسیون خودش backend-side است (از `frontend_address` پرداخت) — فرانت فقط باید مثل الان دامنه درست را در `frontend_address` بفرستد (بدون تغییر). + +## مشکل / هدف + +۱. `getStateInfo` برای دامنه‌های خارج از city.json از API زمینه بگیرد (`site-context`) و `repContext` برگرداند. +۲. صفحات لیست پزشکان/کلینیک‌ها روی دامنه نماینده سراسری، پارامتر `domain` را به API پاس بدهند. +۳. متادیتا/برندینگ صفحات روی دامنه نماینده از `full_name` نماینده ساخته شود (fallback «نوبت 724»). + +## فایل‌های مرتبط + +| فایل | نقش | +|------|-----| +| `lib/getStateInfo.js` | تشخیص دامنه — فقط city.json؛ باید repContext هم بدهد | +| `app/doctors/page.js` | لیست پزشکان — fetch `/api/v1/doctors` | +| `app/clinics/page.js` | لیست کلینیک‌ها — fetch `/api/v1/clinics` | +| `app/layout.js` | متادیتای پایه از matchedCity | +| `components/home/*` (سرچ صفحه اصلی) | روی دامنه rep هم باید `domain` را پاس بدهد | +| `lib/req.js` | `fetchReq` برای server-side | + +## وضعیت فعلی + +`lib/getStateInfo.js` (کامل — کپی واقعی): + +```js +export async function getStateInfo() { + const headersList = await headers(); + const host = headersList.get("host") || ""; + const subdomain = host.split(".")[0]; + const matchedCity = citiesData.find((city) => { + const cityDomain = city.domain.split(".")[0]; + return cityDomain === subdomain; + }); + const matchedState = + matchedCity && statesData.find((state) => state.id === matchedCity.province_id); + return { matchedCity, matchedState, isRoot: isRootCity(matchedCity) }; +} +``` + +`app/doctors/page.js` (بخش fetch — کپی واقعی): + +```js +const { matchedCity, matchedState, isRoot } = await getStateInfo(); +// ... +if (cityParams) newSearchParams.city = cityParams; +else if (matchedCity && !isRoot) newSearchParams.city = matchedCity.name; +const params = buildDoctorParams(newSearchParams); +doctors = await fetchReq(`${API_URL}/api/v1/doctors`, { params }); +``` + +## وظایف + +### ۱. توسعه `getStateInfo` — repContext + +خروجی جدید: `{ matchedCity, matchedState, isRoot, repContext }` که `repContext = { uuid, full_name, is_global } | null`. + +```js +export async function getStateInfo() { + // ... منطق فعلی city.json دست‌نخورده ... + let repContext = null; + if (!matchedCity && host) { + repContext = await fetchSiteContext(host); // فقط وقتی city match نشد + } + return { matchedCity, matchedState, isRoot: isRootCity(matchedCity), repContext }; +} +``` + +- `fetchSiteContext(host)`: صدا زدن `GET ${NEXT_PUBLIC_API_URL}/api/v1/site-context?domain=${host}` با `fetchReq`؛ اگر `type === "representation"` → آبجکت representation، وگرنه null. **خطای شبکه هرگز صفحه را نشکند** (try/catch → null) و پاسخ برای هر host **cache شود** (in-memory `Map` در سطح ماژول + `next: { revalidate: 300 }` اگر با fetch native؛ با axios همان Map با TTL ۵ دقیقه کافی است) — این تابع در هر render صدا می‌خورد. +- `localhost` و host خالی → بدون درخواست، null. +- تمام call-siteهای فعلی `getStateInfo` بدون تغییر کار کنند (فیلد اضافه فقط additive است). + +### ۲. پاس دادن `domain` در لیست‌ها + +در `app/doctors/page.js` و `app/clinics/page.js`: + +```js +const { matchedCity, matchedState, isRoot, repContext } = await getStateInfo(); +// ... +if (repContext?.is_global) { + params.domain = host; // host از headers — از طریق getStateInfo برگردان یا headers() مستقیم؟ + // الگو: getStateInfo مقدار host را هم برگرداند تا صفحات دوباره parse نکنند + delete params.city; delete params.state; // روی دامنه نماینده، فیلتر شهر بی‌معنی است +} +doctors = await fetchReq(`${API_URL}/api/v1/doctors`, { params }); +``` + +- `getStateInfo` فیلد `host` را هم برگرداند (نرمال‌شده) تا هیچ صفحه‌ای خودش `headers()` را برای دامنه parse نکند — هم‌راستا با اصل «سرویس مرکزی دامنه» در backend. +- جستجوی صفحه اصلی (`components/home/search/*`) که client-side به `/api/v1/doctors` می‌زند: از `window.location.hostname` همان پارامتر `domain` را وقتی سایتِ rep است اضافه کند — تشخیص client-side: مقدار repContext از server از طریق props/context (ساده‌ترین راه: `ProvinceProvider` یا prop از layout؛ الگوی موجود client-side پروژه را دنبال کن). + +### ۳. متادیتا و برندینگ دامنه نماینده + +- `app/layout.js` و `generateMetadata` صفحات doctors/clinics: وقتی `repContext` هست: + - `siteName = repContext.full_name` + - title الگو: `نوبت‌دهی آنلاین پزشکان | ${repContext.full_name}` + - description عمومی (بدون نام شهر). +- Header/Footer: جایی که `matchedCity?.site_name` مصرف می‌شود (`components/layout/*`, `app/component/Logo.js`) fallback به `repContext?.full_name` قبل از «نوبت 724». +- صفحات وابسته به شهر (مثل انتخاب شهر در سرچ): روی دامنه rep رفتار «ریشه» (همه شهرها) بماند — گیت اضافه نزن؛ فقط لیست نتایج فیلتر می‌شود. + +## نکات مهم + +- **هیچ regression روی دامنه‌های شهری**: مسیر `matchedCity` پیدا شد → `fetchSiteContext` اصلاً صدا زده نشود؛ رفتار فعلی بایت‌به‌بایت حفظ. +- `DEV_MODE=TRUE` مثل قبل noindex — دامنه‌های rep هم مشمول همان robots. +- تست local: `HOST=x-nobat.localhost npm run dev` کار نمی‌کند مگر backend لوکال یک rep با دامنه `x-nobat.localhost` داشته باشد — در گزارش، دستور ساخت rep تستی (از پنل ادمین clinicpro لوکال) را ذکر کن. +- خطای API سایت‌کانتکست → سایت مثل دامنه ناشناخته (رفتار فعلی) — هرگز 500 نشود (درس صفحه contact-us). +- build کامل (`npm run build`) و تست دستی سه حالت: دامنه شهر (yazd-nobat.localhost)، دامنه ریشه، دامنه ناشناخته. +- بعد از پیاده‌سازی: مستندات backend (`clinicpro/docs/api/doctor.md`/`clinic.md`) باید با مصرف واقعی این فرانت هم‌خوان باشد — اگر اختلافی دیدی همان‌جا اصلاح کن. +- **عملیاتی**: هر دامنه نماینده سراسری باید در Coolify به سرویس فرانت و به `ALLOWED_FRONTEND_HOSTS` بک‌اند اضافه شود (CORS/TLS) — در گزارش نهایی یادآوری کن. diff --git a/app/clinics/page.js b/app/clinics/page.js index 9fd50a2..635f29c 100644 --- a/app/clinics/page.js +++ b/app/clinics/page.js @@ -18,8 +18,8 @@ function listingRobots(params) { export async function generateMetadata({ searchParams }) { const awaitedParams = await searchParams; - const { matchedCity, matchedState } = await getStateInfo(); - const siteName = matchedCity?.site_name || "نوبت 724"; + const { matchedCity, matchedState, repContext } = await getStateInfo(); + const siteName = matchedCity?.site_name || repContext?.full_name || "نوبت 724"; const cityName = matchedCity?.name || matchedState?.name || ""; const title = cityName ? `کلینیک‌های ${cityName} | جستجو و رزرو نوبت | ${siteName}` @@ -39,7 +39,7 @@ export async function generateMetadata({ searchParams }) { export default async function Clinics({ searchParams }) { const awaitedSearchParams = await searchParams; - const { matchedCity, matchedState, isRoot } = await getStateInfo(); + const { matchedCity, matchedState, isRoot, repContext, host } = await getStateInfo(); const API_URL = process.env.NEXT_PUBLIC_API_URL; const stateParams = awaitedSearchParams.state; const cityParams = awaitedSearchParams.city; @@ -59,6 +59,13 @@ export default async function Clinics({ searchParams }) { const params = buildClinicParams(newSearchParams); + // دامنه‌ی نماینده سراسری: backend فقط کلینیک‌های همان نماینده را برمی‌گرداند؛ فیلتر شهر بی‌معنی است. + if (repContext?.is_global) { + delete params.city; + delete params.state; + params.domain = host; + } + // Req clinics = await fetchReq(`${API_URL}/api/v1/clinics`, { params, diff --git a/app/doctors/page.js b/app/doctors/page.js index fceb437..16adad0 100644 --- a/app/doctors/page.js +++ b/app/doctors/page.js @@ -18,8 +18,8 @@ function listingRobots(params) { export async function generateMetadata({ searchParams }) { const awaitedParams = await searchParams; - const { matchedCity, matchedState } = await getStateInfo(); - const siteName = matchedCity?.site_name || "نوبت 724"; + const { matchedCity, matchedState, repContext } = await getStateInfo(); + const siteName = matchedCity?.site_name || repContext?.full_name || "نوبت 724"; const cityName = matchedCity?.name || matchedState?.name || ""; const title = cityName ? `پزشکان ${cityName} | جستجو و رزرو نوبت | ${siteName}` @@ -39,7 +39,7 @@ export async function generateMetadata({ searchParams }) { async function Doctors({ searchParams }) { const awaitedSearchParams = await searchParams; - const { matchedCity, matchedState, isRoot } = await getStateInfo(); + const { matchedCity, matchedState, isRoot, repContext, host } = await getStateInfo(); const API_URL = process.env.NEXT_PUBLIC_API_URL; let doctors = null; @@ -59,6 +59,13 @@ async function Doctors({ searchParams }) { const params = buildDoctorParams(newSearchParams); + // دامنه‌ی نماینده سراسری: backend فقط پزشکان همان نماینده را برمی‌گرداند؛ فیلتر شهر بی‌معنی است. + if (repContext?.is_global) { + delete params.city_id; + delete params.state_id; + params.domain = host; + } + doctors = await fetchReq(`${API_URL}/api/v1/doctors`, { params, }); diff --git a/app/layout.js b/app/layout.js index cb31453..dda5d07 100644 --- a/app/layout.js +++ b/app/layout.js @@ -16,7 +16,7 @@ export const viewport = { }; export async function generateMetadata() { - const { matchedCity } = await getStateInfo(); + const { matchedCity, repContext } = await getStateInfo(); const headersList = await headers(); const metadataBase = new URL(buildCanonicalUrl(headersList.get("host"), "/")); @@ -27,7 +27,9 @@ export async function generateMetadata() { matchedCity?.title || (matchedCity?.name ? `نوبت‌دهی آنلاین پزشکان ${matchedCity.name} | نوبت 724` - : "نوبت 724 | سیستم نوبت‌دهی آنلاین پزشکی"); + : repContext?.full_name + ? `نوبت‌دهی آنلاین پزشکان | ${repContext.full_name}` + : "نوبت 724 | سیستم نوبت‌دهی آنلاین پزشکی"); const description = matchedCity?.description || "نوبت 724 - سیستم آنلاین نوبت‌دهی برای پزشکان و کلینیک‌ها. با استفاده از نوبت 724، به راحتی نوبت پزشکی خود را به صورت آنلاین رزرو کنید و از خدمات سریع و کارآمد ما بهره‌مند شوید"; const baseMetadata = { @@ -42,7 +44,7 @@ export async function generateMetadata() { description, type: "website", locale: "fa_IR", - siteName: matchedCity?.site_name || "نوبت 724", + siteName: matchedCity?.site_name || repContext?.full_name || "نوبت 724", images: ["https://nobat724.com/assets/images/logo.png"], }, twitter: { diff --git a/graphify-out/.graphify_labels.json b/graphify-out/.graphify_labels.json index 403b52c..0de773e 100644 --- a/graphify-out/.graphify_labels.json +++ b/graphify-out/.graphify_labels.json @@ -371,5 +371,6 @@ "369": "Community 369", "370": "Community 370", "371": "Community 371", - "372": "Community 372" + "372": "Community 372", + "373": "Community 373" } diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md index c91c448..4c50102 100644 --- a/graphify-out/GRAPH_REPORT.md +++ b/graphify-out/GRAPH_REPORT.md @@ -1,16 +1,16 @@ -# Graph Report - nobat724_front (2026-07-08) +# Graph Report - nobat724_front (2026-07-09) ## Corpus Check -- 594 files · ~536,128 words +- 595 files · ~537,275 words - Verdict: corpus is large enough that graph structure adds value. ## Summary -- 2037 nodes · 2019 edges · 373 communities (343 shown, 30 thin omitted) -- Extraction: 95% EXTRACTED · 5% INFERRED · 0% AMBIGUOUS · INFERRED: 98 edges (avg confidence: 0.8) +- 2051 nodes · 2034 edges · 374 communities (344 shown, 30 thin omitted) +- Extraction: 95% EXTRACTED · 5% INFERRED · 0% AMBIGUOUS · INFERRED: 99 edges (avg confidence: 0.8) - Token cost: 0 input · 0 output ## Graph Freshness -- Built from commit: `ee47b535` +- Built from commit: `a56b7e8d` - Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `graphify update .` after code changes (no API cost). @@ -148,9 +148,10 @@ - [[_COMMUNITY_Community 370|Community 370]] - [[_COMMUNITY_Community 371|Community 371]] - [[_COMMUNITY_Community 372|Community 372]] +- [[_COMMUNITY_Community 373|Community 373]] ## God Nodes (most connected - your core abstractions) -1. `getStateInfo()` - 23 edges +1. `getStateInfo()` - 24 edges 2. `🏥 نوبت724 (Nobat724) - سیستم نوبت‌دهی آنلاین پزشکی` - 19 edges 3. `imageUrl()` - 15 edges 4. `Dashboard()` - 10 edges @@ -162,8 +163,6 @@ 10. `Architecture Overview` - 10 edges ## Surprising Connections (you probably didn't know these) -- `Dashboard()` --calls--> `safeJsonParse()` [INFERRED] - app/dashboard/page.js → lib/sanitize.js - `AboutUsPage()` --calls--> `getStateInfo()` [INFERRED] components/aboutUs/index.js → lib/getStateInfo.js - `ContactUsPage()` --calls--> `getStateInfo()` [INFERRED] @@ -172,11 +171,13 @@ components/home/search/index.js → lib/getStateInfo.js - `StLayout()` --calls--> `getStateInfo()` [INFERRED] components/layout/StLayout.js → lib/getStateInfo.js +- `generateMetadata()` --calls--> `getStateInfo()` [INFERRED] + app/about-us/page.js → lib/getStateInfo.js ## Import Cycles - None detected. -## Communities (373 total, 30 thin omitted) +## Communities (374 total, 30 thin omitted) ### Community 0 - "Community 0" Cohesion: 0.05 @@ -191,8 +192,8 @@ Cohesion: 0.04 Nodes (45): dependencies, aos, axios, @casl/ability, @casl/react, date-fns, dayjs, @emotion/cache (+37 more) ### Community 3 - "Community 3" -Cohesion: 0.10 -Nodes (12): ProvinceContext, ProvinceProvider(), Probe(), useProvince(), Content(), Form(), SubmitData(), EditField() (+4 more) +Cohesion: 0.24 +Nodes (14): getCurrentDomain(), robots(), cityFilterParams(), fetchAllPages(), getBlogUrls(), getCityScope(), getClinicUrls(), getCurrentDomain() (+6 more) ### Community 4 - "Community 4" Cohesion: 0.07 @@ -203,12 +204,12 @@ Cohesion: 0.08 Nodes (18): AppointmentList(), ItemAppointment(), AboutDcotor(), DetailDoctor(), Link(), listLink, List(), VAZIR_WEIGHTS (+10 more) ### Community 6 - "Community 6" -Cohesion: 0.15 -Nodes (8): Dashboard(), metadata, defineAbilitiesFor(), getUser(), buildPatientUser(), getServerAccessToken(), LogIn(), metadata +Cohesion: 0.06 +Nodes (17): Dashboard(), metadata, defineAbilitiesFor(), getUser(), formatToman(), rialToToman(), buildPatientUser(), safeJsonParse() (+9 more) ### Community 8 - "Community 8" -Cohesion: 0.07 -Nodes (28): devDependencies, babel-plugin-react-compiler, cross-env, eslint, eslint-config-next, @eslint/eslintrc, jsdom, prettier (+20 more) +Cohesion: 0.13 +Nodes (15): devDependencies, babel-plugin-react-compiler, cross-env, eslint, eslint-config-next, @eslint/eslintrc, jsdom, prettier (+7 more) ### Community 9 - "Community 9" Cohesion: 0.07 @@ -291,8 +292,8 @@ Cohesion: 0.12 Nodes (16): دیپلوی nobat724_front روی Liara (پلتفرم Next.js), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+8 more) ### Community 29 - "Community 29" -Cohesion: 0.13 -Nodes (8): generateMetadata(), generateMetadata(), Appointment(), metadata, getStateInfo(), ContentLogin(), generateMetadata(), Specialties() +Cohesion: 0.12 +Nodes (10): generateMetadata(), generateMetadata(), Appointment(), metadata, fetchSiteContext(), getStateInfo(), siteContextCache, ContentLogin() (+2 more) ### Community 30 - "Community 30" Cohesion: 0.12 @@ -355,8 +356,8 @@ Cohesion: 0.14 Nodes (13): `hours/List.js`, آبجکت اسلات (از `adaptSlots` / API), تأیید و سخت‌سازی غیرفعال‌بودن اسلات‌های گذشته در صفحه‌ی نوبت, زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (کد واقعی) (+5 more) ### Community 45 - "Community 45" -Cohesion: 0.31 -Nodes (9): generateMetadata(), generateMetadata(), imageUrl(), normalizeBlog(), Blog(), Doctor(), getBlog, getDoctor (+1 more) +Cohesion: 0.25 +Nodes (12): generateMetadata(), generateMetadata(), RootLayout(), imageUrl(), normalizeBlog(), getRequestOrigin(), safeJsonLd(), Blog() (+4 more) ### Community 46 - "Community 46" Cohesion: 0.22 @@ -379,8 +380,8 @@ Cohesion: 0.15 Nodes (12): زمینه, فایل‌های مرتبط, مشکل / هدف, نمایش تعداد پزشکان هر تخصص در صفحه /specialties, نکات مهم, وضعیت فعلی (کد واقعی), وظایف, پروژه (+4 more) ### Community 51 - "Community 51" -Cohesion: 0.09 -Nodes (25): getCurrentDomain(), robots(), cityFilterParams(), fetchAllPages(), getBlogUrls(), getCityScope(), getClinicUrls(), getCurrentDomain() (+17 more) +Cohesion: 0.06 +Nodes (20): ClinicsPage(), ProvinceContext, ProvinceProvider(), Probe(), useProvince(), Content(), Form(), SubmitData() (+12 more) ### Community 52 - "Community 52" Cohesion: 0.24 @@ -463,8 +464,8 @@ Cohesion: 0.22 Nodes (7): degree, Form(), gender, degree, Form(), gender, filterList() ### Community 72 - "Community 72" -Cohesion: 0.46 -Nodes (7): generateMetadata(), buildCanonicalPath(), buildCanonicalUrl(), buildMainCanonicalUrl(), getCanonicalUrl(), getRequestOrigin(), normalizeHost() +Cohesion: 0.52 +Nodes (6): generateMetadata(), buildCanonicalPath(), buildCanonicalUrl(), buildMainCanonicalUrl(), getCanonicalUrl(), normalizeHost() ### Community 73 - "Community 73" Cohesion: 0.32 @@ -484,7 +485,7 @@ Nodes (5): HeadTab(), setNewData(), DetailUser(), Disease(), IsTurnsDetails() ### Community 79 - "Community 79" Cohesion: 0.17 -Nodes (5): clearAccessToken(), api, handleSessionExpired(), request, removeToken() +Nodes (11): زمینه, سایت دامنه اختصاصی نماینده سراسری — تشخیص دامنه، فیلتر پزشکان/کلینیک‌ها, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+3 more) ### Community 81 - "Community 81" Cohesion: 0.24 @@ -563,8 +564,8 @@ Cohesion: 0.70 Nodes (4): generateMetadata(), Clinic(), computeClinicRating(), getClinic ### Community 366 - "Community 366" -Cohesion: 0.50 -Nodes (3): RootLayout(), safeJsonLd(), safeJsonParse() +Cohesion: 0.25 +Nodes (8): scripts, build, dev, lint, start, test, test:cov, test:watch ### Community 367 - "Community 367" Cohesion: 0.19 @@ -590,25 +591,29 @@ Nodes (3): ModalAddRelatives(), Relatives(), ItemRelatives() Cohesion: 0.40 Nodes (3): ModalAddSurgeries(), Surgeries(), ItemSurgeries() +### Community 373 - "Community 373" +Cohesion: 0.33 +Nodes (5): engines, node, name, private, version + ## Knowledge Gaps -- **687 isolated node(s):** `metadata`, `FILTER_KEYS`, `fallbackLabels`, `MaterialUISwitch`, `fixedIconData` (+682 more) +- **697 isolated node(s):** `metadata`, `FILTER_KEYS`, `fallbackLabels`, `MaterialUISwitch`, `fixedIconData` (+692 more) These have ≤1 connection - possible missing edges or undocumented components. - **30 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. ## Suggested Questions _Questions this graph is uniquely positioned to answer:_ -- **Why does `getStateInfo()` connect `Community 29` to `Community 0`, `Community 67`, `Community 70`, `Community 6`, `Community 72`, `Community 365`, `Community 45`, `Community 366`, `Community 16`, `Community 14`, `Community 51`, `Community 85`, `Community 86`?** - _High betweenness centrality (0.040) - this node is a cross-community bridge._ +- **Why does `getStateInfo()` connect `Community 29` to `Community 0`, `Community 67`, `Community 70`, `Community 6`, `Community 72`, `Community 365`, `Community 45`, `Community 14`, `Community 16`, `Community 51`, `Community 85`, `Community 86`?** + _High betweenness centrality (0.031) - this node is a cross-community bridge._ - **Why does `imageUrl()` connect `Community 45` to `Community 0`, `Community 99`, `Community 4`, `Community 7`, `Community 365`, `Community 81`, `Community 55`, `Community 56`, `Community 89`?** - _High betweenness centrality (0.039) - this node is a cross-community bridge._ -- **Why does `Dashboard()` connect `Community 6` to `Community 3`, `Community 70`, `Community 366`, `Community 79`, `Community 29`?** + _High betweenness centrality (0.025) - this node is a cross-community bridge._ +- **Why does `isRootCity()` connect `Community 51` to `Community 3`, `Community 29`?** _High betweenness centrality (0.015) - this node is a cross-community bridge._ - **Are the 22 inferred relationships involving `getStateInfo()` (e.g. with `generateMetadata()` and `AboutUsPage()`) actually correct?** _`getStateInfo()` has 22 INFERRED edges - model-reasoned connections that need verification._ - **Are the 14 inferred relationships involving `imageUrl()` (e.g. with `generateMetadata()` and `generateMetadata()`) actually correct?** _`imageUrl()` has 14 INFERRED edges - model-reasoned connections that need verification._ - **What connects `metadata`, `FILTER_KEYS`, `fallbackLabels` to the rest of the system?** - _687 weakly-connected nodes found - possible documentation gaps or missing edges._ + _697 weakly-connected nodes found - possible documentation gaps or missing edges._ - **Should `Community 0` be split into smaller, more focused modules?** _Cohesion score 0.05263157894736842 - nodes in this community are weakly interconnected._ \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.8.44/487a2843c238490c773599dc61eb97293f25564481d3dbe6a22462ca7efe3f63.json b/graphify-out/cache/ast/v0.8.44/487a2843c238490c773599dc61eb97293f25564481d3dbe6a22462ca7efe3f63.json new file mode 100644 index 0000000..e8ada0d --- /dev/null +++ b/graphify-out/cache/ast/v0.8.44/487a2843c238490c773599dc61eb97293f25564481d3dbe6a22462ca7efe3f63.json @@ -0,0 +1 @@ +{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_nobat724_front_claude_prompt_global_rep_domain_site_md", "label": "global-rep-domain-site.md", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L1"}, {"id": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "label": "\u0633\u0627\u06cc\u062a \u062f\u0627\u0645\u0646\u0647 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0633\u0631\u0627\u0633\u0631\u06cc \u2014 \u062a\u0634\u062e\u06cc\u0635 \u062f\u0627\u0645\u0646\u0647\u060c \u0641\u06cc\u0644\u062a\u0631 \u067e\u0632\u0634\u06a9\u0627\u0646/\u06a9\u0644\u06cc\u0646\u06cc\u06a9\u200c\u0647\u0627", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L1"}, {"id": "prompt_global_rep_domain_site_\u067e\u0631\u0648\u0698\u0647", "label": "\u067e\u0631\u0648\u0698\u0647", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L3"}, {"id": "prompt_global_rep_domain_site_\u0632\u0645\u06cc\u0646\u0647", "label": "\u0632\u0645\u06cc\u0646\u0647", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L9"}, {"id": "prompt_global_rep_domain_site_\u0645\u0634\u06a9\u0644_\u0647\u062f\u0641", "label": "\u0645\u0634\u06a9\u0644 / \u0647\u062f\u0641", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L13"}, {"id": "prompt_global_rep_domain_site_\u0641\u0627\u06cc\u0644_\u0647\u0627\u06cc_\u0645\u0631\u062a\u0628\u0637", "label": "\u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0645\u0631\u062a\u0628\u0637", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L19"}, {"id": "prompt_global_rep_domain_site_\u0648\u0636\u0639\u06cc\u062a_\u0641\u0639\u0644\u06cc", "label": "\u0648\u0636\u0639\u06cc\u062a \u0641\u0639\u0644\u06cc", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L30"}, {"id": "prompt_global_rep_domain_site_\u0648\u0638\u0627\u06cc\u0641", "label": "\u0648\u0638\u0627\u06cc\u0641", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L60"}, {"id": "prompt_global_rep_domain_site_\u06f1_\u062a\u0648\u0633\u0639\u0647_getstateinfo_repcontext", "label": "\u06f1. \u062a\u0648\u0633\u0639\u0647 `getStateInfo` \u2014 repContext", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L62"}, {"id": "prompt_global_rep_domain_site_\u06f2_\u067e\u0627\u0633_\u062f\u0627\u062f\u0646_domain_\u062f\u0631_\u0644\u06cc\u0633\u062a_\u0647\u0627", "label": "\u06f2. \u067e\u0627\u0633 \u062f\u0627\u062f\u0646 `domain` \u062f\u0631 \u0644\u06cc\u0633\u062a\u200c\u0647\u0627", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L81"}, {"id": "prompt_global_rep_domain_site_\u06f3_\u0645\u062a\u0627\u062f\u06cc\u062a\u0627_\u0648_\u0628\u0631\u0646\u062f\u06cc\u0646\u06af_\u062f\u0627\u0645\u0646\u0647_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647", "label": "\u06f3. \u0645\u062a\u0627\u062f\u06cc\u062a\u0627 \u0648 \u0628\u0631\u0646\u062f\u06cc\u0646\u06af \u062f\u0627\u0645\u0646\u0647 \u0646\u0645\u0627\u06cc\u0646\u062f\u0647", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L99"}, {"id": "prompt_global_rep_domain_site_\u0646\u06a9\u0627\u062a_\u0645\u0647\u0645", "label": "\u0646\u06a9\u0627\u062a \u0645\u0647\u0645", "file_type": "document", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L108"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_nobat724_front_claude_prompt_global_rep_domain_site_md", "target": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L1", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "target": "prompt_global_rep_domain_site_\u067e\u0631\u0648\u0698\u0647", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L3", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "target": "prompt_global_rep_domain_site_\u0632\u0645\u06cc\u0646\u0647", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L9", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "target": "prompt_global_rep_domain_site_\u0645\u0634\u06a9\u0644_\u0647\u062f\u0641", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L13", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "target": "prompt_global_rep_domain_site_\u0641\u0627\u06cc\u0644_\u0647\u0627\u06cc_\u0645\u0631\u062a\u0628\u0637", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L19", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "target": "prompt_global_rep_domain_site_\u0648\u0636\u0639\u06cc\u062a_\u0641\u0639\u0644\u06cc", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L30", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "target": "prompt_global_rep_domain_site_\u0648\u0638\u0627\u06cc\u0641", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L60", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0648\u0638\u0627\u06cc\u0641", "target": "prompt_global_rep_domain_site_\u06f1_\u062a\u0648\u0633\u0639\u0647_getstateinfo_repcontext", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L62", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0648\u0638\u0627\u06cc\u0641", "target": "prompt_global_rep_domain_site_\u06f2_\u067e\u0627\u0633_\u062f\u0627\u062f\u0646_domain_\u062f\u0631_\u0644\u06cc\u0633\u062a_\u0647\u0627", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L81", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0648\u0638\u0627\u06cc\u0641", "target": "prompt_global_rep_domain_site_\u06f3_\u0645\u062a\u0627\u062f\u06cc\u062a\u0627_\u0648_\u0628\u0631\u0646\u062f\u06cc\u0646\u06af_\u062f\u0627\u0645\u0646\u0647_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L99", "weight": 1.0}, {"source": "prompt_global_rep_domain_site_\u0633\u0627\u06cc\u062a_\u062f\u0627\u0645\u0646\u0647_\u0627\u062e\u062a\u0635\u0627\u0635\u06cc_\u0646\u0645\u0627\u06cc\u0646\u062f\u0647_\u0633\u0631\u0627\u0633\u0631\u06cc_\u062a\u0634\u062e\u06cc\u0635_\u062f\u0627\u0645\u0646\u0647_\u0641\u06cc\u0644\u062a\u0631_\u067e\u0632\u0634\u06a9\u0627\u0646_\u06a9\u0644\u06cc\u0646\u06cc\u06a9_\u0647\u0627", "target": "prompt_global_rep_domain_site_\u0646\u06a9\u0627\u062a_\u0645\u0647\u0645", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".claude/prompt/global-rep-domain-site.md", "source_location": "L108", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/stat-index.json b/graphify-out/cache/stat-index.json index a7a075f..128b232 100644 --- a/graphify-out/cache/stat-index.json +++ b/graphify-out/cache/stat-index.json @@ -1 +1 @@ -{"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/city.json":{"size":50423,"mtime_ns":1783500874424443420,"hash":"7cb85d049bcf4288946e6f3551efd44371501f29b7ff2c0ac51e59a6aa673f0f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/doctor_services.json":{"size":46716,"mtime_ns":1782843473061355065,"hash":"69c0d8624eabb28ee1926dd11d83d02a01adf8913f80dede1ad843c21ebc0258"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/education.json":{"size":360,"mtime_ns":1783066605170617760,"hash":"440ac7ee3fcce903f6aca0296103712fc17a1e9e86611527e9999c591573a2a2"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/progress_detail.json":{"size":519,"mtime_ns":1783066616077124496,"hash":"80fa177614a400037aa8b30941d025013544ef3ee864a7696d732cdac1cc6c3c"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/specialties.json":{"size":18764,"mtime_ns":1783065555796941169,"hash":"62b3ddfef408bb4f96f9ddd86862aa84919e27188e9fee49244dd8255e516914"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/state.json":{"size":4364,"mtime_ns":1782043006598236765,"hash":"87ca9a51f21c57083962121c571035a00e774a1a34cf519b0325450f882d04fd"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/jsconfig.json":{"size":72,"mtime_ns":1760953552262982824,"hash":"3c07efb26e59f46bcab477c7b4d1d68958c43ec0cceda5cb735726790af4fe76"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/liara.json":{"size":391,"mtime_ns":1782752961370207712,"hash":"10033b140aad3ee501bd9a5653eb0a1d43fe53aee55877becfca5a5d1b8a14b5"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/package.json":{"size":2250,"mtime_ns":1783320697752623093,"hash":"33b42f2ce8cac4d3129ca3504a45b69acb7d2d8a95b8a4965cd207f8faa66044"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/adapt-backend-audit-api.md":{"size":9483,"mtime_ns":1782671262951968193,"hash":"e19cc538d048d969601b941242dd729de7f7dea14a403bbe2ff5e134647aa10d"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/appointment-calendar-disabled-dates.md":{"size":9763,"mtime_ns":1781597583936646960,"hash":"e628c04749776a9b8042e5528f915660859a7cdfb6dc12d903cb1b2a73cb24ba"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/appointment-detail-fields-fix.md":{"size":4099,"mtime_ns":1781598090800373168,"hash":"2ab9c060be8be2d461b1ffd2995851906d66e25c229735a3219f85e1f8195839"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/appointment-required-account-fields.md":{"size":7280,"mtime_ns":1781597583936937752,"hash":"556a7ecaeb0c4bde3e6b682a03fea79fdaf7827c9d62ebb5c9b1cd58c427dc13"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/birthday-picker-year-month-day.md":{"size":7704,"mtime_ns":1781597583937172919,"hash":"a588d0d0150fcd8aaef3a41ebdad0404b8fa2c61855d157285aeb9dda04ef3ab"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/booking-lock-patient-flow.md":{"size":9588,"mtime_ns":1781597583937571794,"hash":"d78e22adc6d096b775cdcdc129b12347c337cff71afcb2b708c2cbca82486252"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/booking-send-representation.md":{"size":5088,"mtime_ns":1782304138361157784,"hash":"be8fa462416ccec3ff0f7e60b9d042def7fc27e7f8c03c577630fbb118e77482"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/city-seo-optimization.md":{"size":12088,"mtime_ns":1783069426847432170,"hash":"a0029107f5ad368d237cbf3b7ef28c7b7906794b6fb0da4a00180c0d5789d2d6"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/clinic-seo-schema-knowledge-panel.md":{"size":9490,"mtime_ns":1782035037082293145,"hash":"eb138f4534fc1433698377ae9673b1e22b8627dd564124c895efaf3bd58b64fe"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/connect-panel-dashboard-to-api.md":{"size":13193,"mtime_ns":1781597583937858961,"hash":"17a0579ff0b02c7d73fbdaaabdf26ae1dc668a0e6ab1fe3ff70a8222630b548f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/currency-toman-display-front.md":{"size":6340,"mtime_ns":1783060321819663682,"hash":"d260ca8d266e49ee94910a03c027d8c2b83461c0a40ca046ba1b6fac591f614f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/dashboard-tabs-real-data.md":{"size":10762,"mtime_ns":1781597583938112795,"hash":"e6cd614d25692aeefc353b2db4362ea2a269d2fe652151f227b6b855d33f5be3"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/doctor-poster-redesign.md":{"size":13362,"mtime_ns":1783190129986251542,"hash":"8113bbc0cb9b92135d3a293d761ff889a5f78b9d05d7273c7f8b0736c229c68f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/doctor-seo-schema-knowledge-panel.md":{"size":16103,"mtime_ns":1782031319440018719,"hash":"a1e7d5a4da148b5b13b8800f09d1417ff7a54d20c847b2738624b9d3e72659fc"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-appointment-booking-flow.md":{"size":19846,"mtime_ns":1781597583938358921,"hash":"f023a2e60de677580f5eb6ca22c299f10ee2c557be036cb5adcfa8917ef7d6fa"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-appointment-payment-flow.md":{"size":12476,"mtime_ns":1781597583938747463,"hash":"18b75a0aa94343da7fe5d77403f73b9e704527a92f8da7db04c627303413ef82"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-dashboard-uuid-and-lists.md":{"size":8449,"mtime_ns":1781597583938977130,"hash":"c9171ffaaad4600e4012c4dc7e8d747b8946ba451dfa315605e8ff4928694535"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-doctor-free-turn-disabled.md":{"size":7505,"mtime_ns":1782107579291283238,"hash":"01769376a658f7bf4c1c2ad9349b00581d485f9b199f48871b79333430847f0e"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-doctor-poster-download-image.md":{"size":8557,"mtime_ns":1783188160359344560,"hash":"11395172e2e3d905b4873294ed9df03919796e3c27396fcfc3816fccf38d456c"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-doctors-filter-performance.md":{"size":7565,"mtime_ns":1782043739683215914,"hash":"a2bff95d8ec72493e859cb174fca8469022ee7669f193d889e6e3d2b59bd97b3"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-header-logged-state.md":{"size":7287,"mtime_ns":1781597583939167297,"hash":"9fa28b5810446e5d2cf89ccf2f58a9976c4e9ce3975df5a3b32f3c3eb50a0dce"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-login-bugs.md":{"size":5993,"mtime_ns":1782035969986699960,"hash":"94add08ebe87780fbd4fccf08ed11be2cb45d55828a81f6cc9bc39c79902c040"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-login-session-userinfo.md":{"size":8739,"mtime_ns":1781597583939455089,"hash":"22044e56711732a73f5130b6d38607cd52df0e22fc19c6bd5778544486df932e"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-my-appointments-status-filter.md":{"size":6079,"mtime_ns":1781597583939678131,"hash":"cf4be2acf9ffc36974a6f6999cf2cc5259b73be544a3e0bcaf0f589f34943c4d"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-payment-gateway-flow.md":{"size":11147,"mtime_ns":1782981612166014856,"hash":"c6e6c55b51cabc086cfb88e97ae4977b2f8587822a38232102bea1d45b94f0ab"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-token-storage-xss-headers.md":{"size":11238,"mtime_ns":1781946381493130088,"hash":"88ae04aa6c4de588a6b7fab59d6fc9426d7b1b43c75a1e1e4103fdcf0edfc6df"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/liara-deploy.md":{"size":9137,"mtime_ns":1782750983100811315,"hash":"40d115b3bc3a43851f8e317427e23bd857de37f77bb5b2080077c69e774d1a53"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/nobat724-root-domain-not-city.md":{"size":8911,"mtime_ns":1783016271523973931,"hash":"7abb24fe0c3e3ea6125318b160cba6c41c57be779a3a96dccc77be825cb2d713"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/nobat724-test-suite.md":{"size":19981,"mtime_ns":1782675306936470499,"hash":"76e8926e91c5544fd793ecba45b8b4db9bff5f11593d3ed64a5a8f308ee745e9"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/otp-sms-site-name.md":{"size":4341,"mtime_ns":1783070832183884597,"hash":"c4c736e8535fae943d10e3bfc9aa45b546be27aef879ddc7b919caa7790ff2c5"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/payment-flow-frontend.md":{"size":6753,"mtime_ns":1782992956701932660,"hash":"6913de88e303725560499adef7c1ce2583e257eef0b083758cb67eab05d46151"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/payment-single-flow-frontend.md":{"size":6327,"mtime_ns":1782994816069623536,"hash":"4bf6587d44aa63a0b48c7a22fe7d01cf30be8d2a5385fc3205e3ba4155437411"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/profile-birthday-send-direction-fix.md":{"size":3365,"mtime_ns":1781597583939863923,"hash":"66a55129ea309cca03cc872462fd47053c309c64720784e79f21b4efb5ae4ec0"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/rating-rich-ui-wiring.md":{"size":9378,"mtime_ns":1781597583940215798,"hash":"add909cd22a22c9352f1cd3a6b4bb2ad6672e7784198164f8dbfda25d2f0f93a"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/seo-performance-rendering-audit.md":{"size":15903,"mtime_ns":1782028177971687083,"hash":"10bcf71f9a660ad56f97bb92cb033794f8e65858f761c286191277095231e09a"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/specialties-doctor-count-wire.md":{"size":5538,"mtime_ns":1781599369387196341,"hash":"5d9ed62a164217933720bd64bef89e07413a7e82fe92171cf9508b24e0e5d838"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/technical-seo-audit-multidomain.md":{"size":19291,"mtime_ns":1783252646626491244,"hash":"d070d13a6d70943eb3b5332a9909bcdc1eff6826610b93156c767087628cb143"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/upgrade-next-16.md":{"size":13380,"mtime_ns":1783320697635832503,"hash":"e0f930abf1bac512900eb97733708e398c52df8a5a088d3cd11212546f210eb9"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/user-profile-no-404.md":{"size":6562,"mtime_ns":1781597583940472507,"hash":"a5e69f183ea4fdd29b651385b5350ecc1d7c52097b7a4228e7d1be03b98f7c61"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/verify-past-slots-disabled.md":{"size":5350,"mtime_ns":1781597583940678257,"hash":"bfc8ebe5dcd533c93c86935a95afbcd9456f3828d6801dc02a4231a52b6b06b9"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/CLAUDE.md":{"size":5513,"mtime_ns":1783323447323021515,"hash":"847a296771bd1672e5a798d5f0451ca074cd45536c02d88cd8c08b3857cc7b27"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/README.md":{"size":23904,"mtime_ns":1783323437507877219,"hash":"c71ff73b6ff7b535887b1f016ed07f863d3ebd283571b91baacccb9fb53f685d"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-sitemap-build-fetch-failed.md":{"size":6887,"mtime_ns":1783337915815095855,"hash":"f500d64d164ae77195e7aecbb1ff75b8cec4e1bfceb971ffac3cc46666071630"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/city-json-seo-fields.md":{"size":8340,"mtime_ns":1783498761590225655,"hash":"bad09a70d9f8b419ea377acb5fabb95cee6de33307381fc161c99a402018cd59"}} \ No newline at end of file +{"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/city.json":{"size":50423,"mtime_ns":1783500874424443420,"hash":"7cb85d049bcf4288946e6f3551efd44371501f29b7ff2c0ac51e59a6aa673f0f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/doctor_services.json":{"size":46716,"mtime_ns":1782843473061355065,"hash":"69c0d8624eabb28ee1926dd11d83d02a01adf8913f80dede1ad843c21ebc0258"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/education.json":{"size":360,"mtime_ns":1783066605170617760,"hash":"440ac7ee3fcce903f6aca0296103712fc17a1e9e86611527e9999c591573a2a2"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/progress_detail.json":{"size":519,"mtime_ns":1783066616077124496,"hash":"80fa177614a400037aa8b30941d025013544ef3ee864a7696d732cdac1cc6c3c"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/specialties.json":{"size":18764,"mtime_ns":1783065555796941169,"hash":"62b3ddfef408bb4f96f9ddd86862aa84919e27188e9fee49244dd8255e516914"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/data/state.json":{"size":4364,"mtime_ns":1782043006598236765,"hash":"87ca9a51f21c57083962121c571035a00e774a1a34cf519b0325450f882d04fd"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/jsconfig.json":{"size":72,"mtime_ns":1760953552262982824,"hash":"3c07efb26e59f46bcab477c7b4d1d68958c43ec0cceda5cb735726790af4fe76"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/liara.json":{"size":391,"mtime_ns":1782752961370207712,"hash":"10033b140aad3ee501bd9a5653eb0a1d43fe53aee55877becfca5a5d1b8a14b5"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/package.json":{"size":2250,"mtime_ns":1783320697752623093,"hash":"33b42f2ce8cac4d3129ca3504a45b69acb7d2d8a95b8a4965cd207f8faa66044"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/adapt-backend-audit-api.md":{"size":9483,"mtime_ns":1782671262951968193,"hash":"e19cc538d048d969601b941242dd729de7f7dea14a403bbe2ff5e134647aa10d"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/appointment-calendar-disabled-dates.md":{"size":9763,"mtime_ns":1781597583936646960,"hash":"e628c04749776a9b8042e5528f915660859a7cdfb6dc12d903cb1b2a73cb24ba"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/appointment-detail-fields-fix.md":{"size":4099,"mtime_ns":1781598090800373168,"hash":"2ab9c060be8be2d461b1ffd2995851906d66e25c229735a3219f85e1f8195839"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/appointment-required-account-fields.md":{"size":7280,"mtime_ns":1781597583936937752,"hash":"556a7ecaeb0c4bde3e6b682a03fea79fdaf7827c9d62ebb5c9b1cd58c427dc13"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/birthday-picker-year-month-day.md":{"size":7704,"mtime_ns":1781597583937172919,"hash":"a588d0d0150fcd8aaef3a41ebdad0404b8fa2c61855d157285aeb9dda04ef3ab"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/booking-lock-patient-flow.md":{"size":9588,"mtime_ns":1781597583937571794,"hash":"d78e22adc6d096b775cdcdc129b12347c337cff71afcb2b708c2cbca82486252"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/booking-send-representation.md":{"size":5088,"mtime_ns":1782304138361157784,"hash":"be8fa462416ccec3ff0f7e60b9d042def7fc27e7f8c03c577630fbb118e77482"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/city-seo-optimization.md":{"size":12088,"mtime_ns":1783069426847432170,"hash":"a0029107f5ad368d237cbf3b7ef28c7b7906794b6fb0da4a00180c0d5789d2d6"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/clinic-seo-schema-knowledge-panel.md":{"size":9490,"mtime_ns":1782035037082293145,"hash":"eb138f4534fc1433698377ae9673b1e22b8627dd564124c895efaf3bd58b64fe"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/connect-panel-dashboard-to-api.md":{"size":13193,"mtime_ns":1781597583937858961,"hash":"17a0579ff0b02c7d73fbdaaabdf26ae1dc668a0e6ab1fe3ff70a8222630b548f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/currency-toman-display-front.md":{"size":6340,"mtime_ns":1783060321819663682,"hash":"d260ca8d266e49ee94910a03c027d8c2b83461c0a40ca046ba1b6fac591f614f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/dashboard-tabs-real-data.md":{"size":10762,"mtime_ns":1781597583938112795,"hash":"e6cd614d25692aeefc353b2db4362ea2a269d2fe652151f227b6b855d33f5be3"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/doctor-poster-redesign.md":{"size":13362,"mtime_ns":1783190129986251542,"hash":"8113bbc0cb9b92135d3a293d761ff889a5f78b9d05d7273c7f8b0736c229c68f"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/doctor-seo-schema-knowledge-panel.md":{"size":16103,"mtime_ns":1782031319440018719,"hash":"a1e7d5a4da148b5b13b8800f09d1417ff7a54d20c847b2738624b9d3e72659fc"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-appointment-booking-flow.md":{"size":19846,"mtime_ns":1781597583938358921,"hash":"f023a2e60de677580f5eb6ca22c299f10ee2c557be036cb5adcfa8917ef7d6fa"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-appointment-payment-flow.md":{"size":12476,"mtime_ns":1781597583938747463,"hash":"18b75a0aa94343da7fe5d77403f73b9e704527a92f8da7db04c627303413ef82"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-dashboard-uuid-and-lists.md":{"size":8449,"mtime_ns":1781597583938977130,"hash":"c9171ffaaad4600e4012c4dc7e8d747b8946ba451dfa315605e8ff4928694535"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-doctor-free-turn-disabled.md":{"size":7505,"mtime_ns":1782107579291283238,"hash":"01769376a658f7bf4c1c2ad9349b00581d485f9b199f48871b79333430847f0e"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-doctor-poster-download-image.md":{"size":8557,"mtime_ns":1783188160359344560,"hash":"11395172e2e3d905b4873294ed9df03919796e3c27396fcfc3816fccf38d456c"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-doctors-filter-performance.md":{"size":7565,"mtime_ns":1782043739683215914,"hash":"a2bff95d8ec72493e859cb174fca8469022ee7669f193d889e6e3d2b59bd97b3"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-header-logged-state.md":{"size":7287,"mtime_ns":1781597583939167297,"hash":"9fa28b5810446e5d2cf89ccf2f58a9976c4e9ce3975df5a3b32f3c3eb50a0dce"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-login-bugs.md":{"size":5993,"mtime_ns":1782035969986699960,"hash":"94add08ebe87780fbd4fccf08ed11be2cb45d55828a81f6cc9bc39c79902c040"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-login-session-userinfo.md":{"size":8739,"mtime_ns":1781597583939455089,"hash":"22044e56711732a73f5130b6d38607cd52df0e22fc19c6bd5778544486df932e"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-my-appointments-status-filter.md":{"size":6079,"mtime_ns":1781597583939678131,"hash":"cf4be2acf9ffc36974a6f6999cf2cc5259b73be544a3e0bcaf0f589f34943c4d"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-payment-gateway-flow.md":{"size":11147,"mtime_ns":1782981612166014856,"hash":"c6e6c55b51cabc086cfb88e97ae4977b2f8587822a38232102bea1d45b94f0ab"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-token-storage-xss-headers.md":{"size":11238,"mtime_ns":1781946381493130088,"hash":"88ae04aa6c4de588a6b7fab59d6fc9426d7b1b43c75a1e1e4103fdcf0edfc6df"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/liara-deploy.md":{"size":9137,"mtime_ns":1782750983100811315,"hash":"40d115b3bc3a43851f8e317427e23bd857de37f77bb5b2080077c69e774d1a53"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/nobat724-root-domain-not-city.md":{"size":8911,"mtime_ns":1783016271523973931,"hash":"7abb24fe0c3e3ea6125318b160cba6c41c57be779a3a96dccc77be825cb2d713"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/nobat724-test-suite.md":{"size":19981,"mtime_ns":1782675306936470499,"hash":"76e8926e91c5544fd793ecba45b8b4db9bff5f11593d3ed64a5a8f308ee745e9"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/otp-sms-site-name.md":{"size":4341,"mtime_ns":1783070832183884597,"hash":"c4c736e8535fae943d10e3bfc9aa45b546be27aef879ddc7b919caa7790ff2c5"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/payment-flow-frontend.md":{"size":6753,"mtime_ns":1782992956701932660,"hash":"6913de88e303725560499adef7c1ce2583e257eef0b083758cb67eab05d46151"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/payment-single-flow-frontend.md":{"size":6327,"mtime_ns":1782994816069623536,"hash":"4bf6587d44aa63a0b48c7a22fe7d01cf30be8d2a5385fc3205e3ba4155437411"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/profile-birthday-send-direction-fix.md":{"size":3365,"mtime_ns":1781597583939863923,"hash":"66a55129ea309cca03cc872462fd47053c309c64720784e79f21b4efb5ae4ec0"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/rating-rich-ui-wiring.md":{"size":9378,"mtime_ns":1781597583940215798,"hash":"add909cd22a22c9352f1cd3a6b4bb2ad6672e7784198164f8dbfda25d2f0f93a"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/seo-performance-rendering-audit.md":{"size":15903,"mtime_ns":1782028177971687083,"hash":"10bcf71f9a660ad56f97bb92cb033794f8e65858f761c286191277095231e09a"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/specialties-doctor-count-wire.md":{"size":5538,"mtime_ns":1781599369387196341,"hash":"5d9ed62a164217933720bd64bef89e07413a7e82fe92171cf9508b24e0e5d838"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/technical-seo-audit-multidomain.md":{"size":19291,"mtime_ns":1783252646626491244,"hash":"d070d13a6d70943eb3b5332a9909bcdc1eff6826610b93156c767087628cb143"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/upgrade-next-16.md":{"size":13380,"mtime_ns":1783320697635832503,"hash":"e0f930abf1bac512900eb97733708e398c52df8a5a088d3cd11212546f210eb9"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/user-profile-no-404.md":{"size":6562,"mtime_ns":1781597583940472507,"hash":"a5e69f183ea4fdd29b651385b5350ecc1d7c52097b7a4228e7d1be03b98f7c61"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/verify-past-slots-disabled.md":{"size":5350,"mtime_ns":1781597583940678257,"hash":"bfc8ebe5dcd533c93c86935a95afbcd9456f3828d6801dc02a4231a52b6b06b9"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/CLAUDE.md":{"size":5513,"mtime_ns":1783323447323021515,"hash":"847a296771bd1672e5a798d5f0451ca074cd45536c02d88cd8c08b3857cc7b27"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/README.md":{"size":23904,"mtime_ns":1783323437507877219,"hash":"c71ff73b6ff7b535887b1f016ed07f863d3ebd283571b91baacccb9fb53f685d"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/fix-sitemap-build-fetch-failed.md":{"size":6887,"mtime_ns":1783337915815095855,"hash":"f500d64d164ae77195e7aecbb1ff75b8cec4e1bfceb971ffac3cc46666071630"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/city-json-seo-fields.md":{"size":8340,"mtime_ns":1783498761590225655,"hash":"bad09a70d9f8b419ea377acb5fabb95cee6de33307381fc161c99a402018cd59"},"/Users/hamed/pj/my_pj/clinic_pro/nobat724_front/.claude/prompt/global-rep-domain-site.md":{"size":8662,"mtime_ns":1783568045290634030,"hash":"487a2843c238490c773599dc61eb97293f25564481d3dbe6a22462ca7efe3f63"}} \ No newline at end of file diff --git a/graphify-out/graph.html b/graphify-out/graph.html index 2deeeb4..66bddc9 100644 --- a/graphify-out/graph.html +++ b/graphify-out/graph.html @@ -63,12 +63,12 @@
-
2037 nodes · 2019 edges · 373 communities
+
2051 nodes · 2034 edges · 374 communities