DeepSeek Harness: Bundle و Profile
آخر تحديث: 2026-08-31
قد يحتاج مشروع DSH إلى تكوينات تشغيل متعددة — واحدة لتطوير واجهة الويب، واحدة للنشر بدون واجهة، واحدة لاختبار CI. Profile هو مخطط تجميع مسمّى؛ Bundle هو حزمة تكوين + كود قابلة للتوزيع. معًا، يجعلان نشر DSH بسيطًا كالتبديل بين القنوات.
📋 المتطلبات المسبقة: إكمال 12-local-plugin.md، فهم تكوين cordis.yml
1. ما ستتعلمه
- profile: تجميعات مسمّاة (web/headless)
- bundle: صيغة توزيع تكوين + كود
- حقولا dsh.profile و dsh.bundle
- dsh-base / dsh-web-app / dsh-headless
- ترتيب تركيب طبقات التكوين
- آلية تراكب patch
2. profile: تجميع مسمّى
(1) مفهوم profile
Profile هو مخطط تركيبة إضافات مُعدّ مسبقًا، يُعرَّف بالاسم:
profile ويب: → يتضمن إضافات واجهة الويب، الأدوات التفاعلية
profile بدون واجهة: → بلا واجهة، تنفيذ API + نص برمجي فقط
profile ci: → مجموعة إضافات أدنى، فقط ما تحتاجه الاختبارات
(2) تهيئة profile
أعلن عن profiles في package.json:
{
"name": "my-dsh-project",
"dsh": {
"profiles": {
"web": {
"description": "وضع واجهة الويب للتطوير التفاعلي",
"plugins": [
"@deepseek-ai/dsh-web-app",
"@deepseek-ai/dsh-plugin-tools-interactive"
]
},
"headless": {
"description": "وضع بدون واجهة للأتمتة",
"plugins": [
"@deepseek-ai/dsh-headless",
"@deepseek-ai/dsh-plugin-tools-basic"
]
}
}
}
}
(3) ▶ مثال 3
# استخدام profile ويب
pnpm dsh web --profile web
# استخدام profile بدون واجهة
pnpm dsh headless --profile headless
(4) تركيبة profile
| المكوّن | الوصف |
|---|---|
| قائمة الإضافات | أي إضافات ستُدرَج |
| الوصف | غرض profile |
| التكوين الافتراضي | المعاملات الافتراضية للإضافات |
3. bundle: صيغة توزيع تكوين + كود
(1) مفهوم bundle
Bundle هو صيغة تعبئة profile + تكوين + كود، قابلة للتوزيع مثل حزمة npm:
profile: أي إضافات ستُختار
bundle: إضافات + تكوين + قفل إصدار → حزمة قابلة للتوزيع
(2) ▶ مثال 2
dsh-bundle-my-team/
├── package.json ← حقل dsh.bundle
├── cordis.yml ← التكوين الافتراضي
├── plugins/
│ ├── team-tools/ ← إضافة مدمجة
│ └── team-lint/ ← إضافة مدمجة
└── profiles/
├── web.yml ← تكوين profile ويب
└── headless.yml ← تكوين profile بدون واجهة
(3) ▶ مثال 3
{
"name": "@my-team/dsh-bundle",
"version": "1.0.0",
"dsh": {
"bundle": true,
"profiles": {
"web": "./profiles/web.yml",
"headless": "./profiles/headless.yml"
},
"baseConfig": "./cordis.yml",
"plugins": [
"./plugins/team-tools",
"./plugins/team-lint"
]
}
}
(4) تثبيت bundle
# التثبيت من npm
pnpm add @my-team/dsh-bundle
# بدء الاستخدام بـ profile الخاص بالحزمة
pnpm dsh web --bundle @my-team/dsh-bundle --profile web
4. dsh-base / dsh-web-app / dsh-headless
(1) حزم مدمجة
يوفر DSH ثلاث حزم مدمجة:
| Bundle | الوصف | الإضافات الأساسية المضمنة |
|---|---|---|
| dsh-base | مجموعة أساسية أدنى | core, llm, sessions, trajectory |
| dsh-web-app | نسخة واجهة الويب الكاملة | dsh-base + web-ui, interactive-tools |
| dsh-headless | نسخة بدون واجهة | dsh-base + headless-runner, basic-tools |
(2) علاقات الاعتمادية
graph TB
BASE[dsh-base<br/>core + llm + sessions] --> WEB[dsh-web-app<br/>+ واجهة الويب + الأدوات التفاعلية]
BASE --> HEADLESS[dsh-headless<br/>+ مشغّل بدون واجهة + الأدوات الأساسية]
(3) السلوك الافتراضي
بدون معامل --bundle، يفترض DSH استخدام dsh-web-app:
# مكافئ لـ pnpm dsh web --bundle dsh-web-app
pnpm dsh web
(4) اختيار bundle أساسي
# حزمة أدنى (النواة فقط)
pnpm dsh web --bundle dsh-base
# حزمة واجهة الويب (الافتراضية)
pnpm dsh web --bundle dsh-web-app
# حزمة بدون واجهة
pnpm dsh headless --bundle dsh-headless
5. ترتيب تركيب طبقات التكوين
(1) تراكب تكوين متعدد الطبقات
التكوين النهائي لـ DSH يُركَّب من طبقات متعددة، بأولوية متصاعدة من الأسفل للأعلى:
graph TB
L1[الطبقة 1: تكوين Bundle الافتراضي<br/>cordis.yml] --> L2[الطبقة 2: تكوين Profile<br/>profiles/web.yml]
L2 --> L3[الطبقة 3: تكوين المشروع<br/>cordis.yml الخاص بالمشروع]
L3 --> L4[الطبقة 4: تكوين Patch<br/>cordis.patch.yml]
L4 --> L5[الطبقة 5: معاملات CLI<br/>--patch, --config]
(2) قواعد التراكب
افتراضي Bundle: { plugins: [core, llm], port: 5173 }
Profile: { plugins: [+web-ui], debug: true }
تكوين المشروع: { plugins: [+my-tool], port: 8080 }
Patch: { plugins: [+debug-tool] }
النهائي: { plugins: [core, llm, web-ui, my-tool, debug-tool],
port: 8080, debug: true }
(3) دمج قائمة الإضافات
| العملية | التأثير |
|---|---|
| إضافة جديدة | تُضاف مباشرة في النهاية |
| إضافة بنفس الاسم | الطبقة الأحدث تتجاوز الأقدم |
$insert |
تُضاف في نهاية القائمة |
$replace |
تستبدل الإضافة بنفس الاسم |
(4) دمج قيم التكوين
الأدنى: { a: 1, b: { x: 1, y: 2 } }
الأعلى: { b: { y: 3, z: 4 }, c: 5 }
النتيجة: { a: 1, b: { x: 1, y: 3, z: 4 }, c: 5 }
الكائنات المتداخلة تُدمج بعمق؛ القيم العددية تُستبدل مباشرة.
6. آلية تراكب patch
(1) cordis.patch.yml
ملف patch هو تجاوز التكوين ذو الأولوية القصوى، مناسب للتعديلات المؤقتة أثناء التطوير:
# cordis.patch.yml
plugins:
debug-tools:
$insert: ./dev-plugins/debug-tools
llm:
config:
debug: true
logRequests: true
(2) معامل --patch
# تطبيق طبقة patch
pnpm dsh web --patch
# عدم تطبيق patch
pnpm dsh web
(3) patches متعددة البيئات
config/
├── cordis.yml ← التكوين الأساسي
├── cordis.patch.dev.yml ← patch التطوير
├── cordis.patch.staging.yml ← patch البيئة التجريبية
└── cordis.patch.prod.yml ← patch الإنتاج
التبديل بين البيئات:
# التطوير
cp config/cordis.patch.dev.yml cordis.patch.yml
pnpm dsh web --patch
# الإنتاج
cp config/cordis.patch.prod.yml cordis.patch.yml
pnpm dsh web --patch
(4) التجاوز المباشر عبر CLI
طريقة التكوين ذات الأولوية القصوى:
# تجاوز المنفذ مباشرة
pnpm dsh web --config.port=8080
# تجاوز نموذج LLM مباشرة
pnpm dsh web --config.plugins.llm.config.model=deepseek-reasoner
❓ أسئلة شائعة
dsh.bundle إضافية تخبر DSH بكيفية تحميل التكوين والإضافات.--dump-config لعرض التكوين النهائي: bash pnpm dsh web --patch --dump-config هذا يعرض نتيجة دمج جميع الطبقات، مما يسهل تحديد مصادر التعارض.--bundle dsh-base لتحميل المجموعة الأساسية الأدنى فقط، ثم جمّع الخاصة بك عبر cordis.yml.cordis.patch.prod.yml إلى .gitignore.📖 ملخص
- profile هو مخطط تجميع إضافات مسمّى (web/headless/ci إلخ)
- bundle هو profile + تكوين + كود في حزمة قابلة للتوزيع
- ثلاث حزم مدمجة: dsh-base (أدنى)، dsh-web-app (واجهة الويب)، dsh-headless (بدون واجهة)
- تراكب تكوين بخمس طبقات: Bundle → Profile → المشروع → Patch → CLI؛ الطبقات الأحدث تتجاوز الأقدم
- cordis.patch.yml هو ملف التكوين ذو الأولوية القصوى؛
--patchيُفعّله --dump-configيعرض التكوين المدمج النهائي؛ أساسي لاستكشاف التعارضات
📝 تمارين
1. ⭐ أساسي: أضف حقول dsh.profiles إلى package.json لمشروعك، مع تعريف profiles بعنوانَي web و headless. ابدأ DSH بكل profile وقارن قوائم الإضافات المُحمَّلة.
2. ⭐⭐ متوسط: أنشئ cordis.patch.dev.yml يحمّل إضافة debug-tools ويفعّل تسجيل طلبات LLM في وضع التطوير. ابدأ بـ --patch واستخدم --dump-config للتحقق من تأثير تجاوز طبقة patch.
3. ⭐⭐⭐ متقدم: أنشئ حزمة bundle كاملة بـ profile مخصص، وإضافتين مدمجتين، وتكوين افتراضي. انشر في سجل npm محلي (أو استخدم بروتوكول file:)، ثبّت من مشروع آخر، وابدأ باستخدام هذه الحزمة.