code-flow-viz
npx skills add https://github.com/mmorit00/fund-portfolio-bot --skill code-flow-viz
Agent 安装分布
Skill 文档
ä»£ç æµç¨å¯è§åè§è
æ¬ Skill æä¾ä¸å¥å¯å¤ç¨ç模æ¿åæ¹æ³ï¼ç¨äºæ¢³çä»£ç æµç¨ãçæå¯è§åææ¡£ã
æ ¸å¿ååï¼ç¨æåå ASCII å¾è¡¨è®²æ¸ æ¥”æ°æ®ä»åªæ¥ãç»è¿åªäºå±ãæåå°åªå»”ã
When to use
å¨ä»¥ä¸åºæ¯ä½¿ç¨æ¬ Skillï¼
- ç¨æ·è¯¢é®”æä¸ªåè½æ¯æä¹å·¥ä½ç”
- æ°å¢åè½éè¦è®¾è®¡æ°æ®æµ
- éæåéè¦æ¢³çç°æé»è¾
- ç¼åææ¯ææ¡£ææ¶æè¯´æ
- 代ç è¯å®¡æ¶éè¦å¯è§åè°ç¨é¾
æ ¸å¿æ¨¡æ¿
1. 宿´æµç¨å¾ï¼å¤åºæ¯å¯¹æ¯ï¼
éç¨äºï¼æ¢³çä¸ä¸ªåè½çå¤ç§ä½¿ç¨åºæ¯ï¼å¦æå¨ vs èªå¨ãæå vs 失败ï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â åè½åç§°ï¼å¦ï¼éé¢ç®¡çå
¨çå½å¨æï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
åºæ¯ 1ï¼åºæ¯åç§°ï¼å¦ï¼èªå¨æ¥è¯¢éé¢ç¶æï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ç¨æ·å½ä»¤
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â uv run python -m src.cli.xxx ... â
ââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
ââââââââââââââââââ
â CLI å± â è°ç¨ Flow 彿°
â _do_xxx() â âââââââââââââââââââââ
ââââââââââââââââââ â
â¼
ââââââââââââââââââââââââââââ
â Flow å± â
â xxx_flow() â
âââââââââ¬âââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââ
â Data å± â
â XxxRepo / XxxClient â
ââââââââââ¬ââââââââââââââââââââââ
â
â¼
ââââââââââââââââââââââââââââââ
â å¤é¨ç³»ç» / æ°æ®åº â
â (SQLite / API / etc) â
ââââââââââââ¬ââââââââââââââââââ
â è¿åæ°æ®
â¼
ââââââââââââââââââââââââââââââââââââ
â æ°æ®å¤çï¼è§£æ/转æ¢ï¼ â
âââââââââââââââ¬âââââââââââââââââââââ
â
â¼
ââââââââââââââââââââââââ
â è¿å弿°æ®ç±» â â 说æä¸ºä»ä¹ä¿ç/ç®å
â (Result / Item / ...)â
ââââââââââââ¬ââââââââââââ
â
â¼
ââââââââââââââââââââââââ
â CLI 屿 ¼å¼åè¾åº â
ââââââââââââââââââââââââ
â
â¼
ââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ç»ç«¯è¾åºç¤ºä¾ â
â ï¼ç¨æ¡çº¿å
å´ï¼çªåºæç»ç¨æ·çå°çææï¼ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
åºæ¯ 2ï¼å¦ä¸ä¸ªåºæ¯
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ï¼éå¤ä¸è¿°ç»æï¼çªåºå·®å¼ç¹ï¼
2. æ°æ®åºè¡¨ç»æè¯´æ
éç¨äºï¼è§£éæä¸ªåè½æ¶åçæ°æ®åºè¡¨
CREATE TABLE table_name (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- â 说æä¸»é®ä½ç¨
field1 TEXT NOT NULL, -- 说æå段å«ä¹
field2 TEXT, -- NULL çä¸å¡å«ä¹
...
);
-- ç´¢å¼ï¼è¯´æä¸ºä»ä¹éè¦è¿ä¸ªç´¢å¼ï¼
CREATE INDEX idx_xxx ON table_name(field1, field2);
ç¤ºä¾æ°æ®è¡¨ï¼
| id | field1 | field2 | field3 | 说æ |
|---|---|---|---|---|
| 42 | value1 | value2 | value3 | è§£éè¿æ¡è®°å½çä¸å¡å«ä¹ |
| 43 | … | … | … | … |
å ¸åæ¥è¯¢ï¼
-- åºæ¯è¯´æï¼ä»ä¹æ¶åéè¦è¿æ ·æ¥ï¼
SELECT * FROM table_name
WHERE condition1 = ?
AND (condition2 IS NULL OR condition2 >= ?);
3. åå±è°ç¨é¾å¾ï¼ç®åçï¼
éç¨äºï¼å¿«é说æå½æ°è°ç¨å ³ç³»
CLI å± (_do_xxx)
â
ââ> Flow å± (xxx_flow)
â
ââ> Data/Repo (xxx_repo.get)
â â
â ââ> SQLite (SELECT ...)
â
ââ> Data/Client (xxx_client.fetch)
â
ââ> å¤é¨ API (HTTP GET ...)
4. æ°æ®ç±»è®¾è®¡åæè¡¨
éç¨äºï¼è¯ä¼°ä¸é´æ°æ®ç±»æ¯å¦å¿ è¦
| ç±»å | åæ®µæ° | ç¨é | å¤å® | çç± |
|---|---|---|---|---|
XxxResult |
6 | å¤å段èå + CLI å±ç¤º | â ä¿ç | 满足”æå°å¿ è¦åå” |
XxxWrapper |
1 | ååæ®µå è£ | â å é¤ | è¿åº¦å è£ ï¼ç´æ¥è¿ååå§ç±»å |
XxxItem |
3 | å表æç»é¡¹ | â ä¿ç | æä¸å¡è¯ä¹ |
对æ¯ç¤ºä¾ï¼
# â è¿åº¦å
è£
@dataclass
class XxxResult:
field: SomeType # åªæä¸ä¸ªå段
def xxx_flow() -> XxxResult:
return XxxResult(field=value)
# â
ç®åå
def xxx_flow() -> SomeType: # ç´æ¥è¿å
return value
5. ä¸å¡å ³é®ç¹æ 注
éç¨äºï¼çªåºä¸å¡è§åå设计å³ç
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ä¸å¡å
³é®ç¹ â
ââââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââââ¤
â 为ä»ä¹è¿æ ·è®¾è®¡ï¼ â å
·ä½å³ç â
ââââââââââââââââââââââââ¼âââââââââââââââââââââââââââââââââââââââ¤
â â¢ æ°æ®ç²¾åº¦ â éé¢ç¨ Decimalï¼2 ä½å°æ° â
â ⢠å¹çæ§ â æ (fund_code, date) å¯ä¸çº¦æ â
â ⢠å¯è¿½æº¯æ§ â record_id ä½ä¸ºå
¨å±å¯ä¸æ è¯ â
ââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââ
ä½¿ç¨æ¹æ³
Step 1: ç¡®å®åæç®æ
åç以ä¸é®é¢ï¼
- ç¨æ·æ³äºè§£åªä¸ªåè½çæµç¨ï¼
- è¿ä¸ªåè½æå ç§åºæ¯ï¼ï¼æå/失败ãæå¨/èªå¨çï¼
- æ¶ååªäºå±æ¬¡ï¼ï¼CLI â Flow â Data â DB/APIï¼
- å ³é®æ°æ®ç±»æåªäºï¼ä¸ºä»ä¹è®¾è®¡æè¿æ ·ï¼
Step 2: éæ©åéçæ¨¡æ¿
- å¤åºæ¯å¯¹æ¯ â æ¨¡æ¿ 1ï¼å®æ´æµç¨å¾ï¼
- å䏿µç¨ â æ¨¡æ¿ 3ï¼åå±è°ç¨é¾ï¼
- æ°æ®åºè®¾è®¡ â æ¨¡æ¿ 2ï¼è¡¨ç»æ + ç¤ºä¾æ°æ®ï¼
- æ°æ®ç±»è¯ä¼° â æ¨¡æ¿ 4ï¼åæè¡¨ï¼
Step 3: å¡«å å 容
ååï¼
- ç¨ ASCII å¾è¡¨ä»£æ¿é¿ç¯æå
- ç¨ç®å¤´ï¼
â â¼ â â â â âï¼ä¸²èæ°æ®æµ - ç¨æ¡çº¿ï¼
â â â â â âï¼åé屿¬¡ - ç¨å线æ¡ï¼
â â â â â âï¼çªåºç¨æ·å¯è§é¨å - å¨å
³é®èç¹å 注éï¼
â 说æï¼
符å·ä½¿ç¨è§èï¼
| ç¬¦å· | ç¨é | ç¤ºä¾ |
|---|---|---|
â â¼ |
åç´æµå | æ°æ®ä»ä¸å°ä¸ |
â â |
水平说æ | record_id: int â æ°æ®åºä¸»é® |
â â â â |
åçº¿æ¡ | å å´ä»£ç åãå½ä»¤ |
â â â â |
åçº¿æ¡ | çªåºç»ç«¯è¾åºãéè¦ç»æ |
âââ |
åé线 | åéä¸ååºæ¯ |
Step 4: æ·»å 对æ¯åæ
Before vs Afterï¼éæåºæ¯ï¼ï¼
# Beforeï¼é®é¢çæ¬ï¼
...代ç ...
# é®é¢ï¼
# - è¿åº¦å
è£
# - åæ®µåä½
# - å¢å 认ç¥è´æ
# Afterï¼æ¹è¿çæ¬ï¼
...代ç ...
# æ¹è¿ï¼
# - ç´æ¥è¿åææä¹ç±»å
# - åå°ä¸é´å±
# - éä½ç»´æ¤ææ¬
å®é æ¡ä¾
æ¡ä¾ 1ï¼éé¢ç®¡çæµç¨ï¼å®æ´çï¼
ï¼è§ä¸é¢çæ¨¡æ¿ 1 示ä¾ï¼å±å¼ 4 ä¸ªåºæ¯ç宿´æµç¨ï¼
æ¡ä¾ 2ï¼æ°æ®ç±»è¯ä¼°ï¼fund_restriction 模åï¼
| 彿° | ä¹åè¿å | ç°å¨è¿å | å¤å® | åå |
|---|---|---|---|---|
add_restriction |
AddRestrictionResult(6åæ®µ) |
ä¿ç | â | CLI éè¦å±ç¤ºææå段 |
end_restriction |
EndRestrictionResult(4åæ®µ) |
bool |
â | åªéè¦æå/失败 |
check_trading_status |
CheckStatusResult(2åæ®µ) |
ParsedRestriction | None |
â | åªæ¯ç®åå è£ |
è¾åºæ¸ åï¼Checklistï¼
çææµç¨å¯è§åææ¡£æ¶ï¼ç¡®ä¿å å«ï¼
- 顶屿¦è¿°ï¼åè½ç®æ ãæ¶åæ¨¡åï¼
- åºæ¯æä¸¾ï¼æå/失败ãæå¨/èªå¨çï¼
- å屿µç¨å¾ï¼CLI â Flow â Data â å¤é¨ï¼
- æ°æ®åºè¡¨ç»æï¼å¦ææ¶åï¼
- ç¤ºä¾æ°æ®åæ¥è¯¢ï¼å¸®å©çè§£ï¼
- å ³é®æ°æ®ç±»è¯´æï¼ä¸ºä»ä¹ä¿ç/ç®åï¼
- 设计åå ï¼ä¸ºä»ä¹è¿æ ·åï¼ï¼
- æªæ¥æ©å±ç¹ï¼TODO æé¢çæ¥å£ï¼
忍¡å¼ï¼ä¸è¦è¿æ ·åï¼
â 纯æåæè¿°æµç¨
é¦å
è°ç¨ CLI å±ç _do_xxx 彿°ï¼ç¶å _do_xxx ä¼è°ç¨ Flow å±ç xxx_flow 彿°ï¼
xxx_flow åè°ç¨ Data å±ç xxx_repo.get æ¹æ³...
â ç¨ ASCII å¾è¡¨
CLI (_do_xxx) â Flow (xxx_flow) â Data (xxx_repo.get) â SQLite
â è¡¨æ ¼æ²¡æéç¹
| åæ®µ | ç±»å |
|---|---|
| id | int |
| name | str |
â çªåºä¸å¡å«ä¹
| åæ®µ | ç±»å | 说æ | ä¸å¡çº¦æ |
|---|---|---|---|
| id | int | ä¸»é® | èªå¨çæï¼å ¨å±å¯ä¸ |
| name | str | åºéåç§° | é空ï¼ç¨äºå±ç¤º |
â SQL 没æåºæ¯è¯´æ
SELECT * FROM table WHERE id = ?;
â 带ä¸å¡åºæ¯
-- åºæ¯ï¼ç¨æ·æ¥è¯¢ææ¡éå¶è®°å½è¯¦æ
SELECT * FROM fund_restrictions WHERE id = ?;
-- åºæ¯ï¼DCA åææ¶æ£æ¥ææ¥æ¯å¦è¢«éé¢
SELECT * FROM fund_restrictions
WHERE fund_code = ? AND start_date <= ? AND (end_date IS NULL OR end_date >= ?);
ä¸å ¶ä» Skill çåä½
- code-styleï¼è¾åºä»£ç ç¤ºä¾æ¶éµå¾ªç¼ç è§è
- architectureï¼æµç¨å¾é符åå屿¶æçº¦æ
- dev-workflowï¼æ¢³çæµç¨åå 读åç¸å ³ä»£ç åææ¡£
æ»ç»
æ¬ Skill çæ ¸å¿ä»·å¼ï¼
- å¯å¤ç¨ç模æ¿ï¼åå°ä»é¶å¼å§çæ¶é´
- ç»ä¸çè§è§é£æ ¼ï¼ASCII å¾ + è¡¨æ ¼ + æ¡çº¿
- ä¸å¡è§è§ï¼ä¸åªæ¯ä»£ç æµç¨ï¼æ´å ³æ³¨”为ä»ä¹”
- 对æ¯åæï¼éæååãå¤åºæ¯å¯¹æ¯
- æ¸ åæ£æ¥ï¼ç¡®ä¿ä¸éæ¼å ³é®ä¿¡æ¯
使ç¨é¢çï¼æ¯æ¬¡éè¦è§£é”æä¸ªåè½æä¹å·¥ä½”æ¶é½å¯ä»¥ç¨ã