SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-25

Chia sẻ agent skill giữa repo không bị lệch bản

Đừng copy skill vào 8 repo rồi để chúng lệch nhau. Dùng một repo chung, pin tag cho từng project, thêm smoke test và review mỗi lần bump version.

Cách chia sẻ agent skill giữa các repository

Để chia sẻ agent skill giữa các repository, hãy ngừng sao chép file và bắt đầu phụ thuộc vào file đó. Duy trì một repository chứa skill dùng chung, gắn tag cho repository này và để mỗi project pin một tag. Sau đó thêm một smoke test cho từng skill và review mỗi lần bump giống như khi review dependency được bump.

Có 4 phần: nguồn sự thật dùng chung, version được pin cho từng repository, smoke test cho từng skill và quy trình review. Phần bên dưới giải thích lý do tồn tại của từng phần, các công cụ được release trong 2026 hỗ trợ việc này như thế nào, và cách xây dựng toàn bộ hệ thống trên một git remote tự host mà không cần dùng service bên ngoài.

Một agent skill là một thư mục chứa file SKILL.md cùng các script và file tham chiếu mà skill cần. Nếu bạn chưa biết đơn vị này là gì, trước tiên hãy đọc agent skill là gì và SKILL.md hoạt động như thế nào. Trang này tập trung vào supply chain xoay quanh đơn vị đó.

Vị trí của một skill và lý do việc chia sẻ khó

Claude Code tải skill từ ba nơi, và tài liệu về skill liệt kê từng đường dẫn.

  • ~/.claude/skills/<skill-name>/SKILL.md là cấp cá nhân. Nó được tải trong tất cả project của bạn, nhưng không được tải trong project của người khác.
  • .claude/skills/<skill-name>/SKILL.md là cấp project. Nó được tải cho bất kỳ ai checkout repository đó.
  • <plugin>/skills/<skill-name>/SKILL.md nằm bên trong một plugin. Nó được tải ở mọi nơi plugin đó được bật.

Mục ở giữa hữu ích cho team vì nó được commit, và mọi người clone repo đều nhận được. Đây cũng là nơi vấn đề bắt đầu. Một skill trong .claude/skills/ thuộc về một repository. Bạn có tám repository. Vì vậy, skill đó bị sao chép tám lần.

Frontmatter không giúp được gì. Agent Skills spec cho phép sáu key, và các distribution path thực thi quy tắc này sẽ in danh sách khi bạn dùng key khác:

Unexpected key(s) in SKILL.md frontmatter: argument-hint. Allowed properties are: allowed-tools, compatibility, description, license, metadata, name

Hãy chú ý phần bị thiếu: không có key version. Bên trong file không có thông tin nào cho biết bản sao nào mới hơn. Điều này hợp lý vì skill là một tài liệu, không phải package. Tuy nhiên, việc versioning phải do lớp bên ngoài file đảm nhiệm, và lớp đó là trách nhiệm của bạn.

Vấn đề một: tám bản sao âm thầm lệch nhau

Copy-paste hoạt động tốt trong ngày đầu tiên. Đến ngày thứ 60 thì hỏng. Một người sửa hướng dẫn sai trong repo payments nhưng không cập nhật bảy bản còn lại. Một người khác thêm quy tắc về phân trang vào orders. Bây giờ, cùng một tên skill lại cho ra hai kết quả review khác nhau, tùy agent được khởi chạy từ thư mục nào. Không developer nào biết điều đó.

Lỗi này không biểu hiện rõ vì không có trạng thái lỗi. Skill là nội dung dạng văn bản. Hướng dẫn cũ tạo ra một câu trả lời tự tin nhưng sai, và đây là loại lỗi tốn kém nhất. Agent không so sánh bản copy của bạn với bản copy của người khác. Vì vậy, tín hiệu duy nhất là một người phát hiện hai repo không khớp nhau.

Vấn đề thứ hai: không cố định version

