一键导入
architecture
// 分层架构规范 / Architecture and layering rules (v0.3.1)。在设计新组件、修改导入、检查分层时使用。核心约束:cli → flows → data,core 向内不向外。Use when designing components, changing imports, or reviewing layering decisions. Enforces cli/flows/core/data separation.
// 分层架构规范 / Architecture and layering rules (v0.3.1)。在设计新组件、修改导入、检查分层时使用。核心约束:cli → flows → data,core 向内不向外。Use when designing components, changing imports, or reviewing layering decisions. Enforces cli/flows/core/data separation.
项目架构约定:通过 Root/Folder/File 三层极简元数据(_dir.md + I/O/Pos 注释) 让 AI 在任意位置自定位。 **AI 创建文件夹时自动触发**:hook 会生成 _dir.md 模板,AI 填写 Input/Output/Pos。
在编写、更新、维护 roadmap.md 的时候触发
多模型协作 — 调用 gemini-agent 和 codex-agent 辅助分析 **触发场景**(主动使用): - 深度代码分析:算法理解、性能瓶颈、架构梳理 - 大范围探索:5+ 文件、模块依赖、调用链追踪 - 复杂推理:方案评估、逻辑验证、并发安全分析 - 多视角决策:需要不同角度分析再综合判断 **不触发**: - 简单修改(1-2 文件的明确改动) - 文件查找(用 Explore 或 Glob/Grep) - 已知路径的读写操作 **核心原则**:你是决策者和执行者,外部模型是顾问。
代码风格规范 / Code style conventions。在编写、编辑、评审 Python 代码时使用。包括类型注解、Decimal 精度、Docstring、模块组织等规范。Use when writing, editing, or reviewing Python code. Enforces type hints, Decimal precision, docstrings, and module organization.
命名规范 / Naming conventions。在创建类、函数、变量,或重命名、检查命名时使用。核心原则:简洁优先,上下文消歧义,类型提示已提供足够信息。Use when naming classes/functions/variables, renaming code, or reviewing names. Prioritizes brevity over self-documentation.
用于梳理和可视化代码流程,生成清晰的 ASCII 流程图、数据流图和表格分析。适用于已有代码的梳理、新功能设计的说明、以及技术文档的编写。
| name | architecture |
| description | 分层架构规范 / Architecture and layering rules (v0.3.1)。在设计新组件、修改导入、检查分层时使用。核心约束:cli → flows → data,core 向内不向外。Use when designing components, changing imports, or reviewing layering decisions. Enforces cli/flows/core/data separation. |
本 Skill 关注分层职责与依赖方向。详细说明参见 docs/architecture.md。
在以下场景使用本 Skill(触发词:分层、导入、架构、依赖、architecture、layering、import):
项目采用自外向内依赖的 3 层架构 + 依赖注入:
cli/:命令行入口,参数解析 + 调用 Flow 函数flows/:业务流程函数(纯函数 + @dependency 装饰器)core/:核心逻辑 + 依赖注入
models/:领域数据类(Trade, Fund, DcaPlan 等)rules/:纯业务规则函数(settlement, rebalance 等)dependency.py:依赖注入装饰器(@dependency, @register)container.py:依赖工厂函数集合config.py, log.py:配置和日志data/:数据访问层
db/:数据库 Repo(TradeRepo, NavRepo 等)client/:外部客户端(Eastmoney, Discord 等)依赖方向:只能向内依赖:
cli → flows → data
↓ ↓
core ← ← ←
↑
container(创建 data 层实例)
core/
core/ 内部模块container.py 可以导入 data/(用于创建实例)cli/、flows/flows/
core/(models + rules + dependency)data/ 层实例(不直接导入)cli/data/
core/(models + rules)cli/、flows/cli/
flows/(调用函数)data/(由装饰器处理)无 Protocol 抽象层:
protocols.pyTradeRepo、NavRepo 等依赖注入机制(v0.3.1 新增):
core/dependency.py:提供 @dependency 和 @register 装饰器core/container.py:集中管理所有依赖工厂函数@dependency 自动注入参数避免循环导入:
from typing import TYPE_CHECKING"TradeRepo"识别所在层级
cli / flows / core / data 中的哪一层cliflowscoredata检查依赖方向
core 不能 import flows 或 dataflows 不能 import cli命名约定
TradeRepo、NavRepo(不带 Sqlite 前缀)CalendarService、EastmoneyNavServicecreate_trade()、confirm_trades()、make_daily_report())trade.py、dca.py、market.py、report.pyConfirmResult、ReportResult、FetchNavsResult类型注解
TradeRepo、FundRepodef __init__(self, repo: "TradeRepo")# ❌ core/ 中导入 data/(除了 container.py)
from src.data.db.trade_repo import TradeRepo # 禁止(models/rules 中)
# ❌ flows/ 中导入 cli/
from src.cli.confirm import main # 禁止
# ❌ flows/ 中直接导入 data/(应使用装饰器注入)
from src.data.db.trade_repo import TradeRepo # 禁止(应通过 @dependency)
# ❌ data/ 中导入 flows/
from src.flows.trade import confirm_trades # 禁止
# ✅ container.py 注册依赖工厂
from src.core.dependency import register
from src.data.db.trade_repo import TradeRepo
from src.data.db.calendar import CalendarService
@register("trade_repo")
def get_trade_repo() -> TradeRepo:
conn = get_db_connection()
calendar = get_calendar_service()
return TradeRepo(conn, calendar)
# ✅ flows/ 使用 @dependency 装饰器
from src.core.dependency import dependency
from src.core.models.trade import Trade
from src.data.db.trade_repo import TradeRepo # 仅用于类型注解
from src.data.client.local_nav import LocalNavService
@dependency
def confirm_trades(
*,
today: date,
trade_repo: TradeRepo | None = None, # 自动注入
nav_service: LocalNavService | None = None, # 自动注入
) -> ConfirmResult:
# 直接使用,无需检查 None
to_confirm = trade_repo.list_pending(today)
...
# ✅ cli/ 直接调用 Flow 函数
from src.flows.trade import confirm_trades
def main():
args = parse_args()
result = confirm_trades(today=args.day) # 依赖自动注入
print(f"确认 {result.confirmed_count} 笔交易")
src/core/container.py)from src.core.dependency import register
@register("trade_repo") # 注册名 = Flow 函数参数名
def get_trade_repo() -> TradeRepo:
"""注册名:trade_repo"""
conn = get_db_connection()
calendar = get_calendar_service()
return TradeRepo(conn, calendar)
src/flows/*.py)from src.core.dependency import dependency
@dependency
def confirm_trades(
*,
today: date,
trade_repo: TradeRepo | None = None, # 参数名必须与注册名一致
) -> ConfirmResult:
# trade_repo 已自动注入,直接使用
...
# 测试时手动传入 Mock 对象
mock_repo = MockTradeRepo()
result = confirm_trades(today=date.today(), trade_repo=mock_repo)