→ المدونةأدلة عملية

حين يضيق ملف المهام بوكلاء الذكاء الاصطناعي لديك

‏Beads متتبّع مهام جيد لوكلاء الذكاء الاصطناعي، والمطوّر المنفرد الأفضل له البقاء عليه. وهنا النقطة التي يضيق عندها باكلوج داخل المستودع، وكم تكلّف النقلة.

The Taskfolk team

11 د قراءة7 مشاهدة

XLinkedIn

يسألك زميل عن وضع إعادة كتابة نظام المصادقة. الجواب موجود في قاعدة بيانات داخل نسختك المحلية من المستودع، وأسرع طريقة لعرضه عليه لقطة شاشة لأمر bd list تلصقها في Slack. لا شيء معطّل هنا. أنت فقط لا تملك رابطًا تعطيه لأحد.

نحن نبني ‏Taskfolk، وهو متتبّع مهام مستضاف، فالتحيّز واضح. ما يلي هو النقطة التي يضيق عندها باكلوج محلي داخل المستودع، وكم تكلّف النقلة، وكيف تعود منها إن أردت. وإن قررت البقاء حيث أنت، فتلك نتيجة صحيحة أيضًا.

ما يُتقنه Beads، ومن الأفضل له أن يبقى عليه

‏Beads (الأمر bd) متتبّع مهام قائم على رسم بياني، صُمّم ليكون ذاكرة لوكلاء الذكاء الاصطناعي الذين يكتبون الكود. رخصته MIT، مكتوب بلغة Go، تجاوز 25,000 نجمة على GitHub، وصدرت نسخته v1.1.2 في 26 يوليو 2026، وهو اليوم الذي تحققنا فيه من كل رقم في هذا المقال. أما Task Master، وهو منافس في المجال نفسه، فآخر إصدار له 0.43.1 في مارس 2026.

تصحيح واحد قبل أي شيء. إن قرأت مقالًا يقول إن Beads يحفظ المهام في SQLite وإن ملف JSONL هو المصدر المتتبَّع في git، فذلك المقال أقدم من فبراير 2026. صار Dolt المضمّن هو الافتراضي في v0.49.3 يوم 1 فبراير، ثم أخرجت v0.50.2 آخر مستخدمي SQLite بعدها بأسبوعين. قاعدة البيانات في .beads/embeddeddolt/ وتتزامن مع refs/dolt/data. وملف README صريح في وصف الملف الذي ما زال الجميع يكتب عنه: هو "تصدير للعرض والتبادل، لا مصدر الحقيقة ولا نسخة احتياطية".

وما تكسبه من ذلك حقيقي. يمشي bd ready في رسم التبعيات ويعيد لك العمل غير المحجوب دون أي طلب شبكي. ومعرّفات الهاش تمنع وكيلين على فرعين من توليد المعرّف نفسه، ودمج Dolt على مستوى الخلية يتكفّل بما بقي. ورسم التبعيات هنا كائن أصيل في النظام، لا نوع رابط مركّب على تذكرة.

إن كنت مطوّرًا واحدًا بمستودع واحد وثلاثة وكلاء على الأكثر، توقّف عن القراءة هنا. الأرجح أن Beads هو الجواب الصحيح، وما تبقّى لا يعنيك.

الحدّ الفاصل هو أول شخص لن يستنسخ المستودع

الحجة المعتادة ضد باكلوج على هيئة ملف هي أنه ينهار لحظة تشغيل وكيلين معًا. قلنا هذا بأنفسنا في باكلوج مشترك لوكلاء البرمجة، وأمام Beads لا تصمد الحجة. فمعرّفات الهاش، والدمج على مستوى الخلية، والأمر الذري bd update --claim، ووضع الخادم، كلها موجودة تحديدًا كي لا تتصادم الجلسات المتوازية. وDoltHub يقولها بلا مواربة: وضع الخادم "يتيح لك تشغيل جلسات كثيرة لوكلاء البرمجة على مستودع Git نفسه".

إذن Beads يتّسع للوكلاء. لكنه يقف عند البشر، لأن كل مسار قراءة فيه يبدأ باستنساخ المستودع وتثبيت ملف تنفيذي.

flowchart LR
  agent["Coding agent"] --> db[("Local Dolt database")]
  dev["Developer with a clone"] --> db
  pm["Product lead"] --> wall["Needs a clone and a binary"]
  support["Support engineer"] --> wall

