Configuration
Copy .claude/concise.json.example to .claude/concise.json (Claude Code) or .codex/concise.json (Codex) in your project, then edit the keys below. If both files exist, .claude/concise.json wins.
- Every key and its default
The default
ignoreGlobslist:/node_modules/,/vendor/,/dist/,/build/,/.next/,**/*.generated.*,**/*.min.js,/package-lock.json,/*.lock. - The five layers
The hook reads config from 5 layers, lowest first.
- Merge rules per key
A config file or a
BEC_CONFIG_JSONvalue that does not parse as a JSON object is skipped. - checks, scan, and stopHook
Each core check has its own switch under
checks:comments,fileSize, andprBody, alltrueby default. - Lifecycle context and host hooks
SessionStartsends the resolved limits, enabled style checks, and escape hatches onstartup,resume,clear, andcompact, and in Claude Code onfork. - Optional Claude model checks
Generate one optional evaluator from the current project configuration, using the installed plugin path:
- mode
modeis set per feature, underfeatures.emDash.mode,features.aiWriting.mode, andfeatures.dictionary.mode. - dictionary
features.dictionary.entrieslists terms to flag. - allowList and bypass
allowList.phrasesandallowList.patternsdrop single findings. - softFail
"softFail": true, orBEC_HOOK_SOFT_FAIL=1, turns every deny, every ask, and everyStopblock into an allow that carries the same text, prefixed[concise] soft-fail:. - ignoreGlobs and styleIgnoreGlobs
ignoreGlobsexempts a path from every check. - log
"log": { "enabled": true }, orBEC_LOG_ENABLED=1, writes one record per hook invocation. - monitor
Every hook call registers its project in
~/.config/concise/projects/<folder>-<hash>.json($XDG_CONFIG_HOMEwhen set) with the real path, the name, the first and last time seen, the path of its record file, and the git repository that holds it (repo: name, root, worktree name, and subdirectory, ornull).