آموزش نوشتن Agent Skill اختصاصی برای هوش مصنوعی
با استخراج مهارت از خطاهای واقعی، Agent Skill اختصاصی خود را بسازید. در این راهنما ساختار فایل SKILL.md، نحوه نوشتن دستور فعالسازی و تست عملکرد آن را بررسی میکنیم.
نوشتن مهارت عامل (agent skill) اختصاصی بر اساس یک خطای واقعی
بهترین روش برای نوشتن مهارت اختصاصی برای عامل (agent)، استخراج آن از یک خطای واقعی است. وظیفهای را پیدا کنید که عامل کدنویسی شما دو بار در انجام آن دچار اشتباه شده است، اصلاحیهای که هر دو بار تایپ کردهاید را یادداشت کنید و آن اصلاحیه را در یک فایل SKILL.md ذخیره کنید تا عامل بتواند بهطور خودکار آن را بارگذاری کند. هر چیزی پس از آن، صرفاً مسائل فنی است: ساختار فایل و آن یک خط دستوری که تعیین میکند آیا مهارت مذکور اصلاً اجرا شود یا خیر.
این ترتیب اهمیت دارد. مهارتی که از روی تخیل نوشته شود، مشکلی را مستند میکند که هرگز با آن مواجه نشدهاید و با این حال در هر نشست (session)، بخشی از context شما را اشغال میکند. مهارتی که از یک خطای مشاهدهشده استخراج شده باشد، همراه با تست مخصوص خود ارائه میشود: همان درخواست را دوباره مطرح کنید و ببینید آیا عامل این بار آن را درست انجام میدهد یا خیر. اگر خودِ این قالب برای شما جدید است، ابتدا مهارتهای عامل چیست و چگونه بارگذاری میشوند را مطالعه کنید و سپس برای نوشتن یکی از آنها بازگردید.
شروع از وظیفهای که عامل (agent) دو بار در آن اشتباه کرده است
یک بار اتفاق است. دو بار الگو است و الگو ارزش ثبت در یک فایل را دارد.
در اینجا شکستی را میبینید که در سرورهای واقعی تکرار میشود. شما از عامل میخواهید یک بلاک reverse proxy به Nginx اضافه کند. او /etc/nginx/conf.d/app.conf را ویرایش میکند و سپس sudo systemctl restart nginx را اجرا مینماید. ویرایش دارای غلط تایپی است، بنابراین Nginx از شروع کار امتناع میکند و سایت تا زمانی که شما آن را اصلاح نکنید، از دسترس خارج میماند:
nginx: [emerg] unknown directive "proxy_pas" in /etc/nginx/conf.d/app.conf:12
Job for nginx.service failed because the control process exited with error code.شما آن را در چت اصلاح میکنید. پیش از دست زدن به سرویس، پیکربندی را با sudo nginx -t تست کنید و سپس آن را بهجای restart با reload اعمال نمایید. یک هفته بعد، در وظیفهای متفاوت، همان اشتباه تکرار میشود. آن بار دوم، یک نشانه است.
در حالی که شکست هنوز پیش روی شماست، دو مورد را یادداشت کنید: درخواستی که تایپ کردید و اصلاحیهای که ارائه دادید، با همان کلماتی که به کار بردید. آن دو خط به مهارت تبدیل میشوند. درخواست به شما میگوید که محرک (trigger) باید با چه چیزی مطابقت داشته باشد. اصلاحیه، کل محتواست.
راهنمای تألیف خودِ Anthropic این موضوع را در اولویت قرار میدهد. عامل را روی وظایف نمونه بدون مهارت اجرا کنید، محل شکستها را ثبت کنید و سپس حداقل دستورالعملهایی را بنویسید که آن شکستها را برطرف میکند. شکستها همان مشخصات فنی هستند، بنابراین مهارتی که نتوانید آن را به یک شکست خاص ردیابی کنید، معمولاً مهارتی است که هیچکس به آن نیاز نداشته است.
برای مشاهده یک نمونه عملی از همین خلاصهسازی، Ponytail یک شکست تکراری را به یک مهارت تبدیل میکند؛ عاملی که بسیار فراتر از آنچه خواسته بودید بازنویسی میکند که میتوانید پیش از نوشتن مهارت خود، آن را بهطور کامل مطالعه کنید.
آناتومی یک مهارت
یک مهارت، دایرکتوریای است که شامل یک فایل الزامی میباشد.
.claude/skills/nginx-config-changes/
├── SKILL.md
├── reference/
│ └── proxy-headers.md
└── scripts/
└── check-and-reload.shSKILL.md با یک بلوک frontmatter آغاز میشود؛ مجموعهای از تنظیمات که با فرمت YAML (همان فرمت پیکربندی که فایلهای Docker Compose استفاده میکنند) بین نشانگرهای --- نوشته شدهاند و در ادامه، دستورالعملها با فرمت markdown میآیند. در اینجا کل مهارت مربوط به خطای فوق آمده است.
---
name: nginx-config-changes
description: Tests and reloads nginx safely after a config edit. Use when editing files under /etc/nginx, adding a server block or a reverse proxy, or changing a TLS certificate path.
---
## Rules
Run `sudo nginx -t` after every edit under `/etc/nginx`. Do not touch the service until it prints `test is successful`.
Apply the change with `sudo systemctl reload nginx`. Never use `restart`. A reload keeps the running workers serving traffic until the new config parses, so a broken config leaves the site up. A restart stops nginx first, so a broken config takes the site down.
If `nginx -t` fails, fix the file and test again. Never reload a config that failed the test.
For the proxy header defaults this project expects, see [reference/proxy-headers.md](reference/proxy-headers.md).این فایل کمتر از 20 خط است و یک مهارت کامل محسوب میشود. بخشهای آن عبارتند از:
name: حداکثر 64 کاراکتر، فقط شامل حروف کوچک، اعداد و خط تیره؛ این بخش نمیتواند شامل کلماتclaudeیاanthropicباشد. در یک مهارت شخصی یا پروژهای، این فقط برچسب نمایشی است. دستوری که تایپ میکنید از نام دایرکتوری گرفته میشود، بنابراین این مهارت با/nginx-config-changesفراخوانی میشود.description: شرح عملکرد مهارت و زمان استفاده از آن، حداکثر 1,024 کاراکتر. این خط وظیفه اصلی را انجام میدهد و بخش بعدی صرفاً به همین موضوع اختصاص دارد.- بدنه: دستورالعملهایی که فقط هنگام اجرای مهارت بارگذاری میشوند.
reference/: فایلهای اضافی که عامل (agent) در صورت نیاز میخواند. آنها را ازSKILL.mdلینک کنید و لینکها را در یک سطح عمق نگه دارید، زیرا فایلی که از یک فایل ارجاعدادهشده دیگر فراخوانی شود، اغلب فقط بهصورت ناقص خوانده میشود.scripts/: فایلهایی که عامل بهجای خواندن، آنها را اجرا میکند. فقط خروجی این فایلها از ظرفیت context استفاده میکند، بنابراین یک اسکریپت 300 خطی هزینه کمی دارد.
محل قرارگیری دایرکتوری تعیین میکند که چه کسی به مهارت دسترسی داشته باشد.
.claude/skills/<name>/SKILL.mdدر مخزن (repository): فقط برای همین پروژه، و برای هر کسی که مخزن را clone کند در دسترس خواهد بود.~/.claude/skills/<name>/SKILL.md: برای تمام پروژههای موجود در سیستم شما، و نه هیچکس دیگر.<plugin>/skills/<name>/SKILL.md: همراه با یک افزونه (plugin) توزیع میشود و در هر جایی که آن افزونه فعال باشد، در دسترس است.
با استفاده از mkdir -p .claude/skills/nginx-config-changes یک مهارت بسازید و فایل آن را بنویسید. Claude Code این دایرکتوریها را زیر نظر دارد، بنابراین ویرایش یک مهارت موجود بلافاصله در نشست (session) در حال اجرا اعمال میشود. ایجاد یک دایرکتوری سطح بالای skills که در زمان شروع نشست وجود نداشته است، نیاز به راهاندازی مجدد دارد، زیرا در زمان شروع نشست، مسیری برای نظارت وجود نداشته است.
فیلد description تأثیرگذارترین خط در فایل است
در زمان راهاندازی، agent مقادیر name و description مربوط به هر skill موجود را در context خود بارگذاری میکند. بدنه (body) این skillها بارگذاری نمیشود. هنگامی که درخواست شما میرسد، همان یک خط، تنها مبنای تصمیمگیری برای مرتبط بودن آن skill است؛ بنابراین، یک بدنه عالی که پشت یک توصیف مبهم پنهان شده باشد، هرگز خوانده نخواهد شد.
توصیف را به صورت سومشخص بنویسید. عبارت "Tests and reloads nginx safely" مناسب است. عبارت "I can help you with nginx" مناسب نیست، زیرا این متن در system prompt تزریق میشود و استفاده از اولشخص باعث میشود مدل طوری به نظر برسد که در حال صحبت درباره خودش است.
دو مورد را در توصیف بگنجانید: کاری که آن skill انجام میدهد و شرایطی که در آن اعمال میشود. مورد استفاده مهم را در ابتدا قرار دهید، زیرا Claude Code ورودیهای لیست را در 1,536 کاراکتر کوتاه میکند. یک فیلد اختیاری when_to_use برای عبارتهای محرک (trigger phrases) اضافی و نمونه درخواستها وجود دارد که تحت همان محدودیت به توصیف اضافه میشود.
سپس از کلماتی استفاده کنید که واقعاً تایپ خواهید کرد. عبارت description: Helps with nginx با هیچچیزی مطابقت ندارد، زیرا هیچکس عبارت "helps with" را تایپ نمیکند. نسخه بالا شامل /etc/nginx، server block، reverse proxy و TLS (transport layer security) certificate path است که تقریباً دایره واژگان هر درخواستی را که باید آن را فعال کند، پوشش میدهد.
این هم روش تست برای یک توصیف: آن یک خط را به کسی بدهید که بدنه را ندیده است، به همراه درخواستی که قصد دارید تایپ کنید، و از او بپرسید که آیا آن skill کاربرد دارد یا خیر. اگر او نتواند تشخیص دهد، مدل نیز نخواهد توانست.
حجم بدنه را کوچک نگه دارید، زیرا در متن باقی میماند
هنگامی که یک skill فراخوانی میشود، محتوای رندر شدهٔ آن به عنوان یک پیام وارد گفتگو شده و تا پایان نشست در آنجا باقی میماند. Claude Code فایل را در نوبتهای بعدی دوباره نمیخواند. هر خطی که مینویسید هزینهای است که برای کل نشست میپردازید، نه فقط برای یک پاسخ.
شرکت Anthropic توصیه میکند SKILL.md را زیر 500 خط نگه دارید و جزئیات را به فایلهای جداگانه منتقل کنید. فشردهسازی نشان میدهد که چرا این عدد تصادفی نیست. هنگامی که گفتگو برای آزاد کردن context خلاصه میشود، Claude Code آخرین فراخوانی هر skill را دوباره ضمیمه میکند، فقط 5,000 توکن اول از هر کدام را نگه میدارد و یک بودجه ترکیبی 25,000 توکنی را با شروع از skill که اخیراً فراخوانی شده است، پر میکند. یک skill طولانی ممکن است در میانه راه قطع شود. چندین skill طولانی ممکن است یکدیگر را بهطور کامل از حافظه خارج کنند.
بنابراین فقط مطالبی را بنویسید که مدل از قبل نمیداند. مدل میداند nginx چیست و reverse proxy چه کاری انجام میدهد. مدل قانون داخلی شما درباره اولویت reload بر restart را نمیداند و همین قانون تنها دلیل وجود این فایل است.
اگر skill به agent دستور میدهد که یک اسکریپت بستهبندیشده را اجرا کند، مسیر را با ${CLAUDE_SKILL_DIR} نامگذاری کنید تا در هر کجا که skill نصب شده است، بهدرستی شناسایی شود و همان دستور را از قبل تأیید کنید تا اجرا به دلیل درخواست مجوز متوقف نشود.
---
name: nginx-config-changes
description: Tests and reloads nginx safely after a config edit. Use when editing files under /etc/nginx, adding a server block or a reverse proxy, or changing a TLS certificate path.
allowed-tools: Bash(${CLAUDE_SKILL_DIR}/scripts/check-and-reload.sh *)
---این مجوز فقط نوبتی را که skill را فراخوانی کرده است پوشش میدهد و با ارسال پیام بعدی شما پاک میشود، بنابراین بهطور خودکار به یک مجوز دائمی تبدیل نخواهد شد.
چگونه فعال شدن یک skill را اثبات کنیم
مشاهدهٔ بارگذاری یک skill به شما میگوید که agent آن را پیدا کرده است، اما نشان نمیدهد که آیا پاسخ تغییر کرده است یا خیر. هر دو مورد را بررسی کنید و این کار را در یک session جدید انجام دهید؛ زیرا sessionای که در آن skill را نوشتهاید، تمام گفتههای شما در حین نوشتن را در حافظه دارد. آن context باقیمانده، شکافهای موجود در فایل را پنهان میکند.
- یک session جدید با
claudeدر پروژه شروع کنید. - درخواست خود را به همان شکلی که در یک روز کاری عادی مطرح میکنید، با کلمات خودتان و بدون نام بردن از skill تایپ کنید.
- منتظر فراخوانی (invocation) بمانید. اگر skill فعال نشد، توضیحات (description) را اصلاح کنید. بدنهٔ (body) آن هنوز مشکل اصلی نیست.
- برای کنترل، آن را بهصورت دستی با
/nginx-config-changesفراخوانی کنید. اگر رفتار هنگام فراخوانی دستی صحیح باشد اما هنگام درخواست عادی اشتباه باشد، این موضوع تأیید میکند که مشکل از trigger است، نه از دستورالعملها. - همان درخواست را با skill خاموش اجرا کنید و دو پاسخ را با هم مقایسه کنید. در منوی
/skills، روی skill مورد نظر بروید،Spaceرا بزنید تا وضعیت آن بهoffتغییر کند، سپسEnterرا برای ذخیره بزنید. این کار یک ورودیskillOverridesدر.claude/settings.local.jsonمینویسد و فشردن دوبارهSpaceپس از اتمام کار، وضعیت را بهonبرمیگرداند. - چند درخواست بنویسید که نباید باعث فعال شدن skill شوند و مطمئن شوید که در آن موارد، skill غیرفعال باقی میماند.
برای خودکارسازی این چرخه، پلاگین skill-creator را از marketplace رسمی نصب کنید.
/plugin marketplace add anthropics/claude-plugins-official
/plugin install skill-creator@claude-plugins-officialاگر خروجی نصب عبارت Run /reload-plugins to activate. را نشان داد، آن دستور را اجرا کنید. سپس از Claude بخواهید skill شما را با نام ارزیابی کند. این پلاگین موارد تست را در evals/evals.json داخل دایرکتوری skill ذخیره میکند و هر مورد را در یک subagent مجزا اجرا میکند تا هر اجرا با یک context تمیز شروع شود. سپس مقایسهای بین حالت با-skill و بدون-skill ارائه میدهد که عدد واقعی است: بهبود نرخ موفقیت که بر اساس توکنها و زمانی که skill مصرف میکند، اندازهگیری شده است.
حالت شکست: مهارت هرگز فعال نمیشود
شما درخواست را تایپ میکنید، اما ایجنت همچنان رفتار قدیمی و نادرست را انجام میدهد و هیچ خطی مربوط به مهارت ظاهر نمیشود. این موارد را به ترتیب بررسی کنید.
- توضیحات مهارت مشخص میکند که چه کاری انجام میدهد، اما نمیگوید چه زمانی باید از آن استفاده کرد؛ بنابراین هیچ بخشی از درخواست شما با آن مطابقت ندارد.
- توضیحات مهارت از کلماتی که شما تایپ میکنید اجتناب میکند. اگر شما "nginx" را میگویید، توضیحات باید حتماً شامل کلمه nginx باشد.
- گزینه
disable-model-invocation: trueدر frontmatter تنظیم شده است. این کار باعث میشود توضیحات مهارت بهطور کامل از context مدل خارج شود و مهارت فقط توسط شما و با استفاده از/nameقابل فراخوانی باشد. - یک glob در
pathsدر frontmatter، فعالسازی را به فایلهای منطبق محدود میکند و فایلی که روی آن کار میکنید با آن مطابقت ندارد. - مهارت در یک دایرکتوری تو در توی
.claude/skills/پایینتر از دایرکتوری شروع شما قرار دارد. این مهارتها تنها پس از آنکه ایجنت فایلی را در آن زیردایرکتوری بخواند یا ویرایش کند بارگذاری میشوند؛ بنابراین تا آن زمان، مهارت اصلاً در دسترس نیست.
حالت شکست: فعالسازی مداوم مهارت
مشکل معکوس این است که توصیف آنقدر کلی باشد که مهارت در کارهای نامرتبط فعال شود. عبارت "هنگام کار روی سرور استفاده شود" با تقریباً هر درخواستی در مخزن سرور مطابقت دارد. در نتیجه، بدنه مهارت برای وظایفی که نمیتواند در آنها کمک کند بارگذاری میشود و تا پایان نشست در متن باقی میماند.
توصیف را به شرایطی که واقعاً اهمیت دارد محدود کنید و فایلها یا دستوراتی که پوشش میدهد را نام ببرید. هنگامی که مهارت فقط برای فایلهای خاصی کاربرد دارد، از یک paths glob استفاده کنید. برای هر عملیاتی که دارای اثرات جانبی است، مانند deploy یا commit، مقدار disable-model-invocation: true را تنظیم کرده و آن را شخصاً با /name فراخوانی کنید تا عامل هرگز بهتنهایی تصمیم نگیرد که اکنون زمان مناسبی برای deploy است.
حالت شکست: مهارت متعلق به فایل قوانین شماست
یک فایل قوانین مانند CLAUDE.md یا AGENTS.md در ابتدای هر نشست بارگذاری میشود و برای هر وظیفهای اعمال میگردد. بدنهٔ یک مهارت تنها زمانی بارگذاری میشود که آن مهارت فراخوانی شود. تناوب، عامل اصلی در این تصمیمگیری است. حقیقتی که برای تمام وظایف در مخزن صادق است، مانند مدیر بستهای که استفاده میکنید، متعلق به فایل قوانین است. رویهای که تنها برای بخش کوچکی از وظایف کاربرد دارد، مانند قانون nginx در بالا، متعلق به یک مهارت است؛ جایی که در روزهایی که کسی nginx را ویرایش نمیکند، هیچ هزینهای (از نظر پردازشی یا حافظه) ندارد.
شکست واقعی، قرار دادن آن در هر دو مکان است. دو نسخه از دستورالعملها به مرور با هم تفاوت پیدا میکنند و هنگامی که عامل (agent) کار اشتباهی انجام میدهد، نمیتوانید تشخیص دهید که از کدام نسخه پیروی کرده است. برای هر دستورالعمل یک جایگاه مشخص انتخاب کنید. مرز بین مهارتها، سرورهای MCP و فایلهای قوانین موارد پیچیدهتر را بررسی میکند، از جمله زمانی که پاسخ صحیح، استفاده از یک سرور MCP (پروتکل زمینه مدل) است که به جای یک دستورالعمل جدید، ابزار جدیدی را در اختیار عامل قرار میدهد.
پس از اثبات کارایی، آن را به اشتراک بگذارید
مهارتی که یک هفته کار واقعی را پشت سر بگذارد، ارزش ثبت کردن دارد. مهارتهای پروژه در .claude/skills/ مانند کد بازبینی میشوند و همراه با مخزن (repository) منتقل میگردند؛ بنابراین همتیمی شما که مخزن را clone میکند، اصلاحات شما را بدون نیاز به هیچ مرحله تنظیماتی دریافت خواهد کرد. انتقال یک مهارت بین مخازن بدون استفاده از کپی و پیست، چالش خاص خود را دارد که در نحوه اشتراکگذاری مهارتهای عامل بین مخازن به آن پرداخته شده است.
یک نکته در مورد قابلیت حمل: Claude Code لیست بلندی از فیلدهای frontmatter را میپذیرد، اما استاندارد Agent Skills تنها شش مورد را مجاز میداند: name، description، license، compatibility، metadata و allowed-tools. اگر مهارتی را با هر فیلد دیگری در frontmatter در claude.ai بارگذاری کنید یا برای Skills API بستهبندی نمایید، به جای نادیده گرفتن فیلد اضافی، فرآیند مستقیماً با خطا مواجه میشود:
Unexpected key(s) in SKILL.md frontmatter: argument-hint. Allowed properties are: allowed-tools, compatibility, description, license, metadata, nameدر محدوده همان شش فیلد باقی بمانید تا فایل شما هم در Claude Code و هم در هر ابزار دیگری که از این استاندارد پشتیبانی میکند، به درستی بارگذاری شود. نوشتن دستورالعملها به گونهای که با انتقال به مدلهای دیگر همچنان کارآمد باقی بمانند، موضوعی جداگانه است که در نوشتن مهارتهایی که با هر مدلی کار میکنند پوشش داده شده است.
FAQ
طول فایل SKILL.md چقدر باید باشد؟
آن را زیر 500 خط نگه دارید و انتظار داشته باشید که اکثر مهارتهای مفید بسیار کوتاهتر از این باشند. بدنهٔ فایل هنگام فراخوانی مهارت وارد گفتگو میشود و تا پایان نشست در آن باقی میماند، بنابراین هر خط یک هزینهٔ تکرارشونده است، نه یک هزینهٔ یکباره. مطالب مرجع طولانی را به فایلهای جداگانه در دایرکتوری مهارت منتقل کنید و از طریق SKILL.md به آنها لینک دهید؛ با این کار، عامل فقط زمانی که به آنها نیاز دارد، فایلها را میخواند. اسکریپتهای بستهبندیشده به جای خوانده شدن، اجرا میشوند، بنابراین هزینهٔ آنها فقط به اندازهٔ خروجیشان است.
چرا مهارت من هرگز فعال نمیشود؟
توضیحات (description) معمولاً دلیل این مشکل است، زیرا تنها بخشی از مهارت است که هنگام تصمیمگیری مدل در context قرار دارد. مطمئن شوید که در توضیحات ذکر شده است که چه زمانی باید از مهارت استفاده کرد (نه فقط اینکه چه کاری انجام میدهد) و حاوی کلماتی باشد که واقعاً در درخواستهای خود تایپ میکنید. اگر توضیحات درست به نظر میرسد، frontmatter را برای disable-model-invocation: true بررسی کنید که مهارت را بهطور کامل از دید مدل پنهان میکند، و همچنین برای یک glob در paths که آن را به فایلهایی که با آنها کار نمیکنید محدود کرده است. مهارت موجود در یک دایرکتوری تو در توی .claude/skills/ پایینتر از دایرکتوری شروع شما نیز دلیل دیگری است: این مهارتها فقط پس از خواندن یا ویرایش یک فایل در آن زیردایرکتوری توسط عامل، بارگذاری میشوند.
آیا این باید یک مهارت باشد یا یک خط در فایل قوانین من؟
بپرسید که این مورد در چند تا از وظایف شما کاربرد دارد. فایل قوانین در هر نشست بارگذاری میشود، بنابراین باید شامل حقایقی باشد که برای همهٔ وظایف صادق است، مانند مدیر بسته (package manager) یا قرارداد نامگذاری شاخهها. یک مهارت فقط زمانی بارگذاری میشود که فعال شود، بنابراین جای مناسبی برای رویهای است که فقط در بخش کوچکی از وظایف اهمیت دارد. هرگز یک دستورالعمل مشابه را در هر دو مکان ننویسید، زیرا دو نسخه با هم تفاوت پیدا میکنند و شما دیگر نمیتوانید تشخیص دهید که عامل از کدام یک پیروی کرده است.
چگونه بفهمم که یک مهارت واقعاً کمک کرده است؟
آن را با یک مبنا (baseline) مقایسه کنید. چند درخواست واقعی جمعآوری کنید، هر کدام را در یک نشست تازه با مهارت فعال اجرا کنید، سپس دوباره آنها را با مهارت غیرفعالشده از منوی /skills اجرا کنید و هر دو پاسخ را در کنار هم بخوانید. نشست تازه اهمیت دارد، زیرا گفتگویی که در آن مهارت را نوشتهاید هنوز حاوی توضیحات شماست و باعث میشود یک فایل ناقص، کامل به نظر برسد. افزونهٔ skill-creator این مقایسه را برای شما انجام میدهد و نرخ موفقیت را در کنار هزینهٔ توکن گزارش میکند.
آیا میتوانم از یک SKILL.md مشابه با یک عامل دیگر استفاده کنم؟
بله، تا زمانی که در فیلدهایی که استاندارد Agent Skills تعریف کرده است بمانید: name، description، license، compatibility، metadata و allowed-tools. Claude Code فیلدهای بسیار بیشتری را میپذیرد و همچنین از ویژگیهای بدنه مانند تزریق دستورات shell پشتیبانی میکند که سایر ابزارها آن را اجرا نمیکنند. آپلود مهارتی با یک فیلد خارج از استاندارد، با یک خطای صریح که ویژگیهای مجاز را فهرست میکند، با شکست مواجه میشود؛ بنابراین از ابتدا تصمیم بگیرید که آیا یک مهارت قرار است در Claude Code باقی بماند یا قابل انتقال باشد.