home / skills / masanao-ohba / claude-manifests / git-operator

git-operator skill

/skills/generic/git-operator

This skill manages git operations with conventional commits, grouping related changes and enforcing project-specific policies for clean, auditable history.

npx playbooks add skill masanao-ohba/claude-manifests --skill git-operator

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
15.7 KB
---
name: git-operator
description: Manages Git operations including commits with appropriate conventions, combining related changes logically and following project-specific policies
hooks:
  SessionStart:
    - type: command
      command: |
        if command -v yq &> /dev/null && [ -f ".claude/config.yaml" ]; then
          echo "=== Git Configuration ==="
          yq -o=json '.output.language' .claude/config.yaml 2>/dev/null || true
          yq -o=json '.git' .claude/config.yaml 2>/dev/null || true
        fi
---

# Generic Git Operator

A technology-agnostic skill for managing Git operations according to best practices and project-specific conventions.

## Configuration

This skill reads settings from `.claude/config.yaml`:

```yaml
git:
  operations:
    commit: auto          # auto|user_request_only|prohibited
    push: user_request_only
  commit_message:
    format: conventional  # conventional|simple|custom
```

**Defaults** (when config not set):
- commit: user_request_only
- push: user_request_only
- format: conventional

## Core Responsibilities

### 1. Commit Message Principles

**Focus on Role and Definition, Not Description**

```yaml
Good Examples:
  # Role-focused (what this commit accomplishes)
  - "Add user authentication"
  - "Fix race condition in data loader"
  - "Refactor database connection pooling"
  - "Remove deprecated API endpoints"

Bad Examples:
  # Descriptive (what you did, not what it accomplishes)
  - "Changed login function to use JWT tokens"  # ❌ Too descriptive
  - "Modified the database file to support pooling"  # ❌ Describes changes, not purpose
  - "Updated API routes because they were old"  # ❌ Explains process, not result
```

### 2. Commit Grouping Strategy

**Logical Grouping by Purpose**

```yaml
Grouping Rules:
  same_purpose:
    description: "Changes that accomplish the same goal belong in one commit"
    examples:
      - "Add validation: validator file + tests + integration"
      - "Fix bug: root cause fix + related edge case fixes"
      - "Refactor: extracted functions + updated call sites"

  separate_concerns:
    description: "Different purposes must be in separate commits"
    examples:
      - "feat: Add feature X" + "test: Add tests for feature X" # ❌ Should be one commit
      - "fix: Bug A" + "fix: Unrelated bug B" # ❌ Should be separate
      - "refactor: Module A" + "refactor: Module B" # ❌ Only combine if same refactoring goal

  atomic_commits:
    description: "Each commit should be independently functional"
    rules:
      - "Commit should not break the build"
      - "Tests should pass after the commit"
      - "Commit should be revertable without side effects"
```

**Conventional Commit Format**

```yaml
Format: "<type>: <subject>"

Types:
  feat:
    description: "New feature or capability"
    examples:
      - "feat: Add password reset functionality"
      - "feat: Add CSV export for reports"

  fix:
    description: "Bug fix"
    examples:
      - "fix: Resolve memory leak in cache"
      - "fix: Correct timezone calculation"

  refactor:
    description: "Code restructuring without behavior change"
    examples:
      - "refactor: Extract validation logic"
      - "refactor: Simplify error handling"

  docs:
    description: "Documentation changes only"
    examples:
      - "docs: Update API documentation"
      - "docs: Add architecture decision record"

  test:
    description: "Test additions or modifications only (when not part of feat/fix)"
    examples:
      - "test: Add edge cases for parser"
      - "test: Improve test coverage for auth module"

  chore:
    description: "Maintenance tasks, dependencies, configuration"
    examples:
      - "chore: Update dependencies"
      - "chore: Configure CI pipeline"

  perf:
    description: "Performance improvements"
    examples:
      - "perf: Optimize database queries"
      - "perf: Add caching layer"

  style:
    description: "Code style changes (formatting, whitespace)"
    examples:
      - "style: Apply code formatter"
      - "style: Fix linting errors"
```

### 3. Commit Message Language

**Follow Project Output Language**

