مدرب الجري بالذكاء الاصطناعي عندي هو مستودع Git ووكيل Claude
أنهي حصتي، تتزامن ساعتي، وبعد ثلاث دقائق يكون التحليل مكتوبا في مستودعي، والأسبوع قد أعيد ضبطه، ومدربي قد ترك تعليقا تحت نشاط Strava. لا تطبيق مبرمج، ولا خادم مكتوب، ولا فاتورة API محسوبة على كل token: اشتراك Claude، وAgentsRoom، وملفات Markdown. هذا هو التركيب الكامل، قابل لإعادة الإنتاج.
أنهي حصتي. تتزامن ساعتي مع Strava من تلقاء نفسها، كالعادة. وأذهب لأستحم.
حين أخرج، تكون ثلاثة أشياء قد حدثت دون أن ألمس شيئا. تحليل الحصة مكتوب في مستودع تدريبي. والأسبوع أعيد ضبطه، وسبب التغيير مدون بجانبه. وتحت نشاط Strava هناك تعليق من مدربي، يقول لي ما تساويه الحصة وما الذي تغيره ليوم الجمعة.
هذا المدرب ليس تطبيقا برمجته. إنه مستودع Git من ملفات Markdown، واشتراك Claude، وAgentsRoom يمسك كل ذلك معا. لا خادم مكتوب، ولا فاتورة محسوبة على كل token، وحوالي عطلة نهاية أسبوع من التركيب.
كل شيء منشور على هيئة قالب: github.com/AgentsRoomDev/running-performance-coach. يمكنك استنساخه وجعله لك بملء المواضع الفارغة. يشرح هذا المقال كيف يعمل، قطعة قطعة، بافتراض أنك سمعت بكلمة API لكنك لم تكتب webhook قط.
للسياق: أجري منذ زمن طويل، 2:47 في الماراثون، 1:13:59 في نصف الماراثون، 33:45 في 10 كم. هدف الدورة الحالية هو العودة إلى ما دون 34 دقيقة في 10 كم. هذا مهم لما يلي: مدرب عام يعيد علي شرح ما هي حصة العتبة لا ينفعني في شيء، وهذه بالضبط هي المشكلة التي يحلها هذا التركيب.
ما يحدث بين نهاية جريتي والتعليق
السلسلة الكاملة ست خطوات:
- ساعتي ترسل النشاط إلى Strava. هذا الجزء يحدث أصلا عند الجميع.
- كل 15 دقيقة، سكربت Python صغير يسأل Strava إن كان هناك جديد.
- حين يجد حصة جديدة، يبني بطاقة حصة بصيغة Markdown في مستودعي: اللفات، والأزمنة الجزئية، والحجم، ونبض القلب. بيانات مقاسة فقط.
- كما يعيد كتابة عنوان النشاط ووصفه على Strava، حتى يتوقف تدفقي عن قول Afternoon Run.
- ثم يرسل رسالة موقعة إلى AgentsRoom، الذي يفتح وكيل Claude والحصة بين يديه سلفا.
- ذلك الوكيل يقوم بعمل المدرب: يقرأ، ويقارن، ويكتب التحليل، ويضبط الأسبوع، ويودع، ويدفع، ويعلق على Strava، ويرسل لي التقرير الطويل بالبريد.
الخطوات الخمس الأولى سباكة. السادسة هي موضوع هذا المقال.
سجل التدريب مستودع Git، وليس قاعدة بيانات
هذا هو القرار الذي يغير كل شيء، وهو أيضا الذي يفاجئ الناس أكثر من غيره.
حصة واحدة = ملف واحد، journal/2026/2026-09-03.md. أسبوع واحد = ملف واحد، plan/weeks/2026-W36.md. تغيير واحد في الخطة = إيداع واحد، مع سببه في الرسالة. لا قاعدة بيانات، ولا مخطط، ولا ترحيل، ولا واجهة.
ثلاث نتائج، بترتيب الأهمية:
المدرب يستطيع أن يعيد قراءة تاريخه هو. يعرف ما وصفه قبل ثلاثة أسابيع، ويستطيع أن يتحقق إن كان ذلك قد نجح. روبوت محادثة تحكي له حصتك يبدأ من الصفر في كل محادثة. أما وكيل لديه مستودع فله ذاكرة، وهذه الذاكرة يقرؤها إنسان.
أقرأ خطتي على هاتفي، في تطبيق GitHub. ملف README.md في المستودع ليس صفحة تقديم: إنه لوحة قيادتي. العقد المكتوب في CLAUDE.md صريح في ذلك، لا تخطيط ينتهي ما دام README لا يعكسه. النتيجة: ليس عندي أي واجهة أصونها، ومع ذلك عندي شاشة تقول لي ماذا أفعل اليوم.
لا شيء لا رجعة فيه. كل ما يكتبه الوكيل إيداع. أستطيع قراءته، ومناقشته، والتراجع عنه. هذا مختلف تماما عن تطبيق يقرر وحده.
الخطوة 1: Strava توقظ سكربتا صغيرا
يعرض Strava واجهة API: وسيلة تتيح لبرنامج أن يطلب: أعطني الأنشطة الأخيرة لهذا الرياضي. السكربت strava_sync.py يفعل ذلك بالضبط، ويحول الجواب إلى بطاقة حصة.
الجزء المثير ليس نداء الشبكة، بل إعادة البناء. الساعة تسجل لفات خاما. على السكربت أن يستنتج أي حصة كانت تلك:
Lap 1 : 4.40 km in 26'07 (5:56/km) ← إحماء
Lap 2 : 1.00 km in 3'41 (3:41/km) ← تكرار 1
Lap 3 : 0.20 km in 1'59 (9:55/km) ← استشفاء
... → "5 x 1000m r' 2'"
يجرب كل تقسيم من صيغة: أسرع k لفات هي التكرارات، ويحتفظ بالأفضل الذي يصمد. يبدو هذا بديهيا وهو ليس كذلك: التجميع الساذج حسب السرعة يقع في الفخ فور أن يكون الإحماء أسرع من الاستشفاء.
وقبل كل شيء، شكل الحصة يعاد بناؤه من الساعة، لا من الخطة أبدا. من المغري فعل العكس (الخطة تقول 5 x 1000m، فلنكتب ذلك) وهذا بالضبط هو الخطأ: كل الفائدة هي في كشف الأيام التي فعلت فيها شيئا آخر. حين يختلف الاثنان، فذلك الاختلاف هو المعلومة، والمدرب يراه:
Planned 3 x 8' → جري متواصل
تحذيران قبل أن تبدأ.
واجهة Strava API صارت تشترط اشتراك مطور مدفوعا منذ يونيو 2026. بدونه، كل نداء يجيب 403 Application Status Inactive. البديل موجود ومدمج في القالب: صدر ملف TCX من ساعتك وسلمه إلى import_tcx.py. كل ما يأتي بعد الاستيراد يعمل بالطريقة نفسها.
الحصص سخية، لكنها حقيقية. على تطبيقي، 300 طلب كل 15 دقيقة و3000 في اليوم للقراءة. السكربت يستهلك واحدا في كل تمريرة في الوضع المستقر، أي 96 في اليوم. نحن بعيدون جدا عن السقف، لكن هذا من النوع الذي يتحقق منه المرء قبل، لا بعد.

