@aliosmanozturk
# Nguyên tắc cam kết Git cho mô hình ngôn ngữ AI ## Nguyên tắc cốt lõi 1. **Tuân theo các cam kết thông thường** (https://www.conventionalcommits.org/) 2. **Hãy ngắn gọn và chính xác** - Không dùng ngôn ngữ hoa mỹ, so sánh nhất hoặc tính từ không cần thiết 3. **Tập trung vào NHỮNG GÌ đã thay đổi, chứ không phải CÁCH hoạt động** - Mô tả sự thay đổi, không phải chi tiết triển khai 4. **Một thay đổi logic cho mỗi lần xác nhận** - Chia các thay đổi có liên quan nhưng độc lập thành các lần xác nhận riêng biệt 5. **Viết với tâm trạng bắt buộc** - "Thêm tính năng" chứ không phải "Thêm tính năng" hoặc "Thêm tính năng" 6. **Luôn bao gồm nội dung** - Không bao giờ sử dụng các cam kết chỉ có chủ đề ## Cấu trúc thông báo cam kết ``` <type>(<scope>): <subject> <body> <footer> ``` ### Loại (Bắt buộc) - `feat`: Tính năng mới - `fix`: Sửa lỗi - `refactor`: Thay đổi mã không sửa lỗi cũng như không thêm tính năng - `perf`: Cải thiện hiệu suất - `style`: Thay đổi kiểu mã (định dạng, thiếu dấu chấm phẩy, v.v.) - `test`: Thêm hoặc cập nhật bài kiểm tra - `docs`: Thay đổi tài liệu - `build`: Xây dựng hệ thống hoặc các phần phụ thuộc bên ngoài (npm, gradle, Xcode, SPM) - `ci`: Thay đổi đường dẫn CI/CD - `chore`: Tác vụ thường xuyên (gitignore, tệp cấu hình, bảo trì) - `revert`: Hoàn nguyên cam kết trước đó ### Phạm vi (Tùy chọn nhưng được khuyến nghị) Cho biết khu vực thay đổi: `auth`, `ui`, `api`, `db`, `i18n`, `analytics`, v.v. ### Chủ đề (Bắt buộc) - **Tối đa 50 ký tự** - **Chữ cái đầu tiên viết thường** (trừ khi đó là danh từ riêng) - **Không có dấu chấm ở cuối** - **Tâm trạng bắt buộc**: "thêm" chứ không phải "thêm" hoặc "thêm" - **Hãy cụ thể**: "thêm xác thực email" chứ không phải "thêm xác thực" ### Nội dung (Bắt buộc) - **Luôn bao gồm nội dung** - Tối thiểu 1 câu - **Giải thích NHỮNG GÌ đã thay đổi và TẠI SAO** - Cung cấp ngữ cảnh - **Bọc ở 72 ký tự** - **Tách khỏi chủ đề bằng dòng trống** - **Sử dụng dấu đầu dòng cho nhiều thay đổi** (sử dụng `-` hoặc `*`) - **Số vấn đề tham khảo** nếu có - **Đề cập đến các lớp/hàm/tệp cụ thể khi có liên quan** ### Chân trang (Tùy chọn) - **Những thay đổi đáng chú ý**: `BREAKING CHANGE: <description>` - **Tài liệu tham khảo về vấn đề**: `Closes #123`, `Fixes #456` - **Đồng tác giả**: `Co-Authored-By: Name <email>` ## Các từ và cụm từ bị cấm **KHÔNG BAO GIỜ sử dụng những từ này** (chúng mơ hồ, chủ quan hoặc cường điệu): ❌ Toàn diện ❌ Mạnh mẽ ❌ Tăng cường ❌ Được cải thiện (trừ khi bạn chỉ định số liệu nào được cải thiện) ❌ Đã tối ưu hóa (trừ khi bạn chỉ định số liệu nào được cải thiện) ❌ Tốt hơn ❌ Tuyệt vời ❌ Tuyệt vời ❌ Tuyệt vời ❌ Mạnh mẽ ❌ Liền mạch ❌ Thanh lịch ❌ Sạch sẽ ❌ Hiện đại ❌ Nâng cao ## Ví dụ tốt và xấu ### ❌ XẤU (Không có nội dung) ``` feat(auth): add email/password login ``` **Vấn đề:** - Không có nội dung - Không giải thích những gì đã thực sự được thực hiện ### ❌ Xấu (Nội dung mơ hồ) ``` feat: Add awesome new login feature This commit adds a powerful new login system with robust authentication and enhanced security features. The implementation is clean and modern. ``` **Vấn đề:** - Tính từ chủ quan (tuyệt vời, mạnh mẽ, mạnh mẽ, nâng cao, sạch sẽ, hiện đại) - Không chỉ định những gì đã được thêm vào - Thân thể mô tả chất lượng, không phải chức năng ### ✅TỐT ``` feat(auth): add email/password login with Firebase Implement login flow using Firebase Authentication. Users can now sign in with email and password. Includes client-side email validation and error handling for network failures and invalid credentials. ``` **Tại sao nó tốt:** - Công nghệ cụ thể được đề cập (Firebase) - Phạm vi rõ ràng (auth) - Nội dung mô tả chức năng nào đã được thêm vào - Giải thích nội dung xử lý lỗi --- ### ❌ XẤU (Không có nội dung) ``` fix(auth): prevent login button double-tap ``` **Vấn đề:** - Không có nội dung giải thích cách khắc phục ### ✅TỐT ``` fix(auth): prevent login button double-tap Disable login button after first tap to prevent duplicate authentication requests when user taps multiple times quickly. Button re-enables after authentication completes or fails. ``` **Tại sao nó tốt:** - Tâm trạng cấp bách - Vấn đề cụ thể được mô tả - Phần thân giải thích cả cách tiếp cận vấn đề và giải pháp --- ### ❌ Xấu ``` refactor(auth): extract helper functions Make code better and more maintainable by extracting functions. ``` **Vấn đề:** - Chủ quan (tốt hơn, có thể duy trì được) - Không cụ thể về chức năng nào ### ✅TỐT ``` refactor(auth): extract helper functions to static struct methods Convert private functions randomNonceString and sha256 into static methods of AppleSignInHelper struct for better code organization and namespacing. ``` **Tại sao nó tốt:** - Thay đổi cụ thể được mô tả - Đề cập đến tên chức năng chính xác - Phần thân giải thích lý luận và cấu trúc mới --- ### ❌ Xấu ``` feat(i18n): add localization ``` **Vấn đề:** - Không có xác - Quá mơ hồ ### ✅TỐT ``` feat(i18n): add English and Turkish translations for login screen Create String Catalog with translations for login UI elements, alerts, and authentication errors in English and Turkish. Covers all user-facing strings in LoginView, LoginViewController, and AuthService. ``` **Tại sao nó tốt:** - Ngôn ngữ cụ thể được đề cập - Phạm vi rõ ràng (i18n) - Nội dung liệt kê những gì đã được dịch và những tập tin nào --- ## Nguyên tắc cam kết nhiều tệp ### Thời điểm phân chia cam kết Chia các thay đổi thành các cam kết riêng biệt khi: 1. **Các mối quan tâm logic khác nhau** - ✅ Cam kết 1: Thêm chức năng - ✅ Cam kết 2: Thêm test cho chức năng 2. **Phạm vi khác nhau** - ✅ Cam kết 1: `feat(ui): add button component` - ✅ Cam kết 2: `feat(api): add endpoint for button action` 3. **Các loại khác nhau** - ✅ Cam kết 1: `feat(auth): add login form` - ✅ Cam kết 2: `refactor(auth): extract validation logic` ### Khi nào nên kết hợp các cam kết Kết hợp các thay đổi trong một lần xác nhận khi: 1. **Những thay đổi được kết hợp chặt chẽ** - ✅ Thêm chức năng và cách sử dụng trong cùng một thành phần 2. **Biến đổi nguyên tử** - ✅ Tái cấu trúc tên hàm trên nhiều file 3. **Chia tay mà không có nhau** - ✅ Thêm giao diện và cách thực hiện cùng nhau ## Chiến lược cam kết cấp tệp ### Ví dụ: Đăng nhậpXem thay đổi Nếu loginView có 2 thay đổi độc lập: **Thay đổi 1:** Tái cấu trúc cấu trúc khung nhìn ngăn xếp **Thay đổi 2:** Thêm chỉ báo tải **Chia thành 2 commit:** ``` refactor(ui): extract content stack view as property in login view Change inline stack view initialization to property-based approach for better code organization and reusability. Moves stack view definition from setupUI method to lazy property. ``` ``` feat(ui): add loading state with activity indicator to login view Add loading indicator overlay and setLoading method to disable user interaction and dim content during authentication. Content alpha reduces to 0.5 when loading. ``` ## Nguyên tắc cụ thể theo bản địa hóa ### ✅TỐT ``` feat(i18n): add English and Turkish translations Create String Catalog (Localizable.xcstrings) with English and Turkish translations for all login screen strings, error messages, and alerts. ``` ``` build(i18n): add Turkish localization support Add Turkish language to project localizations and enable String Catalog generation (SWIFT_EMIT_LOC_STRINGS) in build settings for Debug and Release configurations. ``` ``` feat(i18n): localize login view UI elements Replace hardcoded strings with NSLocalizedString in LoginView for title, subtitle, labels, placeholders, and button titles. All user-facing text now supports localization. ``` ### ❌ Xấu ``` feat: Add comprehensive multi-language support Add awesome localization system to the app. ``` ``` feat: Add translations ``` ## Thay đổi đột phá Khi giới thiệu những thay đổi đột phá: ``` feat(api): change authentication response structure Authentication endpoint now returns user object in 'data' field instead of root level. This allows for additional metadata in the response. BREAKING CHANGE: Update all API consumers to access response.data.user instead of response.user. Migration guide: - Before: const user = response.user - After: const user = response.data.user ``` ## Cam kết đặt hàng Khi chuẩn bị nhiều lần xác nhận, hãy sắp xếp chúng một cách hợp lý: 1. **Phụ thuộc trước tiên**: Thêm thư viện/cấu hình trước khi sử dụng 2. **Nền tảng trước tính năng**: Mô hình trước quan điểm 3. **Build before source**: Xây dựng cấu hình trước khi thay đổi mã 4. **Tiện ích trước người tiêu dùng**: Người trợ giúp trước các thành phần sử dụng chúng ### Thứ tự ví dụ: ``` 1. build(auth): add Sign in with Apple entitlement Add entitlements file with Sign in with Apple capability for enabling Apple ID authentication. 2. feat(auth): add Apple Sign-In cryptographic helpers Add utility functions for generating random nonce and SHA256 hashing required for Apple Sign-In authentication flow. 3. feat(auth): add Apple Sign-In authentication to AuthService Add signInWithApple method to AuthService protocol and implementation. Uses OAuthProvider credential with idToken and nonce for Firebase authentication. 4. feat(auth): add Apple Sign-In flow to login view model Implement loginWithApple method in LoginViewModel to handle Apple authentication with idToken, nonce, and fullName. 5. feat(auth): implement Apple Sign-In authorization flow Add ASAuthorizationController delegate methods to handle Apple Sign-In authorization, credential validation, and error handling. ``` ## Trường hợp đặc biệt ### Tệp cấu hình ``` chore: ignore GoogleService-Info.plist from version control Add GoogleService-Info.plist to .gitignore to prevent committing Firebase configuration with API keys. ``` ``` build: update iOS deployment target to 15.0 Change minimum iOS version from 14.0 to 15.0 to support async/await syntax in authentication flows. ``` ``` ci: add GitHub Actions workflow for testing Add workflow to run unit tests on pull requests. Runs on macOS latest with Xcode 15. ``` ### Tài liệu ``` docs: add API authentication guide Document Firebase Authentication setup process, including Google Sign-In and Apple Sign-In configuration steps. ``` ``` docs: update README with installation steps Add SPM dependency installation instructions and Firebase setup guide. ``` ### Tái cấu trúc ``` refactor(auth): convert helper functions to static struct methods Wrap Apple Sign-In helper functions in AppleSignInHelper struct with static methods for better code organization and namespacing. Converts randomNonceString and sha256 from private functions to static methods. ``` ``` refactor(ui): extract email validation to separate method Move email validation regex logic from loginWithEmail to isValidEmail method for reusability and testability. ``` ### Hiệu suất **Chỉ định cải tiến:** ❌ `perf: optimize login` ✅ ``` perf(auth): reduce login request time from 2s to 500ms Add request caching for Firebase configuration to avoid repeated network calls. Configuration is now cached after first retrieval. ``` ## Yêu cầu về nội dung văn bản **Yêu cầu tối thiểu đối với nội dung:** 1. **Ít nhất 1-2 câu hoàn chỉnh** 2. **Mô tả cụ thể NHỮNG GÌ đã được thay đổi** 3. **Giải thích TẠI SAO cần thay đổi (khi không rõ ràng)** 4. **Đề cập đến các thành phần/tệp bị ảnh hưởng khi có liên quan** 5. **Bao gồm các chi tiết kỹ thuật mà chủ đề không thể hiện rõ** ### Ví dụ về Thân hình Tốt: ``` Add loading indicator overlay and setLoading method to disable user interaction and dim content during authentication. ``` ``` Update signInWithApple method to accept fullName parameter and use appleCredential for proper user profile creation in Firebase. ``` ``` Replace hardcoded strings with NSLocalizedString in LoginView for title, labels, placeholders, and buttons. All UI text now supports English and Turkish translations. ``` ### Ví dụ về Thân hình Xấu: ❌ `Add feature.` (quá mơ hồ) ❌ `Updated files.` (không giải thích cái gì) ❌ `Bug fix.` (không giải thích lỗi gì) ❌ `Refactoring.` (không giải thích những gì đã được tái cấu trúc) ## Mẫu cho mô hình AI Khi một mô hình AI được yêu cầu tạo các cam kết: ``` 1. Read git diff to understand ALL changes 2. Group changes by logical concern 3. Order commits by dependency 4. For each commit: - Choose appropriate type and scope - Write specific, concise subject (max 50 chars) - Write detailed body (minimum 1-2 sentences, required) - Use imperative mood - Avoid banned words - Focus on WHAT changed and WHY 5. Output format: ## Commit [N] **Title:** ``` loại (phạm vi): chủ đề ``` **Description:** ``` Nội dung giải thích những gì đã thay đổi và tại sao. Đề cập cụ thể các thành phần, lớp hoặc phương thức bị ảnh hưởng. Cung cấp bối cảnh. ``` **Files to add:** ```bash git thêm đường dẫn/vào/tập tin ``` ``` ## Danh sách kiểm tra cuối cùng Trước khi đề xuất cam kết, hãy xác minh: - [ ] Loại đúng (feat/fix/refactor/etc.) - [ ] Phạm vi cụ thể và có ý nghĩa - [ ] Chủ ngữ là tâm trạng bắt buộc - [ ] Chủ đề có 50 ký tự - [ ] **Có nội dung (bắt buộc)** - [ ] **Nội dung có ít nhất 1-2 câu hoàn chỉnh** - [ ] Nội dung giải thích CÁI GÌ và TẠI SAO - [ ] Không sử dụng từ bị cấm - [ ] Không có tính từ chủ quan - [ ] Cụ thể về NHỮNG GÌ đã thay đổi - [ ] Đề cập đến các thành phần/tệp bị ảnh hưởng - [ ] Một thay đổi logic cho mỗi lần xác nhận - [ ] Các tệp được nhóm chính xác --- ## Thông báo cam kết ví dụ (Hoàn thành) ``` feat(auth): add email validation to login form Implement client-side email validation using regex pattern before sending authentication request. Validates format matches standard email pattern (user@domain.ext) and displays error message for invalid inputs. Prevents unnecessary Firebase API calls for malformed emails. ``` **Điều gì làm cho điều này tốt:** - Loại và phạm vi rõ ràng - Chủ đề cụ thể - Nội dung giải thích việc xác thực làm gì - Phần thân giải thích vì sao cần thiết - Đề cập đến lợi ích (ngăn chặn các lệnh gọi API) - Không có từ bị cấm - Tâm trạng bắt buộc trong suốt --- **Hãy nhớ:** Một thông báo cam kết tốt phải cho phép ai đó hiểu được sự thay đổi mà không cần nhìn vào sự khác biệt. Hãy cụ thể, ngắn gọn, khách quan và luôn bao gồm nội dung có ý nghĩa.