- ð§ æºèœå¯¹è¯ â åºäº AgentScope æ¡æ¶ïŒæ¯æå€æš¡åé 眮ïŒProvider 管çïŒïŒæµåŒèŸåºïŒSSEïŒ
- ð± 倿ž éæ¥å ¥ â DingTalkïŒééïŒãé£ä¹ŠïŒFeishu/LarkïŒãiMessage åŒç®±å³çš
- ð€ SubAgent æ¯æ â å€è§è²åŒæ¥å代çïŒç¬ç« Session äžäžæïŒæ¯æç¬ç«æš¡åé 眮 + è¿è¡æ¶æœè±¡
- ð ïž å·¥å ·ç³»ç» â å 眮 12 äžªå·¥å ·ïŒæä»¶è¯»åãShellãæµè§åšãPython æ§è¡ãæèœ/宿¶ä»»å¡ CLI çïŒïŒTool Guard å®å šé²æ€ïŒå¯è§ååŒå ³ç®¡ç + è°çšæ¥å¿
- â° å®æ¶ä»»å¡ â æ å Cron 衚蟟åŒè°åºŠïŒèªåšæ§è¡ + ç»æéç¥ + CLI 管ç
- ð æèœæ©å± â ZIP/URL æ¹åŒå®è£ èªå®ä¹æèœå ïŒçæ¬ç®¡ç + çé蜜
- ð Dashboard â ç³»ç»ç»è®¡é¢æ¿ïŒæ±æ»äŒè¯/æ¶æ¯/Token/å·¥å ·/æèœ/ä»»å¡çææ
- ð éç¥ç³»ç» â WebSocket 宿¶éç¥æ»çº¿ïŒå šå±ç³»ç»äºä»¶æšé
- ð» CLI å·¥å · â åœä»€è¡ç®¡çå·¥å ·ïŒæ¯æè¿çšç®¡çãæ§å¶å°èŸåº
- ðŠ Task Artifacts â SubAgent 产åºç©ç®¡çïŒæ¯ææä»¶/ææ¬/代ç çç±»å
- ð åå端å犻 â React å端 + FastAPI åç«¯ïŒæäŸå¯è§å管ççé¢
- 𧪠æµè¯é©±åš â 672+ åå äžéææµè¯ïŒE2E èŠçæ žå¿æµçš
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ¶æ¯æž éå± â
â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â
â â Web â â DingTalk â â Feishu â â iMessage â â
â ââââââ¬ââââââ ââââââ¬ââââââ ââââââ¬ââââââ ââââââ¬ââââââ â
âââââââââŒâââââââââââââââŒââââââââââââââŒââââââââââââââŒââââââââââââ
â â â â
âââââââââŒâââââââââââââââŒââââââââââââââŒââââââââââââââŒââââââââââââ
â FastAPI Backend â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â SchedulerClient â â
â â (FastAPI è¿çšå
客æ·ç«¯ïŒè¿æ¥ç¬ç« Scheduler è¿çš) â â
â ââââââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââ â
â â ZMQ (DEALER â ROUTER) â
â ââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââââââ â
â â Scheduler è¿çš (SchedulerBroker) â â
â â ââââââââââââââââââââââââââââââââââââââââââââââââââââ â â
â â â ROUTER (请æ±è·¯ç±) + XPUB/XSUB (äºä»¶ä»£ç) â â â
â â ââââââââââââ¬âââââââââââââââ¬âââââââââââââââ¬ââââââââââ â â
â â â â â â â
â â ââââââââââââŒââââ ââââââââŒââââââââ ââââŒâââââââââââ â â
â â â PA Worker â â Sub Worker â â Cron Worker â â â
â â â (per session)â â (per task) â â (singleton) â â â
â â â pa:{sid} â â sub:{n}:{t} â â cron:sched â â â
â â ââââââââââââââââ ââââââââââââââââ âââââââââââââââ â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â â Provider Mgr â â Tool System â â Tool Guard â â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â â Session Mgr â â Skill Mgr â â Notification â â
â ââââââââââââââââ ââââââââââââââââ â Bus (WS) â â
â ââââââââââââââââ ââââââââââââââââ âââââââââââââââââ â
â â Workspace â â Memory â â
â â Manager â â (Hybrid) â â
â ââââââââââââââââ ââââââââââââââââ â
â SQLite (WAL) â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââŒâââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â React Frontend (Vite + TypeScript + Tailwind) â
â Chat · Sessions · Tools · Skills · Tasks · Cron · â
â Workspace · Dashboard â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ç³»ç»éçš å€è¿çš + ZMQ æ¶æ¯æ»çº¿ æ¶æïŒæ¯äžª Agent è¿è¡åšç¬ç«ç OS è¿çšäžïŒ
| ç»ä»¶ | è¿çšæš¡å | 诎æ |
|---|---|---|
| SchedulerClient | FastAPI äž»è¿çšå | è客æ·ç«¯ïŒéè¿ ZMQ DEALER è¿æ¥ Scheduler |
| SchedulerBroker | ç¬ç«è¿çš | äžå€®è°åºŠåšïŒç®¡çææ Worker è¿çšççåœåšæ |
| PA Worker | æ¯ Session äžäžªè¿çš | è¿è¡ PersonalAssistantDaemonïŒå€ççšæ·å¯¹è¯ |
| Sub Worker | æ¯ Task äžäžªè¿çš | è¿è¡ SubAgentDaemonïŒæ§è¡å§æŽŸä»»å¡ |
| Cron Worker | å šå±åäŸè¿çš | è¿è¡ CronDaemonïŒè°åºŠåæ§è¡å®æ¶ä»»å¡ |
ZMQ éä¿¡æš¡åïŒ
- ROUTER/DEALER â 请æ±/æ§å¶è·¯ç±ïŒ
Envelope+msgpackåºååïŒ - XPUB/XSUB â äºä»¶ååž/订é 代çïŒSSE æµåŒæšéïŒ
- Worker çåœåšæïŒ
PENDING â STARTING â RUNNING â IDLE â STOPPING â STOPPED
- Python 3.10+
- Node.js 18+
- Docker & Docker ComposeïŒå¯éïŒ
# å
éä»åº
git clone https://github.com/robscc/nimo.git
cd nimo
# äžé®å¯åšåŒåç¯å¢
make dev
# æè
åå«å¯åš
make backend # å端 http://localhost:8088
make frontend # å端 http://localhost:3000# å€å¶å¹¶é
眮ç¯å¢åé
cp .env.example .env
# çŒèŸ .env å¡«åçžå
³é
眮
# å¯åšæææå¡
docker-compose up -dæ¯æå€ç§é
眮æ¹åŒïŒäŒå
级ä»é«å°äœïŒïŒç¯å¢åé > ~/.nimo/config.yaml > .env > é»è®€åŒ
æšèäœ¿çš ~/.nimo/config.yamlïŒ
llm:
provider: compatible # å
Œå®¹ OpenAI æ ŒåŒç API
model: qwen-plus
api_key: your_api_key
base_url: https://dashscope.aliyuncs.com/compatible-mode/v1
# å¯éïŒæ¶æ¯æž é
dingtalk:
app_key: ""
app_secret: ""
feishu:
app_id: ""
app_secret: ""
imessage:
enabled: false # ä»
macOSä¹å¯äœ¿çš .env æä»¶ïŒ
LLM_MODEL=qwen-plus
LLM_API_KEY=your_api_key| æž é | ææ¡£ | ç¶æ |
|---|---|---|
| DingTalk | docs/channels/dingtalk.md | â æ¯æ |
| é£ä¹Š Feishu | docs/channels/feishu.md | â æ¯æ |
| iMessage | docs/channels/imessage.md | â æ¯æïŒé macOSïŒ |
ç³»ç»å å« 3 ç§ AgentïŒåèªè¿è¡åšç¬ç«è¿çšäžïŒéè¿ ZMQ + MessageBus åäœïŒ
çšæ·æ¶æ¯ (Web/DingTalk/é£ä¹Š/iMessage)
â
âŒ
FastAPI API â SchedulerClient â CHAT_REQUEST (ZMQ)
â
âŒ
PA Worker (pa:{session_id})
â
ââ 1. ååšçšæ·æ¶æ¯å° Memory
ââ 2. æå»ºåšæ System Prompt
â ââ Workspace äžäžæ (SOUL.md / AGENTS.md)
â ââ SubAgent è±åå (Registry åšæçæ)
â ââ å¯çšçå·¥å
·å衚 + Prompt Skills
â ââ @mention è·¯ç±æç€º (åŠæ)
ââ 3. é建对è¯åå² (å猩æç¥ïŒä¿çæèŠ)
ââ 4. è°çš LLM (æå€ 32 蜮工å
·åŸªç¯)
â ââ è§£æå·¥å
·è°çš (OpenAI æ ŒåŒ)
â ââ Tool Guard å®å
𿣿¥
â ââ æ§è¡å·¥å
· â è®°åœæ¥å¿ â 远å å°å¯¹è¯
â ââ 埪ç¯çŽå°æ å·¥å
·è°çš
ââ 5. æµåŒèŸåº SSE äºä»¶
â (thinking_delta / text_delta / tool_start / tool_done / done)
ââ 6. ååšå©æåå€ + è®°åœ Token çšé
ââ 7. è§Šåè®°å¿å猩 (è¶
éåŒæ¶)
PA è°çš dispatch_sub_agent å·¥å
· (æ @mention è§Šå)
â
ââ è·¯ç±: agent_name çŽæ¥æå® (äŒå
)
â æ task_type å¹é
Registry
â
âŒ
SchedulerBroker æ¶å° DISPATCH_SUB â spawn æ°è¿çš
â
âŒ
Sub Worker (sub:{agent_name}:{task_id})
â
ââ 1. å 蜜 SubAgentTask + è§è²å®ä¹
ââ 2. å建ç¬ç«äžäžæ
â ââ ç¬ç« session_id: "sub:{parent}:{task_id}"
â ââ ç¬ç« BufferMemory (äžæ±¡æäž»å¯¹è¯)
â ââ ç¬ç«æš¡åé
眮 (æªé
眮åéå°å
šå±)
ââ 3. æ£æ¥ MessageBus åŸ
å€çæ¶æ¯
ââ 4. è°çš LLM + å€èœ®å·¥å
·åŸªç¯
â ââ æ¯èœ®æ£æ¥ MessageBus æ°æ¶æ¯
â ââ æ§è¡å·¥å
· â è®°åœ execution_log
â ââ è¶
åºèœ®æ¬¡ â åŒºå¶æèŠ
ââ 5. ååž task_event (SSE 宿¶æšé)
ââ 6. æŽæ° Task ç¶æ (DONE/FAILED)
â ââ åå
¥ execution_log + result
â ââ 倱莥æ¶: ææ°éé¿éè¯
ââ 7. éç¥ PA
â AGENT_RESPONSE (ZMQ)
âŒ
SchedulerBroker æŠæªç»æ
ââ åå
¥ç¶ Session è®°å¿
ââ åé SSE ä»»å¡å®æå¡ç
CronDaemon (cron:scheduler) åå°åŸªç¯
â æ¯ 30 ç§æ£æ¥ get_due_jobs()
âŒ
åç°å°æä»»å¡
â
ââ 1. å建 CronJobExecution è®°åœ (RUNNING)
ââ 2. å®äŸå CronAgent
â ââ èœ»éæš¡åŒ: åªå 蜜 SOUL.md + AGENTS.md
â ââ å¿è·³æš¡åŒ: å èœœå®æŽ Workspace äžäžæ
ââ 3. è°çš LLM + å·¥å
·åŸªç¯
â ââ æ§è¡å·¥å
· â è®°åœ execution_log
â ââ è¿åæç»ç»æ
ââ 4. æŽæ°æ§è¡è®°åœ (DONE/FAILED)
â ââ åå
¥ result + execution_log
â ââ æŽæ° next_run_at (croniter 计ç®)
ââ 5. éç¥ PA Session
ââ ZMQ AGENT_NOTIFY â pa:{session_id}
ââ ååž session 级 SSE äºä»¶
ââââââââââââ send() ââââââââââââââââ ZMQ AGENT_NOTIFY ââââââââââââ
â PA ââââââââââââââ¶â MessageBus ââââââââââââââââââââââââ¶â SubAgent â
â âââââââââââââââ (DB + ZMQ) âââââââââââââââââââââââââ â
ââââââââââââ receive() ââââââââââââââââ AGENT_RESPONSE ââââââââââââ
â
â æ¶æ¯çåœåšæ: PENDING â DELIVERED â PROCESSED
â æ¶æ¯æš¡åŒ: request / response / notify / broadcast
SubAgent æ¯ç¬ç«è¿è¡çåŒæ¥å代çïŒæ¥æç¬ç«äžäžæãç¬ç«æš¡åé çœ®ïŒæ¯æå€èœ®å·¥å ·è°çšå Agent éŽéä¿¡ã
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â PersonalAssistant (äž» Agent) â
â â
â dispatch_sub_agent(task, agent_name/task_type, context) â
â â â
â ⌠â
â âââââââââââââââââââ task_type ââââââââââââââââââââââ â
â â SubAgentRegistryâââââå¹é
âââââââââ SubAgentDefinition â â
â â (è§è²æ³šåäžå¿) â â · researcher â â
â ââââââââââ¬âââââââââ â · coder â â
â â â · ops-engineer â â
â ⌠â · èªå®ä¹è§è²... â â
â å建 SubAgentTask (PENDING) ââââââââââââââââââââââ â
â çæç¬ç« sub_session_id: "sub:<parent>:<task_id>" â
â â â
â ⌠(asyncio åå°ä»»å¡) â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â SubAgent å®äŸ â â
â â · ç¬ç« BufferMemoryïŒäžåœ±åäž»äžäžæïŒ â â
â â · ç¬ç«æš¡åé
眮ïŒå¯èŠçïŒæªé
眮åéå°äž» AgentïŒ â â
â â · ç¬ç« AsyncSessionïŒé¿å
DB éïŒ â â
â â â â
â â run() â reply() 埪ç¯: â â
â â ââââââââââââââââââââââââââââââââââââââââââââ â â
â â â 1. æ£æ¥ MessageBus åŸ
å€çæ¶æ¯ â â â
â â â 2. æå»ºæ¶æ¯å衚 (system + history + user) â â â
â â â 3. è°çš LLM â â â
â â â 4. è§£æå·¥å
·è°çš (OpenAI æ ŒåŒ) â â â
â â â 5. æ§è¡å·¥å
· â è®°åœæ¥å¿ â 远å å°å¯¹è¯ â â â
â â â 6. 埪ç¯çŽå°æ å·¥å
·è°çšæèŸŸå° max_tool_roundsâ â â
â â â 7. è¶
åºèœ®æ¬¡ â åŒºå¶æèŠ (force summary) â â â
â â ââââââââââââââââââââââââââââââââââââââââââââ â â
â â â â
â â 宿 â æŽæ° Task ç¶æ (DONE/FAILED) â â
â â â åå
¥ execution_log â â
â â â éè¿ MessageBus éç¥äž» Agent â â
â â â åé task_event_bus 宿¶äºä»¶ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
SubAgent æ¯æäž€ç§è·¯ç±æ¹åŒïŒ
| æ¹åŒ | 诎æ | äŒå 级 |
|---|---|---|
agent_name |
çŽæ¥æå® SubAgent åç§°ïŒåŠ researcherïŒ |
ðŽ æé« |
task_type |
æä»»å¡ç±»åå¹é
SubAgent ç accepted_task_types å衚 |
ð¡ æ¬¡ä¹ |
# æ¹åŒ 1ïŒçŽæ¥æå® agent_name
task = await assistant.dispatch_sub_agent(
task="åææ¥åå¹¶çææèŠ",
agent_name="researcher",
context={"file": "report.pdf"},
session_id="user_session_123",
)
# æ¹åŒ 2ïŒæ task_type èªåšè·¯ç±
task = await assistant.dispatch_sub_agent(
task="åäžäžªæåºç®æ³",
task_type="coding",
session_id="user_session_123",
)
# æ¥è¯¢ä»»å¡ç¶æ
status = await assistant.get_task_status(task.id)æ¯äžª SubAgent å®äŸæ¥æå®å šé犻çè¿è¡ç¯å¢ïŒ
- ç¬ç« SessionïŒ
sub_session_id = "sub:<parent_session>:<task_id>"ïŒäžäžäž»å¯¹è¯æ··æ· - ç¬ç« MemoryïŒäœ¿çšç¬ç«ç
BufferMemoryïŒå€èœ®å·¥å ·å¯¹è¯äžæ±¡æäž»äžäžæ - ç¬ç« DB SessionïŒäœ¿çšç¬ç«ç
AsyncSessionLocalïŒé¿å äžè¯·æ±çº§ Session ç SQLite éå²çª
SubAgent å¯é 眮ç¬ç«çæš¡ååæ°ïŒæªé 眮çåæ®µèªåšåéå°äž» Agent çå šå±é 眮ïŒ
SubAgentDefinition.get_model_config(fallback=äž»Agenté
眮)
â model_name: SubAgentèªå®ä¹ ?? äž»Agentç model
â model_provider: SubAgentèªå®ä¹ ?? äž»Agentç provider
â api_key: SubAgentèªå®ä¹ ?? äž»Agentç api_key
â base_url: SubAgentèªå®ä¹ ?? äž»Agentç base_url
SubAgent çæ¯æ¬¡è¿è¡éœäŒè®°åœå®æŽç execution_logïŒå
å«ïŒ
system_promptâ ç³»ç»æç€ºè¯user_messageâ çšæ·/äž» Agent äžåçä»»å¡llm_responseâ æ¯èœ® LLM ååºtool_start/tool_doneâ å·¥å ·è°çšåŒå§/ç»æïŒå«èæ¶duration_msïŒforced_summaryâ è¶ åºå·¥å ·èœ®æ¬¡åçåŒºå¶æèŠfinal_resultâ æç»ç»æ
æ¥å¿éè¿ task_event_bus 宿¶æšéïŒäŸ SSE 订é
ïŒïŒå¹¶æä¹
åå° SubAgentTask.execution_log åæ®µã
éè¿ MessageBus å®ç°åŒæ¥æ¶æ¯äŒ éïŒ
| æ¶æ¯æš¡åŒ | 诎æ |
|---|---|
request |
åå ¶ä» Agent åé请æ±å¹¶çåŸ ååº |
response |
åå€åŠäžäžª Agent çè¯·æ± |
notify |
ååéç¥ïŒåŠä»»å¡å®æéç¥äž» AgentïŒ |
broadcast |
å¹¿ææ¶æ¯ç»ææçžå ³ Agent |
SubAgent åšæ¯èœ®å·¥å
·è°çšåæ£æ¥ MessageBus äžçåŸ
å€çæ¶æ¯ïŒå¹¶å°å
¶æ³šå
¥åœå对è¯äžäžæã
| è§è² | 诎æ | é»è®€ä»»å¡ç±»å |
|---|---|---|
researcher |
ç ç©¶äžä¿¡æ¯æ¶é | research, summarize, analyze, report, investigate, compare |
coder |
çŒç äžææ¯å®ç° | code, debug, script, implement, test, refactor, fix |
ops-engineer |
è¿ç»Žäžåºç¡è®Ÿæœ | ops, mysql, redis, kubernetes, k8s, logs, prometheus, monitoring, debug-infra, sre, devops |
æ¯æéè¿ APIïŒPOST /api/v1/sub-agentsïŒæå端èªå®ä¹æ·»å æ°è§è²ã
å
眮 12 䞪工å
·ïŒéè¿å端 /tools 页é¢å¯è§å管çïŒ
| å·¥å · | 诎æ | é»è®€ç¶æ |
|---|---|---|
get_current_time |
è·ååœåæ¶éŽ | â åŒå¯ |
read_file |
读åæä»¶å 容 | â åŒå¯ |
browser_use |
æµè§åšèªåšå | â åŒå¯ |
send_file_to_user |
åéæä»¶ç»çšæ· | â åŒå¯ |
skill_cli |
æèœç®¡ç CLI | â åŒå¯ |
cron_cli |
宿¶ä»»å¡ç®¡ç CLI | â åŒå¯ |
dispatch_sub_agent |
æŽŸé£ SubAgent | â åŒå¯ |
write_file |
åå ¥æä»¶ | â å ³é |
edit_file |
çŒèŸæä»¶ | â å ³é |
execute_shell_command |
æ§è¡ Shell åœä»€ | â å ³é |
execute_python_code |
æ§è¡ Python 代ç | â å ³é |
produce_artifact |
çæä»»å¡äº§åºç© | â å ³é |
æ¯æ Tool Guard å®å šé²æ€æºå¶ïŒå¯¹å±é©æäœè¿è¡æŠæªå确讀ã
äœ¿çšæ å 5 段 Cron 衚蟟åŒå建èªåšåä»»å¡ïŒ
# æ¯å€©æ©äž 9 ç¹å鿥æ¥
0 9 * * *
# æ¯åšäžæéåŸ
å
0 9 * * 1
任塿§è¡åéè¿æ¶æ¯æ»çº¿åäž» Agent åééç¥ïŒæ§è¡æ¥å¿å®æŽè®°åœã
# è¿è¡åå
+ éææµè¯ïŒ672 testsïŒ
make test
# ä»
åå
æµè¯
make test-unit
# ä»
éææµè¯
make test-integration
# E2E æµè¯ïŒéåå端è¿è¡ïŒ
cd backend && .venv/bin/pytest tests/e2e/ -v
# èŠççæ¥å
make coveragenimo/
âââ .github/ # GitHub Actions & æš¡æ¿
âââ backend/ # FastAPI å端
â âââ agentpal/
â â âââ agents/ # PersonalAssistantãSubAgentãCronAgentãBaseAgent
â â âââ channels/ # DingTalkãFeishuãiMessage
â â âââ api/v1/ # REST API è·¯ç±ïŒ14 䞪 endpoint æš¡åïŒ
â â âââ memory/ # è®°å¿æš¡åïŒBuffer / SQLite / Hybrid / ReMeLightïŒ
â â âââ models/ # SQLAlchemy ORM æš¡åïŒ13 åŒ è¡šïŒ
â â âââ providers/ # æš¡åæäŸæ¹ç®¡çïŒProvider Managerãéè¯æš¡åïŒ
â â âââ runtimes/ # SubAgent è¿è¡æ¶æœè±¡ïŒInternal / HTTPïŒ
â â âââ scheduler/ # å€è¿çš SchedulerïŒBroker / Client / Worker / ProcessïŒ
â â âââ zmq_bus/ # ZMQ æ¶æ¯æ»çº¿ïŒå®æ€è¿çšãåè®®ãäºä»¶è®¢é
ïŒ
â â âââ cli/ # åœä»€è¡å·¥å
·ïŒstart / stop / restart / status / configïŒ
â â âââ workspace/ # å·¥äœç©ºéŽç®¡çïŒäžäžææå»ºãè®°å¿åå
¥ïŒ
â â âââ tools/ # å·¥å
·æ³šåäžå
眮工å
·ïŒ12 䞪ïŒ
â â âââ services/ # é
眮ãCron è°åºŠãéç¥æ»çº¿ãäºä»¶æ»çº¿
â âââ tests/ # unit / integration / e2e
âââ frontend/ # React + Vite + TypeScript + Tailwind
â âââ src/
â âââ pages/ # ChatãToolsãSkillsãTasksãSessionsãWorkspaceãCronãDashboard
â âââ components/ # LayoutãSessionPanelãMentionPopupãTaskArtifactViewerãNimoLogo
â âââ hooks/ # useToolsãuseSessionsãuseSkillsãuseCronãuseTasksãuseNotifications ...
âââ docs/ # é¡¹ç®ææ¡£
âââ docker-compose.yml
æ¬¢è¿ PR å IssueïŒè¯·å é 读 CONTRIBUTING.mdã