ويظهر هذا في صورة عادة أكثر منه خطأ. يطلب أحدهم رابطًا يرى فيه الوضع، ولا رابط لديك، فتلصق له لقطة من الطرفية. كرّر ذلك مرتين أسبوعيًا لمدة شهر وتصبح أنت طبقة التقارير في مشروعك. لا توجد واجهة ويب رسمية، وواجهات المجتمع محلية أولًا بحكم التصميم. وأقرب شيء إلى رابط قابل للمشاركة هو الموقع الساكن الذي تولّده أداة Bead Me Up, Scotty، إن تذكّر أحدهم أن يولّده من جديد.

لوحة كانبان بأعمدة قائمة الانتظار وللتنفيذ وقيد التنفيذ وقيد المراجعة، وبطاقات تحمل مفاتيح المهام والتصنيفات والصور الرمزية.

من فعلها، ومن يحق له أن يفعلها

يسجّل Beads فاعلًا مع كل عملية كتابة، ومرجع الإعدادات يحدّده بترتيب ثابت: خيار --actor، ثم BEADS_ACTOR، ثم BD_ACTOR، ثم git config user.name، ثم $USER، ثم كلمة "unknown".

لا شيء في هذه السلسلة موثّق الهوية. هو نص يعلنه من يشغّل الأمر، مع تجاوز عبر متغيّر بيئة، واحتياطي اسمه unknown في آخر الصف. وتكتشف ذلك يوم تفتح سجل تذكرة مغلقة فتجد الفاعل مسجّلًا باسم $USER عندك، لأن الوكيل عمل بهويتك أنت.

ربط وكيل بـ ‏Taskfolk ينشئ صف مستخدم حقيقيًا موسومًا كوكيل، وصف عضوية، وملفًا تعريفيًا، ومفتاح API منشئه هو معرّف مستخدم ذلك الوكيل. وكل ما يكتبه المفتاح يحمل تلك الهوية، فيظهر الوكيل في قائمة المُسند إليه، وفي إشارات @، وفي سجل النشاط. أما عنوان بريده فيقع على نطاق فرعي بلا توجيه بريد، فالرابط السحري الذي كان سيسجّل دخوله لا يجد مكانًا يصل إليه. التفاصيل في إدارة فريق من وكلاء الذكاء الاصطناعي.

صفحة الوكلاء وفيها أربعة وكلاء مرتبطين بالاسم والبرنامج، لكل منهم مفتاح API خاص، وتحتهم سجل متتابع لجلسات الوكلاء.

والصلاحيات تنبع من الثغرة نفسها: لا يوجد كيان موثّق الهوية تُعلَّق عليه سياسة كتابة. وBeadbox، وهي واجهة رسومية تجارية مبنية على Beads، تقول هذا عن منتجها هي، والوصف ينطبق تمامًا على نموذج التخزين تحته: "لا توجد حسابات مستخدمين، ولا أدوار، ولا قيود رؤية لكل مهمة. وكل من يملك وصولًا إلى مجلد .beads/ عبر نظام الملفات (أو إلى خادم Dolt) يستطيع قراءة كل شيء وكتابته". وأقرب ما يوفّره Beads هو agent.profile، وهو يحكم صلاحية git لأمر bd prime، لا حقول المهام. وما ينكسر يوم ينضم متعاقد خارجي هو الافتراض، لا الكود.

أما عندنا فقائمة سماح لكل وكيل على 14 حقلًا في المهمة، تُفرض عند نقطة كتابة واحدة تغطي REST، ونقطة نهاية الانتقالات، وMCP. القائمة على مستوى الحقل لا القيمة: تقرّر هل يحق للوكيل الكتابة في حقل الحالة أصلًا، لا أن تحصره في نقل المهام إلى قيد المراجعة. الإعداد في ضبط صلاحيات حقول الوكيل.

نافذة بعنوان ما الذي يستطيع هذا الوكيل تعديله، فيها 14 مربع اختيار للحقول، المؤشَّر منها الحالة والأولوية والتصنيفات فقط.

العرض المشترك مرتبط بالجهاز، والترقية حدث جماعي

‏Beads يعمل عبر عدة مستودعات، وإنكار ذلك تكاسل. فالأمران bd repo add وbd repo sync يجمعان مستودعات أخرى في عرض قراءة واحد، وكل مهمة تحمل source_repo، والصيغة external:<project>:<capability> توجّه تبعية إلى مشروع آخر.

المشكلة في مكان هذه الإعدادات: جهاز واحد، وملف إعدادات شخص واحد. شخصان سجّلا مستودعات مختلفة يقرآن باكلوجين مختلفين، ولا أحد منهما يملك ما يعطيه للشخص الثالث.

