سجل التغييرات

GitHub

كل تغيير جدير بالذكر، إصدارًا بعد إصدار. الملف نفسه يأتي مع المستودع ومترجم إلى جميع اللغات الـ19.

[1.133.0] — 2026-08-01

أُضيف

  • اكتشاف الشركات المموَّلة (#/funded، تكافؤ مع المشروع الأصل #2117) — عرض جديد للقراءة فقط يُمرِّر سكربت company-funded.mjs الخاص بالمشروع الأصل career-ops عبر GET /api/company-funded: قائمة أولية للمراجعة تضم الشركات التي حصلت مؤخراً على تمويل، مُكتشَفة من تغذيات تمويل عامة مُثبَّتة المضيف (TechCrunch، وPR Newswire، وThe Guardian، وHacker News). يُشغِّل التمرير السكربت بالخيارين --json --dry-run (إخراج JSON إلى stdout، دون كتابة ملفات)، ولا يُمرِّر مدخلات المستخدم أبداً إلى --sources، ويحمل تحديد معدّل (rate limiting)، وهو مُشغَّل من قِبل المستخدم فقط (زر اكتشاف، لا يُشغَّل عند التحميل أبداً). وحدة مسار جديدة server/lib/routes/funded.mjs + public/js/views/funded.js، ضمن قسم الاستقطاب.
  • موجز المقابلات الأسبوعي (#/interview-digest، تكافؤ مع المشروع الأصل #2129/#2130) — عرض جديد للقراءة فقط يُمرِّر سكربت weekly-digest.mjs الخاص بالمشروع الأصل (بدون LLM) عبر GET /api/interview/weekly-digest: تجميع آلي لملاحظات جلسات المقابلات — الشركات والجولات التي أُجريت معها مقابلات هذا الأسبوع، والكفاءات المتكررة، والثغرات المفتوحة المُقدَّرة بأفضل جهد. يُمرَّر النطاق الاختياري ?from=&to= فقط عندما يكون كلا الطرفين بصيغة YYYY-MM-DD صالحة؛ النطاق الفارغ يُنتج موجزاً صالحاً بقيمة available:true. أُضيف إلى server/lib/routes/interview.mjs + public/js/views/interview-digest.js، ضمن قسم التحليلات.
  • يتّبع كلا المُمرِّرين عقد “الفشل الآمن” available:false المُعتمَد عندما يكون سكربت المشروع الأصل غير موجود (بيئة CI، التثبيتات المستقلة). 26 مفتاح ترجمة (i18n) جديداً ×17 لغة؛ مجموعة اختبار جديدة معزولة عن CI tests/parity-routes-v1133.test.mjs (+5 ← 2143).

ملاحظات

  • تجاوز المشروع الأصل career-ops الإصدار v1.24.0 بإضافة صفحة متتبّع المتابعة (Follow-up Tracker) الخاصة بتطبيق web/ المبني على Next.js (#1422) وتصيير PDF من جهة الخادم (#2182) — لم يُنقَل ذلك: تمتلك career-ops-ui بالفعل مسار تمرير خاصاً بالمتابعة ومُشغِّلات PDF خاصة بها، وتصليب followup-cadence.mjs الكامن يصل مجاناً عبر مسار التمرير القائم على shell out. تغييرات set-status.mjs / tracker-utils.mjs داخلية بحتة لواجهة سطر الأوامر (CLI) ولا تُعكَس هنا.

[1.132.0] — 2026-07-31

غُيّر

  • استُخلصت منظومة عرض نتائج #/scan إلى public/js/lib/scan-results.js (تسديد ديْن عقد حجم الملف — كان public/js/views/scan.js قد بلغ نحو 1254 سطرًا). انتقلت المنظومة — renderResults، وbuildChipRow، وgetRows، وبانيات الصفوف/الأوجه، ورسّامات خيارات الأقدمية/البلد، ومرآة سجلّ FALLBACK_SOURCES — إلى مصنع window.ScanResults.create(ctx) يُغلق على كائن سياق يوفّره العرض (عناصر التصفية، ومجموعات الأوجه النشطة، ومقسِّم الصفحات، وبيانات الصفحة الثنائية، ودالة جلب lastResults). لا تغيير في السلوك — نُقلت الدوال حرفيًا وأُعيد ربط متغيرات الإغلاق ميكانيكيًا إلى ctx.*؛ أصبح scan.js الآن نحو 906 سطرًا. (لا يزال فوق الحد المستهدف البالغ 800 سطر — من المخطط إجراء عملية استخلاص ثانية؛ عقد حجم الملف لعرضَي JS المتبقيين الشاذّين، scan.js وconfig.js، مُتتبَّع في docs/sdd/CONVENTIONS.md.)
  • تقرأ الاختبارات الثابتة للمصدر الآن الملفين عبر tests/helpers/scan-src.mjs::loadScanSrc() (على غرار loadAppCss())؛ يقرأ tests/scan-fallback-sources.test.mjs الآن مرآة السجلّ من scan-results.js.
  • بوابة انحدار جديدة داخل المتصفح — يُهيّئ tests/playwright-scan-filters.mjs ملف data/last-scan.json مُعَدًّا مسبقًا ويُشغّل كل مرشّحات #/scan (المصدر، الأقدمية، العمل عن بُعد، العمر، تضمين/استبعاد النص)، مُتحقِّقًا من أعداد الصفوف بدقّة، بحيث يُتحقَّق من الاستخلاص مقابل سلوك المتصفح الفعلي (يُشغَّل عبر npm run test:e2e:browser). أُضيفت معرِّفات ثابتة لعناصر التصفية (#scan-filter-*، #scan-apply) لأجله.

صيانة

  • أصبحت لافتة “أحدث إصدار” في README مُختصرة إلى ملخّص من سطر واحد + رابط إلى سجل التغييرات الكامل (يُتقاعَد الجدار السردي الطويل متعدد الإصدارات — يعيش التاريخ في CHANGELOG*.md). طُبِّق ذلك عبر جميع اللغات الـ17.

[1.131.2] — 2026-07-31

غُيّر

  • تقسيم app.css إلى ثلاث صفحات أنماط مرتّبة (ديْن عقد حجم الملف — كان الملف الواحد قد بلغ نحو 1990 سطرًا، متجاوزًا كثيرًا الحد الصارم البالغ 800 سطر). أصبح الآن app.css (نحو 672 سطرًا — إمكانية الوصول، رموز التصميم/السمة، الشريط الجانبي، المحتوى الرئيسي، الأزرار، غلاف المحتوى)، و**components.css** (نحو 595 سطرًا — البطاقات، الشبكات، مقسِّم الصفحات، الشارات، الجداول، النماذج، السجل/وحدة التحكم، markdown، مبدّل اللغة، مرشّح الرقائق، شريط الاتصال)، و**overlays.css** (نحو 737 سطرًا — التنبيه المنبثق (toast)، درج الإشعارات، النافذة المنبثقة (modal)، المتفرقات/الاستجابة، انعكاس [dir="rtl"]، docs-fab، usage-hud)، كل منها ضمن الحد الصارم.
    • القطع متواصل ومرتّب، لذا يكون التتالي (cascade) مطابقًا حرفيًا بايتًا ببايت للملف قبل التقسيم؛ يحمّل index.html الملفات الثلاثة كعناصر <link> مرتّبة. لا تغيير في السلوك أو الترميز أو الترجمة (i18n).
    • أصبحت الاختبارات التي تتحقق من CSS تقرأ الآن السلسلة المُدمَجة عبر مُساعد مشترك tests/helpers/css.mjs::loadAppCss(). يُثبّت ملف اختبار جديد tests/css-modularization.test.mjs هذا التقسيم (وجود الملفات · كل منها ≤ 800 سطر · ترتيب عناصر <link> في index.html) ← المجموعة 2138. جرى التحقق داخل المتصفح: تُحلَّل صفحات الأنماط الثلاث جميعها وتُطبَّق قواعدها.

[1.131.1] — 2026-07-31

أُصلح

  • اتساق تثبيت المضيف للمحوّلات (adapters) في مصدرَي v1.130.0 (متابعات مراجعة الذكاء الاصطناعي، دفاع في العمق؛ لا تغيير في السلوك للمدخلات الصالحة):
    • محوّل a16z-speedrun-talent يعيد الآن التحقّق من تجاوز api: / a16z-speedrun-talent: عند buildEndpoint (HTTPS + مضيف مطابق تمامًا speedrun-talent-network.com) ويعود إلى التغذية القياسية عند فشل التحقّق — تكافؤًا مع محوّل cryptocurrencyjobs، بحيث لا تصل قيمة من مضيف مختلف إلى منفذ الجلب أبدًا (كان يعتمد سابقًا فقط على حارس assertSpeedrunUrl عند وقت الجلب). أصبح فحص تطابق المضيف الدقيق الآن تعبيرًا نمطيًا واحدًا مُصدَّرًا SPEEDRUN_TALENT_HOST_RE يتشاركه الحارس والمحوّل.
    • مُحلِّل cryptocurrencyjobs — يستخدم cleanUrl الآن حارس المضيف المطابق تمامًا نفسه المستخدَم في assertCryptocurrencyJobsUrl وتجاوز المحوّل (كان يستخدم endsWith، الذي يقبل النطاقات الفرعية). لم يعد المُحلِّل أبدًا أكثر تساهلًا من حارس SSRF: يُستبعَد رابط عنصر من sub.cryptocurrencyjobs.co.
    • ‏+2 اختبارَين → المجموعة 2135.

[1.131.0] — 2026-07-31

أُضيف

  • لوحة تبويبات المراحل بأسلوب CRM في #/tracker (منقولة من عرض /pipeline الخاص بتطبيق الويب للمشروع الأصل). يُستبدل شريط رقائق القمع + القائمة المنسدلة للحالة في المتتبِّع بـشريط تبويبات مراحل: تبويب الكل بالإضافة إلى تبويب لكل حالة قياسية — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — يعرض كل منها عداداً حياً لكامل السجل التاريخي، مع تضمين المراحل ذات العدّ الصفري بحيث يظل القمع بالكامل مرئياً دائماً (المظهر النمطي لـCRM). التبويب النشط يقود عملية التصفية؛ والنقر عليه مجدداً يمسح التصفية ويعود إلى الكل. تحافظ الصفوف على تدرّج لون النتيجة والشرعية وإمكانيات PDF والتقرير، وتُظهر خلية الشركة الآن شعار العلامة التجارية عند تفعيل الشعارات (معطّلة افتراضياً ← صفر طلبات إضافية).
    • مسار جديد للقراءة فقط GET /api/tracker/stages يُعيد القمع القياسي (التسميات مرتّبة) + خريطة طيّ للأسماء البديلة، مصدرها server/lib/states.mjs (templates/states.yml، مع احتياطي مُضمَّن) — بحيث لا يُبرمج العميل أبداً القائمة البيضاء للحالات. يبقى رد GET /api/tracker القديم بلا معامِلات دون تغيير ({ rows } فقط).
    • مكتبة عميل جديدة نقية ومُختبرة وحدويًا public/js/lib/tracker-stages.js تُصنّف الصفوف وفق مراحل الخادم، متسامحة مع تنسيق markdown العريض الشارد والأسماء البديلة المترجَمة (مثال: aplicado ← Applied). التبويبات قابلة للوصول (role tablist/tab، وaria-selected، ومساحة لمس ≥44 بكسل، والعدادات ضمن الاسم المتاح للوصول لكل تبويب). لا مفاتيح i18n جديدة. المجموعة 2133.

[1.130.0] — 2026-07-31

أُضيف

  • مصدرا مسح جديدان منقولان من المشروع الأصلي career-ops v1.24.0 (داخل العملية، دون تبعيات جديدة؛ يظهر كلاهما في قائمة Source المنسدلة بـ#/scan وعلى الصفحة الرئيسية لـcvstart.org):
    • a16z Speedrun (a16z-speedrun-talent، ‏#2231) — تغذية JSON على مستوى اللوحة بأكملها لشبكة مواهب a16z Speedrun. مضيف مُثبَّت على speedrun-talent-network.com، HTTPS فقط، ترقيم صفحات يبدأ من 0 مع حدّ أقصى لعدد الصفحات، وتمرير q/إعداد لكل شركة، وفشل بأسلوب آمن.
    • Cryptocurrency Jobs (cryptocurrencyjobs) — لوحة وظائف الويب3 cryptocurrencyjobs.co، تُستوعب عبر تغذية RSS 2.0 العامة الخاصة بها (بلا مصادقة). فكّ ترميز كيانات XML على مرحلتين، قوائم عن بُعد فقط، واستخراج جهة التوظيف من ذيل العنوان "… at <Company>".
    • أصبح إجمالي السجل الآن 72 مصدرًا = 67 إنجليزية + 5 روسية (ALL_ADAPTERS = 67 محوّلاً إنجليزيًا).

أُصلح

  • echojobs — تبقى الوظائف الهجينة قابلة للتمييز عن العمل عن بُعد (تكافؤ مع المشروع الأصلي، ‏#2258). أصبحت علامة hybrid غير الحسّاسة لحالة الأحرف تُنتج الآن "<City> · Hybrid" (أو Hybrid مجردة عند غياب المدينة) وworkplaceType: 'Hybrid'، بدلاً من الانطواء ضمن Remote.
  • radancy — دعم ترميز TalentBrew القديم ونقل جزء نتائج JSON (تكافؤ مع المشروع الأصلي a3e6df9)، محكوم بـopts.fetchJson قابل للحقن.

ملاحظات

  • لم يُنقل — ميزات خاصة بـCLI المشروع الأصلي فقط. يبقى السطح الكبير لـCLI/الأوضاع في career-ops v1.24.0 خارج web-ui، الذي هو عارض + كتابة رقيقة عبره، لا مضيف أوضاع: جداول الامتثال/الاختصاص القضائي، دفتر هاتف جهات الاتصال + vCard، تفريغ محاضر المقابلة النصية/اكتشاف منصّة المكالمات، تعيين حالة السجل، تسجيل النتيجة، الفرز الثنائي المرحلة، تشابه إعلانات الوظائف، مخطّط عنصر السيرة الذاتية للطلب المُصدَّر، اكتشاف Playwright-MCP لـdoctor، وملف portals/fix-slugs.mjs. تغييرات تنسيق المسح التي تعيش في scan.mjs الخاص بالمشروع الأصلي — ماسح Interamt.de بواسطة Playwright، مسح iCIMS الشامل العكسي لأنظمة ATS، مرشّح العمل عن بُعد حسب أهلية الدولة، ضبط وتيرة بحث DNS، إزالة تكرار rltr في StepStone، وعمود الشركة الموحَّد في سجل المسح — لا تنطبق: يُشغّل web-ui ماسحات EN/RU داخل العملية ولا يستدعي scan.mjs.
  • مُغطّى مسبقًا. إصلاح طيّ التشكيل في role-matcher (‏#2209) نُقل في v1.127.0، لذا فهو بلا أثر هنا.

[1.129.1] — 2026-07-29

أُصلح

  • متابعات مراجعة الذكاء الاصطناعي على منافذ web من v1.128/v1.129 (كلها استشارية، أُصلحت من الأصل): أسبقية المستوى في job-facets.js (المعدِّل الصريح يتغلّب الآن على كلمة الإدارة — Senior Engineering Manager → senior، كان lead)؛ لم يعد fallback في states.mjs مثبَّتًا (تُحفظ القراءة الناجحة، ويُعاد fallback دون تخزين — الأب غير المتاح مؤقتًا عند الإقلاع يُقرأ ثانيةً في الاستدعاء التالي) + console.warn عند ملف موجود لكنه تالف؛ score-tone.js — الصف بلا درجة محايد (muted) لا أحمر؛ يتخطّى domainFromName() الـslugs غير ASCII قبل /api/logo؛ +حارس عزل في tests/states.test.mjs. +4 اختبارات → 2073.

[1.129.0] — 2026-07-29

أُضيف

  • وجه المستوى + عمود المدة في #/scan — مكتبة job-facets.js التي شُحنت في v1.128.0 صارت الآن موصولة بواجهة المسح (كانت منطقًا فقط). قائمة المستوى الجديدة تصنّف عنوان كل وظيفة إلى lead/staff/senior/متوسط/junior/متدرب (JobFacets.seniorityFromTitle) وتُملأ تلقائيًا مما هو موجود فعليًا في النتائج (كوجه الدولة)؛ العناوين بلا كلمة مستوى تمرّ دائمًا. تُحفظ في عمليات البحث المحفوظة وإعادة التعيين والتطبيق. يكتسب الجدول عمود المستوى (شارة) وعمود المدة بلا رموز (اليوم / Nي، من JobFacets.daysSince). 12 مفتاح i18n ×17، +3 اختبارات → 2069.

[1.128.0] — 2026-07-29

أُضيف

  • أربعة حلول منقولة من تطبيق الويب الخاص بالمشروع الأب (../web/، Next.js)، أُعيدت كتابتها بجافاسكريبت خام/ESM دون تبعيات جديدة: (1) يقرأ server/lib/states.mjs ملف templates/states.yml مباشرةً كمصدر وحيد لمفردات حالات المتتبِّع (مع احتياطي للـCI) — ويلغي إعادة المزامنة اليدوية للقائمة البيضاء كل إصدار؛ يطوي POST الأسماء البديلة (الإسبانية/القديمة) إلى التسمية القياسية، ويجمّع قمع GET حسب الحالة القياسية؛ (2) شعارات الشركات في صفوف مستضافة على ATS عبر domainFromName() (~90 علامة→نطاق)؛ (3) score-tone.js — درجة لون رباعية المستويات (≥4.2/3.8/3.0 + احتياطي حرفي)؛ (4) job-facets.js — أوجه seniority/source/days. +21 اختبارًا.

ملاحظات

  • غير منقول (مفهوم فقط): طبقة الإجراءات الوكيلة للأب (actions/registry.ts + api/assistant/route.ts) — مخطط لحين تحوّل docs-fab إلى مساعد فاعل. لا مصادر جديدة (السجل 70)، لا تغييرات i18n/help.

[1.127.0] — 2026-07-29

أُضيف

  • ثلاثة مصادر مسح جديدة (تكافؤ مع career-ops v1.23.0) — يضم السجل الآن 70 محوّلاً (65 EN + 5 RU): Flowxtra (مُجمِّع شامل بلا مصادقة)، VDAB (واجهة كلمات مفتاحية لخدمة التوظيف الفلمنكية)، وiCIMS (بوابات careers-<tenant>.icims.com، منفصلة عن jibeapply). كما يعود Cursor إلى قائمة الـCLI (parent #2115): يكتشف cli-detect الآن cursor (10 أدوات)، واستُعيدت القائمة في help/README/config ×17.

أُصلح

  • انتقل agenticjobs من كشط HTML إلى واجهة REST (#2167)؛ يستعيد Greenhouse المدينة من /offices عندما يكون location.name مجرد نمط عمل (#2104)؛ تكافؤ role-matcher (#1933/#2164/#2009: بادئة MTS، أساس product، طيّ التشكيل، خلاف ما دون الأساس).

ملاحظات

  • غير منقول. معظم v1.23.0 سطح CLI/لوحة تحكم لا يستخدمه web-ui (batch-tailor، discover-ats، أوضاع NL/PT، سمات PDF، لوحة Go، updater/doctor)؛ سكربتات الترحيل دون تغيير. VERSION الأب → 1.23.0.

[1.126.1] — 2026-07-25

أُصلح

  • نقطتا انحراف في قائمة CLI فوّتتهما إعادة مزامنة v1.126.0 — (1) مقدّمة تبويب API keys في #/config (config.providerModelNote، i18n ×17) كانت تسرد 7 واجهات فقط — تُدرَج الآن Antigravity وGrok Build بعد OpenCode؛ (2) صف ثانٍ في جدول المقارنة داخل دليل المساعدة (×17) وملف help للموقع المبني في CI كانا لا يزالان يعرضان Inside Claude Code / Codex / Cursor / Gemini CLI — المجموعة القديمة مع Cursor — والآن القائمة الكاملة. كلاهما استخدم فواصل شرطة مائلة/نقطة وسطى لم تغطّها أنماط مسح v1.126.0. أُعيد توليد لقطة i18n؛ وتبقى المجموعة 1969.

[1.126.0] — 2026-07-25

أُضيف

  • علامة تبويب أدوات AI CLI تكتشف الآن جميع واجهات career-ops الثماني من الدرجة الأولى — تمّت مزامنة قائمة #/config مع docs/SUPPORTED_CLIS.md للمشروع الأب: يكتسب server/lib/routes/cli-detect.mjs واجهتَي Grok Build CLI (grok) وKimi CLI (kimi)، وتفحص Antigravity الآن ثنائيّها القياسي agy أولاً. يُبلّغ مسح PATH للقراءة فقط الآن عن 9 أدوات؛ وما زال لا يُشغّل أي ثنائي يجده.

غُيّر

  • إعادة مزامنة التوثيق مع career-ops.org/docs — طُوبِقت كل واجهة توثيق مع صفحات المشروع الأب الحيّة (قُرئت الـ31 كلها). قائمة مساعدي الذكاء الاصطناعي القياسية (help ×17 + README ×17) تسرد الآن الواجهات الثماني من الدرجة الأولى — Claude Code، Codex، OpenCode، Antigravity CLI، Grok Build CLI، Qwen Code، Kimi، GitHub Copilot CLI — إضافةً إلى Gemini CLI (غلاف قديم). تحافظ حزم المساعدة على بنية 29 H2 / 105 H3.

[1.125.4] — 2026-07-23

غُيّر

  • تبعيات site (dependabot #151–#153) — sharp 0.34.5→0.35.3 وsvgo 4.0.1→4.0.2 وfast-uri (dev) 3.1.3→3.1.4 في site/؛ بناء Astro أخضر، دون تأثير على SPA/الخادم.

ملاحظات

  • مسح تكافؤ مع المشروع الأب (career-ops 37d17ec..254764a، بعد v1.22.0) — لا شيء يُنقل: حارس الصف الخاطئ في set-status (#2108) خاص بـ CLI فقط (في web-ui تُختار صفوف المتتبّع صراحةً في الواجهة ولا يستدعي أي مسار set-status.mjs)، وRisk Summary للأوضاع المترجمة (#2109) يمسّ ملفات modes/<lang>/ التي لا يقرؤها web-ui أبدًا (يقرأ فقط modes/*.md في المستوى الأعلى)، والتحقق من الـ manifest في update-system (#2111) خاص بالمحدِّث فقط، والباقي وثائق المشروع الأب (README تركي، SIGNATURES ×4، SCRIPTS.md، تشكيل es). يبقى VERSION الأب 1.22.0 — parentVersion دون تغيير.

[1.125.3] — 2026-07-23

أُصلح

  • كانت مطالبات LLM بالدنماركية والهندية تُجيب بالإنجليزية (أبلغ عنها مستخدم) — لم يُوسَّع LOCALE_NAMES ولا كتل SCAFFOLD_STRINGS الخمس في server/lib/prompts.mjs لتشمل da وhi، فكان resolveLocale() يعود إلى en، وتفقد كل مطالبة ذكاء اصطناعي — البحث المعمّق (المباشر واليدوي)، الأوضاع، التقييم، المقابلة، التواصل، CV Studio — توجيه # Output language في هاتين اللغتين. أصبحت كلتاهما الآن مدعومتين بالكامل: توجيه اللغة + سقالة مترجمة. بوابة الانحدار في tests/locale-scaffold.test.mjs تمسح الآن قائمة اللغات القياسية السبع عشرة بدلاً من 12 مثبّتة يدويًا، وبوابة بنيوية جديدة تُفشل أي مفتاح سقالة يعود إلى الإنجليزية — لغة مستقبلية تُغفل prompts.mjs لن تُنشر بعد الآن (+12 اختبارًا، المجموعة الآن 1969).

[1.125.2] — 2026-07-22

أُصلح

  • البحث المعمّق عبر Gemini: خطأ HTTP 502 (MALFORMED_FUNCTION_CALL) (#145، مساهمة من @Alien10140) — كان موجّه /api/deep المباشر يطلب من النموذج «Use WebFetch / WebSearch» وحفظ الموجز في ملف، لكن مزوّدي واجهات API بلا أدوات ليس لديهم قناة أدوات؛ فكان Gemini يردّ باستدعاء دالة بدل النص، فيظهر ذلك كخطأ 502 فارغ. أصبح لدى buildDeepPrompt وbundleProjectContext علم headless: التشغيلات المباشرة (Anthropic/Gemini/سلسلة الاحتياط) تتلقى موجّهًا بلا أدوات يكتب الموجز من السياق المضمّن، بينما يحتفظ موجّه النسخ واللصق الخاص بـ Claude Code بتعليمات الأدوات. ‎+1 اختبار في tests/critical-fixes.test.mjs.

غُيّر

  • رفع نماذج Gemini الافتراضية بعد إيقاف gemini-2.0-flash (#144، مساهمة من @Alien10140) — القائمة المنسدلة في الإعدادات، واحتياطي الخادم في gemini.mjs (الذي كان يخالف التلميح بصمت)، وسلسلة احتياط OpenRouter، وconfig.geminiModelHint ×17، ودليل المساعدة ×17 كلها تشير الآن إلى gemini-3.6-flash. البوابة الجديدة ضد الانحراف tests/gemini-default-model.test.mjs (+5 اختبارات) تثبّت كل الأسطح على القيمة الحرفية نفسها — وأصبحت الحزمة الآن 1957 اختبارًا.

[1.125.1] — 2026-07-21

أُصلح

  • SuccessFactors: يحتفظ مستأجرو RMK متعددو العلامات التجارية بمسار علامتهم (تكافؤ مع المشروع الأصلي، ‏#2099، بعد v1.22.0) — الشركات القابضة التي تُشغّل عدة علامات تجارية مستحوذ عليها عبر مثيل RMK واحد مشترك تميّزها بجزء من مسار الرابط (careers.nemetschek.com/Bluebeam/ مقابل …/Vectorworks/)؛ كان المحوّل يختزل عنوان URL المُهيَّأ إلى أصله، فيمسح بصمتٍ إعلانات العلامة التجارية الرئيسية فقط. أصبحت نقطة النهاية الآن تحافظ على بادئة العلامة التجارية، ولا تحذف سوى جزء لاحق مثل /search/ أو /tile-search-results/، بحيث لا يتكرر أي شيء على نفسه أبداً؛ ويبقى المستأجرون ذوو النطاق الواحد دون تغيير بايت واحد. دالة مساعدة جديدة مُصدَّرة باسم resolveTenantBase + كتلة اختبار واحدة منقولة في tests/sources-successfactors.test.mjs.

[1.125.0] — 2026-07-21

أُضيف

  • cvstart.org: قسم “مصادر الوظائف” على الصفحة الرئيسية — قسم جديد بين لقطات الشاشة وقائمة المقارنة يسرد جميع مصادر المسح الـ67 كشرائح قابلة للنقر (62 لوحة/نظام ATS إنجليزي + 5 لوحات روسية تحت عنوان فرعي خاص بها)، ويرتبط كل منها بالموقع العام الخاص بالمصدر. تُزامَن القائمة مع سجل المحوّلات الحي عند البناء (sync-assets.mjs → facts.sources)، بحيث لا يمكن أن تنحرف أبداً عن التطبيق؛ وخريطة روابط منسَّقة في Sources.astro محمية باختبار tests/site-sources.test.mjs الجديد. اكتسب شريط التنقّل العلوي مرساة مصادر جديدة؛ و4 مفاتيح i18n جديدة للموقع ×17. كما أُصلحت قائمة inLanguage في JSON-LD الخاص بالصفحة الرئيسية، التي كانت لا تزال تفتقد hi.

[1.124.0] — 2026-07-21

أُضيف

  • خمسة مصادر مسح (تكافؤ مع المشروع الأصلي career-ops v1.22.0، ‏#1808/#1572/#2024/#2055) — Welcome to the Jungle (واجهة JSON على مستوى اللوحة بأكملها)، وAgentic Engineering Jobs (لوحة وظائف الهندسة العميلة/الذكاء الاصطناعي)، وJobvite (نظام ATS لكل مستأجر بلا مصادقة)، وGem (نظام ATS لكل مستأجر)، وAlibaba Group (واجهة JSON لصفحة التوظيف، على غرار نمط Meituan/Tencent). كل واحد منها زوج (مصدر ومحوّل) مُثبَّت على مضيف ومعزول عن CI؛ يوفّر السجل الآن 67 محوّلاً (62 إنجليزية + 5 روسية)؛ حُدِّث احتياطي قائمة Source المنسدلة في #/scan وفحص الانحراف الخاص بها؛ وخمس مجموعات اختبارات جديدة tests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs.

أُصلح

  • Arbeitsagentur: العمل عن بُعد على مستوى البلد بأكمله فقط حين تكون قيمة homeofficetyp مساوية لـ VOLLSTAENDIG (تكافؤ مع المشروع الأصلي، ‏#1981) — استعلام homeoffice=nv_true يُعيد أيضاً وظائف هجينة، لذا يتحقّق تمرير العمل عن بُعد الآن من كل نتيجة عبر نقطة نهاية تفاصيل الوظيفة على دفعات صغيرة، ويتعامل مع الفشل بأسلوب آمن: أي خطأ في البحث يُبقي على المدينة الحقيقية للوظيفة بحيث تظل مرشِّحات الموقع سارية.
  • SmartRecruiters: كانت روابط الوظائف العامة تُبنى دون /postings/ (تكافؤ مع المشروع الأصلي، ‏#2047) — أصبحت الروابط الآن تصل إلى صفحة الوظيفة العامة بدلاً من خطأ 404 لدى المستأجرين الذين يُسقط موقعهم العام هذا الجزء من الرابط.

ملاحظات

  • شحن المشروع الأصلي v1.22.0 أيضاً تغييرات من جهة CLI لا تستدعيها الواجهة عبر الصدفة أو تغطّيها مسبقاً: قالب السيرة الذاتية بالصينية المبسّطة (zh-CN) وطباعة PDF، ووضع /expand، وتعديلات ذاكرة التخزين المؤقت لمِحثّات المزوّدين (Gemini/OpenAI/Ollama)، وتفصيل الرموز لكل خطوة (تملك الواجهة مقياس استخدامها الخاص)، وتسلسل قفل الكتابة الخاص بالمتتبّع (تُمرّر الواجهة عمليات الكتابة عبر withFileLock منذ v1.21)، وأعلام المسح visa_filter وتاريخ النشر المطلق (تملك الواجهة مرشِّح عمرها الخاص «منشورة خلال»)، وبذر إزالة تكرار المصادر التي سبق رصدها (يحتفظ ماسح الواجهة بإزالة التكرار الخاصة بسجل المسح).

[1.123.0] — 2026-07-17

أُضيف

  • مصدر مسح Oracle Recruiting Cloud (تكافؤ مع المشروع الأصلي career-ops v1.21.0، ‏#1929) — واجهة recruitingCEJobRequisitions REST بلا مصادقة لمواقع التوظيف Oracle Fusion/ORC (JPMorgan Chase وOracle وBNY Mellon وAmerican Express وHoneywell وغيرها): مضيف مُثبَّت على *.fa[.<region>][.ocs].oraclecloud.com، ورقم الموقع يُستخرج من careers_url الخاص بكل شركة متابَعة، وترقيم صفحات بالإزاحة مع حدّ أقصى صارم لعدد الصفحات، وترويسات شبيهة بالمتصفح واعية بـ WAF. يوفّر السجل الآن 62 محوّلاً (57 إنجليزية + 5 روسية)؛ حُدِّث احتياطي قائمة Source المنسدلة في #/scan وفحص الانحراف الخاص بها؛ ومجموعة اختبارات جديدة معزولة عن CI باسم tests/sources-oraclecloud.test.mjs.

أُصلح

  • كاشف إعادة النشر: العناوين الأساسية تبقى متمايزة عن أخواتها ذات اللاحقة المتخصصة (تكافؤ مع المشروع الأصلي، ‏#1922) — لم يعد العنوان «Senior Analytics Engineer» يُجمَّع مع «Senior Analytics Engineer, People Analytics»: حين تكون رموز أحد العنوانين مجموعة جزئية صارمة من رموز الآخر وتكون الكلمة الإضافية تخصصاً حقيقياً لا كلمة أساسية، يُعامَل العنوانان بوصفهما وظيفتين قابلتين للنشر منفصلتين. صارت تعليقات إعادة النشر مثل «(Repost)» و«relisted» تُعامَل الآن كضوضاء وصفية عبر كلمات توقف. +2 تأكيدين في tests/detect-reposts.test.mjs.

ملاحظات

  • شحن المشروع الأصل v1.21.0 أيضاً تغييرات من جهة CLI لا تستدعيها الواجهة عبر الصدفة أو تغطّيها مسبقاً: تحذير إعادة التقديم لشركة سبق التقديم لها (تملك الواجهة فترة تهدئة لإعادة التقديم منذ v1.84.0)، وأعلام --format/--report لخطاب التقديم، وأوضاع prompt البريد الإلكتروني للمقابلة (الإشارات الحمراء / معلومات اللجنة / التغيّب عن المقابلة)، وحفظ إشارات الثقة وصحة البوابات في المسح (تُشغّل الواجهة ماسحها الخاص داخل العملية مع trust-validator وصفحة صحة البوابات)، وامتدادات الإحصاءات وفجوة الراتب (تُنقَل بالقراءة فقط وبأسلوب fail-soft).

[1.122.0] — 2026-07-16

أُضيف

  • الهندية (हिन्दी) — اللغة السابعة عشرة — قاموس واجهة كامل (نحو 1,110 مفتاحاً)، ودليل المساعدة الكامل داخل التطبيق (تكافؤ 29 قسماً رئيسياً / 105 قسماً فرعياً)، وREADME.hi.md، وCHANGELOG.hi.md جديد (يبدأ من v1.122.0، على غرار سابقة الألمانية والإيطالية والتركية)، وصفحة الهبوط cvstart.org مع صفحات المنهجية/الرخصة/سجل التغييرات/المساعدة، ومبدّل اللغة (🇮🇳)، والكشف التلقائي عن لغة المتصفح، ولقطة شاشة موطّنة للوحة التحكم. أصبح كل بوابة تكافؤ ×16 تعمل الآن ×17: تكافؤ قاموس i18n واللقطة المرجعية، وبوابتا الأقسام الرئيسية/الفرعية لدليل المساعدة، وتكافؤ سجل التغييرات، وفحص check-i18n في الموقع، ومسح Playwright للغات.

[1.121.0] — 2026-07-16

أُضيف

  • cvstart.org: صفحات المنهجية والرخصة وسجل التغييرات — اكتسبت صفحة الهبوط ثلاثة أقسام جديدة بكل اللغات الست عشرة، إلى جانب كتلة المقارنة القائمة: /methodology/ (معيار التقييم السداسي الأبعاد من 0.0 إلى 5.0، وعتبة التقديم عند 4.0، وقواعد ما لا يُفعل أبداً — ملخّص مُوطَّن من career-ops.org/methodology)، و**/license/** (نص MIT القانوني الكامل مع الإشارة إلى NOTICE.md)، و**/changelog/** (هذا الملف نفسه، مُعروضاً لكل لغة من ملفات CHANGELOG الست عشرة المترجمة في المستودع). إدخال جديد المنهجية في الترويسة وروابط الموارد في التذييل؛ أصبح sync-assets.mjs الآن يزامن CHANGELOG ×16 وLICENSE إلى الموقع وقت البناء، بحيث لا يمكن للصفحات أن تنحرف عن المستودع أبداً.
  • روابط المنهجية عبر التوثيق — أصبح README (بكل اللغات الست عشرة)، وقائمة §1 المرجعية في دليل المساعدة داخل التطبيق (بكل اللغات الست عشرة)، والويكي، تربط جميعها إلى career-ops.org/methodology (إلى جانب الأسئلة الشائعة والمسرد) بجوار أدلة career-ops.org/docs القائمة.

تغيّر

  • تحديث شارة الإصدار وشعار README (1850 اختبارًا، الإصدار v1.121.0) — كانت الشارة لا تزال تعلن عن v1.119.5.

[1.120.0] — 2026-07-16

أُضيف

  • بيان CareerOps (تكافؤ مع الأصل v1.20.0) — أطلق المشروع الأصل بيان CareerOps (MANIFESTO.md · career-ops.org/manifesto) ويُبرزه الآن من README الخاص به، ومن أداة التحديث، ومن لوحة تحكم Go. تحذو الواجهة حذوه: رابط جديد في تذييل الشريط الجانبي يفتح صفحة البيان (مفتاح i18n جديد footer.manifesto في كل اللغات الست عشرة)، ودليل المساعدة داخل التطبيق اكتسب القسم 29 «بيان CareerOps» بكل اللغات الست عشرة، وREADME يشرح ماهية البيان وكيفية توقيعه، وتذييل صفحة الهبوط cvstart.org يربط إليه أيضاً.

ملاحظات

  • أصلح المشروع الأصل v1.20.0 أيضاً كبت المهارة المعروفة في وضع upskill المستهدف، وأسكت dotenv كي يبقى مخرج scan --json القياسي قابلاً للتحليل، وأصلح قالب السيرة الذاتية بصيغة HTML كي يبقى عنوان الدور مع نقاطه — وهي أسطح من جهة CLI لا تستدعيها الواجهة عبر الصدفة؛ لم يتطلّب الأمر أي تغيير في كود الواجهة.

[1.119.5] — 2026-07-13

أُصلح

  • زر اللغة في صفحة الهبوط لم يعد ينكسر — مع أعلام v1.119.2 كان نص المبدّل في الترويسة (مثل «🇷🇺 Русский») قد ينكسر حتى ثلاثة أسطر على عروض سطح المكتب الضيقة؛ نص المبدّل وكل خيارات القائمة المنسدلة أصبحت الآن whitespace-nowrap — العلم + الاسم الأصلي دائماً في سطر واحد. كما انتقلت قائمة اللغات في التذييل من شبكة صلبة بعمودين إلى صفٍّ ملتفٍّ من عناصر بسطر واحد — «🇧🇷 Português (Brasil)» لم يعد ينكسر في منتصف الاسم أيضاً.

[1.119.4] — 2026-07-13

تغيّر

  • LICENSE يسمّي المؤلف — سطر حقوق النشر أصبح: Sergei Emelianov (Fighter90) https://sergey-cv.com and career-ops-ui contributors (نص MIT القانوني كما هو). ملف NOTICE.md جديد يفصّل الترخيص: من يملك حقوق النشر، وما الذي يغطيه منح MIT بالضبط (الكود، الوثائق، الترجمات، صفحة الهبوط، الويكي)، وما لا يغطيه (بياناتك أثناء التشغيل، المشروع الأب، محتوى لوحات الوظائف، العلامات التجارية)، وجدول مكونات الطرف الثالث (express/js-yaml — MIT؛ Astro/Tailwind — MIT؛ خطا Figtree وJetBrains Mono — SIL OFL 1.1؛ sharp — Apache-2.0) وسطر إسناد اختياري.

[1.119.3] — 2026-07-13

أُضيف

  • SECURITY.md — سياسة الأمان التي كان يشير إليها CONTRIBUTING أصبحت موجودة الآن: الإصدارات المدعومة، مسار الإبلاغ الخاص (تم تفعيل الإبلاغ الخاص عن الثغرات في GitHub على المستودع — تبويب Security → «Report a vulnerability»)، نموذج التهديد لتطبيق مستخدم واحد مرتبط بـ localhost (ضمن النطاق: XSS عبر إعلانات وظائف عدائية / SSRF / اجتياز المسارات / تسرب الأسرار / إضعاف CSP؛ خارج النطاق: حجب الخدمة عن localhost الخاص بك ومشكلات المشروع الأب)، وخط الأساس للتحصين للمراجعين.

[1.119.2] — 2026-07-13

أُضيف

  • CONTRIBUTING.md — دليل المساهم الذي طالما أشارت إليه صفحة الهبوط وREADME أصبح موجوداً الآن: الإعداد، خريطة المشروع، القواعد الصارمة للأمان/عدم البناء، مستويات الاختبار، شرح «السجلّين» لإضافة مصدر فحص، عقد i18n ×16، اصطلاحات الالتزامات/طلبات السحب، وعملية الإصدار.
  • أعلام اللغات على صفحة الهبوط — يعرض الآن مبدّل لغات cvstart.org وشبكة اللغات في التذييل ولافتة «اقرأ بلغتك» علم كل لغة بجانب اسمها الأصلي (نفس مجموعة المؤشرات الإقليمية في <select> لغة التطبيق؛ يتدهور إلى حروف المنطقة حيث تغيب محارف الأعلام).
  • إصلاحات تذييل صفحة الهبوط — رابط Discussions الميت (الميزة غير مفعّلة في المستودع) يشير الآن إلى ويكي المشروع، ويذكر التذييل المؤلف: Sergei Emelianov (sergey-cv.com · LinkedIn).

[1.119.1] — 2026-07-13

أُصلح

  • مرشِّح المصادر في #/scan لحق بالسجل — القائمة الثابتة FALLBACK_SOURCES خلف قائمة Source المنسدلة (تُستخدم فقط عندما يتعذّر الوصول إلى GET /api/scan/sources) كانت متخلفة بصمت منذ v1.87.0: كان ينقص الاحتياطي دون اتصال 20 مزوّداً (Amazon وAvature وSAP SuccessFactors وGet on Board وDassault Systèmes وbeesite وHigherEdJobs وJibeApply (iCIMS) وsoftgarden وCornerstone وPhenom وRadancy وDeutsche Bahn وEchoJobs وTKMS وHeckler & Koch وRheinmetall وLaraJobs والجديدان Meituan / Tencent). زُومنت مع كل الـ61 وتحميها الآن فحص انحراف يُفشل CI كلما اختلفت قائمة العميل عن سجل الخادم (القيم والتسميات معاً). +1 اختبار (1845).

[1.119.0] — 2026-07-13

تكافؤ مع مشروع career-ops الأب v1.19.0 + تحديث صفحة الهبوط cvstart.org.

أُضيف

  • مزوّدا فحص جديدان — Meituan (zhaopin.meituan.com) وTencent (careers.tencent.com): واجهتا JSON عامتان بلا مصادقة للوحات التقنية الصينية، تُكتشفان من المضيف أو تُختاران عبر provider: صريح، مع بحث من جهة الخادم لكل كلمة مفتاحية وتقسيم صفحات وإزالة تكرار حسب URL — الآن 61 محوّلاً (56 إنجليزية + 5 روسية). +20 اختباراً (1844).
  • كتلة المساهمين على صفحة الهبوط — يعرض cvstart.org صور كل من ساهم بكود (واجهة GitHub /contributors وقت البناء، مع ترشيح البوتات)، مترجمة إلى اللغات الست عشرة كلها، مع رابط إلى مخطط المساهمين الكامل.
  • عدّاد نجوم GitHub مباشر على صفحة الهبوط — تُحدَّث شارة الترويسة الآن من جهة العميل عبر واجهة GitHub عند كل زيارة (لقطة وقت البناء تبقى احتياطاً)، وإعادة بناء أسبوعية مجدولة لـ Pages تُبقي اللقطة وقائمة المساهمين حديثتين؛ نداءات الواجهة في CI موثّقة برمز token.

أُصلح

  • طلبات Workday CXS تحمل ترويسات شبيهة بالمتصفح (الأب #1813) — المستأجرون خلف Cloudflare (شوهد مباشرةً: geico) يردّون بـ 500 على الطلبات الخالية من UA/accept-language/origin/referer الاعتيادية؛ يستنتج الجالب الآن الـ origin واسم الموقع من عنوان CXS نفسه. ونالت طلبات Glints نفس UA المتصفح + origin/referer، وكلاهما من الثابت المشترك BROWSER_LIKE_USER_AGENT في http-json.mjs.

[1.118.4] — 2026-07-10

أُصلح

  • عمليات فحص hh.ru كانت تعيد 0 نتيجة من عنوان IP روسي (روابط النطاق الفرعي الإقليمي) — من عنوان IP سكني روسي، يعيد hh.ru توجيه البحث عبر 302 إلى نطاق فرعي إقليمي (sochi.hh.ru، spb.hh.ru، …) ويعيد روابط الوظائف على ذلك النطاق الفرعي. كان المحلل يبحث عن رابط العنوان على المضيف الثابت https://hh.ru/vacancy/ ولا يطابق أيًّا من الروابط الإقليمية، فكان الفحص العامل تمامًا يسجّل 0 بصمت. أصبح الآن يقبل أي مضيف *.hh.ru (إعلانات adsrv.hh.ru/click?… تظل مستبعدة — لا تملك مسار /vacancy/<id>) ويوحّد كل رابط نتيجة إلى https://hh.ru/vacancy/<id>. تم التحقق مباشرةً: يجري الآن تحليل 17 وظيفة حقيقية من صفحة sochi.hh.ru كانت تعطي 0 سابقًا. ‏+1 اختبار (1824).

[1.118.3] — 2026-07-10

أُصلح

  • كان hh.ru يعيد 0 نتيجة بصمت (صفحة فحص VPN البينية) — يعيد hh.ru الآن توجيه الشبكات التي يصنّفها كـ VPN/بروكسي (عناوين IP لمراكز البيانات) عبر 302 إلى صفحة بينية /vpncheeck (“VPN мешает работе сайта”) تستجيب بـ HTTP 200 دون أي بطاقة وظيفة، فكان الفحص يبلغ عن 0 دون أي خطأ. يكتشف الماسح الآن إعادة التوجيه عبر عنوان URL النهائي للاستجابة، ويعطّل hh.ru لبقية التشغيل، ويطبع تلميحًا صادقًا: يجب أن يخرج الترافيك فعلًا عبر IP سكني — قد يبقى VPN/بروكسي على مستوى النظام نشطًا حتى مع إيقاف مفتاح المتصفح. ‏+1 اختبار (1823).

[1.118.2] — 2026-07-10

صيانة

  • متابعة صفحة الهبوط (#118) — جرت مطابقة site/README.md مع Astro 7 (ترقية الأمان في #116)، وأزيل استيراد غير مستخدم، وأضيفت 4 حراسات قابلة للتنفيذ لسكربتات بناء صفحة الهبوط: بوابة تكافؤ i18n تفشل فعليًا مع قاموس معطوب، وsync-assets لا يكتب أبدًا خارج site/ — المجموعة 1822. حُلّ تنبيهان من CodeQL (أحدهما أُصلح في المصدر والآخر رُفض بوصفه سلوك بناء مقصودًا).

[1.118.1] — 2026-07-10

أُصلح

  • مسح hh.ru من خارج روسيا — يعيد hh.ru الآن HTTP 451 (حجب قانوني إقليمي) لعناوين IP غير الروسية على صفحات البحث العامة. يعامل الماسح 451 مثل 403: بعد أول حجب يُعطَّل hh.ru لبقية التشغيل مع سطر صادق في السجل يشير إلى عنوان IP روسي / مخرج VPN، فلا تُهدر الاستعلامات المتبقية ولا بقية المصادر الروسية. حُدِّث دليل المساعدة §7 بجميع اللغات الـ16. +1 اختبار (1818).

[1.118.0] — 2026-07-09

حزمة التكافؤ مع مشروع career-ops الأب v1.18.0.

أُضيف

  • 9 مزوّدي فحص جدد — Cornerstone OnDemand (csod), Phenom (phenom), Radancy (radancy), Deutsche Bahn (deutschebahn), EchoJobs (echojobs), TKMS (tkms), Heckler & Koch (hecklerkoch), Rheinmetall (rheinmetall), LaraJobs (larajobs) — الآن 54 محوّلًا. كما يتعرّف محوّل Lever على لوحات مستأجر الاتحاد الأوروبي (jobs.eu.lever.co).
  • حالة Hired في المتتبِّع (تكافؤ مع states.yml الأب): العروض المقبولة تحصل على حالة قياسية خاصة وشارة احتفالية ولافتة «حصلت على الوظيفة» في #/tracker؛ ويحسبها القمع والتحويلات كأنها اجتازت كل المراحل.
  • تبويب الإجمالي في #/stats — تمرير للقراءة فقط لسكربت الأب stats.mjs (ملخص المتتبِّع الإجمالي، معدلات القمع التراكمية، إجماليات الماسح، تغطية البوابات) بالإضافة إلى ملاحظات التعويضات من salary-gap.mjs (المرغوب مقابل المعلن مقابل الفعلي، لكل طلب). مساران جديدان GET /api/stats/lifetime وGET /api/stats/salary-gap — استدعاءات صدفة بلا تكلفة توكنات، وتدهور آمن {available:false} من دون المشروع الأب.
  • 28 مفتاح i18n جديدًا في اللغات الـ16 كلها؛ وتحديث دليل المساعدة §14/§26 بكل اللغات.

الاختبارات

  • +38 اختبار وحدة (ثلاث مجموعات تكافؤ للمزوّدين + مسارات التمرير/الحالة) — الإجمالي 1817.

[1.117.2] — 2026-07-06

إصلاح المتتبِّع الفارغ لاستدعاءات التكافؤ الخارجية. تخرج سكربتات الأصل بالرمز 1 مع JSON منظم {error} عندما لا يحتوي المتتبِّع على طلبات بعد؛ وكانت لوحة المتابعة وتبويب أنماط الرفض يعرضانها كـ«script-error». يمرر المساران الآن ذلك كحالة فارغة سليمة (available:true, empty:true) فتعرض الواجهة رسالتها الصادقة «لا شيء بعد». تم التحقق مباشرة مع أصل حقيقي.

جديد: لا شيء.

[1.117.1] — 2026-07-06

تقوية v1.117.0 (فرز CodeQL). تحمل الآن نقاط النهاية الثلاث ذات الاستدعاء الخارجي (GET /api/followup، POST /api/followup/seed، GET /api/stats/patterns) محدِّد المعدل المشترك حسب IP (تنشئ عملية فرعية لكل طلب؛ no-op على loopback). استخراج نص الرابط في «أضِف إلى السيرة» يزيل الوسوم حتى نقطة ثابتة ثم يحذف كل </> متبقٍ — تعقيم كامل مثبت لنص مطالبة LLM. لا تغيير في سلوك المدخلات الصحيحة.

جديد: لا شيء.

[1.117.0] — 2026-07-06

حزمة التكافؤ مع الأصل — ست قدرات من career-ops الأصل إلى الواجهة. (1) لوحة إيقاع المتابعة في #/followup: استعجال لكل طلب (🔴/🟠/🟡/🔵) من followup-cadence.mjs، مع زر زرع تواريخ المتابعة (followup-seed.mjs --backfill). (2) أنماط الرفض: تبويب إحصاءات رابع يشغّل analyze-patterns.mjs (قراءة فقط) — توزيع النتائج والتوصيات ومعدل التقدّم لكل مزوّد ATS. (3) أضِف إلى السيرة: بطاقة في CV Studio تحوّل رابطًا أو نصًا ملصوقًا إلى نقاط ATS مبنية فقط على ذلك المصدر (اقتراحات فقط، دون كتابة؛ جلب الروابط محمي من SSRF). (4) 4 مزوّدي فحص جدد — beesite وHigherEdJobs (RSS) وJibeApply (iCIMS) وsoftgarden — يضم السجل الآن 50 محوّلاً (45 EN + 5 RU)، كلها في قائمة Scan. (5) خطوة الفحص المسبق للمُقصيات في قائمة Apply. (6) مشغّل reconcile (/api/run/reconcile). مسارات الاستدعاء الخارجي تتدهور بصدق دون سكربتات الأصل.

  • وحدة مسارات جديدة server/lib/routes/followup.mjs (الـ31) + مسارات جديدة + 8 ملفات source/adapter. اختبارات: 6 + 7 جديدة؛ المجموعة 1737 → 1750. 41 مفتاح i18n جديدًا ×16. المساعدة §13/§17/§24/§26 موسّعة ×16.

جديد: GET /api/followup، POST /api/followup/seed، GET /api/stats/patterns، POST /api/cv-studio/add-entry، POST /api/run/reconcile.

[1.116.0] — 2026-07-06

إعادة تصميم مقياس الاستخدام + أول اختبار شامل للأدوات. جرى إصلاح مقياس استخدام الذكاء الاصطناعي (v1.114.0) وتثبيته بشكل صحيح: أصبح الآن مثبَّتًا أسفل الشريط الجانبي الأيسر (بعرض الشريط كاملًا، بنفس السطح) ويحجز في الأسفل مساحة تساوي ارتفاعه بحيث لا تُغطّى القائمة أبدًا — يظل التنقّل وتذييل الإصدار يمرّان بحرّية فوقه. يُحدَّث مباشرةً (كل 15 ثانية، وعند تركيز التبويب وتغيير المسار)، ويعرض كل صف نافذة الآن <الرموز> · <التكلفة التقديرية> الحقيقية (تُقاس الأشرطة مقابل نافذة 30 يومًا) بدل “نسبة” ثابتة عند 100%. كذلك: حاجز typeof دائم في مستورد السيرة يُغلق من المصدر الإيجابية الكاذبة المتكررة لخلط الأنواع في CodeQL، واختبار شامل جديد بـPlaywright يشغّل كلتا الأداتين الدائمتين في متصفح حقيقي.

  • public/js/lib/usage-hud.js + app.css، server/lib/cv-import.mjs. اختبارات: tests/playwright-widgets.mjs (2 E2E) + tests/usage-hud.test.mjs (10). المساعدة §6 موسّعة ×16.

جديد: لا شيء.

[1.115.0] — 2026-07-06

صقل التصميم (محافظ، مع الإبقاء على هوية المرجاني). تمريرة تحسين خفيفة على نظام التصميم المشترك — دون إعادة هيكلة ودون تغيير اللوحة اللونية. تُرفع الآن بطاقات المقاييس في لوحة التحكم وتكتسب حدًّا مرجانيًا عند التمرير (مثل بلاطات الإجراءات السريعة)؛ وتُرفع بطاقات المحتوى قليلًا؛ وتكتسب أزرار primary / dark / danger ظلًّا في السكون ورفعًا لطيفًا عند التمرير لإحساس بالعمق؛ وتُحاذى الأرقام الكبيرة عبر tabular-nums؛ وتحصل عناصر التحكم التفاعلية على هالة مرجانية ناعمة خلف حلقة لوحة المفاتيح بسمك 2 بكسل. تحترم كل الحركة prefers-reduced-motion، والهالة مقصورة على عناصر التحكم — وليست *:focus-visible عامة.

  • CSS فقط (public/css/app.css)؛ دون تغييرات في العلامات أو i18n أو المسارات أو CSP. اختبارات: tests/design-polish-v1115.test.mjs (5). جرى التحقق مباشرةً عبر Playwright.

جديد: لا شيء.

[1.114.0] — 2026-07-06

مقياس استخدام وتكلفة الذكاء الاصطناعي في الشريط الجانبي (أسفل اليسار). يوجد الآن قسم الاستخدام مضغوط في أسفل الشريط الجانبي (بطاقة ثابتة أسفل اليسار إن لم يوجد شريط جانبي؛ أسفل اليمين في RTL) في كل صفحة. يعرض استخدامك لرموز LLM عبر نوافذ 24 ساعة / 7 أيام / 30 يومًا — كلٌّ بصيغة <الرموز> · <النسبة%> بشريط أخضر (النسبة من كامل المدة) — بالإضافة إلى تذييل بالتكلفة التقديرية لـ24 ساعة. البيانات هي تجميع GET /api/usage للقراءة فقط من data/llm-usage.jsonl (محليًا فقط)، نفس مصدر صفحة #/usage؛ التكلفة تقديرية وعمليات الوضع اليدوي مجانية ولا تُحتسب. قابل للطي — يبدّل العنوان وتُحفظ الحالة.

  • عنصر واجهة جديد public/js/lib/usage-hud.js يُحمَّل من index.html، يُركَّب في الشريط الجانبي فوق تذييل الإصدار (بديل الزاوية الثابتة). آمن لـ CSP؛ متوافق مع السمة ومعكوس لـ RTL. دون مسار خادم جديد. اختبارات: tests/usage-hud.test.mjs (8). 3 مفاتيح i18n جديدة ×16.

جديد: لا شيء.

[1.113.0] — 2026-07-06

مساعد “اسأل المساعدة” عائم في كل صفحة. يطفو الآن زر دردشة على شكل روبوت بتدرّج لوني في الزاوية السفلية اليمنى (السفلية اليسرى في RTL) من كل صفحة. انقره لفتح دردشة مضغوطة تجيب عن أسئلة الاستخدام اعتمادًا فقط على دليل المساعدة داخل التطبيق بلغتك — نفس نقطة النهاية لصفحة #/docs-assistant (POST /api/docs-assistant/ask)، لذا لا يقرأ أبدًا سيرتك أو ملفك أو المتتبِّع. مباشر بمفتاح LLM؛ دون مفتاح → مطالبة جاهزة للتشغيل. يعرض الرأس صورة روبوت + حالة اتصال؛ تُدخل الشارات أسئلة شائعة؛ Esc أو النقر خارجًا يغلقه؛ ويختفي في صفحة #/docs-assistant.

  • عنصر واجهة جديد public/js/lib/docs-fab.js يُركَّب عالميًا من index.html؛ آمن لسياسة CSP؛ أنماط متوافقة مع السمة ومعكوسة لـ RTL في app.css. دون مسار خادم جديد. اختبارات: tests/docs-fab.test.mjs (8). 6 مفاتيح i18n جديدة ×16. المساعدة §1 موسّعة في مكانها.

جديد: لا شيء.

[1.112.0] — 2026-07-06

دمج التوثيق وضمان الجودة. دون تغيير مرئي في الشيفرة. حُدِّث مستند اصطلاحات SDD (docs/sdd/CONVENTIONS.md) إلى 30 وحدة مسار الحالية (كانت 24) وخط أساس الاختبارات الحالي؛ وجرى دمج مطالبة ضمان الجودة النهائية لكامل المشروع (qa/QA-REGRESSION-PROMPT.md) — تحديث آلية الإصدار (v1.111، parentVersion 1.17.0، نشر مُشغَّل بحدث الإصدار)، وتصحيح جدول إضافات §14 (إعادة وسم استبعاد Scan إلى v1.109.0) وتوسيعه بإغلاق CodeQL في v1.111 — بحيث يصلح وحده كمطالبة انحدار وحيدة لكل الوظائف. يضيف اختبار تغطية واحدًا لفرع الرفع المفرط الحجم.

جديد: لا شيء.

[1.111.0] — 2026-07-06

الأمان — إغلاق متأخّرات CodeQL. ثلاثة تحصينات دفاع متعمّق تُغلق ما تبقّى من نتائج التحليل الساكن من مصدرها بدل تجاهلها (dismiss). يقوم stripDangerousMarkdown الآن بتهريب الرمز < لأي فتح وسم خطير مبتور (حمولة تنتهي بـ<script/<iframe/…)، بحيث لا يحتوي ناتجه بشكل مثبت على أي وسم خطير حي. يقرأ استيراد السيرة حجم المخزن المرفوع عبر تحويل صريح Number() — حاجز ضد خلط الأنواع. أصبحت أسطر أدوار الأوضاع الآن سلاسل قالبية مُدمَجة عبر String.replace بدل دوال مخزّنة، مما يزيل استدعاء الإرسال الديناميكي بالكامل. لا تغيير سلوكي مرئي للمستخدم.

  • server/lib/security.mjs، server/lib/cv-import.mjs، server/lib/prompts.mjs. اختبارات: tests/security-hardening-v1111.test.mjs (7) + تحديث اختبار الحارس v1108. دون تغييرات i18n/مساعدة/مسارات.

جديد: لا شيء.

[1.110.0] — 2026-07-06

تحديث الوثائق وضمان الجودة (كل اللغات). دون تغيير في الكود. حُدِّث موجّه QA لكامل المشروع إلى v1.109.0 مع §14 جديد (v1.98→v1.109)، واكتسبت موجّهات تدقيق UX وتصدير التصميم الدائمة مجموعة الصفحات الحالية. كل فقرة مساعدة أُضيفت في v1.100–v1.109 مترجمة الآن إلى جميع اللغات الست عشرة.

جديد: لا شيء.

[1.109.0] — 2026-07-06

مرشّح الاستبعاد في Scan + نظرة عامة على المسار (مطابقة تخطيط الويب). في #/scan، يعامل مربع البحث الآن الفواصل كـأو (“الأدوار المطلوبة”)، ويُخفي حقل استبعاد جديد أي صف تحتوي شركته/دوره/موقعه على أي كلمة مفصولة بفواصل (مثل senior, staff)؛ ويُحفَظ كلاهما في عمليات بحثك المحفوظة. في #/pipeline، يعرض شريط نظرة عامة مضغوط مسارك بنظرة واحدة — N في الوارد، N متتبَّع، وأعداد Applied / Responded / Interview / Offer من المتتبِّع، وكل شارة تربط بـ#/tracker.

  • من جهة العميل فقط (لا مسار/كتابات جديدة). public/js/views/scan.js + public/js/views/pipeline.js. اختبارات: tests/scan-pipeline-ui-v1109.test.mjs (2). 4 مفاتيح i18n جديدة ×16. المساعدة §7 + §8 موسّعة في مكانها.

جديد: لا شيء.

[1.108.0] — 2026-07-06

تعزيز الأمان (فرز CodeQL، الجولة 2). أُصلحت ثلاث نتائج إضافية منخفضة الخطورة: يحلّ باني الموجّهات سطر دور اللغة عبر مفتاح خاص + typeof === function كي لا تتمكّن لغة معدَّلة من الإرسال إلى أسلوب في النموذج الأولي (unvalidated-dynamic-method-call)؛ ويُحدَّد slug اسم ملف PDF بـ200 حرف قبل التعبير النمطي كي لا يتراجع دخل من الشرطات فقط (ReDoS كثير الحدود)؛ ويُجبِر استيراد المستند filename من نوع مصفوفة (ترويسة مكرّرة) على سلسلة (type-confusion). لا تغيير في السلوك للمدخلات الصحيحة.

  • server/lib/prompts.mjs، server/lib/routes/runners.mjs، server/lib/cv-import.mjs + tests/security-hardening-v1108.test.mjs (3). خلال v1.106–v1.108 انخفض تراكم التحليل الساكن من 167 إلى نحو 14، مع إصلاح كل نتيجة ذات صلة أمنية حقيقية ورفض الباقي (إيجابيات كاذبة محميّة/مُعقَّمة + lint بمستوى ملاحظة) مع التبرير.

جديد: لا شيء.

[1.107.0] — 2026-07-06

تعزيز أداة التعقيم (دفاع متعمّق ضد XSS في حالة السكون). stripDangerousMarkdown — التي تُبطل HTML الخطير في markdown السيرة/الوظيفة المخزَّن ليبقى أي مستهلك يتجاوز عميل الهروب-عند-العرض آمناً — تُشغّل الآن إزالة الوسوم حتى نقطة ثابتة (كرّر حتى الاستقرار) بحيث تُلتقط الإزالة التي تعيد تشكيل الحمولة (مثل <scr<script></script>ipt>)، وتطابق وسوم إغلاق script/style وغيرها مع فضلات لاحقة (</script foo>)، وتزيل فاتحاً تنفيذياً غير مغلق (<script …>). سلوك markdown الصحيح دون تغيير — تزيل المزيد فقط.

  • server/lib/security.mjs: حلقة نقطة ثابتة (محدودة بـ8 تمريرات) + أنماط إغلاق [^>]*> + إزالة الفاتح غير المغلق. +3 حالات انحدار في tests/cv-xss-bypasses.test.mjs. يبقى حدّ XSS المرجعي هو الهروب عند الإخراج (UI.md)؛ وهذا يعزز ضمان السكون ويغلق نتائج CodeQL المقابلة.

جديد: لا شيء.

[1.106.0] — 2026-07-06

تعزيز الأمان (فرز CodeQL). أُصلحت ثلاث نتائج حقيقية (وإن كانت منخفضة الخطورة) بعد مراجعة تراكم التحليل الساكن: مسار خطأ عرض المسار الآن يهرّب رسالة الخطأ قبل وصولها إلى DOM (قد يعكس خطأ الخادم مدخلات المستخدم، لذا يُعامَل كغير موثوق — حدّ XSS)، وكتابات خصائص الملف/الإعدادات ترفض مفاتيح __proto__ / constructor / prototype (حماية من تلوث النموذج الأولي احتياطاً — المفاتيح تأتي من مواصفات حقول ثابتة لا من مدخلات خام). معظم التنبيهات المتبقية إيجابيات كاذبة على قراءات/كتابات الماسح المشروعة في data/* وعلى مسارات تحمل بالفعل المحدِّد الخاص؛ رُفضت مع التبرير.

  • public/js/router.js يهرّب err.message عبر UI.escapeHtml قبل innerHTML؛ وserver/lib/routes/content.mjs وserver/lib/routes/config.mjs يحميان مفاتيح النموذج الأولي. لا تغيير في السلوك للمدخلات الصحيحة. اختبارات: tests/security-hardening-v1106.test.mjs (3). لا مفاتيح i18n جديدة.

جديد: لا شيء.

[1.105.0] — 2026-07-06

صفحة استخدام الذكاء الاصطناعي وتكلفته. صفحة جديدة استخدام الذكاء الاصطناعي (الشريط الجانبي، بجوار الصحة) تعرض عدد الرموز التي أنفقتها على توليدات الذكاء الاصطناعي الحيّة — التقييمات والتقارير والمحادثات — مفصّلة حسب المزوّد خلال آخر 24 ساعة و7 أيام و30 يوماً وكل الوقت، مع تكلفة تقديرية بالدولار. كل نداء حيّ يضيف سجلاً صغيراً {provider, in, out} إلى data/llm-usage.jsonl (لا يُرسَل شيء إلى أي مكان)؛ التشغيلات بلا مفتاح (الوضع اليدوي) لا تكلّف شيئاً ولا تُسجَّل.

  • وحدة مسار جديدة (الثلاثون) server/lib/routes/usage.mjs — GET /api/usage (تجميعات للقراءة فقط) + server/lib/llm-usage.mjs (recordUsage يوحّد أشكال الاستخدام لدى Anthropic/OpenAI/Gemini ويضيف بأفضل جهد؛ وreadUsage/aggregate يجمّعان حسب نافذة 24س/7أ/30ي/الكل × المزوّد) + server/lib/llm-pricing.mjs (جدول أسعار قابل للتعديل لكل مزوّد $/1M رمز — الرموز دقيقة، والدولارات أسعار قائمة تقريبية يمكنك تصحيحها؛ ولا تُحتسب فاتورةً). التسجيل موصول بنقاط الإرسال (runActiveProvider + routes/llm.mjs).
  • عرض جديد public/js/views/usage.js (#/usage، تبويبات النوافذ). اختبارات: tests/usage-routes.test.mjs. 17 مفتاح i18n جديد ×16 (usage.* + nav.usage). المساعدة §6 موسّعة في مكانها.

جديد: server/lib/routes/usage.mjs؛ server/lib/llm-usage.mjs؛ server/lib/llm-pricing.mjs؛ public/js/views/usage.js.

[1.104.0] — 2026-07-06

شعارات الشركات في جدول الفحص (مع حفظ الخصوصية). مفتاح جديد في المظهر ضمن إعدادات التطبيق — إظهار شعارات الشركات في جدول الفحص (معطّل افتراضياً) — يرسم شعار كل شركة بجوار اسمها في #/scan. الشعار هو أيقونة الشركة المجلوبة من نطاقها الخاص ويُمرَّر عبر وسيط على الخادم (GET /api/logo)، بحيث لا تعرف أي خدمة شعارات خارجية أيّ أصحاب عمل تطالعهم. الوظائف على بوابة توظيف مشتركة (Greenhouse وLever وAshby …) تُظهر شارة حرفية ملوّنة بدل أيقونة البوابة، وأي شعار يفشل تحميله يعود إلى الشارة نفسها.

  • وحدة مسار جديدة (التاسعة والعشرون) server/lib/routes/logos.mjs — GET /api/logo?domain=. تتحقق من النطاق (دون مخطط/مسار/loopback)، وتجلب /favicon.ico عبر safeGet الآمن ضد SSRF (وضع binary جديد يعيد البايتات الخام + content-type؛ وتثبيت DNS والتحقق من إعادة التوجيه وحد الحجم دون تغيير)، وتُجري استشعار توقيع الصورة كي لا تقدّم أبداً صفحة خطأ HTML كصورة، وتخزّن الإصابات والإخفاقات في LRU بالذاكرة، ولا تكتب شيئاً على القرص.
  • مكتبة عميل جديدة public/js/lib/company-logo.js (window.CompanyLogo): معطّلة افتراضياً عبر علم في localStorage؛ وتتخطى مضيفات ATS المشتركة لصالح صورة رمزية حرفية حتمية؛ واحتياطي img.onerror آمن لـCSP. اختبارات: tests/logo-routes.test.mjs. 5 مفاتيح i18n جديدة ×16 (appear.*). المساعدة §2 موسّعة في مكانها.

جديد: server/lib/routes/logos.mjs؛ public/js/lib/company-logo.js.

[1.103.0] — 2026-07-06

الإعدادات: «أدوات CLI للذكاء الاصطناعي» — أيّها مثبَّت. يعتمد career-ops على Claude Code لكنه يعمل مع أي CLI وكيلي يتبع معيار skills المفتوح. يعرض تبويب جديد أدوات CLI للذكاء الاصطناعي في إعدادات التطبيق (#/config) أيّاً من — Claude Code وCodex وGemini CLI وOpenCode وGitHub Copilot CLI وQwen وAntigravity — مثبَّت على الجهاز الذي يشغّل الخادم، ومساراتها. إنه فحص للـPATH للقراءة فقط: يتحقق فقط من وجود كل ملف تنفيذي ولا يشغّله إطلاقاً (دون --version، دون تنفيذ)، ولا يكتب شيئاً ولا يمسّ بيانات المستخدم.

  • وحدة مسار جديدة (الثامنة والعشرون) server/lib/routes/cli-detect.mjs — GET /api/cli-detect. يحلّ الكشف مسار الملف التنفيذي من قائمة سماح ثابتة من 7 عناصر عبر process.env.PATH (وسائط .cmd/.exe/.bat في ويندوز؛ بت التنفيذ في POSIX)؛ ولا يمكن أبداً تشغيل ملف خبيث على PATH عبر هذا المسار.
  • تبويب جديد «أدوات CLI للذكاء الاصطناعي» في public/js/views/config.js (تحميل مؤجَّل، رابط عميق عبر #/config?tab=cli). اختبارات: tests/cli-detect-routes.test.mjs. 8 مفاتيح i18n جديدة ×16 (cli.* + config.tabCli). المساعدة §2 موسّعة في مكانها.

جديد: server/lib/routes/cli-detect.mjs.

[1.102.0] — 2026-07-05

«اسأل الدليل» — محادثة مستندة إلى دليل المساعدة المدمج. صفحة جديدة اسأل الدليل 💬 (الشريط الجانبي، تحت المساعدة): اكتب سؤالاً مثل «كيف أفحص بوابات الوظائف؟» لتحصل على إجابة مستمدة فقط من دليل مساعدة التطبيق بلغتك — تعرض الأقسام التي استُخدمت ولا تقرأ أبداً سيرتك الذاتية أو ملفك أو بحثك عن عمل. الأمر يتعلق بكيفية استخدام التطبيق، لا بك. مع مفتاح LLM تجيب مباشرةً؛ ودون مفتاح تسلّمك موجّهاً جاهزاً معبّأً مسبقاً بأقسام المساعدة ذات الصلة.

  • وحدة مسار جديدة (السابعة والعشرون) server/lib/routes/docs-assistant.mjs — POST /api/docs-assistant/ask. استرجاع بلا تبعيات: يُقسَّم دليل لغتك إلى أقسام ## ويُقيَّم بتداخل الكلمات المفتاحية مع سؤالك؛ تُدمَج الأقسام الأعلى، وعلى النموذج الإجابة منها أو القول إن الدليل لا يغطيه (دون اختلاق ميزات/مسارات). سلسلة مزوّدين مشتركة، احتياطي يدوي، محدودة المعدل، دون كتابة، ولا تقرأ بيانات المستخدم.
  • عرض جديد public/js/views/docs-assistant.js. اختبارات: tests/docs-assistant-routes.test.mjs. 14 مفتاح i18n جديد ×16 (docs.* + nav.docsAssistant). المساعدة §1 موسّعة في مكانها.

جديد: server/lib/routes/docs-assistant.mjs؛ public/js/views/docs-assistant.js.

[1.101.0] — 2026-07-05

CV Studio: كيّف سيرتك الذاتية + اكتب خطاب تقديم لوظيفة محددة، عبر قائمة تحقق بمستوى مسؤول التوظيف. بطاقة جديدة التكييف مع وظيفة في #/cv-studio: الصق وصف وظيفة (واختيارياً دوراً/عنواناً مستهدفاً)، فينتج CV Studio سيرة ذاتية مكيّفة مع ذلك الإعلان بالإضافة إلى خطاب تقديم مطابق، ثم يمرّرهما عبر بوابة قائمة تحقق قبل تسليمهما — الأخطاء error تحجب (تُصحَّح قبل أن ترى النتيجة)، والتحذيرات warn تنصح. الآلية مستخلصة من ممارسة التوجيه المهني إلى قواعد عامة — مسؤول التوظيف يقرأ في ثوانٍ، لذا تذهب الخبرة ذات الصلة إلى الأعلى، ويطابق العنوان دور الوظيفة، وتحمل النتائج أرقاماً محددة، ويبقى الخطاب تشويقاً قصيراً بجسر واحد «المتطلب ↔ حقيقتك المطابقة». يستند فقط إلى سيرتك الذاتية وملفك ووثيقتك المكوّنة من صفحتين، ولا يختلق أبداً — دون شركات أو أدوار أو تاريخ مضمّن.

  • نقطة نهاية جديدة POST /api/cv-studio/tailor (توسّع وحدة cv-studio الحالية — دون وحدة سابعة وعشرين): buildTailorPrompt + بوابة عامة TAILOR_INSTRUCTIONS، مبنية على bundleProjectContext، وسلسلة مزوّدين مشتركة، وموجّه يدوي دون مفتاح، ومحدودة المعدل، دون كتابة. تُصدَّر النتيجة إلى Markdown / PDF / DOCX عبر شريط report-export.js المشترك.
  • الاختبارات: +3 في tests/cv-studio-routes.test.mjs. 10 مفاتيح i18n جديدة ×16 (cvs.tailor*). مرجع عام docs/prompts/resume-cover.md. المساعدة §24 موسّعة في مكانها.

جديد: docs/prompts/resume-cover.md.

[1.100.0] — 2026-07-05

الوثيقة المكوّنة من صفحتين: تعبئة تلقائية بالذكاء الاصطناعي من سيرتك الذاتية + معاينة + تصدير إلى PDF/DOCX/Markdown. تلتقط الوثيقة (#/two-pager) ما تريده فعلاً من دورك التالي، لكن سابقاً كان عليك كتابة كل حقل يدوياً أو نسخ موجّه إلى أداة أخرى. الآن يعمل ✨ مساعد التعبئة بالذكاء الاصطناعي مباشرةً مع مزوّدك المُهيّأ — يقرأ فقط سيرتك الذاتية + الملف الشخصي (عبر bundleProjectContext، دون اختلاق أي شيء)، ويصوغ جميع الحقول (من أنا / ما أحب / الأساسيات / ما أكره / العوائق الحاسمة / غير القابل للتفاوض / البيئة المستهدفة) ويملأ النموذج لتراجعه وتعدّله وتحفظه. بدون مفتاح API يعود إلى نافذة نسخ الموجّه كما كان. زر جديد 👁 معاينة وتصدير يعرض الوثيقة كمستند منسّق مع شريط تنزيل .md / حفظ بصيغة PDF / حفظ بصيغة DOCX / نسخ.

  • تصدير .docx بلا تبعيات. ملف جديد server/lib/docx.mjs يُنتج .docx بصيغة Office Open XML صغيراً لكن صالحاً (أرشيف ZIP بضغط DEFLATE للأجزاء الأربعة من OOXML، مع CRC-32 لكل إدخال) — دون تبعية تشغيل جديدة (تبقى التبعيات express + js-yaml). مسار جديد POST /api/export/docx (server/lib/routes/export.mjs، وحدة المسار السادسة والعشرون؛ عديم الحالة، محدود بـ200 كيلوبايت، دون كتابة / دون LLM / دون جلب URL). مدمج في public/js/lib/report-export.js المشترك، لذا يحصل تقرير السوق وخطة المسار المهني والتوجيه المهني أيضاً على تصدير DOCX.
  • تستخدم التعبئة التلقائية المباشرة سلسلة المزوّدين المشتركة (runActiveProvider / providerAvailable)؛ ويُحلَّل YAML العائد ويُعاد ضبطه إلى شكل الوثيقة المحدود (parseYamlFields + normalizeTwoPager) — تُسقَط المفاتيح غير المعروفة وتُحدَّد المصفوفات/السلاسل. الوضع اليدوي محفوظ.
  • الاختبارات: tests/export-routes.test.mjs. 4 مفاتيح i18n جديدة ×16 (export.saveDocx، twoPager.preview، twoPager.aiFilling، twoPager.aiFilled).

جديد: server/lib/docx.mjs؛ server/lib/routes/export.mjs.

[1.99.0] — 2026-07-05

صفحة صحة البوابات (#/portals). يراقب الماسح مجموعة من الشركات في portals.yml؛ وقد ينكسر رمز ATS بصمت فيختفي ذلك الموظِّف من كل عمليات المسح المستقبلية. تعرض صفحة Portals الجديدة كل شركة مُراقَبة، وعند Check portal health تفحص كل careers_url عبر safeGet المثبّت على DNS (آمن ضد SSRF) وتُعلّم الميتة (رمز 404 = مُستبعَدة بصمت) — للقراءة فقط. كما تُقوّي مُبلّغ الأخطاء في v1.98.0 بعد المراجعة: يلتقط مخزن الأخطاء الحلقي الآن إخفاقات الشبكة في fetch، ويُخفي المُنقّي مفاتيح المزوّدين غير المُعنونة.

جديد: server/lib/routes/portals.mjs; public/js/views/portals.js.

[1.98.0] — 2026-07-05

مُبلّغ الأخطاء المدمج (تكافؤ مع واجهة web-v0.2.0 للمشروع الأصلي). يجمع زر 🐞 Report a bug في درج الإشعارات لقطة تشخيصية بحدٍّ أدنى للخصوصية — الإصدارات، شاشتك، المتصفح، ملخّص فحوصات /api/health، وآخر 20 خطأً من مخزن حلقي جديد من جهة العميل — بالإضافة إلى بصمة حتمية لإزالة التكرار (co-web-<base36>)، ويتيح لك مراجعة نص Markdown الدقيق ثم يفتح مشكلة GitHub مُعبّأة مسبقًا. لا يُرسَل شيء تلقائيًا؛ ولا يحمل أبدًا سيرتك الذاتية أو ملفك أو إجاباتك أو روابط الوظائف أو المفاتيح. مكتبتان جديدتان logbuf.js + bug-report.js؛ 11 مفتاح i18n ×16؛ tests/bug-report.test.mjs.

جديد: public/js/lib/logbuf.js; public/js/lib/bug-report.js.

[1.97.1] — 2026-07-05

تصليب مدفوع بالمراجعة وتكافؤ في التوثيق (متابعة لـ v1.97.0). كشفت مراجعةٌ لسجلّات مراجعة الذكاء الاصطناعي عن إصلاحات فعلية:

  • fit-score.js (شارة الملاءمة ◎ في المسح). لم تعُد salaryFloor() ترفع معدّلاً دون سنوي إلى حدٍّ أدنى سنوي زائف — إذ تُرجِع «at least 500 EUR/day» و«$80/hr» و«6000 monthly» الآن null بدل عائق صفقة بقيمة 500k/80k. صار تطابق البلد بالكلمة الكاملة (\b…\b)، فلم تعُد «Germany» تطابق الصفة «German» (ولا «Nigeria» داخل «Nigerian») لتُطلق انتهاك «مطلوب في مكان آخر» زائفاً. ‏+3 اختبارات في tests/fit-score.test.mjs.
  • تكافؤ التوثيق. صار كل README مُترجَم يُعلن 16 locales باتساق — فقد ظلّ عدّ/قائمة صفّ Help (‏×13) ونصّ قسم الترجمة + ملاحظة «أضِف المفتاح إلى كل ملفات N» (‏×8) على أعداد ما قبل v1.85 (‏8/9). صُحِّح عدّ المحوّلات في المساعدة داخل التطبيق §17 إلى 46 محوّلاً — 41 إنجليزية + 5 روسية عبر الحُزم الـ16 كلّها.

لا تغيير سلوكي يتجاوز إرشاد شارة الملاءمة؛ لا إضافة مسارات أو مفاتيح أو i18n.

[1.97.0] — 2026-07-05

مصدر ماسح Dassault Systèmes + كنسة جودة على ثلاث جبهات.

  • مصدر مسح جديد — Dassault Systèmes (تكافؤ مع المشروع الأصلي career-ops، ‏#1498). يعكس server/lib/sources/dassault.mjs + server/lib/portals/adapters/dassault.mjs مزوّد Exalead عديم التوكنات لـ«بحث البطاقات» من المشروع الأصلي (التغذية العامة خلف 3ds.com/careers/jobs). إنه نقطة نهاية عالمية واحدة، لذا يُختار عبر المزوّد (provider: dassault) أو يُكتشف تلقائياً من مضيف 3ds.com، ومثبّت مضيف SSRF على www.3ds.com مع redirect:'error'. تُحلَّل XML دون DOM (خرائط <Meta> لكل <Hit>)، وتُستخرج المدينة/البلد من سلسلة الفئة المُترجمة، ولا تُحفَظ الإعلانات إلا حين يكون رابطها العام على *.3ds.com. يوفّر السجل الآن 46 محوّلاً (41 EN + 5 RU)؛ رُفع عدّ ALL_ADAPTERS، وتأكيدات المعرّف المُرتّب ومجموعة EN لـ /api/scan/sources من 40 → 41. المجموعة tests/sources-dassault.test.mjs (10 حالات).
  • نقل إصلاحات المتانة من المشروع الأصلي. يتحمّل مُحلّل Avature الآن نوعين من ترميز المستأجرين الحيّ (article--result بلاحقة فهرس الموضع + مرساة عنوان JobDetail دون فئة، ‏#1541)؛ ويحمي Get on Board من قيمة published_at تساوي 0/سالبة (لا مزيد من تواريخ 1970 الزائفة)؛ ويحدّ SuccessFactors الصفحة الأخيرة كي لا تتجاوز MAX_JOBS (‏#1528).
  • إصلاحات تدقيق الخادم. لم يعُد safe-fetch يتعلّق على استجابة تتجاوز الحدّ — إذ يحسم مسار حدّ الحجم الوعد مباشرةً بدل انتظار حدث 'end' الذي لا يُطلقه مجرى مُتلَف أبداً (إصلاح جلبات /api/pipeline/preview والأنبوب التلقائي للصفحات الكبيرة). صار تسجيل نشاط SSE stream.* قابلاً للوصول من جديد (نُقل فحص /api/stream/ فوق حارس «تخطّي GET» الشامل).
  • إصلاحات تدقيق SPA. يحمي مبدّل تبويبات #/stats من تسابق العرض غير المتزامن — إذ لم يعُد بإمكان نتيجة تبويب بطيء أن تطمس تبويباً أحدث انتقل إليه المستخدم بالفعل. صار تأكيدا حذف المقابلة التجريبية والتواصل المهني يمرّران عنواناً + متناً صحيحين (لا مزيد من حوار بمتن فارغ).
  • إصلاحات الترجمة. تصحيح قيم قاموس غير مترجمة — الأوكرانية config.modes* (Adaptive Framing / Exit Narrative / Location Policy)، والروسية eval.jdLbl («Job Description»)، والإيطالية dash.quick.contactoSub («referral» ← «segnalazione») — إضافةً إلى ترجمة العبارة النمطية الإنجليزية 16 locales في سجلات تغيّر ru/uk/ja/ko/zh-CN/zh-TW.

جديد: server/lib/sources/dassault.mjs؛ server/lib/portals/adapters/dassault.mjs.

[1.96.0] — 2026-07-04

التوجيه المهني (Epic 27). صفحة #/orientation جديدة تجيب عن سؤال «أي الاتجاهات تناسبني فعلاً؟» — وهي القراءة التي قد تحصل عليها من اختبار مهني، لكنها مُستنتَجة من سيرتك الذاتية وملفك الشخصي بدلاً من استبيان. انقر إنشاء الملف، فيُعيد النموذج أفضل المسارات المهنية المطابقة لك (أيّ من الأنماط الثمانية — الوظيفي، والإداري، والمُتواصِل، والأخصائي، والمُحلِّل، والمُبتكِر، والمدير، وريادي الأعمال — يناسبك، مع أدلّة)، وميلاً نحو نوع مهني، وأدواراً موصى بها، ونقاط قوة مهنية مرتبطة بسيرتك الذاتية، ونزعات أسلوب العمل، وتوصيات للتطوير. إنه تأمّل بالذكاء الاصطناعي لكيفية قراءة سيرتك الذاتية — وليس اختباراً نفسياً: لا يختلق الإنجازات ولا يبلّغ عن درجات رقمية كأنها مُقاسة. صدّره إلى Markdown أو PDF؛ لا يُكتب شيء على القرص.

  • مسار جديد server/lib/routes/orientation.mjs (وحدة المسار الرابعة والعشرون) — يبني POST /api/orientation/generate مُوجِّه الملف من السيرة الذاتية+الملف الشخصي+الورقة المكوّنة من صفحتين+الذاكرة عبر تعاقب المزوّدات المشترك، مع بديل يدوي للنسخ واللصق ودون كتابة أي ملفات.
  • يعيد استخدام report-export.js من أجل Markdown/PDF/النسخ، ضمن مجموعة التنقّل Growth.
  • الاختبارات: tests/orientation-routes.test.mjs (صياغة تأمّلية / لا درجات مُختلَقة، وضع يدوي مبذور بالسيرة الذاتية/الملف الشخصي). 7 مفاتيح i18n جديدة ×16 لغة، والمساعدة §28 ×16.

جديد: #/orientation؛ server/lib/routes/orientation.mjs.

[1.95.0] — 2026-07-04

خطة المسار المهني (Epic 26). صفحة #/career-plan جديدة تحوّل سيرتك الذاتية وملفك الشخصي إلى خطة تطوّر ملموسة ومخصّصة. اختر أفقاً (6/12/24 شهراً) وتركيزاً اختيارياً، ويقوم النموذج — بقراءة سيرتك الذاتية وملفك الشخصي وصفحتك المزدوجة (two-pager) ومذكّرتك — بكتابة لقطة لنقطة الانطلاق، وتحليل SWOT لنقاط القوة/النمو، وأهداف بصيغة SMART / OKR / WOOP، ومسارات بديلة، وخطة للمهارات الصلبة/الناعمة، وخريطة طريق شهراً بشهر، وطرق تتبّع التقدّم، والمزالق، وخطوات الدعم. يخطّط انطلاقاً مما تُظهره موادّك فعلاً، ولا يختلق أبداً وقائع عن تاريخك. حرّره داخلياً، واحفظه في طبقة المستخدم (config/career-plan.md)، وصدّره إلى Markdown أو PDF.

  • مسار جديد server/lib/routes/career-plan.mjs (وحدة المسارات الثالثة والعشرون) — GET/PUT /api/career-plan (يكتب config/career-plan.md) + POST /api/career-plan/generate (سلسلة المزودين المشتركة، تراجع يدوي، دون اختلاق). PATHS.careerPlan.
  • يعيد استخدام المساعد المشترك report-export.js (v1.94.0) لـ Markdown/PDF/النسخ، ومجموعة تنقّل النمو جديدة.
  • الاختبارات: tests/career-plan-routes.test.mjs (التحديد، رحلة ذهاب-وإياب GET/PUT، موجّه مُغذّى بالسيرة الذاتية/الملف الشخصي وواعٍ بالأفق). 20 مفتاح i18n جديد ×16 locales، المساعدة §27 ×16.

جديد: #/career-plan؛ server/lib/routes/career-plan.mjs؛ PATHS.careerPlan.

[1.94.0] — 2026-07-04

الإحصاءات، مُعاد تصميمها (Epic 25). صفحة #/stats أصبحت الآن قسم الإحصاءات بثلاث علامات تبويب، برسوم بيانية حقيقية وبيانات أكثر بكثير. علامة تبويب جديدة تقرير السوق تطلب من النموذج تحليلاً للرواتب وسوق العمل لأدوارك المستهدفة في منطقة وعملة تختارها — ملخّص تنفيذي، الرواتب حسب المستوى مع مئينات P10/P25/P75/P90، أبرز أصحاب العمل، جدول للمهارات المطلوبة، تواتر المزايا، توزيع المكتب/الهجين/العمل عن بُعد، اتجاهات على مدى 12–24 شهراً، وإرشادات للتفاوض. كل رقم موسوم بأنه تقدير توجيهي من معرفة النموذج، ولا يُقدَّم أبداً كبيانات مُستخرَجة. علامة تبويب جديدة خط الأنابيب الخاص بي ترسم بيانات متتبّعك: توزيع الدرجات، قمع الحالات، أبرز الشركات والأدوار، الطلبات عبر الزمن، ومعدلات التحويل. عرض الدور المستهدف الأصلي (الشواغر/الرواتب حسب البلد + اتجاه اللقطات المحفوظة) ينتقل إلى علامة تبويب ثالثة، الآن مع محدِّد عملة ونظرة عامة على الإعلانات حسب الدور.

  • صدّر أي تقرير إلى Markdown أو PDF، أو انسخه — عبر المساعد المشترك report-export.js (تنزيل Markdown كـ blob؛ PDF عبر مشغّل PDF المضمّن الحالي).
  • مسار جديد server/lib/routes/market.mjs (وحدة المسارات الثانية والعشرون) — يبني POST /api/stats/market موجّه تحليل سوق من سيرتك الذاتية/ملفك الشخصي (فيعرف أدوارك المستهدفة)، والمنطقة، والعملة، ويمرّره عبر سلسلة المزودين المشتركة، ويرجع إلى موجّه نسخ-ولصق دون مفتاح. لا كتابة أي ملفات.
  • الاختبارات: tests/market-routes.test.mjs (تحديد المنطقة/العملة، موجّه موسوم بالأمانة، وضع يدوي مُغذّى بالسيرة الذاتية/الملف الشخصي). 36 مفتاح i18n جديد ×16 locales، المساعدة §26 ×16.

جديد: #/stats مُعاد تصميمها إلى علامات تبويب؛ server/lib/routes/market.mjs؛ public/js/lib/report-export.js.

[1.93.0] — 2026-07-04

طبقة الذاكرة (Epic 24). صفحة #/memory جديدة تحتفظ بملاحظة قصيرة قابلة للتحرير «تذكّر هذا عنّي» يبقيها المساعد في ذهنه في كل مهمة:

  • ملاحظة واحدة، في كل مكان — لأنها مُضمَّنة داخل bundleProjectContext، تصل الملاحظة تلقائياً إلى كل طلب ذكاء اصطناعي (التقييم، المقابلة التجريبية، التواصل المهني، CV Studio) عبر كل المزودين. اكتبها مرة واحدة؛ فتوجّه كل شيء.
  • توجيه لا حقائق — تلتقط تفضيلاتك وطريقتك المفضّلة في العمل (النبرة، التنسيق، العوائق الحاسمة، الإيقاع)، ولا تلتقط أبداً ادعاءات واقعية جديدة عن خبرتك — فتلك تبقى فقط في سيرتك الذاتية وملفك الشخصي و two-pager. تُحفَظ في طبقة المستخدم في config/memory.md، ولا تُستبدَل أبداً بالتحديثات.
  • اقتراح من بياناتك — يستخرج POST /api/memory/suggest أنماطاً سلوكية من متتبّع طلباتك ويصيغ نقاطاً لتراجعها وتحرّرها. يقرأ متتبّعك؛ لا يختلق حقائق أبداً، ولا يجري أي نداء مباشر.

جديد: server/lib/routes/memory.mjs (وحدة المسارات الحادية والعشرون — GET/PUT /api/memory + POST /api/memory/suggest)، public/js/views/memory.js، PATHS.memory، وكتلة config/memory.md مُضافة إلى bundleProjectContext. 11 مفتاح i18n جديد عبر جميع الـ 16 locales. الاختبارات: tests/memory-routes.test.mjs.

[1.92.0] — 2026-07-04

CV Studio (Epic 21). صفحة #/cv-studio جديدة تمنح سيرتك الذاتية ثلاث أدوات أمينة، معظمها محلي:

  • تشخيص السيرة الذاتية — درجة حتمية من 0 إلى 100 مع شرح لكل فحص (الأثر المُقاس كمياً، الأفعال الضعيفة، الكلمات الطنّانة، الطول، الأقسام الأساسية، بيانات الاتصال). على جانب العميل بالكامل (window.CvDiagnostics) — بلا نموذج لغوي، لا شيء مُختلق، وكل ملاحظة مشروحة كي تقرّر أنت ما تغيّره.
  • قناع الخصوصية — إخفاء البيانات الشخصية (البريد الإلكتروني، الهاتف، الروابط/المعرّفات، عنوان الشارع، واختيارياً اسمك ← الأحرف الأولى) قبل مشاركة سيرتك كنموذج أو لقطة شاشة. يعمل بالكامل في المتصفّح (window.CvPrivacy)؛ ويُبلغ بدقّة عمّا أخفاه ولا يخزّن الأصل أبداً.
  • Make it human / مطابقة النبرة — الصق سطراً أو فقرة جامدة وأعد كتابتها بنبرتك أنت، مبنيةً على جانب الخادم على voice-dna.md و writing-samples/. حاجز صارم: يجوز له إعادة الترتيب والتشذيب وإعادة النبرة، لكنه لا يُدخل أبداً حقيقة أو مقياساً أو إنجازاً غير موجود أصلاً في النص. يعمل مباشرةً عبر سلسلة المزودين المشتركة، أو يعيد لك مطالبة جاهزة للنسخ واللصق دون مفتاح.

جديد: server/lib/routes/cv-studio.mjs (وحدة المسارات العشرون — POST /api/cv-studio/humanize)، public/js/views/cv-studio.js، public/js/lib/cv-diagnostics.js، public/js/lib/cv-privacy.js، PATHS.voiceDna + PATHS.writingSamplesDir. 29 مفتاح i18n جديد عبر جميع الـ 16 locales. الاختبارات: tests/cv-diagnostics.test.mjs، tests/cv-studio-routes.test.mjs. (معرض القوالب، والتصدير إلى Word، وأرشيف PDF للإعلانات تُتابَع كأعمال لاحقة في CV Studio.)

[1.91.0] — 2026-07-04

التواصل المهني والبحث المعمّق عن الشركات (Epic 16). صفحة #/networking جديدة تحوّل شركةً إلى خطة قابلة للتنفيذ للحصول على مقابلة، مبنية على سيرتك الذاتية وملفك الشخصي و two-pager:

  • ملف الشركة — موجز مركّز عمّا تفعله الشركة، والإشارات الحديثة الجديرة بالاقتباس، وخطاطيف «لماذا أنا مناسب» المستخلصة من خلفيتك الحقيقية.
  • بمن تتصل — من 3 إلى 5 شخصيات مستهدفة (مدير التوظيف، مسؤول توظيف داخلي، مساهم فردي أقدم في الفريق، معرفة دافئة/من الخريجين) مع سلسلة بحث LinkedIn محددة للعثور على كل منهم. لا يختلق أبدًا أسماء حقيقية.
  • أدفأ مسار للتعريف — أكثر طريق دافئ واقعي للدخول بالنسبة لخلفيتك أنت (صاحب عمل/مدرسة/مجتمع مشترك، مسار من الدرجة الثانية، أو رسالة مباشرة باردة عالية الإشارة) ولماذا.
  • مسودّات التواصل — رسائل قصيرة ومحددة لأهم الشخصيات، مبنية على نقاط إثباتك الحقيقية.
  • مباشر أو يدوي — يعمل مباشرةً عبر سلسلة المزودين المشتركة بأي مفتاح، أو يعيد لك مطالبة جاهزة للنسخ واللصق (بديل أمين، لا شيء مُختلق). حفظ الخطة يحفظ خطة مكتملة في طبقة المستخدم (networking/net-{company}-{role}-{date}.md)؛ وتعرض الصفحة الخطط المحفوظة وتفتحها وتحذفها.

جديد: server/lib/routes/networking.mjs (وحدة المسارات التاسعة عشرة)، public/js/views/networking.js، PATHS.networkingDir. يعيد استخدام سلسلة server/lib/llm-dispatch.mjs من v1.90.0. 24 مفتاح i18n جديد عبر جميع الـ 16 locales. الاختبارات: tests/networking-routes.test.mjs.


career-ops-ui v1.267.1 · page 6/11 · mirror of the project changelog for cvstart.org