evorule_cli/cli.rs
1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (C) 2026 EvoRule Project
3// This file is part of EvoRule, licensed under GNU Affero General Public License v3 or later.
4//! CLI 参数定义(clap derive)
5//!
6//! 子命令:
7//! - `run`:加载并执行 JSON 规则,输出 fact log
8//! - `replay`:重放 fact log(pretty-print)
9//! - `diff`:对比两个 fact log(按 FactId 对齐)
10//! - `validate`:校验 JSON 规则文件(用 tier1 RuleValidator)
11//! - `verify-chain`:验证 fact log 哈希链完整性
12
13use std::path::PathBuf;
14
15use clap::{Parser, Subcommand};
16
17/// evorule: 没有智能,只有执行的最佳实践
18#[derive(Parser, Debug)]
19#[command(
20 name = "evorule",
21 version,
22 about = "evorule: no intelligence, only best practices of execution",
23 long_about = "evorule CLI - 加载并执行用户编写的 JSON 规则。\n\
24 零网络、零遥测、零系统依赖,适合合规敏感用户本地使用。\n\
25 fact log 采用 evorule-reactor WAL 格式,与 evorule-governance 审计链互通。"
26)]
27pub struct Cli {
28 #[command(subcommand)]
29 pub command: Command,
30}
31
32#[derive(Subcommand, Debug)]
33pub enum Command {
34 /// 加载并执行 JSON 规则(输出 fact log)
35 Run {
36 /// 规则目录(包含 *.json 文件)
37 rules_dir: PathBuf,
38
39 /// 初始 payload(JSON 字符串,可选,默认 {})
40 #[arg(long, conflicts_with = "payload_file")]
41 payload: Option<String>,
42
43 /// 从文件读取初始 payload(JSON 格式)
44 #[arg(long)]
45 payload_file: Option<PathBuf>,
46
47 /// 输出文件(默认 stdout)
48 #[arg(long, short = 'o')]
49 output: Option<PathBuf>,
50
51 /// 最大执行步数上界(默认 10000,超限发 Fact::Error 退出)
52 #[arg(long, default_value_t = crate::executor::DEFAULT_MAX_STEPS)]
53 max_steps: usize,
54 },
55
56 /// 重放 fact log(pretty-print 每个 Fact)
57 Replay {
58 /// fact log 文件(JSON Lines 格式,与 tier1 reactor WAL 互通)
59 fact_log: PathBuf,
60 },
61
62 /// 对比两个 fact log(按 FactId 对齐,非 HashSet)
63 Diff {
64 /// 第一个 fact log
65 a: PathBuf,
66 /// 第二个 fact log
67 b: PathBuf,
68 },
69
70 /// 校验 JSON 规则文件(用 tier1 RuleValidator,语法+语义验证)
71 Validate {
72 /// 规则目录
73 rules_dir: PathBuf,
74 },
75
76 /// 验证 fact log 哈希链完整性(blake3,与 evorule-governance 互通)
77 VerifyChain {
78 /// fact log 文件
79 fact_log: PathBuf,
80 },
81}