الخطوة 2: السكربت يوقظ الوكيل، بتوقيع
هنا تصبح الأمور مثيرة.
الـ webhook هو عكس السؤال. بدل أن تسأل كل خمس دقائق إن كان هناك جديد، تعطي عنوان ويب لبرنامج، فيرسل هو إليك رسالة حين يقع الحدث. ولا تدفع شيئا ما دام لا يحدث شيء.
يعرض AgentsRoom ذلك بالضبط: مشغل webhook. تنشئ مشغلا في التطبيق، فيعيد إليك رابطا وسرا. وأي شخص يرسل رسالة JSON إلى ذلك الرابط يفتح وكيلا، مع الموجه الذي كتبته ومحتوى الرسالة محقونا فيه سلفا.

الرسالة التي يرسلها سكربتي صغيرة عن قصد:
{
"type": "created",
"title": "03/09 · 5 x 1000m r' 2'",
"body": "حصة 03/09/2026 مستوردة من Strava.\n\nحصة نوعية: 5 x 1000m r' 2'\nالأزمنة الجزئية: 3'41 - 3'40 - 3'38 - 3'40 - 3'35\n\nالحجم الإجمالي: 12.51 km في 1h07'42 (5:25/km)، الارتفاع+ 56 m\nالحصة المخططة: RP10-5x1000\n\nبطاقة الحصة: journal/2026/2026-09-03.md\nبطاقة الأسبوع: plan/weeks/2026-W36.md"
}
لاحظ ما ليس فيها: نص الخطة. الـ webhook يحمل رمز الحصة المخططة ومسار البطاقات، لا محتواها أبدا. الوكيل الذي يملك المستودع سيذهب ليقرأها بنفسه، والوكيل الذي لا يملكه لا شأن له بتعليماتي الداخلية. هي القاعدة نفسها المطبقة على الأوصاف المنشورة على Strava.
التوقيع، والفخ الذي يأتي معه
رابط عمومي يفتح وكيلا لا يمكن أن يبقى مفتوحا لأي أحد يعثر عليه. لذلك فالمشغل موقع: يحسب السكربت بصمة للرسالة بالسر المشترك (وهي HMAC-SHA256، إن كان المصطلح يعني لك شيئا) ويرسلها في ترويسة X-AgentsRoom-Signature. ويعيد الخادم حساب البصمة نفسها عنده، وإن لم تتطابقا رفض.
بدون توقيع، الجواب صريح:
{"error":"REJECTED","message":"Signature missing."}
وهذا هو الفخ، الذي كلفني أمسية كاملة. التوقيع يغطي البايتات الدقيقة التي تخرج على الشبكة، لا الكائن في الذاكرة. إن وقعت ملفا كما هو على القرص، ثم تركت طبقة أخرى تعيد تسلسل الكائن (مسافة زائدة، أو ترتيب مفاتيح مختلف، أو حرف مهروب بطريقة أخرى)، حصلت على توقيع صحيح تماما لرسالة لن يستقبلها الخادم أبدا. والرفض غير قابل للتنقيح: كل شيء يبدو سليما على الجانبين.
الإصلاح يتسع لجملة واحدة: سلسل ووقع في المكان نفسه. في القالب، الدالة post_json تقوم بالأمرين، ولا يحق لأي شيء آخر أن يمس جسم الرسالة.
الخطوة 3: ثلاث طبقات تقول للمدرب من هو، وكيف تجري الأمور هنا، وماذا يفعل الآن
الوكيل الذي يدرب ليس موجها واحدا ضخما. إنه ثلاثة نصوص منفصلة، والفصل بينها مهم.
الطبقة 1، الشخصية: من هو
موجه نظام مرفق بالوكيل في AgentsRoom. يحمل فلسفة التدريب، وهو عام تجاه الرياضة عن قصد: يستطيع أن يدرب أي أحد.
عملك ليس مجرد توليد خطط تدريب. أنت تدرب الرياضي باستمرار عبر تحليل تدريبه، وفهم لياقته الحالية، وتكييف الحصص القادمة. […] تكلم كمدرب متمرس، لا كروبوت محادثة تحفيزي.
كما يقول ما لا يفعله: ألا يحكم على حصة بناء على التزام الوتيرة المستهدفة وحدها، وأن يكون صريحا بشأن عدم يقين توقع زمن السباق، وألا يصادق على هدف لمجرد أن الرياضي يريده. هذا السطر الأخير هو ما يجعل المدرب مفيدا.
لست مضطرا لكتابتها بنفسك: هذه الشخصية منشورة في كتالوج وكلاء AgentsRoom باسم مدرب أداء الجري. نقرة واحدة تثبتها، جاهزة للاستعمال.
الطبقة 2، CLAUDE.md: كيف تجري الأمور هنا
هذا هو العقد، يقرأ في بداية كل جلسة. يحتوي بنية الملفات، والقواعد التي تحفظ اتساقها، ومبادئ التدريب التي تقيد كل اقتراح، وقبل كل شيء الطقس: التسلسل الدقيق الذي ينفذ حين يبلغ عن حصة.
مقتطف واحد، لأنه يبين مستوى الدقة:
ترتيب التضحية حين ينحرف الأسبوع: أولا الدقائق الزائدة في الجري السهل، ثم عمل التقوية، ثم طول الجري الطويل، ثم حصة نوعية واحدة. لا الأسبوع كله أبدا.
هنا يتوقف المدرب عن كونه روبوت محادثة. لا يرتجل سير عمل في كل مرة، بل يتبع الذي كتبته مرة واحدة. إن لم تقرأ إلا ملفا واحدا من مستودع القالب، فاقرأ ذاك.
الطبقة 3، موجه المشغل: ماذا يفعل الآن
هذه هي الرسالة التي تسلم للوكيل حين تصل حصة. يتلقى النشاط عبر متغيرات قالب: {{event.title}} و{{event.body}} و{{event.url}}. فيبدأ الوكيل والحصة بين يديه سلفا، بدل أن يذهب للبحث عنها.

