سجل التغييرات
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 لغة؛ مجموعة اختبار جديدة معزولة عن CItests/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. جرى التحقق داخل المتصفح: تُحلَّل صفحات الأنماط الثلاث جميعها وتُطبَّق قواعدها.
- القطع متواصل ومرتّب، لذا يكون التتالي (cascade) مطابقًا حرفيًا بايتًا ببايت للملف قبل التقسيم؛ يحمّل
[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) — لوحة وظائف الويب3cryptocurrencyjobs.co، تُستوعب عبر تغذية RSS 2.0 العامة الخاصة بها (بلا مصادقة). فكّ ترميز كيانات XML على مرحلتين، قوائم عن بُعد فقط، واستخراج جهة التوظيف من ذيل العنوان"… at <Company>". - أصبح إجمالي السجل الآن 72 مصدرًا = 67 إنجليزية + 5 روسية (
ALL_ADAPTERS= 67 محوّلاً إنجليزيًا).
- a16z Speedrun (
أُصلح
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) —
sharp0.34.5→0.35.3 وsvgo4.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) — واجهة
recruitingCEJobRequisitionsREST بلا مصادقة لمواقع التوظيف 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والأنبوب التلقائي للصفحات الكبيرة). صار تسجيل نشاط SSEstream.*قابلاً للوصول من جديد (نُقل فحص/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