ملخص سريع
حوّل ملف وكيل ذكاء اصطناعي واحدًا إلى 10 بيئات تطوير متكاملة (IDEs) في 3 خطوات: (1) حلل مقدمة YAML باستخدام دوال باش get_field() و get_body() و to_kebab()، (2) حوّل إلى تنسيقات خاصة بالأداة باستخدام convert.sh (كلود كود .md، كيرسور .mdc، آيدر CONVENTIONS.md، ويندسيرف .windsurfrules)، (3) ثبّت في المسارات الصحيحة باستخدام install.sh. اكتب مرة واحدة، وحوّل تلقائيًا، وانشر في كل مكان.
ملف وكيل واحد. عشر بيئات تطوير متكاملة (IDEs). تعلم كيف يحوّل مشروع "The Agency" ملف Markdown واحدًا ليعمل عبر كلود كود، كيرسور، آيدر، ويندسيرف، جيت هاب كوبايلوت، و6+ أدوات أخرى.
لقد كتبت وكيل ذكاء اصطناعي. الآن تريد أن يكون متاحًا في:
- كلود كود (ملفات
.mdفي~/.claude/agents/) - كيرسور (ملفات
.mdcفي.cursor/rules/) - آيدر (ملف
CONVENTIONS.mdواحد في جذر المشروع) - ويندسيرف (ملف
.windsurfrulesواحد) - جيت هاب كوبايلوت (ملفات
.mdفي~/.github/agents/) - و5+ أدوات أخرى
هل تكتب 10 إصدارات؟ لا. أنت تكتب مرة واحدة، وتحوّل تلقائيًا.
يحل مشروع "The Agency" هذه المشكلة باستخدام نصين برمجيين من باش:
convert.sh— يحوّل ملفات الوكلاء إلى تنسيقات خاصة بالأداةinstall.sh— ينسخ الملفات المحولة إلى المسارات الصحيحة
في هذا البرنامج التعليمي، ستقوم بالهندسة العكسية لكل من النصين البرمجيين. ستتعلم كيفية تحليل مقدمة YAML، واستخراج محتوى النص الأساسي، وبناء مسارات تحويل لأي أداة.
تنسيق الوكيل
يستخدم كل وكيل في "The Agency" نفس الهيكل:
---
name: API Tester
description: Specialized in API testing with Apidog, Postman, and automated validation
color: purple
emoji: 🧪
vibe: Breaks APIs before users do.
---
# API Tester Agent Personality
You are **API Tester**, an expert in API validation...
## Identity & Memory
- Role: API testing specialist
- Personality: Thorough, skeptical, evidence-focused
...
الملف له جزءان:
- المقدمة (Frontmatter) — بيانات YAML الوصفية بين محددات
--- - النص الأساسي (Body) — محتوى Markdown بعد علامة
---الثانية
التحويل يعني: استخراج حقول المقدمة، تحويل النص الأساسي إلى التنسيق المستهدف، الكتابة إلى المسار الصحيح.
الخطوة 1: تحليل مقدمة YAML
أنشئ الملف parse-frontmatter.sh:
#!/usr/bin/env bash
#
# parse-frontmatter.sh — Extract YAML frontmatter fields from agent files
#
set -euo pipefail
# Extract a single field value from YAML frontmatter
# Usage: get_field <field> <file>
get_field() {
local field="$1" file="$2"
awk -v f="$field" '
/^---$/ { fm++; next }
fm == 1 && $0 ~ "^" f ": " {
sub("^" f ": ", "");
print;
exit
}
' "$file"
}
# Strip frontmatter, return only body
# Usage: get_body <file>
get_body() {
awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' "$1"
}
# Convert name to kebab-case slug
# Usage: to_kebab "API Tester" → api-tester
to_kebab() {
echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g'
}
# Demo
if [[ "${1:-}" == "--demo" ]]; then
AGENT_FILE="${2:-test-agent.md}"
echo "File: $AGENT_FILE"
echo "Name: $(get_field 'name' "$AGENT_FILE")"
echo "Description: $(get_field 'description' "$AGENT_FILE")"
echo "Slug: $(to_kebab "$(get_field 'name' "$AGENT_FILE")")"
echo "---"
echo "Body preview:"
get_body "$AGENT_FILE" | head -10
fi
اختبره:
chmod +x parse-frontmatter.sh
./parse-frontmatter.sh --demo engineering-backend-architect.md
الناتج:
File: engineering-backend-architect.md
Name: Backend Architect
Description: Senior backend architect specializing in scalable system design...
Slug: backend-architect
---
Body preview:
# Backend Architect Agent Personality
You are **Backend Architect**, a senior backend architect...
الخطوة 2: التحويل إلى تنسيق كلود كود
يستخدم كلود كود ملفات .md خام. لا حاجة للتحويل — فقط انسخ:
convert_claude_code() {
local agent_file="$1"
local dest="$HOME/.claude/agents/"
mkdir -p "$dest"
cp "$agent_file" "$dest/"
echo " Claude Code: $(basename "$agent_file")"
}
الخطوة 3: التحويل إلى تنسيق كيرسور
يستخدم كيرسور ملفات .mdc مع حقل description في المقدمة:
convert_cursor() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local description=$(get_field 'description' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
local output=".cursor/rules/agency-${slug}.mdc"
mkdir -p "$(dirname "$output")"
cat > "$output" << EOF
---
description: Agency agent: $description
---
$body
EOF
echo " Cursor: agency-${slug}.mdc"
}
الإدخال:
---
name: API Tester
description: Specialized in API testing...
---
# API Tester Agent...
الناتج (.mdc):
---
description: Agency agent: Specialized in API testing...
---
# API Tester Agent...
الخطوة 4: التحويل إلى تنسيق آيدر
يستخدم آيدر ملف CONVENTIONS.md واحدًا يحتوي على جميع الوكلاء:
convert_aider() {
local agent_file="$1"
local output="CONVENTIONS.md"
# Append with separator
echo "" >> "$output"
echo "---" >> "$output"
echo "" >> "$output"
cat "$agent_file" >> "$output"
echo " Aider: appended to $output"
}
قم ببناء الملف بالكامل:
build_aider() {
local output="CONVENTIONS.md"
echo "# Agency Agents for Aider" > "$output"
echo "" >> "$output"
echo "This file contains all Agency agents for Aider integration." >> "$output"
echo "" >> "$output"
for agent_file in engineering/*.md design/*.md testing/*.md; do
convert_aider "$agent_file"
done
}
الخطوة 5: التحويل إلى تنسيق ويندسيرف
يستخدم ويندسيرف ملف .windsurfrules واحدًا (مشابه لـ آيدر):
convert_windsurf() {
local agent_file="$1"
local output=".windsurfrules"
echo "" >> "$output"
echo "---" >> "$output"
echo "" >> "$output"
cat "$agent_file" >> "$output"
echo " Windsurf: appended to $output"
}
الخطوة 6: التحويل إلى تنسيق أنتيجرافيتي
يستخدم أنتيجرافيتي (جيميني) ملفات SKILL.md في مجلدات فرعية:
convert_antigravity() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local slug=$(to_kebab "$name")
local output="integrations/antigravity/skills/agency-${slug}/SKILL.md"
mkdir -p "$(dirname "$output")"
cat > "$output" << EOF
# Agency Agent: $name
$(get_body "$agent_file")
EOF
echo " Antigravity: agency-${slug}/SKILL.md"
}
الخطوة 7: التحويل إلى تنسيق أوبن كلو
يستخدم أوبن كلو ثلاثة ملفات لكل وكيل (SOUL.md و AGENTS.md و IDENTITY.md):
convert_openclaw() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local description=$(get_field 'description' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
local output_dir="integrations/openclaw/agency-${slug}"
mkdir -p "$output_dir"
# SOUL.md - Main agent definition
cat > "$output_dir/SOUL.md" << EOF
# $name
$description
---
$body
EOF
# AGENTS.md - Agent capabilities
cat > "$output_dir/AGENTS.md" << EOF
# Agent Capabilities: $name
- Specialized expertise in domain
- Deliverable-focused output
- Success metrics defined
See SOUL.md for full definition.
EOF
# IDENTITY.md - Agent identity
cat > "$output_dir/IDENTITY.md" << EOF
# Identity: $name
- Name: $name
- Description: $description
- Source: The Agency (agency-agents repo)
EOF
echo " OpenClaw: agency-${slug}/"
}
الخطوة 8: النص البرمجي convert.sh الكامل
إليك النص البرمجي الكامل للتحويل (مبسط):
#!/usr/bin/env bash
#
# convert.sh — Convert all Agency agents to tool-specific formats
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
OUT_DIR="$REPO_ROOT/integrations"
# Frontmatter helpers
get_field() {
local field="$1" file="$2"
awk -v f="$field" '
/^---$/ { fm++; next }
fm == 1 && $0 ~ "^" f ": " { sub("^" f ": ", ""); print; exit }
' "$file"
}
get_body() {
awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' "$1"
}
to_kebab() {
echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g'
}
# Conversion functions
convert_claude_code() {
local agent_file="$1"
local dest="$OUT_DIR/claude-code/"
mkdir -p "$dest"
cp "$agent_file" "$dest/"
}
convert_cursor() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
mkdir -p "$OUT_DIR/cursor/.cursor/rules/"
cat > "$OUT_DIR/cursor/.cursor/rules/agency-${slug}.mdc" << EOF
---
description: Agency agent: $(get_field 'description' "$agent_file")
---
$body
EOF
}
convert_aider() {
local output="$OUT_DIR/aider/CONVENTIONS.md"
echo "" >> "$output"
echo "---" >> "$output"
cat "$agent_file" >> "$output"
}
convert_windsurf() {
local output="$OUT_DIR/windsurf/.windsurfrules"
echo "" >> "$output"
echo "---" >> "$output"
cat "$agent_file" >> "$output"
}
# Main conversion loop
echo "Converting Agency agents..."
AGENT_DIRS=(engineering design testing marketing sales)
for dir in "${AGENT_DIRS[@]}"; do
for agent_file in "$REPO_ROOT/$dir"/*.md; do
[[ -f "$agent_file" ]] || continue
name=$(get_field 'name' "$agent_file")
echo "Processing: $name"
convert_claude_code "$agent_file"
convert_cursor "$agent_file"
done
done
# Build combined files
echo "# Agency Agents for Aider" > "$OUT_DIR/aider/CONVENTIONS.md"
for dir in "${AGENT_DIRS[@]}"; do
for agent_file in "$REPO_ROOT/$dir"/*.md; do
[[ -f "$agent_file" ]] || continue
convert_aider "$agent_file"
done
done
echo "# Agency Agents for Windsurf" > "$OUT_DIR/windsurf/.windsurfrules"
for dir in "${AGENT_DIRS[@]}"; do
for agent_file in "$REPO_ROOT/$dir"/*.md; do
[[ -f "$agent_file" ]] || continue
convert_windsurf "$agent_file"
done
done
echo "Conversion complete!"
echo " Claude Code: $OUT_DIR/claude-code/"
echo " Cursor: $OUT_DIR/cursor/.cursor/rules/"
echo " Aider: $OUT_DIR/aider/CONVENTIONS.md"
echo " Windsurf: $OUT_DIR/windsurf/.windsurfrules"
شغّله:
chmod +x convert.sh
./convert.sh
الخطوة 9: التثبيت لكل أداة
بعد التحويل، انسخ الملفات إلى المسارات الخاصة بالأداة:
#!/usr/bin/env bash
#
# install.sh — Install converted agents to your local tools
#
set -euo pipefail
# Claude Code
install_claude_code() {
local src="$REPO_ROOT/integrations/claude-code/"
local dest="$HOME/.claude/agents/"
mkdir -p "$dest"
cp "$src"/*.md "$dest/"
echo "Claude Code: $(find "$dest" -name '*.md' | wc -l) agents installed"
}
# Cursor
install_cursor() {
local src="$REPO_ROOT/integrations/cursor/.cursor/rules/"
local dest="./.cursor/rules/"
mkdir -p "$dest"
cp "$src"/*.mdc "$dest/"
echo "Cursor: $(find "$dest" -name '*.mdc' | wc -l) rules installed"
}
# Aider
install_aider() {
local src="$REPO_ROOT/integrations/aider/CONVENTIONS.md"
local dest="./CONVENTIONS.md"
cp "$src" "$dest"
echo "Aider: CONVENTIONS.md installed"
}
# Windsurf
install_windsurf() {
local src="$REPO_ROOT/integrations/windsurf/.windsurfrules"
local dest="./.windsurfrules"
cp "$src" "$dest"
echo "Windsurf: .windsurfrules installed"
}
# Install all detected tools
install_all() {
if [[ -d "$HOME/.claude/agents/" ]]; then
install_claude_code
fi
if command -v cursor &>/dev/null || [[ -d "./.cursor/" ]]; then
install_cursor
fi
if command -v aider &>/dev/null; then
install_aider
fi
}
install_all
مقارنة التنسيقات
| الأداة | التنسيق | النطاق | التحويل |
|---|---|---|---|
| كلود كود | .md |
على مستوى المستخدم (~/.claude/agents/) |
نسخ كما هو |
| كيرسور | .mdc |
على مستوى المشروع (.cursor/rules/) |
إضافة حقل وصف في المقدمة |
| آيدر | CONVENTIONS.md |
جذر المشروع | تجميع جميع الوكلاء |
| ويندسيرف | .windsurfrules |
جذر المشروع | تجميع جميع الوكلاء |
| جيت هاب كوبايلوت | .md |
على مستوى المستخدم (~/.github/agents/) |
نسخ كما هو |
| أنتيجرافيتي | SKILL.md |
على مستوى المستخدم (~/.gemini/antigravity/) |
تغليف في مجلد المهارة |
| أوبن كلو | SOUL.md + أخرى |
على مستوى المستخدم (~/.openclaw/) |
تقسيم إلى 3 ملفات |
| جيميني CLI | امتداد | على مستوى المستخدم (~/.gemini/extensions/) |
إنشاء بيان + مهارات |
| أوبن كود | .md |
على مستوى المشروع (.opencode/agents/) |
نسخ كما هو |
| كوين كود | .md |
على مستوى المشروع (.qwen/agents/) |
النسخ كوكيل فرعي (SubAgent) |
ابنِ نصك البرمجي الخاص بالتحويل
قالب لإضافة أداة جديدة:
#!/usr/bin/env bash
# 1. Define conversion function
convert_your_tool() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local description=$(get_field 'description' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
# 2. Create output path
local output="path/to/your/tool/agency-${slug}.ext"
mkdir -p "$(dirname "$output")"
# 3. Write converted content
cat > "$output" << EOF
# Your tool-specific format
# Use: $name, $description, $body
EOF
echo " YourTool: agency-${slug}.ext"
}
# 4. Add to main loop
for agent_file in engineering/*.md; do
convert_your_tool "$agent_file"
done
ما قمت ببنائه
| المكون | الغرض |
|---|---|
get_field() |
استخراج قيم مقدمة YAML |
get_body() |
تجريد المقدمة، وإرجاع نص Markdown الأساسي |
to_kebab() |
تحويل الأسماء إلى معرفات URL-safe slugs |
convert_cursor() |
التحويل إلى تنسيق .mdc |
convert_aider() |
تجميع في ملف واحد |
convert_windsurf() |
تجميع في ملف واحد |
convert_antigravity() |
إنشاء أدلة المهارات |
convert_openclaw() |
التقسيم إلى 3 ملفات لكل وكيل |
install.sh |
النسخ إلى المسارات الخاصة بالأداة |
الخطوات التالية
توسيع النصوص البرمجية:
- إضافة تحويل متوازي باستخدام
xargs -Pأو GNU parallel - إضافة التحقق (التحقق من حقول المقدمة المطلوبة)
- إضافة وضع التشغيل التجريبي (علامة
--dry-run)
إضافة المزيد من الأدوات:
- ملحقات VS Code
- بيئات JetBrains IDEs
- أدوات داخلية مخصصة
التحسين للمستودعات الكبيرة:
- تخزين المقدمة المحللة مؤقتًا (Cache)
- استخدام
findمع-print0للتعامل الآمن مع الملفات - إضافة أشرطة تقدم لأكثر من 100 وكيل
استكشاف المشكلات الشائعة وإصلاحها
فشل نص التحويل البرمجي مع "بديل خاطئ" (bad substitution):
- تأكد من أنك تقوم بتشغيل bash، وليس sh:
#!/usr/bin/env bash - تحقق من إصدار bash:
bash --version(يجب أن يكون 4.0+) - شغّل بشكل صريح باستخدام bash:
bash convert.sh - ابحث عن نهايات أسطر Windows:
sed -i 's/\r$//' convert.sh
عدم استخراج حقول المقدمة:
- تحقق من أن تنسيق YAML يستخدم
:(نقطتين ومسافة) وليس فقط: - تحقق من وجود مسافات إضافية قبل أسماء الحقول
- تأكد من أن محددات المقدمة هي بالضبط
---(3 شرطات) - اختبر التحليل يدويًا:
./parse-frontmatter.sh --demo agent.md
إنشاء المعرفات الفريدة (Slug) يؤدي إلى أسماء معطوبة:
- اختبر الدالة
to_kebab()بالحالات القصوى - تعامل مع الأحرف الخاصة:
to_kebab() { echo "$1" | iconv -f utf8 -t ascii//translit | ... } - أضف بديلاً للمعّرفات الفريدة الفارغة:
[[ -z "$slug" ]] && slug="unknown-agent" - سجّل الأسماء الأصلية لتصحيح الأخطاء
عدم تحميل قواعد كيرسور:
- تحقق من أن ملفات
.mdcتحتوي على مقدمة صالحة معdescription - تحقق من تكوين MCP الخاص بـ كيرسور:
.cursor/mcp.json - تأكد من أن الملفات موجودة في
.cursor/rules/وليس.cursor/agents/ - أعد تشغيل كيرسور بعد إضافة قواعد جديدة
ملف آيدر CONVENTIONS.md يصبح كبيرًا جدًا:
- قم بالتقسيم حسب الفئة:
CONVENTIONS-engineering.md،CONVENTIONS-design.md - نفّذ عملية تقليم تلقائية للوكلاء المهملين
- أضف جدول محتويات في الأعلى
- فكر في ملفات لكل وكيل مع توجيهات التضمين (include directives)
تحسين الأداء للتحويلات الكبيرة
المعالجة المتوازية:
بالنسبة للمستودعات التي تحتوي على 100+ وكيل، استخدم GNU parallel:
#!/usr/bin/env bash
# convert-parallel.sh
export OUT_DIR="$REPO_ROOT/integrations"
# Export functions for parallel use
export -f get_field get_body to_kebab convert_cursor convert_claude_code
# Find all agent files and process in parallel
find "$REPO_ROOT" -name "*.md" -type f | \
parallel -j 8 --progress '
name=$(get_field "name" {})
slug=$(to_kebab "$name")
echo "Converting: $name"
convert_cursor "{}"
convert_claude_code "{}"
'
echo "Parallel conversion complete!"
التحويل التزايدي:
تحويل الملفات التي تم تغييرها فقط:
#!/usr/bin/env bash
# convert-incremental.sh
CACHE_FILE="$REPO_ROOT/.conversion-cache"
# Load previous state
declare -A PREV_HASHES
if [[ -f "$CACHE_FILE" ]]; then
while IFS='=' read -r file hash; do
PREV_HASHES["$file"]="$hash"
done < "$CACHE_FILE"
fi
# Process each agent
for agent_file in engineering/*.md; do
CURRENT_HASH=$(md5sum "$agent_file" | cut -d' ' -f1)
PREV_HASH="${PREV_HASHES[$agent_file]:-}"
if [[ "$CURRENT_HASH" != "$PREV_HASH" ]]; then
echo "Changed: $agent_file"
convert_cursor "$agent_file"
convert_claude_code "$agent_file"
NEW_HASHES["$agent_file"]="$CURRENT_HASH"
else
echo "Unchanged: $agent_file"
fi
done
# Save cache
for file in "${!NEW_HASHES[@]}"; do
echo "$file=${NEW_HASHES[$file]}"
done > "$CACHE_FILE"
تتبع التقدم:
أضف تقدمًا مرئيًا للتحويلات الطويلة:
#!/usr/bin/env bash
total_files=$(find "$REPO_ROOT" -name "*.md" -type f | wc -l)
current=0
for agent_file in "$REPO_ROOT"/**/*.md; do
((current++))
percent=$((current * 100 / total_files))
# Progress bar
filled=$((percent / 5))
empty=$((20 - filled))
bar=$(printf '%*s' "$filled" | tr ' ' '#')
spaces=$(printf '%*s' "$empty" | tr ' ' ' ')
name=$(get_field 'name' "$agent_file")
echo -ne "\r[${bar}${spaces}] ${percent}% - $name"
convert_cursor "$agent_file"
done
echo -ne "\n"
اعتبارات الأمان للوكلاء المشتركين
التحقق من مصادر الوكيل:
عند تنزيل الوكلاء من مصادر خارجية:
#!/usr/bin/env bash
# validate-agent.sh
validate_agent() {
local file="$1"
# Check required frontmatter fields
local name=$(get_field 'name' "$file")
local description=$(get_field 'description' "$file")
if [[ -z "$name" ]]; then
echo "ERROR: Missing 'name' field in $file"
return 1
fi
if [[ -z "$description" ]]; then
echo "WARNING: Missing 'description' field in $file"
return 1 # Consider this a critical warning
fi
# Check for malicious patterns in body
local body=$(get_body "$file")
if echo "$body" | grep -q 'rm -rf\|curl.*\|wget.*\|eval\|exec'; then
echo "WARNING: Potentially dangerous patterns in $file"
return 1
fi
echo "VALID: $name"
return 0
}
عزل تنفيذ الوكيل (Sandboxing):
بالنسبة للوكلاء غير الموثوق بهم، قم بتشغيلهم في بيئات معزولة:
- استخدم حاويات Docker لتنفيذ الوكيل
- حدد وصول نظام الملفات بتركيبات للقراءة فقط
- قيد الوصول إلى الشبكة لنطاقات محددة
- سجّل جميع إجراءات الوكيل لأغراض التدقيق
ملف وكيل واحد. عشر بيئات تطوير متكاملة (IDEs). نصان برمجيان من باش.
هذه هي قوة أتمتة التحويل. اكتب مرة واحدة، وحوّل تلقائيًا، وثبّت في كل مكان.
دورك الآن: أضف دعم التحويل لأداة الذكاء الاصطناعي المفضلة لديك. شارك النص البرمجي. اجعل الوكلاء قابلين للنقل.
النقاط الرئيسية
- اكتب مرة واحدة، وحوّل إلى أكثر من 10 تنسيقات — ملف Markdown واحد مع مقدمة YAML يتحول إلى كلود كود، كيرسور، آيدر، ويندسيرف، و6+ أدوات أخرى
- معالجة باش تحلل استخراج المقدمة —
get_field()تستخرج قيم YAML،get_body()تزيل المقدمة،to_kebab()تنشئ معرفات URL-safe slugs - التنسيقات الخاصة بالأداة تتطلب تحويلات مختلفة — كلود كود ينسخ كما هو، كيرسور يضيف وصف المقدمة، آيدر/ويندسيرف يجمعان جميع الوكلاء
- النصوص البرمجية للتثبيت تنسخ إلى المسارات الصحيحة — الأدوات على مستوى المستخدم تستخدم
~/.claude/agents/، وأدوات المشروع تستخدم.cursor/rules/أو ملفات جذر المشروع - يمكن التوسيع بقوالب لأدوات جديدة — حدد الدالة
convert_your_tool()، وأضفها إلى حلقة التحويل الرئيسية، ووثق متطلبات التنسيق
الأسئلة الشائعة
ما هو convert.sh وكيف يعمل؟ convert.sh هو نص برمجي باش يحلل مقدمة YAML من ملفات وكلاء Markdown، ويستخرج محتوى النص الأساسي، ويحول كل وكيل إلى تنسيقات خاصة بالأداة. يستخدم awk للتحليل، sed لتحويل المعرفات الفريدة (slugs)، وheredocs لتوليد المخرجات.
كيف يعمل تحليل المقدمة في باش؟ تستخدم الدالة get_field() awk لتتبع محددات المقدمة (---)، وتجد السطر المطابق لاسم الحقل، وتستخرج القيمة. الدالة get_body() تطبع جميع الأسطر بعد محدد --- الثاني.
ما هي بيئات التطوير المتكاملة (IDEs) والأدوات المدعومة؟ كلود كود (.md)، كيرسور (.mdc)، آيدر (CONVENTIONS.md)، ويندسيرف (.windsurfrules)، جيت هاب كوبايلوت (.md)، أنتيجرافيتي (SKILL.md)، أوبن كلو (SOUL.md + ملفين)، امتدادات جيميني CLI، أوبن كود، وكوين كود.
كيف أضيف دعم التحويل لأداة جديدة؟ أنشئ دالة convert_yourtool() تستخرج حقول المقدمة، وتحول النص الأساسي إلى تنسيق أداتك، وتكتب إلى المسار الصحيح. أضف استدعاء الدالة إلى حلقة التحويل الرئيسية.
هل يمكنني تشغيل التحويلات بشكل متوازي لمعالجة أسرع؟ نعم. استخدم xargs -P أو GNU parallel لمعالجة ملفات وكلاء متعددة في وقت واحد. بالنسبة لأكثر من 100 وكيل، يمكن أن يقلل التحويل المتوازي وقت التشغيل من دقائق إلى ثوانٍ.
كيف أتحقق من وجود حقول المقدمة؟ أضف فحوصات التحقق في دالة التحويل الخاصة بك: [[ -z "$name" ]] && echo "Missing name field" && exit 1. قم بتشغيل التحقق قبل كتابة ملفات الإخراج.
ماذا لو فشل التحويل لبعض الوكلاء؟ استخدم set -euo pipefail للفشل السريع عند الأخطاء. أضف معالجة الأخطاء باستخدام || continue لتخطي الملفات المعطلة. سجل الفشل في ملف منفصل لتصحيح الأخطاء.