Ngay cả khi team lưu trữ các skill tại một nơi, cách chia sẻ phổ biến vẫn là một bước copy: script setup, một dòng curl trong tài liệu onboarding hoặc một shell alias để đồng bộ thư mục. Tất cả các cách này đều cài phiên bản hiện đang ở đầu branch.

Điều đó có nghĩa là hai developer dùng cùng một commit của cùng một application vẫn có thể đang chạy các instruction khác nhau vì họ thực hiện đồng bộ vào những ngày khác nhau. Điều đó cũng có nghĩa là bạn không thể trả lời câu hỏi quan trọng sau một lần agent chạy lỗi: skill nào đã tạo ra kết quả này? Nếu không ghi lại revision, lần chạy đó không thể tái lập, nên báo cáo bug không đủ thông tin để xử lý.

Vấn đề ba: không ai biết skill còn hoạt động hay không

Skill không có compiler. Đây là tập chỉ dẫn dành cho model, nên skill có thể ngừng hoạt động trong khi file vẫn giữ nguyên từng byte. Việc nâng cấp model có thể thay đổi mức độ model tuân thủ một chỉ dẫn dài. Một công cụ dòng lệnh mà skill gọi có thể đổi tên một flag. Một URL trong file tham chiếu có thể bắt đầu trả về 404, khiến agent làm việc dựa trên trang lỗi.

Không trường hợp nào trong số này gây lỗi rõ ràng. Agent vẫn trả lời. Chỉ là câu trả lời kém hơn so với tháng trước, và rất khó nhận ra điều đó nếu chỉ xem từng pull request một.

Các công cụ phát hành trong 2026 giải quyết vấn đề gì

Hiện đã có một số câu trả lời, nhưng chúng chưa thống nhất về nơi lưu phiên bản.

Lockfile. Công cụ dòng lệnh skills của Vercel Labs (vercel-labs/skills, cấp phép MIT, phiên bản v1.5.22 tính đến ngày 5 August 2026) cài skill từ một git repository vào thư mục mà agent của bạn yêu cầu, đồng thời biết layout của hơn 70 agent. npx skills add <repo> cài đặt, npx skills update nâng cấp và npx skills list hiển thị những gì bạn đã có. Bản ghi các skill đã cài được lưu một lần cho mỗi user thay vì một lần cho mỗi repository. Một yêu cầu đang mở trong project đó (issue 283) đề nghị thêm lệnh skills install để cài lại mọi skill được theo dõi từ lock file, nhờ đó máy thứ hai sẽ có cùng một bộ skill. Hãy xem yêu cầu này như một báo cáo trạng thái. Ý tưởng lockfile đã được thống nhất. Phần dành cho từng project vẫn đang được xây dựng.

Spec và test. SkillSpec đi theo hướng khác. Công cụ này xem SKILL.md là một contract cần kiểm tra thay vì prose để tin tưởng, với mục tiêu được nêu là làm cho skill "có thể làm theo, kiểm thử và chứng minh". skillspec doctor <path> báo cáo nơi agent có khả năng mất mạch xử lý. skillspec boundary map <path> báo cáo những gì skill có thể truy cập, còn skillspec boundary assess <path> xếp hạng các phát hiện đó theo mức độ rủi ro. Đây là một Rust crate, được cấp phép kép theo MIT hoặc Apache 2.0, phiên bản 0.2.2 tính đến ngày 29 July 2026. Hãy cài phiên bản đã pin thay vì phiên bản mới nhất:

cargo install skillspec --version 0.2.2 --locked
skillspec --version

--locked build với các phiên bản dependency mà crate được phát hành cùng, vì vậy build không tự thay đổi dependency. skillspec --version phải in ra 0.2.2. Nếu hiện số khác, một binary cũ hơn ở phía trước trong PATH của bạn đang được ưu tiên.