وهذا هو هيكله، كما هو في المشغل:
حصة جديدة مستوردة من Strava.
**{{event.title}}** · النشاط {{event.id}}
{{event.url}}
{{event.body}}
---
أنت في مستودع `training-plan`. اقرأ `CLAUDE.md` أولا: هو القانون.
تكتب بلغتي وتخاطبني مباشرة في كل النص (§3).
طقس §6 ينطبق، لكن **خطوته 1 منجزة سلفا**: `strava_publish.py`
أنشأ بطاقة الحصة وأودعها. تستأنف من الخطوة 2 وتمضي إلى
النهاية. ثلاثة مخرجات، بهذا الترتيب: **التحليل في المستودع**،
**التعليق تحت نشاط Strava**، **البريد**.
⚠️ **أنت تعمل دون إشراف: لا أحد سيقرأ سؤالا.** لا تطلب أبدا
تحكيما: أنت تقرر، وأنت تنفذ، وتقول في تقريرك ما حسمته
ولماذا.
## 1 · حلل واضبط الخطة (طقس §6، الخطوات 2 إلى 6)
1. `git pull --rebase` أولا: قد تأتي البطاقة من الخادم.
2. اقرأ، بهذا الترتيب: بطاقة اليوم، وبطاقة الأسبوع،
`athlete/zones-and-paces.md`، و**آخر 3 بطاقات حصص**:
الحصة لا يحكم عليها وحدها أبدا.
3. اكتب قسم `## Analysis`: **الحكم أولا**، ثم الإشارات التي
تحمله، ثم ما الذي يغيره.
⛔ إن كان `## Analysis` مملوءا سلفا، لا تعد كتابته.
4. حدث بطاقة الأسبوع وسجل **كل** تغيير في الخطة تحت
`## Adjustments`، مع سببه.
5. **أعد توليد `README.md`**: هي الشاشة التي أقرؤها على هاتفي.
6. أودع وادفع، بمسارات صريحة، ⛔ ولا تستخدم `git add -A` أبدا.
## 2 · Kudos وتعليق على Strava
⛔ تعليق Strava عمومي: لا نبض قلب مستهدف، ولا وجع صغير،
ولا تحكيم داخلي، ولا زمن وصول متوقع.
## 3 · التقرير الكامل بالبريد
السطر الذي يقوم بأكبر عمل هو الذي في الوسط: لا أحد سيقرأ سؤالا. الوكيل الذي يعمل دون أحد أمام الشاشة ويطلب تحكيما لا يرتكب خطأ، إنه ببساطة يتوقف، وأنت تكتشف ذلك في اليوم التالي.
أي نموذج، ولماذا مليون token ليست تباهيا
| الإعداد | القيمة |
|---|---|
| النموذج | Claude Opus، سياق 1M |
| جهد الاستدلال | مرتفع |
| وضع الأذونات | مستقل |
| الوصول إلى المتصفح | مفعل |