والتكلفة الثانية تكبر مع عدد الأشخاص. حين تعبر الترقية هجرة في المخطط على قاعدة بيانات مربوطة بمستودع بعيد، يقول ملف README إن نسخة واحدة معيَّنة تشغّل bd migrate ثم bd dolt push، بينما يثبّت الباقون الملف التنفيذي ويشغّلون bd bootstrap. وحارس الإصدار يرفض فتح قاعدة بيانات هاجرها ملف تنفيذي أحدث. مع شخصين هذه رسالة على Slack. ومع ثمانية تصير موعدًا مجدولًا، وأول عَرَض له زميل تعطّل عنده bd بعد brew upgrade لا صلة له بالأمر.

أين يقع الفرق فعليًا

الأداتان تتعقّبان المهام مع تبعياتها، وكلتاهما تحسن ذلك. ما يحسم الاختيار هو الهوية والوصول والجمهور والاستضافة.

Beads Taskfolk
نسبة العمل إلى فاعله نص معلَن، واحتياطي unknown مستخدم أو مفتاح موثّق الهوية
حدود الكتابة لكل وكيل لا توجد قائمة سماح على 14 حقلًا
معرفة الوضع دون استنساخ تصدير ساكن فقط رابط، بعد دعوة
العرض عبر المستودعات إعدادات على كل جهاز واحد للجميع
العمل غير المحجوب bd ready، دون اتصال لا يوجد، اسرد ثم اقرأ الروابط
العمل دون اتصال كل استعلام محلي لا يوجد
الترقيات نسخة واحدة تهاجر مستضاف
التكلفة مجاني، رخصة MIT، بلا حساب 5 مشاريع مجانًا، ثم 3 دولارات للمقعد

الترحيل خطوة بخطوة

المهام أولًا، ثم الروابط بينها، لأن الرابط لا ينشأ قبل أن يوجد طرفاه.

flowchart LR
  bd["bd export"] --> jsonl["issues.jsonl"]
  jsonl --> bulk["POST bulk, 50 per call"]
  bulk --> links["Second pass, links"]
  links --> ws["Workspace"]
  ws --> back["GET issues and links"]
  back --> imp["bd import upserts"]

ابدأ بالتصدير. الذكريات التي يسجّلها bd remember مستثناة افتراضيًا، وهذا ما تريده.

bd export -o issues.jsonl

كل سطر مهمة واحدة بتصنيفاتها وتبعياتها وتعليقاتها. وما ينتقل معك هو issue_type وpriority وstatus وlabels وdependencies وcomments، وزوج external_ref / source_system للمعرّفات العابرة بين الأنظمة.

{"id":"core-8f2","title":"Rotate the signing key","issue_type":"chore","priority":1,"labels":["auth"],"dependencies":[{"depends_on_id":"core-4a1","type":"blocks"}]}

ثلاثة تحويلات تفقد معلومات، واختيار ما تفقده أفضل من اكتشافه في الأسبوع الثالث. أنواع bug وtask وepic تمرّ كما هي، وfeature تصير story، وchore وdecision تنتهيان معًا عند task. والأولويات عند Beads من 0 إلى 4، حيث 0 حرجة و4 هي الباكلوج، أي أن آخر الدرجات موقع في الطابور لا درجة إلحاح، أما عندنا فست درجات مسمّاة، فتهبط 4 إلى lowest. وأنواع الروابط discovered-from وsupersedes وreplies-to لا مقابل لها: عندنا relates_to وblocks وduplicates، مع علاقة الأب بالابن.

وفخ واحد سيكلّفك نصف يوم عمل. الحقل parent مقبول عند الإنشاء، متجاهَل عند التحديث، فالابن الذي أُنشئ قبل أبيه لا سبيل إلى إعادة ربطه عبر API. رتّب ملف التصدير بحيث تأتي الملاحم والمهام الأب في الدفعة الأولى.

ثم أنشئ المهام على دفعات من 1 إلى 50. الاستجابة 201 حين تنجح كل العناصر، و207 حين يفشل بعضها، ومعها رقم العنصر الذي تعطّل.

curl -X POST https://taskfolk.ai/api/v1/workspaces/acme/projects/CORE/issues/bulk \
  -H "Authorization: Bearer tfk_live_a1b2..." \
  -H "Content-Type: application/json" \
  -d '{"items":[{"type":"task","title":"Rotate the signing key","priority":"high"}]}'
await fetch("https://taskfolk.ai/api/v1/workspaces/acme/projects/CORE/issues/bulk", {
  method: "POST",
  headers: { Authorization: "Bearer tfk_live_a1b2...", "Content-Type": "application/json" },
  body: JSON.stringify({ items: batch }), // 50 at a time
});
requests.post(
    "https://taskfolk.ai/api/v1/workspaces/acme/projects/CORE/issues/bulk",
    headers={"Authorization": "Bearer tfk_live_a1b2..."},
    json={"items": batch},
)
{"data":[{"index":0,"ok":true,"data":{"key":"CORE-118","title":"Rotate the signing key"}}]}