Thực hành của vendor. Google mô tả cách xây dựng các skill trong google/skills qua bài viết về cách xây dựng, kiểm thử và mở rộng quy mô agent skill. Nếu bỏ qua quy mô, cơ chế này chỉ là continuous integration (CI) thông thường. Mọi skill đều phải chạy qua linter để kiểm tra metadata frontmatter, số dòng, layout thư mục và cách đặt tên trước khi được merge. Link checker sẽ làm build fail nếu bất kỳ URL nào trả về 404, nhờ đó phát hiện các link có vẻ hợp lệ nhưng do agent tự tạo. Tác giả phải cung cấp một bộ evaluation prompt và rubric chấm điểm cùng với skill. Các job evaluation theo lịch sẽ chạy hằng tuần trên toàn bộ library để phát hiện regression. Mỗi skill cũng có một owner được chỉ định và người này phải sửa skill khi chất lượng giảm.

Mẫu hình chung phía sau cả ba câu trả lời

Bạn không phải chọn một trong các cách đó. Bên dưới chúng là một cấu trúc duy nhất, và git thuần cung cấp đầy đủ cấu trúc đó.

  1. Một nguồn sự thật duy nhất. Mỗi skill chỉ có đúng một nơi lưu trữ, và mọi repository đều tham chiếu đến nơi đó thay vì giữ một bản sao.
  2. Một phiên bản được pin cho từng repository. Mỗi project ghi lại revision chính xác mà nó sử dụng, vì vậy việc nâng cấp là một commit trong project đó, có author và ngày tháng.
  3. Một smoke test cho từng skill. Một bài kiểm tra có thể chạy để xác nhận skill vẫn tạo ra kết quả như đã cam kết.
  4. Một quy trình review. Thay đổi đối với skill dùng chung phải qua review, và mọi consumer đều thấy diff trước khi áp dụng.

Đó chính là cấu trúc của một dependency. Skill đã trở thành artifact dùng chung nhanh hơn tốc độ phát triển của tooling xung quanh nó, vì vậy sử dụng những công cụ mà bạn đã tin cậy là lựa chọn an toàn nhất.

Bố cục cho một nhóm nhỏ trên git remote tự host

Một repository chứa các skill. Không có nội dung nào khác trong đó, nên history của repository hoạt động như changelog của các instruction.

agent-skills/
  skills/
    api-review/
      SKILL.md
    release-notes/
      SKILL.md
  tests/
    api-review.sh
    release-notes.sh
  CHANGELOG.md

Release là các tag. Dùng annotated tag vì chúng chứa message và ngày tạo. Viết message theo lý do consumer muốn nâng version:

git tag -a v1.4.0 -m "api-review: require pagination on list endpoints"
git push origin v1.4.0

Nếu remote của bạn là Gitea, Forgejo, GitLab hoặc bare repository qua SSH trên VPS của bạn, các bước tiếp theo vẫn không thay đổi. Tất cả chỉ gồm git và một symlink.

Pin bằng git submodule

Một submodule ghi lại chính xác một commit của repository khác bên trong repository của bạn. Bản ghi đó chính là pin. Trong mỗi project sử dụng submodule:

git submodule add https://git.example.com/team/agent-skills.git vendor/agent-skills
git -C vendor/agent-skills fetch --tags
git -C vendor/agent-skills checkout v1.4.0
mkdir -p .claude/skills
ln -s ../../vendor/agent-skills/skills/api-review .claude/skills/api-review
git add .gitmodules vendor/agent-skills .claude/skills/api-review
git commit -m "Pin shared agent skills to v1.4.0"

Symlink là phần giúp cách này hoạt động. Một skill entry ở cấp project có thể là symlink trỏ đến một thư mục ở nơi khác trên disk, và Claude Code sẽ đi theo symlink đó rồi đọc SKILL.md từ target. Vì vậy, skill được nạp như một project skill bình thường, còn các byte nằm trong submodule tại commit bạn đã chọn.