السياق الطويل ليس زخرفة. ليحكم على حصة واحدة كما ينبغي، يقرأ المدرب بطاقة اليوم، وبطاقة الأسبوع، وجدول الوتائر المرجعية، والحصص الثلاث السابقة. الحصة لا يحكم عليها وحدها أبدا: الحمل المتراكم، وتتابع الأيام، ونقاط اليقظة الجارية تغير الحكم تماما. ثلاثة تكرارات عند 3:38 في اليوم التالي لجري طويل من ساعتين لا تروي القصة نفسها التي ترويها 3:38 نفسها بعد يوم راحة.
الوضع المستقل ليس استهتارا، بل نتيجة: تنفيذ دون أحد أمام الشاشة ليس فيه من يوافق على git push. والوصول إلى المتصفح هو ما يتيح للوكيل أن يذهب ليعلق على Strava ويرسل البريد، وهما أمران لا توجد لهما هنا واجهة API عملية.
ما هو مؤتمت، وما ليس كذلك عن قصد
هذا هو قرار التصميم الذي أنا أسعد به، ومن السهل ألا ينتبه إليه المرء.
مهمة الاستيراد تسجل وتنشر، ولا تحكم أبدا.
| ما يفعله السكربت | ما لا يفعله |
|---|---|
| جلب الأنشطة الجديدة | ملء قسم Analysis |
| إنشاء بطاقة الحصة | المساس ببطاقة الأسبوع |
| كتابة العنوان والوصف على Strava | المساس بالوتائر المرجعية |
| إيداع البطاقات التي أنشأها | إبداء أي رأي |
سكربت يبدأ في الحكم سينتج أحكاما بلا سياق، بمنطق مجمد في شيفرة لا يعيد أحد قراءتها. الحكم يعني الإمساك معا بحمل الأسبوع، وبالحالة الراهنة، وبما قيل المرة الماضية: ذلك عمل مدرب، والوكيل يقوم به، والملف كله أمام عينيه.
الفائدة العملية فورية: حين لا يكون الوكيل قد اشتغل (الجهاز مطفأ، أو الـ API معطل)، البطاقة موجودة على أي حال. لا شيء يضيع، ينقص التعليق فقط، وتكفي إعادة تشغيل.
اختيار آخر يسير في الاتجاه نفسه: السكربت لا يحتفظ بملف حالة ليعرف ما عالجه سلفا. الوصف على Strava هو مصدر الحقيقة. فارغا، يكتب؛ حاملا لتوقيعه، يمضي؛ غير فارغ وبلا توقيع، فأنت من كتبته وهو لا يمسه. ملف حالة محلي ما كان ليقول شيئا عما فعله جهاز آخر؛ وهكذا، يستطيع جهازان أن يعملا بالتوازي دون أن يدوس أحدهما على الآخر.
قاعدتا فصل أخريان، محفورتان في المستودع ولا يجوز الالتفاف عليهما:
- الوصف المنشور على Strava لا ينسخ أبدا نص الخطة: بطاقة أسبوعي تحتوي نبضات قلب مستهدفة وموازنات لا شأن لها بنشاط عمومي؛
- الوصف المكتوب باليد لا يطمس أبدا.
التعليق الذي يحط تحت النشاط
الغاية ليست تهنئة الذات. الغاية أن يكون حكم المدرب مقروءا من هاتفي، تحت النشاط، دون فتح المستودع، وأن يبقى هناك، ملتصقا بالحصة، إلى الأبد.
لذلك فالتعليق ضيق عن قصد: رمز تعبيري للحكم، والرقم الذي يحمله، وما الذي يغيره للحصة التالية. حوالي 250 حرفا.
✅ خمسة تكرارات عند 3'39 في المتوسط لهدف بين 3'38 و3'44، ونبض القلب مسطح على البلوك كله. جدول الوتائر يصمد. الجمعة يبقى سهلا: لقد أنفقت هامش هذا الأسبوع.
أما النسخة الطويلة، تلك التي فيها نبضات القلب، ونقطة اليقظة التي أشرت إليها، والموازنة بشأن حجم الأسبوع القادم، فتذهب إلى المستودع وإلى البريد. قناتان، وجمهوران، والموجه هو من يمسك الحد بينهما.
ثلاثة أشياء لا تنكسر إلا في الإنتاج
كل سطر من هذه السطور موجود لأن شيئا ما انكسر بدونه. وهي أكثر إفادة من بقية المقال.
1. ثبت المتصفح. عندي امتدادان لـ Claude متصلان في Chrome. لا شيء يضمن أيهما سيحصل عليه الوكيل، وواحد منهما فقط يحمل جلسة Strava. النتيجة: في تنفيذ من كل اثنين، كان الوكيل ينتهي في المتصفح الخطأ، غير مسجل الدخول، وعاجزا عن التعليق على أي شيء. اختيار المتصفح بمعرف الجهاز لا يحفظ من جلسة إلى أخرى: لذلك مكانه في الموجه، مع منع صريح من الذهاب لسؤال المستخدم أيهما يختار. في العمل دون إشراف، السؤال جمود تام.
2. حقل تعليق Strava ليس فيه maxlength. لا شيء في المتصفح يمنعك من الكتابة بطول زائد: الخادم هو من يرفض عند الإرسال. الوكيل الذي يؤلف فقرة جميلة من 600 حرف يكتبها كلها، وينقر على Post، فيتلقى فشلا لا يفهمه. لذلك على الموجه أن يفرض الإيجاز قبل الكتابة، وأن يحسب حساب الحالة: إن فشل الإرسال، تقصر وتعيد النشر، ولا تقسم أبدا إلى تعليقين.
3. تعليق مدرب واحد لكل نشاط. حين تعيد تشغيل حدث للاختبار (وهو ما تفعله كثيرا في البداية)، بدون هذه القاعدة يكدس الوكيل التعليقات على نشاط عولج سلفا. لذلك يجعله الموجه يقرأ علامة تبويب Comments قبل الكتابة، ويتخطى دوره إن كان موجودا فيها أصلا. المنطق نفسه على جانب المستودع: إن كان قسم ## Analysis مملوءا سلفا، فلا يعاد كتابته.
ما يكلفه هذا
| القطعة | أين | التكلفة |
|---|---|---|
| وكيل المدرب | جهازي، عبر AgentsRoom | اشتراك Claude الخاص بي |
| الاستطلاع كل 15 دقيقة | جهاز Linux صغير يعمل باستمرار | ~5 يورو شهريا، أو لا شيء على Raspberry Pi |
| السجل | مستودع Git خاص | مجاني |
| واجهة Strava API | Strava Developer Program | راجع تسعير Strava |
لا يوجد مفتاح API محسوب على كل token في هذا التركيب. وهذه هي النقطة التي أجدها الأكثر استهانة: الشيء نفسه مبنيا على API تدفع بالاستعمال كان سيكون فيه عداد يدور مع كل حصة، وعلى الأرجح ما كنت لأبقيه.
ابنه في عطلة نهاية الأسبوع هذه
الخطوات، بالترتيب. احسب أمسية واحدة إن كان عندك أصلا حساب Strava واشتراك Claude.
1. استنسخ القالب واجعله لك.
git clone https://github.com/AgentsRoomDev/running-performance-coach.git my-coach
cd my-coach
rm -rf .git && git init
اجعل نسختك خاصة. سجل التدريب يحتوي بيانات صحية: نبض القلب، والنوم، والإصابات. القالب عمومي، ونسختك ينبغي ألا تكون كذلك.
ثم املأ، بهذا الترتيب: athlete/profile.md (من أنت كعداء)، وathlete/records.md (أرقامك الشخصية)، وathlete/constraints.md (الأوقات المتاحة لك فعلا)، وathlete/zones-and-paces.md (وتائرك المرجعية)، وplan/objective.md (السباق والهدف)، ثم CLAUDE.md، حيث تستبدل كل موضع {{...}}.
وأخيرا، افتح المستودع بوكيل Claude عندك وقل له: اقرأ CLAUDE.md وathlete/، ثم ابن لي الأسبوع الأول.
2. اربط Strava.
cp .env.example .env && chmod 600 .env
python3 scripts/strava_oauth.py # نقرة واحدة في المتصفح، مرة واحدة
python3 scripts/strava_sync.py --dry-run
الخيار --dry-run يطبع ما كان سيكتب دون أن يكتب شيئا. تلك هي اللحظة المناسبة للتحقق من أن إعادة بناء الحصص تناسبك.
3. أنشئ المشغل في AgentsRoom. تحت Triggers، New trigger:
| الحقل | القيمة |
|---|---|
| النوع | Webhook، المصدر generic |
| الموجه | محتوى docs/trigger-prompt.md |
| الدور / الشخصية | docs/coach-persona.md |
| وضع الأذونات | مستقل |
| الوصول إلى المتصفح | مفعل |
يصك AgentsRoom رابطا وسر توقيع. ضع الاثنين في ملف .env عندك:
WEBHOOK_URL=https://agentsroom.dev/api/triggers/t_xxxxxxxxxxxx
WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxx
4. اختبره قبل أن تثق به.
python3 scripts/webhook_replay.py scripts/examples/webhook-session.json --dry-run
python3 scripts/webhook_replay.py scripts/examples/webhook-session.json
هذا يعيد تشغيل حصة في المشغل دون انتظار جريتك القادمة ودون المساس بحالة المهمة المؤتمتة. يجب أن ترى ✅ HTTP 202، ويجب أن تفتح علامة تبويب وكيل في AgentsRoom.
5. شغله كل 15 دقيقة.
bash scripts/systemd/install.sh # على خادم Linux
وحدة oneshot مع مؤقت: لا عملية مقيمة، والتمريرة الفائتة بينما كان الجهاز مطفأ تعوض عند الإقلاع التالي.
إن لم يكن عندك جهاز يعمل باستمرار، تخط هذه الخطوة: شغل strava_sync.py يدويا متى شئت، أو صف حصتك للوكيل ببساطة في محادثة. الطقس الموجود في CLAUDE.md يعمل بالطريقة نفسها. تفقد الأتمتة، لا المدرب.
ما أستخلصه من هذا، أبعد من الجري
لا شيء في هذا التركيب خاص بالجري. ما يبينه هو نمط قابل لإعادة الاستعمال في كل مجال تقريبا تراكم فيه بيانات شخصية وتود رأيا كفؤا فيها.
ثلاث قطع، ولا شيء غيرها. مستودع Git من ملفات Markdown كذاكرة تقرؤها الآلة وتقرؤها أنت. حدث يوقظ وكيلا بدل وكيل يستطلع في حلقة ويحرق tokens بلا فائدة. ثلاث طبقات إعداد تفصل بنظافة من هو الوكيل، وكيف يعمل عندك، وماذا عليه أن يفعل في اللحظة.
استبدل حصة الجري بكشف حساب بنكي، أو جلسة برمجة، أو قياس سكر الدم، أو ملاحظة قراءة: الآلية لا تتغير.
الأسئلة الشائعة
هل يجب أن أعرف البرمجة لأبني مدرب جري بالذكاء الاصطناعي؟
يكفي أن تعرف كيف تشغل أمرا في الطرفية وتحرر ملفا نصيا. مستودع القالب جاهز للاستنساخ، وسكربتات Python لا تستخدم سوى المكتبة القياسية (لا pip install)، وجزء التدريب يضبط بكتابة نثر عادي في ملفات Markdown. العمل الحقيقي ليس تقنيا: إنه أن تصف بصدق من أنت كعداء وما الذي تستهدفه.
كم يكلف هذا شهريا؟
يعمل الوكيل على اشتراك Claude الذي تملكه أصلا (Pro أو Max): لا يوجد مفتاح API محسوب على كل token. فوق ذلك قد ترغب في جهاز صغير يعمل باستمرار ليسأل Strava كل 15 دقيقة، حوالي 5 يورو شهريا على VPS، أو لا شيء على Raspberry Pi. مستودع Git الخاص مجاني. يبقى Strava API، الذي صار يشترط اشتراك مطور مدفوعا منذ يونيو 2026.
لماذا مستودع Git بدل قاعدة بيانات؟
لأن التاريخ يصبح قابلا للقراءة، من المدرب ومنك. كل حصة ملف Markdown، وكل تغيير في الخطة إيداع مع سببه. يستطيع الوكيل أن يعيد قراءة ما وصفه قبل ثلاثة أسابيع وأن يتحقق مما إذا كان قد نجح، وأنت تقرأ خطتك على هاتفك في تطبيق GitHub، دون كتابة سطر واحد من الواجهة.
ما هو الـ webhook، بكلمات بسيطة؟
الـ webhook خدمة تتصل بك بدل أن تتصل بها أنت. بدل أن تسأل كل خمس دقائق إن كان هناك جديد، تعطي عنوان ويب لبرنامج، فيرسل هو إليك رسالة حين يقع الحدث. هنا، السكربت الذي يستورد الحصة يرسل تلك الرسالة إلى AgentsRoom، الذي يفتح وكيل Claude في غضون ثانية. وهذا أيضا ما يجعل التركيب اقتصاديا: الوكيل الذي يستطلع في حلقة يحرق tokens في كل دورة، أما مشغل webhook فلا يكلف شيئا ما دام لا يحدث شيء.
هل يعمل هذا مع رياضة غير الجري؟
نعم. الاستيراد يعيد بناء لفات الساعة، وركوب الدراجات والسباحة يسجلان لفات أيضا. ما يتغير هو ملفات الاستراتيجية وكتالوج الحصص، وهي نصوص تعيد كتابتها أنت. الآلية (الاستيراد، webhook، الوكيل، المستودع) لا تتحرك.
هل يمكن للوكيل أن يخطئ ويخرب خطتي؟
يمكنه أن يخطئ، لكنه لا يستطيع تخريب الكثير: كل ما يكتبه إيداع Git تستطيع قراءته ومناقشته والتراجع عنه. ملف CLAUDE.md يمنعه صراحة من إعادة كتابة التاريخ، ومن اختلاق بيانات لم تقدمها، ومن تغيير الخطة دون تسجيل السبب، ومن إعطاء نصيحة طبية. وعند ألم مريب، يحيلك إلى مختص.
مستودع القالب هنا: AgentsRoomDev/running-performance-coach. استنسخه، واملأ وتائرك، ويصير عندك مدربك. وإن أردت أن ترى القطعة التي توقظ الوكيل، فهي موصوفة في صفحة مشغلات webhook، وAgentsRoom يحمل من هنا.
تحميل AgentsRoom
شغّل كل وكلاء الذكاء الاصطناعي لديك، في كل مشاريعك، من نافذة واحدة.
التطبيق المرافق: تابع وكلاءك أينما كنت
استخدم Claude أو Codex أو Antigravity CLI أو أي مزود AI آخر.
أرسل الأخطاء والطلبات مباشرة إلى قائمة المهام العامة.
لمحة عن AgentsRoom أثناء العمل.
تابع القراءة
كم عدد التوكنات المتبقية لي في Claude؟ لا يوجد رقم كهذا.
اشتراكك في Claude ليس مقوَّماً بالتوكنات، لذلك لا توجد شاشة تعرض رصيداً من التوكنات. إليك ما يقيسه فعلياً، وأين تقرأه، ولماذا يتناقص وأنت لا تكتب شيئاً، وما الذي يتغير في النافذة الأسبوعية في 14 سبتمبر 2026.
اقرأ المقالClaude يضع الآن علامة مائية على مخرجاته. كودك بالكاد يتأثر.
Anthropic باتت تضع علامة مائية على مخرجات Claude. ما الذي يُعلَّم فعلًا، ولماذا يفلت الكود المولَّد منها في معظمه، ومن يستطيع كشفها حقًا، ولماذا لا يتغير SEO موقعك.
اقرأ المقاللا يحتفظ Antigravity CLI إلا بتسجيل دخول Google واحد لكل جهاز، وإليك ما ينفع بدلًا منه
لماذا لا يمكنك التناوب بين اشتراكَي Google AI Pro في Antigravity CLI، وأين يخزّن تسجيل دخولك فعلًا، وما الذي تفعله مبدّلات الحسابات حقًا بسلسلة مفاتيح نظامك، ولماذا لا تضاعف خطة العائلة حصتك، والأسلوب الوحيد الذي يشغّل عدة حسابات بالتوازي فعلًا.
اقرأ المقال