cli-git-conventional — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cli-git-conventional (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A bulleted imperative like {match} tells the agent to never reveal, disclose, or mention something to the user. Used adversarially it can instruct the agent to hide its tool calls or lie about what it did — stripping the transparency a user relies on to trust the agent.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Optimization: This skill uses on-demand loading. SemVer rules, git/jj commands, and branch conventions live in references/.Language rule: Commit messages are always in the project's commit language (check git log --oneline -10). If mixed, default to English. The skill instructions are bilingual (FR/EN) but output follows the project."A commit message is a letter to your future self. Write it in your voice, not a machine's."
Reference: https://www.conventionalcommits.org/en/v1.0.0/
NEVER add `Co-authored-by: Claude` or any AI trailer. The commit belongs entirely to the person who asked. No Co-authored-by, Generated-by, AI-assisted, or equivalent trailers. Ever.
When the user says /ghost (the only slash-command spelling), not an AI, I'm not an AI, pas une IA, or equivalent natural language, enforce maximum ghostwriter discipline:
Anthropic in commits, branches, tags, changelogs, PR text, release notes, or generated repo files unless the repository itself is explicitly about those tools.
marker entriesare not allowed to remain unless reclassified as product-fixture with a short reason tied to source, tests, packaging, or documented product behavior.
Claude is the ghostwriter. The message is signed by the user, written in their voice.
| Bad (AI voice) | Good (human voice) |
|---|---|
feat: implement comprehensive solution for handling edge cases in authentication module | feat(auth): handle token expiry on refresh |
refactor: enhance code quality and maintainability by restructuring | refactor(router): split dispatch logic into smaller fns |
fix: resolve critical issue that was causing unexpected behavior | fix(cache): prevent stale reads after TTL reset |
chore: update various dependencies to their latest versions | chore(deps): bump tokio 1.35 -> 1.37 |
Banned words: comprehensive, robust, leverage, utilize, enhance, streamline, facilitate, in order to, as part of, to ensure that.
Required voice: direct verbs (add, fix, remove, split, bump, wire, drop), imperative present, project vocabulary.
<type>[scope][!]: <description>
[body]
[footer(s)]| Type | SemVer | Usage |
|---|---|---|
feat | MINOR | New feature |
fix | PATCH | Bug fix |
build | -- | Build system, external deps |
chore | -- | Maintenance, no functional impact |
ci | -- | CI/CD configuration |
docs | -- | Documentation only |
style | -- | Formatting, whitespace (no logic change) |
refactor | -- | Restructuring without feat or fix |
perf | PATCH | Performance optimization |
test | -- | Adding or modifying tests |
revert | -- | Reverting a previous commit |
If a change spans multiple types, split into multiple commits.
add, fix, remove (never added, fixes, removing)feat: add retry logic -- not feat: Add retry logicBREAKING CHANGE: <what breaks>
Refs: #123, #456
Closes: #789No Co-authored-by: Claude or similar. Ever.
Signal with ! before : and/or BREAKING CHANGE: footer:
feat(api)!: remove legacy v1 endpoints
BREAKING CHANGE: /api/v1/* routes no longer served. Migrate to /api/v2/*.Use this audit during commit guard and whenever the user asks to audit a full directory, remove AI traces, run /ghost, or says not an AI.
Scan the whole target directory, not only the staged diff. Detection must be agnostic: do not rely only on a fixed allow/deny list. Classify a file or directory as an AI/agent marker when its path, name, extension, or content says it configures, instructs, stores state for, or exposes context to an assistant, agent, LLM, prompt engine, coding copilot, MCP server, or AI IDE.
Minimum detection method:
.git, vendored dependencytrees, build outputs, binary blobs, and large generated artifacts.
CLAUDE.md,GEMINI.md, AGENTS.md, llms.txt, llms-full.txt, .cursorrules, .cursor/, .windsurf/, .aider*, .continue/, .junie/, .claude/, .github/copilot-*, copilot-instructions, prompt, agent, assistant, mcp, llm, rules when the surrounding path indicates AI tooling.
prose mentioning AI-agent instructions, tool-specific configuration, prompt/rule injection, model/provider setup, MCP servers, code-assistant memory, conversation history, or instructions intended for Claude, Codex, Cursor, Copilot, Aider, Gemini, Windsurf, OpenCode, Devin, Jules, Continue, or equivalent tools.
marker: AI/agent config, memory, instruction, prompt, or history file.product-fixture: legitimate source/test fixture in a repo whose productis AI/agent tooling, skill distribution, or assistant integration.
documentation-only: ordinary docs that mention AI as a product topic butdo not configure an assistant.
false-positive: unrelated use of words like agent, prompt, ormodel.
only when all staged marker entries are removed or reclassified as product-fixture with a short reason.
Example shell probes to seed the audit, not to replace judgment:
find . -name .git -prune -o -type f -print \
| rg -i '(^|/)(CLAUDE|GEMINI|AGENTS|llms(-full)?|copilot|aider|cursor|windsurf|continue|junie|mcp|prompt|assistant|agent|rules)([./_-]|$)'
find . -name .git -prune -o -type d -print \
| rg -i '(^|/)\.(claude|cursor|windsurf|aider|continue|junie)(/|$)'
rg -n -i 'claude|codex|chatgpt|openai|anthropic|cursor|copilot|aider|gemini|windsurf|opencode|devin|jules|mcp|llm|prompt injection|assistant instructions' . \
--glob '!**/.git/**' \
--glob '!**/node_modules/**' \
--glob '!**/target/**' \
--glob '!**/dist/**'Policy:
content is useful, move it first into standard docs such as CONTRIBUTING.md, docs/architecture.md, docs/index.md, or repo-specific operator docs, then delete the marker file.
when the user asked for ghost/no-AI cleanup or full-directory audit.
would be a destructive scope expansion, stop and report the exact marker paths instead of silently committing around them.
AI/agent tooling, skill distribution, or assistant integration. In that case, marker files may be legitimate product-fixture entries only when tied to source, tests, packaging, or documented product behavior, and the audit result plus reason must be stated before commit.
Before every git commit performed by the agent, run a guard phase after the final staging decision and before writing the commit object. This guard is mandatory unless the user explicitly says to bypass checks.
Minimum guard:
git status --short. Do not stage or revertunrelated user changes.
git diff --cached --name-statusand git diff --cached --stat. If nothing is staged, stage only the files required by the user's request, then inspect again.
git diff --cached --check. Fix whitespace/conflict-marker failuresbefore committing.
entries classified as marker, or stop and report them if removing tracked files is outside the user's requested scope. In ghost/no-AI cleanup mode, staged marker entries must be removed 100%; only documented product-fixture, documentation-only, or false-positive entries may remain.
Co-authored-by,Generated-by, Generated with, AI-assisted, Claude, Codex, ChatGPT, OpenAI, Anthropic, Cursor, Aider, Devin, Jules, Windsurf. If a marker is not part of the product domain, remove it.
relevant. Examples: python3 scripts/validate_skills.py for this skills repo, git diff --check, targeted link checks for docs-only changes, or the project's documented pre-commit command. Do not invent slow or network-heavy checks unless the repo or user already requires them.
with the exact failing command.
After the guard passes, create the commit with a Conventional Commit message in the project's commit language and with no AI trailers.
Before writing a commit message:
git diff --staged (or the changes the user shared).git log --oneline -10 for context, style, AND language.Language examples:
# History is French → commit in French
git log: "fix(ci): corrige perte de variable dans subshell"
NEW: "fix(security): externalise le mot de passe healthcheck"
# History is English → commit in English
git log: "fix(ci): fix variable loss in subshell"
NEW: "fix(security): externalize healthcheck password"Determine the type. When in doubt:
featfixrefactortestdocscichore(deps) or build(deps)Choose the most specific scope:
auth, router, cache, dlpapi, db, ui, clidepsApply ghostwriter rules:
Use HEREDOC for multi-line messages:
git commit -m "$(cat <<'EOF'
fix(auth): handle expired tokens
Remove the silent swallow of TokenExpiredError. Callers now
receive a 401 with Retry-After header.
Refs: #88
EOF
)"Read references/commands.md for full git and jj command reference.Read references/semver.md for SemVer 2.0.0 rules, tag commands, version bump resolution, and CHANGELOG format.Read references/branches.md for branch naming conventions and examples.| Bad | Good |
|---|---|
fix stuff | fix(cache): prevent stale entries after TTL expiry |
WIP | Atomic commits with proper messages |
feat: Added new feature | feat: add retry backoff on transient errors |
Update / Changes | Explicit message with type |
Everything as chore | Use appropriate type |
Scope too broad: feat(app): | Precise scope: feat(router): |
| 12 unrelated files in one commit | Atomic: one logical change per commit |
Co-authored-by: Claude | No AI trailers |
When invoked with --audit-markers, /ghost, not an AI, or when the user asks to clean AI traces from a project or audit a full directory, apply the agnostic AI marker file audit above first. The commands below are probes to seed the investigation; they are not an exhaustive definition of what counts as a marker.
Scan history for tool-specific trailers, bot authors, generated notices, and assistant URLs. Treat the patterns as examples and add equivalent project-local signals when found:
# Trailers (all AI tools)
git log --all --format="%H %s" --grep="Co-authored-by\|Co-Authored-By\|Generated by\|Generated with\|Generated-by\|AI-assisted" | \
grep -iE "claude|copilot|opencode|codex|cursor|aider|gemini|devin|windsurf|anthropic|openai"
# Bot authors (Copilot, Devin, Jules)
git log --all --format="%H %an" | grep -iE "\[bot\]|copilot|devin-ai|jules"
# Aider author suffix
git log --all --format="%H %an" | grep "(aider)"
# PR footers in merge commits
git log --all --merges --format="%H %b" | grep -iE "claude.com/claude-code|cursor.com|Generated with|<!-- Cursor -->"Known trailers by tool:
| Tool | Trailer / marker |
|---|---|
| Claude Code | Co-Authored-By: Claude <[email protected]> (with optional model name) |
| GitHub Copilot | Author: github-copilot[bot], trailer: Co-Authored-By: GitHub Copilot |
| OpenAI Codex | Co-Authored-By: Codex <[email protected]> |
| Aider | Author suffix (aider), optional prefix aider: in message |
| Devin | Author: devin-ai[bot], footer: Generated by Devin |
| OpenCode | Co-Authored-By: opencode <[email protected]> |
| Gemini/Jules | Author: Jules bot |
| Cursor | <!-- Cursor --> in PR descriptions, cursor- branch prefixes |
# Path/name probe, then classify each hit with the agnostic audit rules.
find . -name .git -prune -o -type f -print \
| rg -i '(^|/)(CLAUDE|GEMINI|AGENTS|llms(-full)?|copilot|aider|cursor|windsurf|continue|junie|mcp|prompt|assistant|agent|rules)([./_-]|$)'
find . -name .git -prune -o -type d -print \
| rg -i '(^|/)\.(claude|cursor|windsurf|aider|continue|junie)(/|$)'
# Content probe for neutral filenames that still carry assistant instructions.
rg -n -i 'assistant instructions|prompt injection|mcp server|model provider|conversation history|claude|codex|chatgpt|openai|anthropic|cursor|copilot|aider|gemini|windsurf|opencode|devin|jules|llm' . \
--glob '!**/.git/**' \
--glob '!**/node_modules/**' \
--glob '!**/target/**' \
--glob '!**/dist/**'Check if AI config files are already gitignored. If NOT, recommend adding them.
## AI Marker Audit -- {project}
### Commits: N trailers found
| Tool | Count | Branches |
| ... |
### Files: N candidate markers found
| File | Classification | Reason |
| ... |
### Branch names: N AI-prefixed branches
| Branch | Tool |
| ... || Option | Risk | How |
|---|---|---|
| A. Rebase interactive (< 5 commits) | Medium | git rebase -i then edit each commit to remove the trailer |
| B. filter-repo (full history) | High — force push | git filter-repo --message-callback with regex removing all AI trailers |
| C. Accept and move on | None | Old commits keep trailers, new commits are clean |
| D. Squash into fresh branch | Medium | New branch with single clean commit, abandon old history |
| E. Absorb + delete markers | Low | Move useful content to standard docs, delete staged marker entries, add private tool state to .gitignore |
| Situation | Options |
|---|---|
| < 5 affected commits, local branch | A + E |
| Many commits, pre-audit | B + E (coordinate with team) |
| Shared branch, multiple contributors | C + E (don't rewrite shared history) |
| Fresh project | D + E |
Recommend adding private assistant state, caches, and local IDE integration to .gitignore when they are not legitimate product fixtures. Do not present this as an exhaustive list:
# AI tool config (not project documentation)
.cursor/
.cursorrules
.cursorignore
.cursorindexignore
.windsurf/
.windsurfrules
.codeiumignore
.aider*
.claude/
.continue/
.junie/Note: root instruction files such as CLAUDE.md, GEMINI.md, AGENTS.md, or equivalents are usually absorbed into standard docs by cli-forge-doc and then deleted. In an AI/agent tooling repository, they may remain only as documented product-fixture entries.
Never run filter-repo or force push without explicit user approval.
| Condition detected | Recommend | Why |
|---|---|---|
| AI markers found in history | /cli-forge-doc | Absorb CLAUDE.md/AGENTS.md into standard docs |
| Commit messages reference issues | Project management (no skill) | Document as info |
| Breaking changes detected | /cli-forge-readme | Update README with migration notes |
Rule: Recommend, don't auto-execute.
filter-repo, force push, or removing unrelated tracked markers needs explicit user approval
| Skill | Relationship |
|---|---|
cli-cycle | After fixes, cli-cycle should invoke cli-git-conventional for commit messages |
cli-forge-pipeline | Pipeline may enforce commit format via CI hooks |
cli-audit-code | Code audit may suggest refactors -- cli-git-conventional writes the commit |
cli-audit-code | If C9 flags credential issues, cli-git-conventional writes chore(auth): for rotation commits |
[ ] Language matches git log history (FR stays FR, EN stays EN)
[ ] Type correct from allowed list
[ ] Scope relevant (or absent if not applicable)
[ ] Scope style matches history (security vs sec, ci vs pipeline)
[ ] ! and/or BREAKING CHANGE footer if breaking
[ ] Description: imperative present, lowercase, no period, <=72 chars
[ ] Body separated by blank line if present
[ ] Valid footers (token: value)
[ ] NO Claude / AI / co-author trailer
[ ] Atomic commit (one logical change)
[ ] Human voice (no banned words)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.