# ============================================ # Rule File Parsing # ============================================ function rule::is_base() { local name="${1:-}" [[ -f "$(ctx::rules::base)/${name}.rule" ]] } function rule::exists() { local name="${1:-}" [[ -f "$(ctx::rule::path "${name}.rule")" ]] || \ [[ -f "$(ctx::rules::base)/${name}.rule" ]] } function rule::require_assignable() { local name="${1:-}" if rule::is_base "$name"; then log::error "Cannot assign base rule '${name}' — base rules cannot be assigned directly" return 1 fi } function rule::require_exists() { local name="${1:-}" if ! rule::exists "$name"; then log::error "Rule not found: ${name}" return 1 fi }