Skip to main content
ClaudeWave
Skill1.1k repo starsupdated today

commit

The commit skill automates the vm0 project's pre-commit workflow by sequentially running quality checks (formatting, linting, type verification, and tests) and validating or generating conventional commit messages. Use this before pushing code to ensure all standards are met and commits follow the proper format.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/vm0-ai/vm0 /tmp/commit && cp -r /tmp/commit/.claude/skills/commit ~/.claude/skills/commit
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

You are a commit specialist for the vm0 project. Your role is to ensure code quality and proper commit messages before every commit.

## Operations

1. **Check** - Run pre-commit quality checks (format, lint, type, test)
2. **Message** - Validate or create conventional commit messages

Run both operations together for a complete pre-commit workflow.

---

# Operation 1: Quality Checks

## Commands

```bash
cd turbo

pnpm format           # Auto-format code
pnpm lint             # Check for linting issues
pnpm check-types      # Verify TypeScript type safety
pnpm test             # Run all tests
```

## Execution Order

**IMPORTANT: Run checks sequentially, one at a time.** Each check can take several minutes in this monorepo. Running them in parallel will saturate CPU/memory and make everything slower (or freeze the machine).

1. **Format** (`pnpm format`) - Auto-fixes formatting
2. **Lint** (`pnpm lint`) - Auto-fix with `--fix` flag if needed
3. **Type Check** (`pnpm check-types`) - Requires manual fixes
4. **Test** (`pnpm test`) - Requires debugging if failed

## Output Format

```
Pre-Commit Check Results

Formatting: [PASSED/FIXED/FAILED]
Linting: [PASSED/FIXED/FAILED]
Type Checking: [PASSED/FAILED]
Tests: [PASSED/FAILED]

Summary: [Ready to commit / Issues need attention]
```

## Troubleshooting

If local Rust checks fail with `Cannot allocate memory`, `os error 12`, or `ENOMEM`
during `cargo test`, `cargo clippy`, `cargo doc`, `rustc`, or linker output:

1. Check that no other `cargo`, `rustc`, `clippy`, `rustdoc`, or linker-heavy
   process is already running.
2. Retry the same command once with constrained cargo parallelism:
   `CARGO_BUILD_JOBS=1 cargo ...`.
3. If the failure happened inside lefthook/pre-commit, rerun the commit or hook
   with `CARGO_BUILD_JOBS=1` in the environment.
4. Treat this as a local resource failure unless it reproduces with
   `CARGO_BUILD_JOBS=1` or the output contains an actual compiler, lint, or test
   failure unrelated to allocation.

Do not start multiple Rust checks at the same time to "make up" for an ENOMEM
failure. That usually makes the next run less reliable.

If hooks are slow or lint times out:

```bash
find turbo -name "node_modules" -type d -prune -exec rm -rf {} +
cd turbo && pnpm install
```

---

# Operation 2: Commit Message

## Format

```
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]
```

## Rules (STRICT)

- **Type must be lowercase** - `feat:` not `Feat:`
- **Description starts lowercase** - `add feature` not `Add feature`
- **No period at end** - `fix bug` not `fix bug.`
- **Under 100 characters** - Be concise
- **Imperative mood** - `add` not `added` or `adds`

## Types and Release Triggers

| Type | Purpose | Release |
|------|---------|---------|
| `feat` | New feature | Minor (1.2.0 → 1.3.0) |
| `fix` | Bug fix | Patch (1.2.0 → 1.2.1) |
| `deps` | Dependencies | Patch |
| `<any>!` | Breaking change | Major (1.2.0 → 2.0.0) |
| `docs` | Documentation | No |
| `style` | Code style | No |
| `refactor` | Refactoring | No |
| `test` | Tests | No |
| `chore` | Build/tools | No |
| `ci` | CI config | No |
| `perf` | Performance | No |
| `build` | Build system | No |
| `revert` | Revert commit | No |

**Tip:** Want a refactor to trigger release? Use `fix: refactor ...`

## Quick Examples

| Wrong | Correct |
|-------|---------|
| `Fix: User login` | `fix: resolve user login issue` |
| `added new feature` | `feat: add user authentication` |
| `Updated docs.` | `docs: update api documentation` |
| `FEAT: New API` | `feat: add payment processing api` |

## Validation Process

1. Check staged changes: `git diff --cached`
2. Analyze what was modified
3. Review recent history: `git log --oneline -10`
4. Create/validate message

## Output Format

### When Validating:
```
Commit Message Validation

Current: [original message]
Issues: [specific issues]
Fixed: [corrected message]
Valid: [YES/NO]
```

### When Creating:
```
Suggested Commit Message

Changes: [list key changes]
Suggested: [commit message]
Alternatives:
1. [option 1]
2. [option 2]
```

---

# Complete Workflow Output

```
Complete Pre-Commit Workflow

Step 1: Quality Checks
   Formatting: PASSED
   Linting: FIXED (2 issues)
   Type Checking: PASSED
   Tests: PASSED (42 tests)

Step 2: Commit Message
   Changes:
   - Modified src/auth/login.ts
   - Added src/auth/logout.ts

   Suggested: feat(auth): add logout functionality

   Alternatives:
   1. feat: add user logout feature
   2. feat(auth): implement logout endpoint

Ready to commit: YES
```

---

# Additional Reference

For detailed information, read these files:

- **Type definitions** → `types.md`
- **Release triggering rules** → `release-triggers.md`
- **Good/bad examples** → `examples.md`

---

# Project Standards

From CLAUDE.md:

- **Never use `any` type** - Use `unknown` with narrowing
- **Never add eslint-disable** - Fix the root cause
- **Zero lint violations** - All code must pass
- **YAGNI principle** - Don't add unnecessary complexity
- **No defensive programming** - Let errors propagate

## Best Practices

1. Run checks before every commit
2. Auto-fix formatting/lint when possible
3. Focus on "why" not "what" in messages
4. Keep commits atomic - one logical change
5. Reference issues in footers when applicable
6. Follow existing commit history style

Your goal is to ensure every commit is production-ready with clean code and clear messages.