ShiErFeng/shierfeng-fastapi-backend/cli/metadata/risk_specs.py
2026-07-24 09:43:10 +08:00

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)