```yaml
Language Policy:
  source: "Read from .claude/config.yaml -> output.language"

  examples:
    en:
      - "feat: Add user authentication"
      - "fix: Resolve race condition"
      - "refactor: Extract validation logic"

    ja:
      - "feat: ユーザー認証を追加"
      - "fix: 競合状態を解決"
      - "refactor: バリデーションロジックを抽出"

  guidelines:
    - "Use configured output language consistently"
    - "Keep technical terms in original language when appropriate"
    - "Maintain clarity and brevity regardless of language"
```

### 4. Claude Code Signature Policy

**Conditional Signature Inclusion**

```yaml
Signature Policy:
  source: "Read from .claude/config.yaml -> git.claude_signature"

  when_enabled:
    format: |
      commit message body

      🤖 Generated with [Claude Code](https://claude.com/claude-code)

      Co-Authored-By: Claude <[email protected]>

    example: |
      feat: Add user authentication

      Implemented JWT-based authentication with refresh tokens.

      🤖 Generated with [Claude Code](https://claude.com/claude-code)

      Co-Authored-By: Claude <[email protected]>

  when_disabled:
    format: |
      commit message body

    example: |
      feat: Add user authentication

      Implemented JWT-based authentication with refresh tokens.

  default: false  # If not specified in config, do not add signature
```

### 5. Git Push Policy

**Conditional Push Permission**

```yaml
Push Policy:
  source: "Read from .claude/config.yaml -> git.allow_push"

  when_allowed:
    - "Execute git push after successful commit"
    - "Confirm push was successful"
    - "Report remote branch status to user"

  when_disallowed:
    - "Do NOT execute git push"
    - "Inform user that commit is local only"
    - "Remind user to push manually if needed"

  default: false  # If not specified in config, do not push
```

### 6. Pre-Commit Workflow

**Standard Commit Process**

```yaml
Commit Workflow:
  step_1_status:
    command: "git status"
    purpose: "Identify all changes (staged, unstaged, untracked)"
    output: "Present to user for confirmation"

  step_2_diff:
    command: "git diff HEAD"
    purpose: "Review actual code changes"
    output: "Analyze for commit message creation"

  step_3_history:
    command: "git log --oneline -10"
    purpose: "Understand project's commit style"
    output: "Match existing conventions"

  step_4_group:
    action: "Group changes by logical purpose"
    rules:
      - "Same goal = one commit"
      - "Different goals = separate commits"
      - "Each commit should be atomic and functional"

  step_5_message:
    action: "Draft commit message(s)"
    rules:
      - "Follow conventional commit format"
      - "Use configured output language"
      - "Focus on role/purpose, not description"
      - "Include Claude signature if enabled in config"

  step_6_stage:
    command: "git add {files}"
    purpose: "Stage files for current commit"
    notes: "May need multiple add commands for grouped commits"

  step_7_commit:
    command: "git commit -m \"$(cat <<'EOF'\\n{message}\\nEOF\\n)\""
    purpose: "Create commit with formatted message"
    notes: "Use HEREDOC for multi-line messages"

  step_8_verify:
    command: "git status"
    purpose: "Confirm commit was created successfully"

  step_9_push:
    condition: "if git.allow_push is true"
    command: "git push"
    purpose: "Push commits to remote repository"
    fallback: "Inform user to push manually"
```

### 7. Configuration Integration

**Required Configuration Structure**

```yaml
# Example .claude/config.yaml structure

output:
  language: en  # or ja, etc.

git:
  claude_signature: false  # true to include Claude Code signature
  allow_push: false  # true to automatically push after commit

  commit_strategy:
    message_format: "conventional"  # conventional, semantic, custom
    examples:
      - "feat: Add new feature X"
      - "fix: Resolve bug in Y"
      - "refactor: Restructure Z"
```

### 8. Commit Quality Checklist

**Pre-Commit Validation**

```yaml
Quality Checklist:
  message:
    - [ ] Follows conventional commit format
    - [ ] Uses correct output language from config
    - [ ] Focuses on role/purpose, not description
    - [ ] Is clear and concise
    - [ ] Includes signature only if enabled in config

  changes:
    - [ ] All related changes are grouped logically
    - [ ] Unrelated changes are in separate commits
    - [ ] Commit is atomic (can be reverted independently)
    - [ ] Tests pass after commit (if applicable)
    - [ ] Build succeeds after commit

  process:
    - [ ] Reviewed git status before committing
    - [ ] Reviewed git diff to understand changes
    - [ ] Checked git log for convention consistency
    - [ ] Staged only files for current commit
    - [ ] Verified commit with git status after
    - [ ] Pushed only if allowed by config
```

