codex-rs/execpolicy/README.md
prefix_rule(pattern=[...], decision?, justification?, match?, not_match?) plus host_executable(name=..., paths=[...]).pattern element may be a list to denote alternatives. decision defaults to allow; valid values: allow, prompt, forbidden.justification is an optional human-readable rationale for why a rule exists. It can be provided for any decision and may be surfaced in different contexts (for example, in approval prompts or rejection messages). When decision = "forbidden" is used, include a recommended alternative in the justification, when appropriate (e.g., "Use `jj` instead of `git`.").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).codex-execpolicy-legacy.prefix_rule(
pattern = ["cmd", ["alt1", "alt2"]], # ordered tokens; list entries denote alternatives
decision = "prompt", # allow | prompt | forbidden; defaults to allow
justification = "explain why this rule exists",
match = [["cmd", "alt1"], "cmd alt2"], # examples that must match this rule
not_match = [["cmd", "oops"], "cmd alt3"], # examples that must not match this rule
)
host_executable(
name = "git",
paths = [
"/opt/homebrew/bin/git",
"/usr/bin/git",
],
)
/usr/bin/git status only matches a rule whose first token is /usr/bin/git./usr/bin/git to basename rules for git.host_executable(name="git", ...) exists, basename fallback is only allowed for listed absolute paths.host_executable() entry exists for a basename, basename fallback is allowed.codex execpolicy check subcommand with one or more policy files (for example src/default.rules) to check a command:codex execpolicy check --rules path/to/policy.rules git status
--resolve-host-executables:codex execpolicy check \
--rules path/to/policy.rules \
--resolve-host-executables \
/usr/bin/git status
--rules flags to merge rules, evaluated in the order provided, and use --pretty for formatted JSON.cargo run -p codex-execpolicy -- check --rules path/to/policy.rules git status
{"matchedRules":[{...}],"decision":"allow"}{"matchedRules":[]}{
"matchedRules": [
{
"prefixRuleMatch": {
"matchedPrefix": ["<token>", "..."],
"decision": "allow|prompt|forbidden",
"resolvedProgram": "/absolute/path/to/program",
"justification": "..."
}
}
],
"decision": "allow|prompt|forbidden"
}
matchedRules is an empty array and decision is omitted.matchedRules lists every rule whose prefix matched the command; matchedPrefix is the exact prefix that matched.resolvedProgram is omitted unless an absolute executable path matched via basename fallback.decision is the strictest severity across all matches (forbidden > prompt > allow).Note: execpolicy commands are still in preview. The API may have breaking changes in the future.