Concise is a Claude Code, Codex, and omp plugin that catches the agent's own verbosity before a write or GitHub command runs. It also filters test-runner output before the agent reads it.
New here? Start with plugins/concise/README.md.
- Comment blocks longer than 2 lines in
Write,Edit,MultiEdit, and Codexapply_patchadditions - New files longer than 300 lines
- Inline
gh prandgh issuebodies with more than 1 prose paragraph or more than 3 sentences in a paragraph - Em dashes and 47 categories of AI writing patterns, both off until you turn them on
- Output from pytest,
go test, npm test, Jest, and Vitest; each run's full output is kept in its own log under$TMPDIR/concise-test-filter-<uid>/<session>/, and the path is printed with the filtered output
Structured GitHub bodies that use headings and lists are allowed. A denied call includes the exact limit and location. After 2 denied retries for the same target, Concise permits the next attempt and flags it.
Git, Node.js, Bash, jq, realpath, and core Unix tools must be available on PATH.
Run these commands inside Claude Code:
/plugin marketplace add https://github.com/yannelli/be-concise
/plugin install concise@be-concise
Review the hooks and choose an installation scope. If the install summary requests it, run /reload-plugins.
Claude Code plugin documentation
Codex CLI 0.152.0 or newer is the supported baseline.
codex plugin marketplace add yannelli/be-concise
codex plugin add concise@be-conciseStart a new Codex session, run /hooks, and review and trust each concise hook under both PreToolUse and Stop. Codex asks for review again when a hook definition changes, so trust the hooks again after an update.
For automation that already validates its hook sources:
codex exec --dangerously-bypass-hook-trust "<prompt>"The bypass applies to that invocation and does not save trust.
omp (oh-my-pi) installs from the same marketplace:
omp plugin marketplace add yannelli/be-concise
omp plugin install concise@be-conciseStart a new omp session. omp loads the hooks as an extension at session start, so /reload-plugins does not pick them up. Subagent replies are not checked in omp, because omp has no subagent stop event.
- plugins/concise/README.md: the entry point. Quick start, what each check does, the 8 presets, and the escape hatches.
- plugins/concise/docs/configuration.md: every config key with its default, the 5 config layers,
mode,allowList,bypass, and logging. - plugins/concise/docs/categories.md: all 47 AI writing categories with an example, a fix, the presets, and the scopes.
- plugins/concise/docs/environment.md: every
BEC_variable and 3 worked scenarios, including a cloud agent with no config file. - plugins/concise/docs/packs.md: the pack file format, the 3 pattern kinds,
detect(text, ctx), and the validator and renderer commands. - plugins/concise/docs/tools.md: the
concise-configCLI, the MCP tools, the settings skills, and the writing-sample tuner. - plugins/concise/docs/host-features.md: the Claude Code, Codex, and omp features the manifests and the omp extension use, with dated sources. Read it before you change a hook manifest.
- plugins/concise/docs/INDEX.md: every doc, with its created and updated dates.
Run from this repository with Node.js 24:
node bin/concise-web.mjsOr install the command globally from npm:
npm install -g @yannelli/be-concise
concise-web --cwd /path/to/projectnpm install -g . installs it from a checkout.
Update the console and the plugin with one command:
concise-web updateThe command installs the latest npm release. Then it updates concise@be-concise in each of Claude Code, Codex, and omp that has the plugin installed. It restarts each running console on another version when that console is the main process of a systemd user unit, and prints a restart hint for other consoles. --check reports what would change and changes nothing. From a git checkout, the command skips the npm step; use git pull for the checkout.
The command starts a localhost server on an available port and opens the browser. Use --port 4317 to select a port or --no-open to print the URL without opening it. npm run web also starts the console from the repository.
concise-web --all serves every project the hooks have registered under ~/.config/concise/projects, with a project switcher in the sidebar that groups projects by git repository and labels worktrees. Projects whose directory no longer exists are hidden until you choose "Show N missing". Each hook call registers its project there and appends its record to ~/.local/state/concise/projects/<hash>/records.jsonl, so the hub shows history from before it started and keeps working while it is down. Set "monitor": { "persist": false } or BEC_MONITOR_PERSIST=0 to keep the registry entry without the record file.
The console edits user and project configuration, shows the effective settings and environment overrides, and tests pasted text through the hooks. The Rules page switches packs on and off, adds a pack from an https URL, a local path, or pasted JSON, checks packs installed from a URL and the plugin itself for updates, and removes packs it installed. Pack management is described in plugins/concise/docs/packs.md. It shows matches, hook decisions, timings, and full JSON responses. Repeat an attempt to test confirmation and retry limits, or reset the playground session.
The playground previews Bash command rewrites. It does not run the pasted command. It uses separate retry state and leaves test configuration changes unsaved until you save a configuration layer.
Live activity captures hook requests and responses for the selected project while the console runs, with filtering, JSON export, and counts for the retained records. It keeps up to 500 records per project within 16 MiB in memory. Stop the server to discard them, and clear a project's history to truncate its record file. Capture requires this version of the plugin in the agent host; reload the plugin and review the changed Bash hook definition after updating. Other environment overrides in the agent process still apply to its hooks.
The URL contains a local access token. Configuration saves detect intervening file edits. Ctrl+C stops the server and removes its capture registration.
Bypass filtering for one command:
NOFILTER=1 pytest tests/NOFILTER=1 also works later in the command, as in cd app && NOFILTER=1 npm test. A command that sends its standard output to a file, as in npm test > out.log 2>&1, is not filtered.
Adjust the output cap, match pattern, context, or tail length:
FILTER_LINES=300 FILTER_PATTERN='FAIL|timeout' FILTER_CONTEXT=10 FILTER_TAIL=20 go test ./...Persistent defaults can live in ~/.claude/test-filter.conf or ~/.codex/test-filter.conf. omp sessions read the same files.
See CONTRIBUTING.md for the branch workflow, Conventional Commits, and automated semantic releases. .agents/docs/INDEX.md lists the researched maintainer notes, including npm trusted publishing.
node plugins/concise/test/run-tests.mjsThe suite runs the Claude Code cases, then plugins/concise/test/codex-tests.mjs, which feeds apply_patch payloads in the shape Codex 0.152 sends, then the omp extension cases, and then a self-check that writes every file in the plugin through the hook under the ryan preset.
