Skip to content

feat: add Claude Code skills support#8

Merged
einverne merged 2 commits intomasterfrom
claude/add-claude-skills-support-011CUp3XhfBzhC3jV3N6z1AZ
Nov 5, 2025
Merged

feat: add Claude Code skills support#8
einverne merged 2 commits intomasterfrom
claude/add-claude-skills-support-011CUp3XhfBzhC3jV3N6z1AZ

Conversation

@einverne
Copy link
Owner

@einverne einverne commented Nov 5, 2025

Add comprehensive Claude skills for development assistance:

  • git-workflow: Git operations and best practices
  • shell-scripting: Bash/Zsh scripting and automation
  • dotfiles-manager: Dotfiles organization and management
  • debug-helper: Debugging and troubleshooting strategies
  • performance-optimizer: Code and script optimization
  • test-expert: Testing and TDD practices

Each skill provides specialized domain expertise that Claude can invoke for targeted assistance. Also updated README to document the skills and agents available in this repository.

Add comprehensive Claude skills for development assistance:
- git-workflow: Git operations and best practices
- shell-scripting: Bash/Zsh scripting and automation
- dotfiles-manager: Dotfiles organization and management
- debug-helper: Debugging and troubleshooting strategies
- performance-optimizer: Code and script optimization
- test-expert: Testing and TDD practices

Each skill provides specialized domain expertise that Claude can
invoke for targeted assistance. Also updated README to document
the skills and agents available in this repository.
@gemini-code-assist
Copy link

Summary of Changes

Hello @einverne, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the AI assistance capabilities by integrating a suite of new Claude Code skills. These skills provide targeted expertise across critical development domains, aiming to streamline workflows and improve code quality. The changes also ensure that these new capabilities are properly documented for users.

Highlights

  • New Claude Code Skills: Introduced six new specialized Claude Code skills to assist with various development tasks: git-workflow, shell-scripting, dotfiles-manager, debug-helper, performance-optimizer, and test-expert.
  • Documentation Update: The main README.md has been updated to include a new section detailing the available Claude Code skills and agents, along with a link to the new skills README.
  • Detailed Skill Guides: Each new skill comes with its own comprehensive Markdown guide, outlining its purpose, use cases, best practices, and relevant code examples for effective utilization.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adds a comprehensive set of Claude Code skills, which is a great enhancement for AI-assisted development within this repository. The skills cover essential areas like git, shell scripting, debugging, performance, and testing. The documentation is well-written and detailed. I've identified a few issues in the provided code examples and documentation links that should be addressed to improve their quality and correctness. My review includes suggestions to fix a broken link, correct buggy code in a shell script template, and improve the clarity of several code examples.

Comment on lines +81 to +97
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The argument parsing logic in the "Safe Script Template" is flawed. It will incorrectly handle positional arguments by treating them as unknown options and exiting. For a script that accepts both options and arguments (like script.sh -v mycommand), this loop will fail. A more robust approach is needed to distinguish between options and positional arguments. The suggested change will stop parsing options upon encountering the first non-option argument.

Suggested change
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
-*)
echo "Unknown option: $1"
usage
exit 1
;;
*)
break
;;
esac
done

Comment on lines +120 to +127
trap cleanup EXIT
trap 'echo "Error on line $LINENO"' ERR

cleanup() {
# Cleanup code
rm -f "$TEMP_FILE"
}
```

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

In the "Error Handling" example, the cleanup function attempts to remove a file using the variable $TEMP_FILE, but this variable is never defined in the script template. This makes the example incomplete and incorrect. The example should show how to create a temporary file securely, for instance using mktemp.

Suggested change
trap cleanup EXIT
trap 'echo "Error on line $LINENO"' ERR
cleanup() {
# Cleanup code
rm -f "$TEMP_FILE"
}
```
TEMP_FILE=$(mktemp)
trap cleanup EXIT
trap 'echo "Error on line $LINENO"' ERR
cleanup() {
# Cleanup code
rm -f "$TEMP_FILE"
}


# Assert
assert user.email == email
assert user.is_active == True

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Python, comparing a boolean value with == True is redundant and not idiomatic. It's better to assert the truthiness of the value directly.

Suggested change
assert user.is_active == True
assert user.is_active

Comment on lines +198 to +204
@patch('myapp.external_api_call')
def test_function(mock_api):
mock_api.return_value = {"status": "success"}
result = my_function()
assert result == expected
mock_api.assert_called_once_with(expected_arg)
```

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This Python mocking example is incomplete because the variables expected and expected_arg are used without being defined. This can be confusing for someone trying to understand or use the example. Please define these variables or use concrete values to make the example self-contained and runnable.

Suggested change
@patch('myapp.external_api_call')
def test_function(mock_api):
mock_api.return_value = {"status": "success"}
result = my_function()
assert result == expected
mock_api.assert_called_once_with(expected_arg)
```
@patch('myapp.external_api_call')
def test_function(mock_api):
expected_return_value = {"status": "success"}
mock_api.return_value = expected_return_value
result = my_function()
assert result == expected_return_value
mock_api.assert_called_once_with("some_expected_argument")

@pytest.mark.asyncio
async def test_async_function():
result = await async_function()
assert result == expected

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The expected variable is not defined in this async test example, which makes it incomplete. It should be replaced with an actual expected value for clarity.

Suggested change
assert result == expected
assert result == "expected_async_result"

def test_time_dependent(mock_datetime):
mock_datetime.now.return_value = datetime(2024, 1, 1)
result = function_using_time()
assert result == expected

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The expected variable is not defined in this time-dependent test example, making it incomplete. Please replace it with a concrete expected value that would result from the mocked time.

Suggested change
assert result == expected
assert result == "expected_value_for_2024-01-01"