Kiểm tra pin:

git submodule status

Một dòng hợp lệ bắt đầu bằng một dấu cách, tiếp theo là commit, path, rồi tag gần nhất:

 4d1a7c2f0b93e5a1c8d6f2b40e7a95c3d1f8b602 vendor/agent-skills (v1.4.0)

Ký tự - ở đầu dòng nghĩa là submodule chưa từng được khởi tạo, nên .claude/skills/api-review không trỏ đến đâu và skill sẽ không được nạp mà không báo lỗi. Khắc phục bằng git submodule update --init. Ký tự + ở đầu dòng nghĩa là commit đã checkout khác với commit được ghi nhận, nên developer đó đang chạy các instruction mà không ai khác có. Clone mới cần git clone --recurse-submodules, và phải ghi lệnh đó trong README, vì clone thông thường để vendor/agent-skills trống và không in ra lỗi.

Việc nâng cấp được thực hiện có chủ đích. Đó chính là mục đích của cách này:

git -C vendor/agent-skills fetch --tags
git -C vendor/agent-skills diff v1.4.0 v1.5.0 -- skills/
git -C vendor/agent-skills checkout v1.5.0
git add vendor/agent-skills
git commit -m "Bump shared agent skills to v1.5.0"

Dòng diff là đường dẫn review. Nó hiển thị cùng một thay đổi mà mọi repo sử dụng khác sẽ thấy, và phù hợp để đưa vào một pull request.

Thay bằng pinning qua plugin marketplace

Nếu không muốn yêu cầu mọi developer học cách dùng submodule, hệ thống plugin của Claude Code sẽ xử lý việc phân phối và hoạt động với remote tự host. Đặt catalog tại .claude-plugin/marketplace.json trong skills repository:

{
  "name": "acme-agents",
  "owner": { "name": "Platform team", "email": "platform@example.com" },
  "plugins": [
    {
      "name": "team-skills",
      "description": "Shared review and release skills",
      "version": "1.4.0",
      "source": {
        "source": "url",
        "url": "https://git.example.com/team/agent-skills.git",
        "ref": "v1.4.0",
        "sha": "4d1a7c2f0b93e5a1c8d6f2b40e7a95c3d1f8b602"
      }
    }
  ]
}

Ở đây có 2 nguồn khác nhau. Nhầm lẫn giữa chúng là lỗi phổ biến. Marketplace source, tức nơi lấy catalog, chấp nhận ref cho branch hoặc tag và không chấp nhận sha. Plugin source bên trong catalog chấp nhận cả 2. Khi đặt cả 2, sha là pin có hiệu lực. Vì vậy, exact-commit pin phải nằm trong mục nhập của catalog.

Mỗi repository sử dụng plugin sẽ khai báo marketplace trong .claude/settings.json đã commit:

{
  "extraKnownMarketplaces": {
    "acme-agents": {
      "source": {
        "source": "url",
        "url": "https://git.example.com/team/agent-skills.git",
        "ref": "v1.4.0"
      }
    }
  },
  "enabledPlugins": {
    "team-skills@acme-agents": true
  }
}

Thành viên trong team tin cậy project folder sẽ được nhắc cài marketplace. Plugin sẽ được bật cho họ mà không cần một trang wiki hướng dẫn thao tác này. Các skill sau đó được gọi bằng /team-skills:api-review, vì plugin skill được namespace theo tên plugin và không thể trùng với project skill cùng tên. Sau khi push tag mới, các repository sử dụng plugin refresh bằng /plugin marketplace update acme-agents, rồi chạy /reload-plugins nếu phần tóm tắt cài đặt yêu cầu.

Viết smoke test cho một skill

Smoke test là một lần chạy agent bằng script trên một fixture có lỗi đã biết, kèm theo một assertion. Claude Code chạy ở chế độ không tương tác với -p, và skill do người dùng gọi cũng hoạt động trong chế độ này: đặt /skill-name vào chuỗi prompt để nó được mở rộng trước khi lần chạy bắt đầu.