احتفظ بخريطة تربط معرّف Beads بمفتاح المهمة، ثم أعد تطبيق dependencies[] عليها. الروابط تُحلّ عبر المشاريع داخل مساحة العمل الواحدة، فالتبعية التي كانت تشير إلى مستودع آخر تصل إلى وجهتها. والمفتاح يسمح بـ 600 طلب في الدقيقة افتراضيًا، أي أن باكلوجًا فيه 4,000 مهمة يحتاج 80 نداء إنشاء، وواحدًا لكل رابط.

curl -X POST https://taskfolk.ai/api/v1/workspaces/acme/projects/CORE/issues/CORE-118/links \
  -H "Authorization: Bearer tfk_live_a1b2..." \
  -d '{"kind":"blocks","direction":"in","target_key":"CORE-104"}'

جدول زمني بمفاتيح المهام وأشرطة ملوّنة، وخطوط تبعية متقطّعة من شريط إلى الشريط الذي يحجبه.

تخطَّ مستورد CSV. هو أسرع، ويسقط بالضبط ما جئت إلى Beads من أجله: الصف المقروء يحمل العنوان والنوع والحالة والأولوية والمُسند إليه والتصنيفات والوصف، بلا حقل أب ولا تبعيات ولا روابط. ولا يوجد موصّل جاهز لـ ‏Beads، ومقال كيف تستورد مشروعك يغطي Jira وTrello.

وكلاؤك يبقون على حلقة عمل قوامها الأوامر

لا قيمة لكل ما سبق إن ساء أداء وكلائك بعده. هم يواصلون مخاطبة أداة، لكنها صارت تجيب عبر HTTP. خادم MCP عندنا نقطة نهاية واحدة من نوع Streamable HTTP، وفهرس أدواته مولَّد من سجل OpenAPI نفسه الذي يعرّف REST، فلا سبيل إلى أن يفترقا: أكثر من 180 عملية، مرشَّحة بالنطاقات لكل مفتاح. النسخة المختصرة في MCP أم REST API لوكيلك.

وحزمة المهارة المولَّدة توفّر أكبر قدر من وقت الإعداد. ملف SKILL.md فيها مبني من جرد مساحة عملك الحيّة، فيبدأ الوكيل بمفاتيح مشاريعك وتصنيفاتك وحقولك المخصصة ومعرّفات الإشارة الحقيقية بدل أن يخمّنها.

تبويب المهارات وفيه تبويبات لـ ‏Claude Code وCursor وVS Code وCodex فوق أمر جاهز للنسخ يضيف خادم MCP.

وموضع الخسارة هو bd ready، والدقة هنا واجبة. لا يوجد نداء واحد يعيد العمل غير المحجوب. قائمة المهام في v1 ترشّح بالحالة والنوع والأولوية والمُسند إليه والمُبلِّغ والمَعلم والسبرنت والأب والتصنيف ونص بحث، وليس بينها "غير محجوب". حالة الحجب تُشتق داخل التطبيق لعرضَي اللوحة والقائمة، ولا تُعرض كمعامل استعلام.

فيسرد الوكيل العمل المفتوح، ويقرأ /links للمرشّحين، ويقرّر بنفسه: نداءات أكثر، ورموز (tokens) أكثر، واعتماد على الشبكة لم يكن قائمًا. والأسئلة الشائعة عند Beads تفضّل واجهة الأوامر على MCP للسبب نفسه، أي خفض عبء السياق، ولا جواب نظيف لدينا هنا. جودة التذكرة ترفع معدل نجاح الوكيل أكثر مما ترفعه وسيلة النقل، ومقال اكتب تذاكر يستطيع الوكيل إنهاءها يتناول ذلك.

ما الذي تخسره، وكيف تخرج

يعطيك Beads قاعدة بيانات لكل مستودع بلا مقابل. أما خطتنا المجانية فتقف عند 5 مشاريع نشطة، فمطوّر لديه ثمانية مستودعات، لكل منها مجلد .beads/ خاص، يصطدم بجدار لم يكن موجودًا عند Beads. و‏Pro بـ 3 دولارات لكل مقعد منفّذ شهريًا، والوكلاء المرتبطون والمشاهدون لا يُحسبون مقاعد.

