76 lines
2.2 KiB
Python
76 lines
2.2 KiB
Python
from dataclasses import dataclass
|
|
from typing import Literal
|
|
|
|
from cli.guards import DEFAULT_DANGEROUS_COMMAND_RULE_REGISTRY, DangerousCommandRuleRegistry
|
|
|
|
CommandRiskLevel = Literal['readonly', 'normal', 'high']
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class CommandRiskSpec:
|
|
"""
|
|
CLI 命令风险元数据定义。
|
|
|
|
:param command_name: 命令唯一标识
|
|
:param risk_level: 风险级别
|
|
:param supports_dry_run: 是否支持演练执行
|
|
"""
|
|
|
|
command_name: str
|
|
risk_level: CommandRiskLevel
|
|
supports_dry_run: bool
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class CommandRiskSpecRegistry:
|
|
"""
|
|
CLI 命令风险元数据注册表。
|
|
|
|
该注册表负责从危险命令规则注册表派生风险元数据,供 TUI、文档、
|
|
诊断提示等只读场景统一查询。
|
|
|
|
:param specs: 按命令名索引的风险元数据表
|
|
"""
|
|
|
|
specs: dict[str, CommandRiskSpec]
|
|
|
|
def get_spec(self, command_name: str) -> CommandRiskSpec | None:
|
|
"""
|
|
获取指定命令的风险元数据。
|
|
|
|
:param command_name: 命令唯一标识
|
|
:return: 风险元数据,不存在时返回 None
|
|
"""
|
|
return self.specs.get(command_name)
|
|
|
|
|
|
class CommandRiskSpecRegistryBuilder:
|
|
"""
|
|
CLI 命令风险元数据注册表构建器。
|
|
|
|
该构建器负责基于危险命令规则注册表生成命令风险元数据注册表,
|
|
避免模块导入阶段散落重复的字典推导逻辑。
|
|
"""
|
|
|
|
@staticmethod
|
|
def build(rule_registry: DangerousCommandRuleRegistry) -> CommandRiskSpecRegistry:
|
|
"""
|
|
基于危险命令规则注册表构建风险元数据注册表。
|
|
|
|
:param rule_registry: 危险命令规则注册表
|
|
:return: 风险元数据注册表
|
|
"""
|
|
return CommandRiskSpecRegistry(
|
|
specs={
|
|
command_name: CommandRiskSpec(
|
|
command_name=rule.command_name,
|
|
risk_level=rule.risk_level,
|
|
supports_dry_run=rule.supports_dry_run,
|
|
)
|
|
for command_name, rule in rule_registry.rules.items()
|
|
}
|
|
)
|
|
|
|
|
|
COMMAND_RISK_SPEC_REGISTRY = CommandRiskSpecRegistryBuilder.build(DEFAULT_DANGEROUS_COMMAND_RULE_REGISTRY)
|