{"product_id":"tao-custom-skills-cho-claude-code-mo-rong-kha-nang-voi-skill-md","title":"Tao Custom Skills cho Claude Code — Mo rong kha nang voi SKILL.md","description":"\n\u003cp\u003eClaude Code mạnh mẽ sẵn, nhưng sức mạnh thật sự đến khi bạn tùy chỉnh nó cho workflow riêng của mình. Custom Skills cho phép bạn đóng gói các tập chỉ dẫn và script thành các khả năng có thể tái sử dụng — giống như tạo plugin cho chính Claude Code.\u003c\/p\u003e\n\n\u003ch2\u003eCustom Skills là gì?\u003c\/h2\u003e\n\u003cp\u003eMột Custom Skill là một gói bao gồm instructions (hướng dẫn) và scripts (các đoạn mã thực thi) mà bạn định nghĩa để Claude Code thực hiện một nhiệm vụ cụ thể. Thay vì giải thích lại cách deploy, cách generate docs hay cách seed database mỗi lần, bạn tạo một skill một lần và gọi lại bất cứ khi nào cần.\u003c\/p\u003e\n\n\u003ch3\u003eThành phần của một Skill\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSKILL.md:\u003c\/strong\u003e File chính định nghĩa tên, mô tả, khi nào kích hoạt, và hướng dẫn chi tiết cho Claude\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eScripts:\u003c\/strong\u003e Các file Python, Bash hoặc JavaScript hỗ trợ thực thi các tác vụ cụ thể\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eResources:\u003c\/strong\u003e Template, config files, hoặc bất kỳ tài liệu tham khảo nào\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eCấu trúc thư mục Skills\u003c\/h2\u003e\n\u003cp\u003eSkills được lưu trong thư mục \u003ccode\u003e.claude\/skills\/\u003c\/code\u003e của project:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e.claude\/\n  skills\/\n    deploy\/\n      SKILL.md\n      deploy.sh\n      health-check.py\n    generate-docs\/\n      SKILL.md\n      generate.py\n      templates\/\n        api-doc.md\n    seed-database\/\n      SKILL.md\n      seed.py\n      fixtures\/\n        users.json\n        products.json\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eMỗi thư mục con trong \u003ccode\u003e.claude\/skills\/\u003c\/code\u003e là một skill độc lập. Claude Code tự động nhận diện các skill dựa trên file SKILL.md trong mỗi thư mục.\u003c\/p\u003e\n\n\u003ch2\u003eĐịnh dạng SKILL.md\u003c\/h2\u003e\n\u003cp\u003eFile SKILL.md là \"bộ não\" của skill. Nó cho Claude biết skill này làm gì, khi nào nên dùng, và cách thực hiện. Đây là cấu trúc chuẩn:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Skill: [Ten Skill]\n\n## Description\nMo ta ngan gon skill lam gi va giai quyet van de gi.\n\n## Trigger\nKhi nao Claude nen tu dong kich hoat skill nay.\nVi du: \"Khi nguoi dung yeu cau deploy\", \"Khi nguoi dung noi generate docs\"\n\n## Instructions\nHuong dan chi tiet tung buoc Claude can lam khi skill duoc kich hoat.\n\n### Buoc 1: [Ten buoc]\nChi tiet cach thuc hien...\n\n### Buoc 2: [Ten buoc]\nChi tiet cach thuc hien...\n\n## Scripts\n- `deploy.sh` — Script chinh de thuc thi deploy\n- `health-check.py` — Kiem tra suc khoe sau deploy\n\n## Notes\nLuu y quan trong, truong hop dac biet, canh bao.\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTạo Skill đầu tiên: Auto Deploy\u003c\/h2\u003e\n\u003cp\u003eHãy tạo một skill tự động deploy ứng dụng lên server. Đây là ví dụ thực tế bạn có thể áp dụng ngay.\u003c\/p\u003e\n\n\u003ch3\u003eBước 1: Tạo thư mục skill\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003emkdir -p .claude\/skills\/deploy\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBước 2: Viết SKILL.md\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Skill: Auto Deploy\n\n## Description\nTu dong deploy ung dung len production server. Bao gom build,\ntest, deploy va health check.\n\n## Trigger\nKich hoat khi nguoi dung yeu cau \"deploy\", \"push to production\",\nhoac \"release\".\n\n## Prerequisites\n- SSH key da duoc cau hinh cho server production\n- Docker da cai dat tren server\n- File .env.production da ton tai\n\n## Instructions\n\n### Buoc 1: Pre-deploy checks\n- Chay `npm run lint` de kiem tra loi code\n- Chay `npm run test` de dam bao tests pass\n- Kiem tra branch hien tai la `main`\n- Kiem tra khong co uncommitted changes\n\n### Buoc 2: Build\n- Chay `npm run build`\n- Kiem tra thu muc build\/dist da duoc tao thanh cong\n- Ghi lai build version tu package.json\n\n### Buoc 3: Deploy\n- Chay script `.claude\/skills\/deploy\/deploy.sh`\n- Script se:\n  1. SSH vao server\n  2. Pull code moi nhat\n  3. Build Docker image\n  4. Restart container voi zero-downtime\n\n### Buoc 4: Health check\n- Chay `.claude\/skills\/deploy\/health-check.py`\n- Kiem tra endpoint \/health tra ve 200\n- Kiem tra response time duoi 500ms\n- Neu fail, tu dong rollback\n\n### Buoc 5: Notification\n- In ra ket qua deploy: thanh cong hoac that bai\n- Ghi lai deploy log vao .claude\/skills\/deploy\/logs\/\n\n## Rollback\nNeu deploy that bai:\n1. SSH vao server\n2. Chay `docker rollback` de quay ve version truoc\n3. Kiem tra health check lai\n4. Bao nguoi dung biet can xu ly thu cong\n\n## Notes\n- Chi deploy tu branch main\n- Luon chay tests truoc khi deploy\n- Giu lai 3 phien ban cu de rollback\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBước 3: Tạo deploy script\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e#!\/bin\/bash\n# .claude\/skills\/deploy\/deploy.sh\n\nset -euo pipefail\n\nSERVER=\"user@production-server.com\"\nAPP_DIR=\"\/opt\/app\"\nIMAGE_NAME=\"myapp\"\n\necho \"=== Starting deployment ===\"\n\n# SSH vao server va deploy\nssh $SERVER \u0026lt;\u0026lt; 'REMOTE'\n  cd \/opt\/app\n\n  # Pull code moi nhat\n  git pull origin main\n\n  # Build Docker image moi\n  docker build -t myapp:latest .\n\n  # Zero-downtime restart\n  docker compose up -d --no-deps --build app\n\n  # Don dep images cu\n  docker image prune -f\n\n  echo \"Deploy completed at $(date)\"\nREMOTE\n\necho \"=== Deployment finished ===\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBước 4: Tạo health check script\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# .claude\/skills\/deploy\/health-check.py\nimport requests\nimport sys\nimport time\n\nHEALTH_URL = \"https:\/\/myapp.com\/health\"\nMAX_RETRIES = 5\nRETRY_DELAY = 3  # seconds\n\ndef check_health():\n    for attempt in range(1, MAX_RETRIES + 1):\n        try:\n            start = time.time()\n            response = requests.get(HEALTH_URL, timeout=10)\n            elapsed = (time.time() - start) * 1000\n\n            if response.status_code == 200 and elapsed \u0026lt; 500:\n                print(f\"Health check passed (attempt {attempt})\")\n                print(f\"  Status: {response.status_code}\")\n                print(f\"  Response time: {elapsed:.0f}ms\")\n                return True\n            else:\n                print(f\"Attempt {attempt}: status={response.status_code}, time={elapsed:.0f}ms\")\n        except requests.exceptions.RequestException as e:\n            print(f\"Attempt {attempt}: Connection error - {e}\")\n\n        if attempt \u0026lt; MAX_RETRIES:\n            time.sleep(RETRY_DELAY)\n\n    print(\"Health check FAILED after all retries\")\n    return False\n\nif __name__ == \"__main__\":\n    success = check_health()\n    sys.exit(0 if success else 1)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ 2: Generate API Documentation\u003c\/h2\u003e\n\u003cp\u003eSkill thứ hai tự động tạo tài liệu API từ source code:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Skill: Generate API Docs\n\n## Description\nTu dong tao tai lieu API tu cac route handlers va JSDoc comments\ntrong source code. Xuat ra file Markdown chuan.\n\n## Trigger\nKich hoat khi nguoi dung yeu cau \"generate docs\", \"update API docs\",\nhoac \"tao tai lieu API\".\n\n## Instructions\n\n### Buoc 1: Scan routes\n- Tim tat ca file trong `src\/routes\/` va `src\/controllers\/`\n- Doc JSDoc comments tren moi route handler\n- Trich xuat: HTTP method, path, parameters, request body, response\n\n### Buoc 2: Parse models\n- Tim tat ca file trong `src\/models\/`\n- Trich xuat schema definitions\n- Map voi cac route da tim duoc\n\n### Buoc 3: Generate documentation\n- Chay script `.claude\/skills\/generate-docs\/generate.py`\n- Script doc source code va tao Markdown file\n- Moi endpoint co: description, parameters, request\/response examples\n\n### Buoc 4: Output\n- Luu file tai `docs\/api-reference.md`\n- In ra so luong endpoints da document\n- Liet ke cac endpoints thieu JSDoc de nguoi dung bo sung\n\n## Template\nSu dung template tai `.claude\/skills\/generate-docs\/templates\/api-doc.md`\n\n## Notes\n- Chi scan cac file .ts va .js\n- Bo qua cac file test va file bat dau bang _\n- Giu lai noi dung custom ma nguoi dung da them vao docs truoc do\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eScript generate docs\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# .claude\/skills\/generate-docs\/generate.py\nimport os\nimport re\nimport json\n\nROUTES_DIR = \"src\/routes\"\nOUTPUT_FILE = \"docs\/api-reference.md\"\n\ndef parse_route_file(filepath):\n    \"\"\"Doc file route va trich xuat thong tin endpoint.\"\"\"\n    endpoints = []\n    with open(filepath, 'r') as f:\n        content = f.read()\n\n    # Tim cac route definitions\n    pattern = r'\/**s*(.*?)*\/s*router.(get|post|put|delete)s*(s*['\"]([^'\"]+)['\"]'\n    matches = re.findall(pattern, content, re.DOTALL)\n\n    for doc, method, path in matches:\n        endpoints.append({\n            'method': method.upper(),\n            'path': path,\n            'description': doc.strip().replace('* ', '').replace('\n', ' ')\n        })\n\n    return endpoints\n\ndef generate_markdown(all_endpoints):\n    \"\"\"Tao file Markdown tu danh sach endpoints.\"\"\"\n    lines = [\"# API Reference\n\"]\n    lines.append(f\"Generated automatically. Total endpoints: {len(all_endpoints)}\n\")\n\n    for ep in all_endpoints:\n        lines.append(f\"## {ep['method']} {ep['path']}\n\")\n        lines.append(f\"{ep['description']}\n\")\n        lines.append(\"---\n\")\n\n    return '\n'.join(lines)\n\ndef main():\n    all_endpoints = []\n    for root, dirs, files in os.walk(ROUTES_DIR):\n        for f in files:\n            if f.endswith(('.ts', '.js')) and not f.startswith('_'):\n                filepath = os.path.join(root, f)\n                endpoints = parse_route_file(filepath)\n                all_endpoints.extend(endpoints)\n\n    markdown = generate_markdown(all_endpoints)\n\n    os.makedirs(os.path.dirname(OUTPUT_FILE), exist_ok=True)\n    with open(OUTPUT_FILE, 'w') as f:\n        f.write(markdown)\n\n    print(f\"Generated docs for {len(all_endpoints)} endpoints\")\n    print(f\"Output: {OUTPUT_FILE}\")\n\nif __name__ == \"__main__\":\n    main()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ 3: Database Seed\u003c\/h2\u003e\n\u003cp\u003eSkill thứ ba tự động tạo dữ liệu mẫu cho môi trường development:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Skill: Database Seed\n\n## Description\nTao du lieu mau cho database development. Ho tro tao users,\nproducts, orders va cac du lieu lien quan voi so luong tuy chinh.\n\n## Trigger\nKich hoat khi nguoi dung yeu cau \"seed database\", \"tao du lieu mau\",\nhoac \"populate dev database\".\n\n## Instructions\n\n### Buoc 1: Kiem tra moi truong\n- Xac nhan dang o moi truong development (KHONG BAO GIO seed production)\n- Kiem tra database connection\n- Hoi nguoi dung co muon xoa du lieu cu truoc khi seed khong\n\n### Buoc 2: Chon du lieu can seed\nHoi nguoi dung muon seed nhung gi:\n- Users (default: 50)\n- Products (default: 100)\n- Orders (default: 200)\n- Reviews (default: 500)\n- Hoac \"all\" de seed tat ca voi so luong default\n\n### Buoc 3: Thuc thi seed\n- Chay `.claude\/skills\/seed-database\/seed.py` voi arguments phu hop\n- Script se doc fixtures va tao du lieu voi faker\n\n### Buoc 4: Xac nhan\n- In ra so luong records da tao cho tung bang\n- Kiem tra foreign key constraints da dung\n- In ra sample records de nguoi dung xac nhan\n\n## Safety\n- KHONG BAO GIO chay tren production database\n- Luon backup truoc khi xoa du lieu cu\n- Kiem tra bien NODE_ENV hoac APP_ENV truoc khi chay\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eScript seed database\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# .claude\/skills\/seed-database\/seed.py\nimport json\nimport os\nimport sys\nimport random\nfrom datetime import datetime, timedelta\n\n# Kiem tra moi truong\nenv = os.getenv('NODE_ENV', 'development')\nif env == 'production':\n    print(\"KHONG THE SEED PRODUCTION DATABASE!\")\n    sys.exit(1)\n\ndef load_fixtures(filename):\n    \"\"\"Doc du lieu mau tu file JSON.\"\"\"\n    filepath = os.path.join(os.path.dirname(__file__), 'fixtures', filename)\n    with open(filepath, 'r') as f:\n        return json.load(f)\n\ndef generate_users(count=50):\n    \"\"\"Tao du lieu users.\"\"\"\n    templates = load_fixtures('users.json')\n    users = []\n    for i in range(count):\n        template = random.choice(templates)\n        users.append({\n            'id': i + 1,\n            'name': f\"{template['first_name']} {template['last_name']}\",\n            'email': f\"user{i+1}@example.com\",\n            'role': random.choice(['customer', 'admin']) if i \u0026lt; 3 else 'customer',\n            'created_at': (datetime.now() - timedelta(days=random.randint(1, 365))).isoformat()\n        })\n    return users\n\ndef generate_products(count=100):\n    \"\"\"Tao du lieu products.\"\"\"\n    templates = load_fixtures('products.json')\n    products = []\n    for i in range(count):\n        template = random.choice(templates)\n        products.append({\n            'id': i + 1,\n            'name': f\"{template['name']} V{random.randint(1,5)}\",\n            'price': round(random.uniform(10, 500) * 1000, -3),\n            'category': template.get('category', 'general'),\n            'stock': random.randint(0, 200),\n            'created_at': datetime.now().isoformat()\n        })\n    return products\n\ndef generate_orders(count=200, user_count=50, product_count=100):\n    \"\"\"Tao du lieu orders.\"\"\"\n    orders = []\n    for i in range(count):\n        orders.append({\n            'id': i + 1,\n            'user_id': random.randint(1, user_count),\n            'product_id': random.randint(1, product_count),\n            'quantity': random.randint(1, 5),\n            'status': random.choice(['pending', 'paid', 'shipped', 'delivered']),\n            'created_at': (datetime.now() - timedelta(days=random.randint(0, 90))).isoformat()\n        })\n    return orders\n\ndef main():\n    # Parse arguments\n    counts = {\n        'users': int(sys.argv[1]) if len(sys.argv) \u0026gt; 1 else 50,\n        'products': int(sys.argv[2]) if len(sys.argv) \u0026gt; 2 else 100,\n        'orders': int(sys.argv[3]) if len(sys.argv) \u0026gt; 3 else 200,\n    }\n\n    print(f\"Seeding database ({env} environment)...\")\n\n    users = generate_users(counts['users'])\n    print(f\"  Created {len(users)} users\")\n\n    products = generate_products(counts['products'])\n    print(f\"  Created {len(products)} products\")\n\n    orders = generate_orders(counts['orders'], counts['users'], counts['products'])\n    print(f\"  Created {len(orders)} orders\")\n\n    print(f\"\nSeed completed successfully!\")\n    print(f\"Sample user: {json.dumps(users[0], indent=2)}\")\n\nif __name__ == \"__main__\":\n    main()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eChia sẻ Skills trong Team\u003c\/h2\u003e\n\u003cp\u003eMột trong những lợi ích lớn nhất của Custom Skills là khả năng chia sẻ giữa các thành viên team. Vì skills nằm trong thư mục \u003ccode\u003e.claude\/skills\/\u003c\/code\u003e và được commit vào git, mọi người trong team đều có thể sử dụng cùng một bộ skills.\u003c\/p\u003e\n\n\u003ch3\u003eQuy trình chia sẻ\u003c\/h3\u003e\n\u003col\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTạo skill:\u003c\/strong\u003e Một thành viên viết skill và test kỹ\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eReview:\u003c\/strong\u003e Team review SKILL.md và scripts như code bình thường\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMerge:\u003c\/strong\u003e Merge vào branch chính\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSử dụng:\u003c\/strong\u003e Tất cả thành viên pull và có thể sử dụng ngay\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003ch3\u003eVersion control cho Skills\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Cau truc git-friendly\n.claude\/\n  skills\/\n    deploy\/\n      SKILL.md          # Huong dan — luon duoc review\n      deploy.sh         # Script — can test truoc khi merge\n      health-check.py   # Script — can test truoc khi merge\n      CHANGELOG.md      # Lich su thay doi cua skill\n    .gitignore          # Bo qua logs, temp files\n\n# .claude\/skills\/.gitignore\n*.log\n__pycache__\/\n.env\ntemp\/\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eConvention cho team\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eMỗi skill phải có SKILL.md với format chuẩn\u003c\/li\u003e\n  \u003cli\u003eScripts phải có error handling và exit codes rõ ràng\u003c\/li\u003e\n  \u003cli\u003eKhông hardcode credentials — dùng biến môi trường\u003c\/li\u003e\n  \u003cli\u003eGhi CHANGELOG khi update skill\u003c\/li\u003e\n  \u003cli\u003eViết comments bằng tiếng Anh trong scripts để team quốc tế đọc được\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eTesting Skills trước khi sử dụng\u003c\/h2\u003e\n\u003cp\u003eTrước khi commit một skill mới, bạn cần test kỹ lưỡng:\u003c\/p\u003e\n\n\u003ch3\u003eTest thủ công\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# 1. Kich hoat skill bang cach noi voi Claude Code\n# Vi du: \"deploy ung dung len production\"\n# Claude se doc SKILL.md va thuc hien theo huong dan\n\n# 2. Kiem tra Claude co doc dung SKILL.md khong\n# Hoi: \"Ban dang su dung skill nao? Mo ta cac buoc.\"\n\n# 3. Test tung script doc lap\npython .claude\/skills\/deploy\/health-check.py\nbash .claude\/skills\/deploy\/deploy.sh\n\n# 4. Test edge cases\n# - Chay khi khong co internet\n# - Chay khi database chua khoi dong\n# - Chay voi quyen han thieu\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eChecklist review skill\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eSKILL.md có rõ ràng và đầy đủ không?\u003c\/li\u003e\n  \u003cli\u003eTrigger conditions có chính xác không? (Không bị kích hoạt nhầm)\u003c\/li\u003e\n  \u003cli\u003eScripts có error handling không?\u003c\/li\u003e\n  \u003cli\u003eCó safety checks không? (Đặc biệt với production)\u003c\/li\u003e\n  \u003cli\u003eCó log output để debug không?\u003c\/li\u003e\n  \u003cli\u003eDependencies đã được ghi rõ chưa?\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eSkill Marketplace và Cộng đồng\u003c\/h2\u003e\n\u003cp\u003eNgoài việc tạo skills riêng, bạn có thể tham khảo và sử dụng skills từ cộng đồng. Một số nguồn:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eGitHub repositories:\u003c\/strong\u003e Tìm kiếm \"claude code skills\" trên GitHub để thấy các skill open-source\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTeam internal registry:\u003c\/strong\u003e Tạo một repo riêng chứa các skills chuẩn của công ty\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eClaude Code community:\u003c\/strong\u003e Tham gia các diễn đàn và group để chia sẻ skills\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eCài đặt skill từ bên ngoài\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Clone skill tu GitHub\ngit clone https:\/\/github.com\/example\/claude-skill-deploy.git temp-skill\n\n# Copy vao project\ncp -r temp-skill\/.claude\/skills\/deploy .claude\/skills\/\n\n# Doc SKILL.md de hieu cach su dung\ncat .claude\/skills\/deploy\/SKILL.md\n\n# Tuy chinh theo nhu cau cua project\n# Sua SERVER, APP_DIR, va cac config khac\n\n# Xoa temp\nrm -rf temp-skill\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eNhững sai lầm thường gặp\u003c\/h2\u003e\n\n\u003ch3\u003e1. Skill quá rộng\u003c\/h3\u003e\n\u003cp\u003eMột skill nên làm tốt một việc. Đừng tạo skill \"làm mọi thứ\" — hãy chia thành nhiều skill nhỏ, mỗi skill có trách nhiệm rõ ràng.\u003c\/p\u003e\n\n\u003ch3\u003e2. Không có safety checks\u003c\/h3\u003e\n\u003cp\u003eĐặc biệt với các skill ảnh hưởng đến production (deploy, database operations), luôn kiểm tra môi trường và yêu cầu xác nhận trước khi thực hiện hành động nguy hiểm.\u003c\/p\u003e\n\n\u003ch3\u003e3. Hardcode thông tin nhạy cảm\u003c\/h3\u003e\n\u003cp\u003eKhông bao giờ ghi trực tiếp password, API key hay server address vào SKILL.md hoặc scripts. Dùng biến môi trường và file .env (đã được gitignore).\u003c\/p\u003e\n\n\u003ch3\u003e4. Không cập nhật SKILL.md\u003c\/h3\u003e\n\u003cp\u003eKhi scripts thay đổi nhưng SKILL.md không được cập nhật, Claude sẽ làm theo hướng dẫn cũ và gặp lỗi. Luôn cập nhật đồng bộ giữa SKILL.md và scripts.\u003c\/p\u003e\n\n\u003ch3\u003e5. Trigger quá chung chung\u003c\/h3\u003e\n\u003cp\u003eTrigger như \"khi người dùng yêu cầu bất cứ điều gì liên quan đến code\" sẽ khiến skill bị kích hoạt nhầm. Viết trigger cụ thể: \"khi người dùng yêu cầu deploy lên staging hoặc production server\".\u003c\/p\u003e\n\n\u003ch2\u003eSkill Dependencies và Environment Setup\u003c\/h2\u003e\n\u003cp\u003eNhiều skills cần các thư viện hoặc công cụ bên ngoài để hoạt động. Bạn cần quản lý dependencies một cách có hệ thống để đảm bảo skill chạy được trên mọi máy của thành viên team.\u003c\/p\u003e\n\n\u003ch3\u003eFile requirements cho Python skills\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# .claude\/skills\/requirements.txt\n# Dung chung cho tat ca skills\nrequests\u0026gt;=2.28.0\npython-dotenv\u0026gt;=1.0.0\n\n# Cho skill deploy\nparamiko\u0026gt;=3.0.0    # SSH connections\n\n# Cho skill generate-docs\npyyaml\u0026gt;=6.0.0      # Parse YAML configs\njinja2\u0026gt;=3.1.0      # Template rendering\n\n# Cho skill seed-database\nfaker\u0026gt;=18.0.0      # Generate fake data\npsycopg2-binary\u0026gt;=2.9.0  # PostgreSQL connection\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eSetup script tự động\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e#!\/bin\/bash\n# .claude\/skills\/setup.sh\n# Chay mot lan khi clone project hoac khi co skill moi\n\nset -euo pipefail\n\necho \"Setting up Claude Code Skills environment...\"\n\n# Tao virtual environment neu chua co\nif [ ! -d \".claude\/skills\/.venv\" ]; then\n    python3 -m venv .claude\/skills\/.venv\n    echo \"Created virtual environment\"\nfi\n\n# Kich hoat venv va cai dependencies\nsource .claude\/skills\/.venv\/bin\/activate\npip install -r .claude\/skills\/requirements.txt --quiet\n\necho \"All dependencies installed\"\n\n# Kiem tra cac bien moi truong can thiet\nrequired_vars=(\"SSH_KEY_PATH\" \"DATABASE_URL\")\nfor var in \"${required_vars[@]}\"; do\n    if [ -z \"${!var:-}\" ]; then\n        echo \"WARNING: $var chua duoc set\"\n    fi\ndone\n\necho \"Setup completed\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eKhi một thành viên mới tham gia project, họ chỉ cần chạy một lệnh duy nhất để cài đặt môi trường cho tất cả skills. Điều này giảm thời gian onboarding và tránh lỗi \"chạy trên máy tôi được\" (works on my machine).\u003c\/p\u003e\n\n\u003ch3\u003eXử lý biến môi trường trong skills\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# .claude\/skills\/.env.example (commit vao git)\nSSH_KEY_PATH=~\/.ssh\/id_rsa\nDATABASE_URL=postgresql:\/\/user:pass@localhost:5432\/mydb\nDEPLOY_SERVER=user@production.example.com\n\n# .claude\/skills\/.env (KHONG commit, moi nguoi co rieng)\nSSH_KEY_PATH=\/home\/dev\/.ssh\/deploy_key\nDATABASE_URL=postgresql:\/\/dev:secret@localhost:5432\/myapp_dev\nDEPLOY_SERVER=admin@10.0.1.50\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eSkill Chaining — Kết nối nhiều Skills\u003c\/h2\u003e\n\u003cp\u003eĐôi khi bạn muốn chạy nhiều skills liên tiếp. Ví dụ: chạy tests, generate docs, rồi deploy. Skill chaining cho phép bạn định nghĩa các workflow gồm nhiều skills:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Skill: Release Pipeline\n\n## Description\nChay toan bo quy trinh release: test, build, generate docs, deploy.\n\n## Trigger\nKich hoat khi nguoi dung yeu cau \"release\", \"ship it\",\nhoac \"chay release pipeline\".\n\n## Instructions\n\n### Buoc 1: Chay test suite\nKich hoat skill \"test\" (neu co) hoac chay truc tiep:\n- npm run test\n- Neu co test that bai, DUNG LAI va bao nguoi dung\n\n### Buoc 2: Generate docs\nKich hoat skill \"generate-docs\":\n- Cap nhat API reference tu source code\n- Commit thay doi docs neu co\n\n### Buoc 3: Build\n- Chay npm run build\n- Kiem tra output khong co errors\n\n### Buoc 4: Deploy\nKich hoat skill \"deploy\":\n- Deploy len staging truoc\n- Chay health check\n- Neu staging OK, hoi nguoi dung co muon deploy production khong\n\n### Buoc 5: Post-release\n- Tao git tag voi version tu package.json\n- In ra release notes tu cac commits ke tu tag truoc\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eSkill chaining giúp bạn tự động hóa các quy trình phức tạp bằng cách kết hợp các skills đơn giản đã có. Mỗi skill vẫn được maintain độc lập, nhưng có thể làm việc cùng nhau khi cần.\u003c\/p\u003e\n\n\u003ch2\u003eNâng cao: Skill kết hợp với Hooks\u003c\/h2\u003e\n\u003cp\u003eBạn có thể kết hợp skills với Claude Code hooks để tự động kích hoạt skill tại các thời điểm cụ thể:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e\/\/ .claude\/settings.json\n{\n  \"hooks\": {\n    \"pre-commit\": {\n      \"command\": \"python .claude\/skills\/generate-docs\/generate.py\",\n      \"description\": \"Tu dong cap nhat API docs truoc moi commit\"\n    },\n    \"post-merge\": {\n      \"command\": \"python .claude\/skills\/seed-database\/seed.py 10 20 50\",\n      \"description\": \"Seed du lieu mau sau khi merge branch moi\"\n    }\n  }\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eVới hooks, skills không chỉ được gọi thủ công mà còn có thể chạy tự động theo các sự kiện trong workflow phát triển.\u003c\/p\u003e\n\n\u003ch2\u003eTóm tắt\u003c\/h2\u003e\n\u003cp\u003eCustom Skills biến Claude Code từ một công cụ thông minh thành một trợ lý được cá nhân hóa hoàn toàn cho project và team của bạn. Các điểm chính:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eSKILL.md là file cốt lõi định nghĩa hành vi của skill\u003c\/li\u003e\n  \u003cli\u003eKết hợp instructions và scripts để tự động hóa tác vụ phức tạp\u003c\/li\u003e\n  \u003cli\u003eChia sẻ skills qua git để cả team cùng hưởng lợi\u003c\/li\u003e\n  \u003cli\u003eLuôn test kỹ và có safety checks cho các skill nguy hiểm\u003c\/li\u003e\n  \u003cli\u003eGiữ skill nhỏ gọn, mỗi skill làm tốt một việc\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eKhám phá thêm các hướng dẫn thực hành Claude Code tại \u003ca href=\"\/en\/collections\/ung-dung\"\u003eThư viện Ứng dụng\u003c\/a\u003e.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47730151227604,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/tao-custom-skills-cho-claude-code-mo-rong-kha-nang-voi-skill-md.jpg?v=1774715573","url":"https:\/\/claude.vn\/en\/products\/tao-custom-skills-cho-claude-code-mo-rong-kha-nang-voi-skill-md","provider":"CLAUDE.VN","version":"1.0","type":"link"}