2025-11-19 19:14:10 -08:00
# codex-execpolicy
## Overview
- Policy engine and CLI built around `prefix_rule(pattern=[...], decision?, match?, not_match?)` .
- This release covers the prefix-rule subset of the execpolicy language; a richer language will follow.
- Tokens are matched in order; any `pattern` element may be a list to denote alternatives. `decision` defaults to `allow` ; valid values: `allow` , `prompt` , `forbidden` .
- `match` / `not_match` supply example invocations that are validated at load time (think of them as unit tests); examples can be token arrays or strings (strings are tokenized with `shlex` ).
- The CLI always prints the JSON serialization of the evaluation result.
- The legacy rule matcher lives in `codex-execpolicy-legacy` .
## Policy shapes
- Prefix rules use Starlark syntax:
```starlark
prefix_rule(
pattern = ["cmd", ["alt1", "alt2"]], # ordered tokens; list entries denote alternatives
decision = "prompt", # allow | prompt | forbidden; defaults to allow
match = [["cmd", "alt1"], "cmd alt2"], # examples that must match this rule
not_match = [["cmd", "oops"], "cmd alt3"], # examples that must not match this rule
2025-04-24 17:14:47 -07:00
)
```
2025-11-19 19:14:10 -08:00
## CLI
2025-12-11 14:46:00 -08:00
- From the Codex CLI, run `codex execpolicy check` subcommand with one or more policy files (for example `src/default.rules` ) to check a command:
2025-11-19 19:14:10 -08:00
```bash
2025-12-11 14:46:00 -08:00
codex execpolicy check --rules path/to/policy.rules git status
2025-04-24 17:14:47 -07:00
```
2025-12-11 14:46:00 -08:00
- Pass multiple `--rules` flags to merge rules, evaluated in the order provided, and use `--pretty` for formatted JSON.
2025-11-20 16:44:31 -05:00
- You can also run the standalone dev binary directly during development:
2025-11-19 19:14:10 -08:00
```bash
2025-12-11 14:46:00 -08:00
cargo run -p codex-execpolicy -- check --rules path/to/policy.rules git status
2025-11-19 19:14:10 -08:00
```
- Example outcomes:
2025-12-04 02:39:48 -05:00
- Match: `{"matchedRules":[{...}],"decision":"allow"}`
- No match: `{"matchedRules":[]}`
2025-04-24 17:14:47 -07:00
2025-12-04 02:39:48 -05:00
## Response shape
2025-04-24 17:14:47 -07:00
```json
{
2025-12-04 02:39:48 -05:00
"matchedRules": [
{
"prefixRuleMatch": {
"matchedPrefix": ["< token > ", "..."],
"decision": "allow|prompt|forbidden"
2025-04-24 17:14:47 -07:00
}
2025-12-04 02:39:48 -05:00
}
],
"decision": "allow|prompt|forbidden"
2025-04-24 17:14:47 -07:00
}
```
2025-12-04 02:39:48 -05:00
- When no rules match, `matchedRules` is an empty array and `decision` is omitted.
2025-11-19 19:14:10 -08:00
- `matchedRules` lists every rule whose prefix matched the command; `matchedPrefix` is the exact prefix that matched.
- The effective `decision` is the strictest severity across all matches (`forbidden` > `prompt` > `allow` ).
2025-11-20 16:44:31 -05:00
Note: `execpolicy` commands are still in preview. The API may have breaking changes in the future.