architecture
1
总安装量
1
周安装量
#42894
全站排名
安装命令
npx skills add https://github.com/mmorit00/fund-portfolio-bot --skill architecture
Agent 安装分布
opencode
1
claude-code
1
Skill 文档
Architecture and layering for fund-portfolio-bot (v0.3.1)
æ¬ Skill å
³æ³¨åå±èè´£ä¸ä¾èµæ¹åã详ç»è¯´æåè§ docs/architecture.mdã
When to use
å¨ä»¥ä¸åºæ¯ä½¿ç¨æ¬ Skillï¼è§¦åè¯ï¼åå±ãå¯¼å ¥ãæ¶æãä¾èµãarchitectureãlayeringãimportï¼ï¼
- è®¾è®¡æ°æ¨¡åææ°åè½æ¶
- ä¿®æ¹ import è¯å¥æä¾èµæ¶
- 代ç è¯å®¡æ¶æ£æ¥å屿¯å¦æ£ç¡®
- ç¨æ·æå°”æåºè¯¥æè¿ä¸ªæ¾å¨åªä¸å±”ã”è¿ä¸ªå¯¼å ¥å¯¹å”ã”循ç¯ä¾èµ”æ¶
屿¬¡ç»ææ¦è§ï¼v0.3.1 ç®åç + ä¾èµæ³¨å ¥ï¼
项ç®éç¨èªå¤åå ä¾èµç 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ï¼ - éè¿ @dependency è£
饰卿³¨å
¥
data/å±å®ä¾ï¼ä¸ç´æ¥å¯¼å ¥ï¼ - ä¸å¾å¯¼å
¥
cli/
- å¯ä»¥ä¾èµ
-
data/- å¯ä»¥ä¾èµ
core/ï¼models + rulesï¼ - ä¸å¾å¯¼å
¥
cli/ãflows/
- å¯ä»¥ä¾èµ
-
cli/- å¯ä»¥ä¾èµ
flows/ï¼è°ç¨å½æ°ï¼ - ä¸éè¦ç´æ¥å¯¼å
¥
data/ï¼ç±è£ 饰å¨å¤çï¼ - åªååæ°è§£æåæµç¨è°ç¨
- å¯ä»¥ä¾èµ
å ³é®çº¦æ
-
æ Protocol æ½è±¡å±ï¼
- v0.3.1 å é¤äº
protocols.py - ç´æ¥ä½¿ç¨å
·ä½ç±»ï¼
TradeRepoãNavRepoç - ç±»çæ¹æ³ç¾åå³ä¸º”æ¥å£çº¦å®”
- v0.3.1 å é¤äº
-
ä¾èµæ³¨å ¥æºå¶ï¼v0.3.1 æ°å¢ï¼ï¼
core/dependency.pyï¼æä¾@dependencyå@registerè£ é¥°å¨core/container.pyï¼éä¸ç®¡çææä¾èµå·¥å彿°- Flow 彿°ä½¿ç¨
@dependencyèªå¨æ³¨å ¥åæ° - CLI æ éæå¨å®ä¾å Repoï¼ç´æ¥è°ç¨ Flow 彿°
-
é¿å 循ç¯å¯¼å ¥ï¼
- å¦é TYPE_CHECKINGï¼ä½¿ç¨
from typing import TYPE_CHECKING - ç±»åæ³¨è§£ä½¿ç¨å符串形å¼ï¼
"TradeRepo"
- å¦é TYPE_CHECKINGï¼ä½¿ç¨
设计æä¿®æ¹ä»£ç æ¶çæ¥éª¤
-
è¯å«æå¨å±çº§
- 夿æä»¶å±äº
cli/flows/core/dataä¸çåªä¸å± - ç¡®ä¿å
¶èè´£ä¸è¯¥å±å®ä½ä¸è´ï¼
- å½ä»¤è¡å
¥å£ + æµç¨å½æ° â
cli - ä¸å¡æµç¨ç¼æ â
flows - æ°æ®æ¨¡å + 纯è§å â
core - æ°æ®åºè®¿é® + å¤é¨å®¢æ·ç«¯ â
data
- å½ä»¤è¡å
¥å£ + æµç¨å½æ° â
- 夿æä»¶å±äº
-
æ£æ¥ä¾èµæ¹å
- ç¡®ä¿ import è¯å¥ç¬¦åä¾èµè§å
coreä¸è½ importflowsædataflowsä¸è½ importcli
-
å½å约å®
- Repo ç±»ï¼
TradeRepoãNavRepoï¼ä¸å¸¦ Sqlite åç¼ï¼ - Service ç±»ï¼
CalendarServiceãEastmoneyNavService - Flow 彿°ï¼å°åèå½¢ï¼
create_trade()ãconfirm_trades()ãmake_daily_report()ï¼ - Flow æä»¶ï¼
trade.pyãdca.pyãmarket.pyãreport.py - Result ç±»ï¼
ConfirmResultãReportResultãFetchNavsResult
- Repo ç±»ï¼
-
ç±»åæ³¨è§£
- 使ç¨å
·ä½ç±»åï¼
TradeRepoãFundRepo - é¿å 循ç¯å¯¼å ¥æ¶ä½¿ç¨ TYPE_CHECKING
- åç¬¦ä¸²ç±»åæ³¨è§£ï¼
def __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)
éæåå²
- v0.1-v0.3ï¼4 屿¶æï¼jobs â wiring â usecases(Protocol) â adaptersï¼
- v0.3.1 é¶æ®µ 1ï¼3 屿¶æï¼cli â flows â dataï¼å é¤ Protocol å wiringï¼
- v0.3.1 é¶æ®µ 2ï¼å¼å ¥ä¾èµæ³¨å ¥ï¼Flow ç±»æ¹å½æ° + @dependency è£ é¥°å¨ï¼