- Reorganize skills from flat .md files to directory structure
  with SKILL.md files following official Claude Code format
- Update all skill descriptions to include "when to use" guidance
  following progressive disclosure pattern
- Add skills symlink in bootstrap.conf.yml to automatically
  link ~/.claude/skills to dotfiles/.claude/skills during setup
- Update skills README with:
  * Official frontmatter requirements (name, description limits)
  * Directory structure documentation
  * Progressive disclosure explanation
  * Installation instructions via dotbot
  * Links to official documentation

Each skill now follows the official structure:
- Directory per skill (e.g., git-workflow/)
- SKILL.md file with YAML frontmatter
- name: lowercase-with-hyphens (max 64 chars)
- description: what it does + when to use it (max 1024 chars)

The bootstrap process now creates ~/.claude/ and symlinks skills
automatically, making them available to Claude Code immediately.
@einverne
Copy link
Owner Author

einverne commented Nov 5, 2025

/gemini review

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a comprehensive set of Claude Code skills for various development tasks, along with documentation and integration into the dotfiles bootstrap process. The new skills are well-documented and cover important areas like Git, shell scripting, debugging, and performance. My review includes suggestions to fix a broken link, improve command examples and code templates for robustness and clarity, and update a deprecated GitHub Action to ensure CI stability. These changes will enhance the quality and usability of the new skills.

Comment on lines +81 to +97
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The argument parsing loop in the "Safe Script Template" does not correctly handle positional arguments. Any positional argument will be treated as an "Unknown option," causing the script to exit prematurely. A robust argument parsing loop should distinguish between options and positional arguments. The suggested implementation stops parsing options upon encountering the first non-option argument, which is a common and effective pattern.

Suggested change
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
-*)
echo "Unknown option: $1" >&2
usage
exit 1
;;
*)
break # stop parsing options
;;
esac
done

pip install -r requirements-dev.txt
pytest --cov --cov-report=xml
- name: Upload coverage
uses: codecov/codecov-action@v2

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The codecov/codecov-action@v2 GitHub Action is deprecated and may stop working in the future. You should update it to a more recent version, such as v4, to ensure continued support, security updates, and access to new features.

Suggested change
uses: codecov/codecov-action@v2
uses: codecov/codecov-action@v4

- [Claude Code Skills Documentation](https://docs.claude.com/en/docs/claude-code/skills)
- [Official Skills Repository](https://github.com/anthropics/skills)
- [How to Create Custom Skills](https://support.claude.com/en/articles/12512198-how-to-create-custom-skills)
- [Agents Directory](../agents/README.md) - For autonomous task execution

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The relative link to the Agents Directory README appears to be incorrect. Given the file structure, the path should likely be ../../claude/agents/README.md to correctly navigate from .claude/skills/ up two levels and then into claude/agents/.

Suggested change
- [Agents Directory](../agents/README.md) - For autonomous task execution
- [Agents Directory](../../claude/agents/README.md) - For autonomous task execution

### Check if Service is Running
```bash
# Check process
ps aux | grep service_name

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The ps aux | grep service_name command will include the grep process itself in the output. A common technique to prevent this is to use a character class for the first letter of the search term, which prevents grep from matching its own process line.

Suggested change
ps aux | grep service_name
ps aux | grep [s]ervice_name

brew install stow
elif [[ "$(uname)" == "Linux" ]]; then
# Linux
sudo apt-get install stow

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

For Debian-based systems, it's a good practice to update the package list before installing a new package to ensure you're getting the latest version available. Also, using the -y flag will automatically confirm the installation, which is useful in non-interactive scripts.

Suggested change
sudo apt-get install stow
sudo apt-get update && sudo apt-get install -y stow


2. **Commit Best Practices**
- Write clear, conventional commit messages
- Follow format: `type(scope): description`

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The commit message format type(scope): description follows the Conventional Commits specification. It would be helpful for users if you included a link to the official specification for more details.

Suggested change
- Follow format: `type(scope): description`
- Follow format: `type(scope): description` (see [Conventional Commits](https://www.conventionalcommits.org/))

```

### Find Memory Leaks
```bash

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The code block for finding memory leaks is incorrectly marked as bash. The content, which includes the @profile decorator and sys.getrefcount, is Python code. The language specifier for the code block should be python for correct syntax highlighting and clarity.

Suggested change
```bash
```python

Comment on lines +120 to +126
trap cleanup EXIT
trap 'echo "Error on line $LINENO"' ERR

cleanup() {
# Cleanup code
rm -f "$TEMP_FILE"
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The cleanup function example refers to $TEMP_FILE, but this variable is not defined within the snippet, which could be confusing. To make the example clearer and promote safe scripting practices, it's beneficial to show how such a temporary file should be created using mktemp and to check if the command was successful.

Suggested change
trap cleanup EXIT
trap 'echo "Error on line $LINENO"' ERR
cleanup() {
# Cleanup code
rm -f "$TEMP_FILE"
}
TEMP_FILE=$(mktemp) || exit 1
trap cleanup EXIT
trap 'echo "Error on line $LINENO"' ERR
cleanup() {
# Cleanup code
rm -f "$TEMP_FILE"
}


# Assert
assert user.email == email
assert user.is_active == True

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Python, comparing a boolean value with == True is redundant and not considered idiomatic. It's more Pythonic to assert the truthiness of the value directly.

Suggested change
assert user.is_active == True
assert user.is_active

@einverne einverne merged commit 25d41a4 into master Nov 5, 2025
5 checks passed
@einverne einverne deleted the claude/add-claude-skills-support-011CUp3XhfBzhC3jV3N6z1AZ branch November 5, 2025 04:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Comments