#!/usr/bin/env bash
set -euo pipefail

claude -p "/api-review Read fixtures/orders-api.md and list the rule ids it breaks." \
  --allowedTools "Read" \
  --output-format json \
  --json-schema '{"type":"object","properties":{"rule_ids":{"type":"array","items":{"type":"string"}}},"required":["rule_ids"]}' \
  | jq -e '.structured_output.rule_ids | index("pagination-required")' > /dev/null

fixtures/orders-api.md là một file ngắn chứa một lỗi có chủ ý. Assertion kiểm tra xem skill có nêu đúng lỗi đó không. jq -e trả về mã thoát khác 0 khi filter của nó tạo ra null, nên script sẽ fail nếu skill không còn bắt được lỗi đã cài sẵn. Bản thân claude trả về mã thoát khác 0 khi lần chạy fail, còn set -euo pipefail biến một trong hai lỗi đó thành test fail.

Model có thể diễn đạt lại câu trả lời giữa các lần chạy, vì vậy không bao giờ assertion trên toàn bộ một câu. Hãy assertion trên một identifier mà skill phải xuất ra, hoặc trên một field của schema mà bạn yêu cầu. Giữ fixture nhỏ để lần chạy không tốn nhiều tài nguyên.

Trong CI, thêm --bare. Nếu không có tùy chọn này, claude -p sẽ nạp cùng context như một phiên tương tác, bao gồm hooks, plugins và CLAUDE.md từ máy đang chạy. Vì vậy, cấu hình cá nhân của một thành viên trong nhóm có thể làm thay đổi kết quả. Chế độ bare bỏ qua toàn bộ auto-discovery. Điều đó cũng khiến skill đang kiểm thử bị bỏ qua, nên hãy load riêng skill đó. Chế độ bare cũng không đọc thông tin đăng nhập subscription của bạn, vì vậy hãy đặt ANTHROPIC_API_KEY trong environment trước:

claude --bare -p "/team-skills:api-review Read fixtures/orders-api.md and list the rule ids it breaks." \
  --plugin-dir vendor/agent-skills \
  --allowedTools "Read" \
  --output-format json

Với --output-format stream-json, event đầu tiên của lần chạy sẽ báo những plugin nào đã được load và chứa một array plugin_errors cho các plugin chưa được load. Hãy làm CI job fail nếu plugin_errors không rỗng. Cách này phát hiện trường hợp pin trỏ đến một revision không còn tồn tại. Nếu không, agent có thể âm thầm bỏ qua các quy tắc nội bộ của bạn.

Một skill dùng chung là một chỉ dẫn có thể thực thi

Hai tính năng khiến điều này đúng theo nghĩa đen, và cả hai đều quan trọng khi file đến từ một team khác.

Thứ nhất, một SKILL.md có thể chạy shell command trước khi model đọc bất kỳ nội dung nào. Một dòng như dưới đây trong phần nội dung là bước tiền xử lý:

- Current branch: !`git rev-parse --abbrev-ref HEAD`

Command chạy trên máy đang tải skill, rồi output của nó thay thế placeholder trong văn bản mà model nhận được. Một block được mở bằng ba dấu backtick, theo sau là !, cũng chạy nhiều command theo cách tương tự. Không có ai phê duyệt các thao tác này trong lúc chạy. Đọc một skill dùng chung cũng có nghĩa là đọc các command substitution của nó.

Thứ hai, frontmatter có thể phê duyệt trước các tool. allowed-tools cấp các tool được liệt kê mà không hiện permission prompt trong lượt gọi skill đó. Với project skill, quyền cấp này có hiệu lực sau khi ai đó chấp nhận hộp thoại workspace trust cho thư mục. Tài liệu Claude Code nêu rõ hệ quả: hãy review project skill trước khi trust một repository, vì skill có thể tự cấp cho mình quyền truy cập tool rất rộng.

