From cocosearch
Analyzes staged or unstaged git diffs using CocoSearch semantic search and dependency impact to generate Conventional Commit messages. Reviews changes thoroughly and prompts for approval, edit, or abort.
npx claudepluginhub violetcranberry/coco-search --plugin cocosearchThis skill uses the workspace's default tool permissions.
A structured workflow for generating comprehensive commit messages. Uses CocoSearch's semantic search and dependency analysis to understand what changed, why it matters, and what it affects — producing commit messages that go far beyond surface-level diff summaries.
Suggests conventional commit messages by analyzing staged, unstaged, and untracked git changes in single or multi-repo workspaces. Read-only; never commits or modifies files. Use when needing commit message ideas before committing.
Creates git commits with repo detection, pre-commit checks, submodule support, and conventional messages. Activates on /commit or git commit requests.
Generates conventional commit messages by analyzing staged Git changes with AI, using prefixes like feat/fix. Ensures standardized format for Git workflows.
Share bugs, ideas, or general feedback.
A structured workflow for generating comprehensive commit messages. Uses CocoSearch's semantic search and dependency analysis to understand what changed, why it matters, and what it affects — producing commit messages that go far beyond surface-level diff summaries.
What this adds over generic commit message generators:
Resolve index name (use the resolved name for all operations):
cocosearch.yaml for indexName field -- if found, use itlist_indexes() and match the current project's directory name against available indexes. The MCP tools auto-derive index names from directory paths (e.g., my-project/ -> my_project), so a match is likely if the repo was indexed without a config file.cocosearch.yaml is missing.list_indexes() to confirm project is indexed
index_stats(index_name="<resolved-name>") to check freshness
Check dependency freshness -- call get_file_dependencies on any known file:
get_file_dependencies(file="<any-known-file>", depth=1)
warnings with type deps_outdated or deps_branch_drift:
Note: "Dependency data is outdated -- impact analysis may be incomplete."warnings with type deps_not_extracted:
Note: "No dependency data found. Blast radius analysis will be skipped."Linked index health (if cocosearch.yaml has linkedIndexes):
warnings array from index_stats() for entries starting with "Linked index"Determine what the user wants to commit.
git diff --cached --stat
If staged changes exist: Use staged changes. Inform: "Analyzing N staged files (+X -Y lines)."
If nothing is staged: Fall back to unstaged changes:
git diff --stat
git ls-files --others --exclude-standard
Inform: "No staged changes found. Analyzing N unstaged/untracked files instead. I'll offer to stage them before committing."
For staged changes:
git diff --cached
For unstaged fallback:
git diff
For untracked files, read the file contents to understand what's being added.
git add before committing.Categorize files to prioritize analysis effort.
| Priority | File types | Examples |
|---|---|---|
| HIGH | Source code | .py, .js, .ts, .go, .rs, .java, .rb, .scala, .kt |
| MEDIUM | Tests, config, CI/CD | test_*.py, *.test.ts, *.yaml, Dockerfile, .github/workflows/ |
| LOW | Docs, changelog, assets | .md, CHANGELOG, .png, .svg, LICENSE |
Present the triage:
Changes to analyze:
HIGH (source): N files
- src/module/core.py (+45 -12)
- src/module/utils.py (+8 -3)
MEDIUM (tests/config): M files
- tests/test_core.py (+20 -5)
LOW (docs): K files
- README.md (+10 -2)
For large changesets (20+ files): Warn: "Large changeset with {count} files. Full analysis may take a moment."
For each HIGH and MEDIUM priority file, run CocoSearch analysis. Run independent queries in parallel where possible.
If no CocoSearch index exists: Skip to Step 3e (diff analysis only) for all files.
Understand what the changed code does in the broader codebase:
search_code(
query="<description of what the changed function/class does>",
use_hybrid_search=True,
smart_context=True,
limit=5
)
Cross-project search: If
linkedIndexesis configured incocosearch.yaml, searches automatically expand to linked indexes. For commits affecting shared code, passindex_names=["project1", "project2"]to capture cross-project impact.
Use the diff to identify the key symbols that changed (new functions, modified classes, renamed variables), then search for them:
search_code(
query="<changed_symbol_name>",
symbol_name="<changed_symbol>*",
use_hybrid_search=True,
smart_context=True,
limit=5
)
Extract: What does this code do? What subsystem does it belong to? Is it a public API or internal utility?
Check what depends on each changed file:
get_file_impact(file="<changed_file>", depth=1)
Classify impact:
| Dependents | Level | Note for commit message |
|---|---|---|
| 0 | Leaf | No downstream impact |
| 1-5 | Moderate | Mention affected area |
| 6-15 | High | Flag in commit body |
| 16+ | Critical | Warn prominently |
Understand what the changed file relies on:
get_file_dependencies(file="<changed_file>", depth=1)
Look for: changes that modify how a file interacts with its dependencies (changed imports, different API calls, new dependencies added).
From the diff, check for:
If any are detected, flag as BREAKING CHANGE for the commit message.
Review the actual patch content for each file:
Build an internal summary for each file:
File: path/to/file.py
Type: source (HIGH)
Changes: +45 -12
What changed: Added new validate_input() function, modified process() to call it
Semantic context: Part of the input processing pipeline in the CLI layer
Impact: 3 dependents (moderate) — test_cli.py, main.py, server.py
Breaking: No
From all per-file summaries, determine the overall commit intent.
| Type | When to use |
|---|---|
feat | New functionality, new files with features, new commands/endpoints |
fix | Bug fixes, error corrections, edge case handling |
refactor | Code restructuring without behavior change |
test | Adding/modifying tests only |
docs | Documentation only changes |
chore | Maintenance, dependency updates, tooling |
perf | Performance improvements |
style | Formatting, whitespace, code style |
ci | CI/CD pipeline changes |
build | Build system, dependency management |
Rules:
feat (or fix), not testThe scope is the primary module/subsystem affected:
dashboard, search, deps)If the changeset includes genuinely separate concerns (e.g., a feature + an unrelated doc fix), note this in the body. Do NOT suggest splitting the commit — just document all changes comprehensively.
BREAKING CHANGE: footer if applicable## Proposed Commit Message
type(scope): subject line here
- First significant change and why
- Second significant change and why
- Updated tests for new functionality
- Updated docs to reflect API changes
BREAKING CHANGE: description (if applicable)
---
Files: N changed (+X -Y)
Impact: [summary of blast radius findings]
Present three choices:
git commit with the generated message. If in unstaged fallback mode, stage the analyzed files first with git add.If the user approves:
If changes were staged (normal mode):
git commit -m "<generated message>"
If changes were unstaged (fallback mode):
git add <analyzed files>
git commit -m "<generated message>"
Confirm: "Committed: <short hash> — <subject line>"
If the analysis found notable patterns, mention them:
core/models.py has 18 dependents. Consider running the full test suite."When no CocoSearch index is available, the skill operates in reduced mode:
refactor, not just a "rename".For common search tips (hybrid search, smart_context, symbol filtering), see skills/README.md.
For installation instructions, see skills/README.md.