وتتخلى كذلك عن العمل دون اتصال. لا وضع دون اتصال، ولا ذاكرة محلية، ولا تطبيق جوال، فانقطاع الشبكة يعني باكلوجًا لا تراه. في الطائرة، الفوز لـ ‏Beads.

الخروج هو الجزء الذي تتخطاه أغلب أدلة الترحيل، وهذا هو. اسحب مهامك وروابطك صفحةً صفحة عبر REST باستخدام ?limit=200 والمؤشّر، واكتب كائن JSON واحدًا في كل سطر بالشكل الذي يتوقعه bd import، ثم استورده. والاستيراد عملية upsert: الصف يستبدل مهمة محلية فقط إن كان updated_at فيه أحدث، وصفوف tombstone تُتخطّى، والصفوف الأقدم تعود ضمن stale_skipped_ids.

curl -s "https://taskfolk.ai/api/v1/workspaces/acme/projects/CORE/issues?limit=200" \
  -H "Authorization: Bearer tfk_live_a1b2..." | ./to-beads-jsonl.py > out.jsonl
bd import out.jsonl

اختم external_ref وsource_system عند الخروج حتى لا ينشئ التشغيل الثاني نسخًا مكرّرة، واحفظ معرّف Beads في حقل نصي مخصص عند الدخول. هذا ما يجعل تشغيل الاثنين جنبًا إلى جنب عمليًا، مع فارق أن Beads يتزامن باتجاهين مع GitHub وJira وLinear، بينما جانبنا سكربت تتولى صيانته بنفسك.

بدل الجدال في موضع الحدّ الفاصل، جرّبه. صدّر باكلوج مستودع واحد، وأنشئ مهامه في مساحة عمل مجانية، وأرسل رابط اللوحة إلى من لا يكفّ عن سؤالك عن الوضع. إن توقف عن السؤال، فالحدّ الفاصل كان حقيقيًا.

أسئلة شائعة

هل أشغّل Beads ومتتبّعًا مستضافًا في الوقت نفسه؟

نعم، لكن الجهد يتوقف على الطرف الآخر. يوفّر Beads مزامنة باتجاهين مع GitHub وJira وLinear (‏bd github sync وbd jira sync وbd linear sync)، فهذه تتعايش معه من اليوم الأول. أما Taskfolk فليس من بين تلك الموصّلات، فالتشغيل جنبًا إلى جنب معه يعني سكربتًا فوق REST API يختم external_ref وsource_system عند التصدير، ويحفظ معرّف Beads في حقل نصي مخصص عند الاستيراد.

ماذا يحدث لملف `.beads/issues.jsonl` بعد الترحيل؟

لا شيء، ولم يكن هو الملف المهم أصلًا. فمنذ فبراير 2026 صار مصدر الحقيقة قاعدة بيانات Dolt مضمّنة في .beads/embeddeddolt/، وصار JSONL تصديرًا خاملًا للعرض والتبادل. وإن أردت الاحتفاظ بالباكلوج القديم، احتفظ بمجلد .beads/ كاملًا أو شغّل bd backup، لا بملف JSONL وحده.

هل يواصل وكيلي العمل من سطر الأوامر بعد الانتقال؟

نعم. يخاطب خادم MCP أو REST API بدل ملف تنفيذي محلي، وحزمة المهارة المولَّدة تسلّمه مفاتيح مشاريعك وتصنيفاتك وحقولك المخصصة الحقيقية فيتوقف عن التخمين. والثغرة الصريحة هي bd ready: لا يوجد نداء واحد يعيد العمل غير المحجوب، فيسرد الوكيل المهام ويقرأ روابطها بنفسه.

كم مهمة يحتمل Beads قبل أن يتباطأ؟

أكثر مما تبلغه معظم المشاريع يومًا. تقول أسئلته الشائعة إن الأوامر تبقى سريعة عند مقياس آلاف المهام، ولا تقترح التقسيم إلى قاعدة بيانات لكل مكوّن إلا بعد نحو 100,000 مهمة. الحجم ليس سبب مغادرة Beads.

هل Beads مجاني، وهل Taskfolk كذلك؟

‏Beads برخصة MIT، مجاني، ولا يحتاج حسابًا ولا خادمًا. ولـ ‏Taskfolk خطة مجانية حقيقية سقفها 5 مشاريع نشطة و128 ميغابايت من مساحة التخزين، مع Pro بـ 3 دولارات لكل مقعد منفّذ شهريًا، والوكلاء المرتبطون والمشاهدون لا يُحسبون مقاعد أبدًا. وإن كانت التكلفة هي المحور الوحيد الذي يعنيك، فابق على Beads.

قراءات ذات صلة

أضف تعليقًا

ابدأ النقاش.