Vì vậy, hãy xử lý việc nâng version skill giống hệt việc nâng version dependency. Khi cơ chế cho phép, hãy pin bằng commit chính xác, vì tag có thể bị di chuyển còn branch thì mặc định luôn thay đổi. Trên máy bị giới hạn quyền, "disableSkillShellExecution": true trong settings thay thế mọi command substitution bằng văn bản cố định [shell command execution disabled by policy] thay vì chạy chúng. Khi được áp dụng qua managed settings, user không thể ghi đè thiết lập này. Bundled skill và managed skill không chịu ảnh hưởng của thiết lập đó.

Cần thận trọng tương tự với dữ liệu mà skill đọc. Skill chạy env hoặc mở một config file sẽ đưa mọi thứ nó tìm thấy vào context của model. Đây chính là lỗi được đề cập trong giữ secret ngoài các agent bạn chạy. Skill fetch một trang hoặc chạy một query cũng tạo ra kiểu lộ dữ liệu tương tự theo hướng ra ngoài, vì text được lấy về đi vào context và trông hoàn toàn giống các instruction bạn viết. Đây là một ranh giới nên đọc kỹ trước khi bạn trỏ một agent vào SearXNG instance của chính bạn để tìm kiếm web.

Đọc gì khi tăng phiên bản

  • Diff của mọi phần thân SKILL.md, vì nội dung đó là chỉ dẫn mà agent của bạn sẽ làm theo.
  • Mọi phép thay thế lệnh, vì chúng được chạy trên máy của bạn khi skill được nạp.
  • Mọi thay đổi đối với allowed-tools, vì dòng đó cấp quyền dùng công cụ mà không cần prompt.
  • Lần chạy test gắn với tag. Nếu repository dùng chung tự chạy smoke test trong CI, tag mà bạn pin phải có một lần chạy thành công đi kèm.

Nếu reviewer không thể đọc toàn bộ diff trong mười phút, skill đó đã phát triển quá lớn. Hãy tách nó ra. Lập luận tương tự cũng áp dụng cho các tài liệu trong repository mà agent đọc: giữ các quy tắc lâu dài trong những file được mô tả ở phần tách AGENTS.md và HUMAN.md, đưa phần giải thích kiến trúc vào một file DESIGN.md viết cho agent, và để skill chỉ chứa các quy trình hẹp.

Khi thay đổi model hoặc tool làm hỏng một skill

Có nhiều thứ bên dưới một skill thay đổi mà không ai chỉnh sửa skill đó. Một lần nâng cấp model có thể làm thay đổi mức độ tuân thủ ổn định của model đối với instruction dài. Khi đó, một skill phụ thuộc vào việc model thực hiện đến bước chín có thể không bao giờ đi đến bước đó nữa. Một command line tool có thể đổi tên flag. Agent vẫn chạy flag cũ, đọc lỗi rồi tự xử lý theo cách khác. Một URL được tham chiếu có thể bắt đầu trả về 404. Agent harness có thể thay đổi cách chọn skill. Vì vậy, một description trước đây từng khớp tốt nhất có thể không còn được chọn. Khi một procedure bắt đầu kết thúc sớm như vậy, không thể sửa bằng cách tăng version. Bản thân instruction cần có cấu trúc buộc phải thực hiện các bước cuối. Đây là cách tiếp cận đứng sau skill unlazy và phương pháp Depth Tree của nó.

Đó là lý do smoke test giữ vai trò quan trọng trong mô hình này. Hãy chạy test của từng skill theo lịch, đồng thời chạy khi push. Google chạy các evaluation job hằng tuần trên toàn bộ library vì lý do này. Với một team có mười skill, một cron job chạy hằng tuần trên một VPS nhỏ là đủ. Đây là cách duy nhất để phát hiện lỗi trước khi developer phát hiện ra.