## Workflow Examples

### Example 1: Feature Implementation with Tests

```yaml
Scenario: "Implemented user authentication with tests"

Analysis:
  changes:
    - backend/auth.py (new authentication module)
    - backend/tests/test_auth.py (tests for authentication)
    - backend/models/user.py (user model updates)
  purpose: "Add complete authentication feature"
  decision: "Single commit - all changes serve same purpose"

Commit Message (config.output.language: en, git.claude_signature: false):
  |
  feat: Add user authentication

  Implemented JWT-based authentication with refresh tokens and comprehensive test coverage.

Commands:
  - git add backend/auth.py backend/tests/test_auth.py backend/models/user.py
  - git commit -m "$(cat <<'EOF'
    feat: Add user authentication

    Implemented JWT-based authentication with refresh tokens and comprehensive test coverage.
    EOF
    )"
  - git status
  - (No push - git.allow_push: false)
```

### Example 2: Multiple Unrelated Fixes

```yaml
Scenario: "Fixed two unrelated bugs"

Analysis:
  changes:
    - frontend/components/DatePicker.js (timezone bug)
    - backend/services/email.py (SMTP connection bug)
  purpose: "Two different bug fixes"
  decision: "Two separate commits - different concerns"

Commit 1 (config.output.language: ja, git.claude_signature: true):
  |
  fix: DatePickerのタイムゾーン処理を修正

  ユーザーのローカルタイムゾーンを正しく適用するように修正。

  🤖 Generated with [Claude Code](https://claude.com/claude-code)

  Co-Authored-By: Claude <[email protected]>

Commit 2:
  |
  fix: SMTP接続のタイムアウト処理を修正

  接続タイムアウト時に適切にリトライするように修正。

  🤖 Generated with [Claude Code](https://claude.com/claude-code)

  Co-Authored-By: Claude <[email protected]>

Commands:
  # First commit
  - git add frontend/components/DatePicker.js
  - git commit -m "$(cat <<'EOF'
    fix: DatePickerのタイムゾーン処理を修正

    ユーザーのローカルタイムゾーンを正しく適用するように修正。

    🤖 Generated with [Claude Code](https://claude.com/claude-code)

    Co-Authored-By: Claude <[email protected]>
    EOF
    )"

  # Second commit
  - git add backend/services/email.py
  - git commit -m "$(cat <<'EOF'
    fix: SMTP接続のタイムアウト処理を修正

    接続タイムアウト時に適切にリトライするように修正。

    🤖 Generated with [Claude Code](https://claude.com/claude-code)

    Co-Authored-By: Claude <[email protected]>
    EOF
    )"

  - git status
  - (No push - git.allow_push: false)
```

### Example 3: Refactoring with Push Enabled

```yaml
Scenario: "Refactored validation logic across multiple files"

Analysis:
  changes:
    - backend/validators/__init__.py (new validator module)
    - backend/validators/email.py (extracted email validation)
    - backend/validators/phone.py (extracted phone validation)
    - backend/services/user.py (updated to use new validators)
    - backend/services/contact.py (updated to use new validators)
  purpose: "Extract and centralize validation logic"
  decision: "Single commit - all changes serve same refactoring goal"

Commit Message (config.output.language: en, git.claude_signature: false, git.allow_push: true):
  |
  refactor: Extract validation logic to dedicated module

  Centralized email and phone validation to improve reusability and maintainability.

Commands:
  - git add backend/validators/ backend/services/user.py backend/services/contact.py
  - git commit -m "$(cat <<'EOF'
    refactor: Extract validation logic to dedicated module

    Centralized email and phone validation to improve reusability and maintainability.
    EOF
    )"
  - git status
  - git push  # Executed because git.allow_push: true
```

## Agent Integration

### Agents That Should Load This Skill

```yaml
Recommended Agents:
  workflow-orchestrator:
    description: "Manages overall development workflow including commits"
    usage: "Loads skill to handle commit operations during workflow"

  code-developer:
    description: "Implements code changes"
    usage: "Loads skill to commit completed implementations"

  quality-reviewer:
    description: "Reviews code quality"
    usage: "Loads skill to commit approved changes after review"

  deliverable-evaluator:
    description: "Evaluates final deliverables"
    usage: "Loads skill to commit validated deliverables"
```

### When to Use This Skill

```yaml
Trigger Conditions:
  user_requests:
    - "commit these changes"
    - "create a commit"
    - "commit with message..."
    - "save these changes to git"

  agent_decisions:
    - "After completing feature implementation"
    - "After fixing bugs"
    - "After refactoring is complete"
    - "After code review approval"
    - "After deliverable validation"

  workflow_events:
    - "End of development cycle"
    - "Before switching branches"
    - "After significant milestone"
```

## Best Practices

1. **Read Configuration First**: Always check `.claude/config.yaml` for `output.language`, `git.claude_signature`, and `git.allow_push` before creating commits
2. **Review Before Commit**: Always run `git status` and `git diff` to understand full scope of changes
3. **Group Logically**: Combine related changes, separate unrelated changes
4. **Atomic Commits**: Each commit should be independently functional and revertable
5. **Clear Messages**: Focus on what the commit accomplishes, not what you did
6. **Verify After Commit**: Always check `git status` after committing to confirm success
7. **Respect Push Policy**: Only push if explicitly allowed by configuration

## Anti-Patterns to Avoid

```yaml
Bad Practices:
  splitting_logical_units:
    example: "Separating implementation and tests for same feature"
    why: "Tests verify the implementation - they belong together"
    correct: "One commit with both implementation and tests"

  combining_unrelated:
    example: "Fixing bug A and bug B in one commit"
    why: "Makes commits harder to revert and understand"
    correct: "Two separate commits, one for each bug"

  descriptive_messages:
    example: "Updated the login function to use new tokens"
    why: "Describes changes, not purpose"
    correct: "Add JWT-based authentication"

  ignoring_config:
    example: "Always including Claude signature"
    why: "Config specifies when to include signature"
    correct: "Check git.claude_signature in config"

  auto_pushing:
    example: "Always running git push after commit"
    why: "Config specifies whether to push"
    correct: "Only push if git.allow_push is true"
```

## Universal Application

This skill applies to any project using Git, regardless of:
- Programming language
- Framework
- Project size
- Team size
- Development methodology

The skill adapts through configuration rather than modification, ensuring consistent Git practices across all projects.

Overview

This skill manages Git operations with project-specific conventions and best practices. It drafts and creates commits that are logically grouped, formatted according to configured commit message rules, and respects push and signature policies. The skill reads configuration from a .claude/config.yaml file to adapt language, signature, and push behavior.

How this skill works

Before any commit, the skill inspects git status, diffs, and recent log history to understand changes and the repository's style. It groups files by purpose, drafts conventional commit messages focused on role/purpose, stages the appropriate files, creates atomic commits, and conditionally executes git push based on configuration. When enabled, it appends a conditional Claude Code signature according to policy.

When to use it

  • After completing a feature implementation or bug fix
  • When you need commits that follow project conventions and are atomic
  • Before switching branches or finishing a development milestone
  • When automated agents or CI pipelines must create standardized commits
  • When you want commits drafted in the repository's configured language

Best practices

  • Read .claude/config.yaml first to get output.language, git.claude_signature, and git.allow_push
  • Run git status and git diff to confirm the full scope of changes before committing
  • Group related edits into a single commit and separate different concerns
  • Follow conventional commit format: <type>: <subject> and keep messages role-focused
  • Ensure commits are atomic: build and tests should pass after each commit
  • Only push automatically if git.allow_push is explicitly true

Example use cases

  • Add a new feature with tests combined into a single feat: commit
  • Split two unrelated bug fixes into separate fix: commits for clear history
  • Refactor shared logic across multiple files and commit as a single refactor: change
  • Create documentation-only changes using docs: with no code changes
  • Run from an orchestrator agent to commit validated deliverables respecting push policy

FAQ

How does the skill decide which files belong in a commit?

It groups files by logical purpose using the diff and developer guidance: same purpose go together, different concerns are separated into different commits.

Will it ever push to remote automatically?

Only if git.allow_push is set to true in .claude/config.yaml; otherwise the skill commits locally and informs you to push manually.

Can commit messages use languages other than English?

Yes. The skill uses output.language from .claude/config.yaml to select the commit message language while keeping technical terms clear.