Tính portability cũng hữu ích. Đặc tả Agent Skills chỉ giữ frontmatter ở 6 key. Vì vậy, một skill được viết theo đặc tả này có thể load trong nhiều tool khác ngoài tool mà bạn viết nó, trong khi mỗi key riêng của harness là một lần đặt cược vào một vendor. Viết skill có thể hoạt động ổn định sau khi đổi model là một discipline riêng. Nội dung này được trình bày trong cách làm cho một skill hoạt động trên mọi model.

FAQ

Làm thế nào để chia sẻ một skill của agent cho nhiều repository?

Đặt skill trong một repository git riêng, tag các bản release trong đó, rồi để mỗi project sử dụng tham chiếu đến một tag thay vì sao chép file. Có hai cơ chế phù hợp. Git submodule ghi lại một commit cụ thể, còn symlink từ .claude/skills/<name> đến submodule giúp skill được nạp như skill thông thường của project. Plugin marketplace cũng thực hiện việc tương tự thông qua /plugin, với thông tin pin được khai báo trong .claude/settings.json của repository sử dụng. Cả hai cách đều lưu phiên bản trong lịch sử git, nên bạn có thể xác định những instruction nào đã tạo ra một lần chạy agent cụ thể.

Có thể pin một skill của agent vào phiên bản cụ thể không?

Không thể thực hiện việc đó từ bên trong SKILL.md, vì frontmatter này không có key version. Thông tin pin phải được đặt ở lớp bên ngoài file. Git submodule mặc định pin vào một commit cụ thể. Trong Claude Code plugin marketplace, một plugin source chấp nhận ref cho branch hoặc tag và sha cho commit cụ thể; khi có cả hai, sha được ưu tiên. Bản thân marketplace source chỉ chấp nhận ref. Nên ưu tiên pin theo commit, vì tag có thể bị di chuyển sau khi bạn đã review.

Smoke test của skill nên kiểm tra điều gì?

Hãy kiểm tra một kết quả ổn định. Chạy skill ở chế độ non-interactive trên một fixture chứa lỗi đã biết, rồi kiểm tra xem một identifier cụ thể có xuất hiện trong output hay không, chẳng hạn rule id mà skill phải báo cáo. Yêu cầu structured output bằng --output-format json--json-schema giúp phép kiểm tra chính xác, còn jq -e khiến script fail khi thiếu giá trị. Không nên kiểm tra cả câu hoàn chỉnh, vì model có thể diễn đạt lại câu trả lời giữa các lần chạy.

Cài đặt một skill dùng chung từ repository của team khác có an toàn không?

Hãy xem đó là một code dependency, vì nó là instruction có thể thực thi. Một SKILL.md có thể chạy shell command khi load thông qua dạng command substitution !, còn field allowed-tools trong frontmatter có thể pre-approve tool mà không cần prompt. Đọc diff ở mỗi lần nâng version, pin vào commit cụ thể thay vì branch, và ưu tiên source do team của bạn kiểm soát. Trên các máy được quản lý tập trung, "disableSkillShellExecution": true trong settings sẽ ngăn mọi command substitution chạy.

Một skill dùng chung có hoạt động trong các agent khác ngoài Claude Code không?

Điều đó phụ thuộc vào frontmatter bạn sử dụng. Đặc tả Agent Skills định nghĩa 6 key: name, description, license, compatibility, metadataallowed-tools. Skill chỉ dùng các key này sẽ được nạp trên những tool triển khai đặc tả, đồng thời cũng được nạp trong Claude Code mà không cần thay đổi. Các key và tính năng trong body dành riêng cho từng harness, nếu vượt ngoài đặc tả, sẽ bị bỏ qua hoặc bị từ chối ở nơi khác. Vì vậy, hãy loại bỏ chúng khỏi mọi skill mà bạn định chia sẻ rộng rãi.