diff --git a/02_卡人(水)/水桥_平台对接/MCP管理/SKILL.md b/02_卡人(水)/水桥_平台对接/MCP管理/SKILL.md index 421a183f..5e5ea255 100644 --- a/02_卡人(水)/水桥_平台对接/MCP管理/SKILL.md +++ b/02_卡人(水)/水桥_平台对接/MCP管理/SKILL.md @@ -108,6 +108,16 @@ updated: "2026-02-23" --- +## 卡若AI 可接入 MCP 的技能清单(参考) + +| 技能 | 成员 | 对应能力 | 可选 MCP 方向 | +|:---|:---|:---|:---| +| F11 量化交易 | 火炬 | 量化策略 | 用 MCP 迭代和优化 | + +> 其他技能匹配见对话归档或 MCPfinder 搜索。 + +--- + ## 触发词 `MCP`、`找MCP`、`连接MCP`、`MCP搜索`、`发现MCP`、`添加MCP`、`需要MCP`、`MCP安装`、`MCP发现`、`查MCP`、`装MCP` diff --git a/02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_all_folders.py b/02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_all_folders.py index 517c2395..7c98f45f 100644 --- a/02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_all_folders.py +++ b/02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_all_folders.py @@ -1,31 +1,76 @@ #!/usr/bin/env python3 -"""全量拉取所有 IMAP 可见文件夹""" +"""全量拉取所有 IMAP 可见文件夹 · 支持进度写入""" import json import sys +import imaplib +import os +from datetime import datetime from pathlib import Path from qq_mail_fetch import fetch_emails, list_folders, AUTH_CODE OUT = Path("/Users/karuo/Documents/卡若Ai的文件夹/报告") OUT.mkdir(parents=True, exist_ok=True) +PROGRESS_FILE = OUT / "qq_fetch_progress.json" -def safe_name(f): - return f.replace("/", "_").replace(" ", "_").replace("&", "x")[:40] +def count_folder(server, folder): + mb = f'"{folder}"' if " " in folder else folder + try: + typ, data = server.select(mb, readonly=True) + if typ == "OK" and data: + n = int(data[0].decode()) + server.close() + return n + except Exception: + pass + return 0 + +def get_folder_counts(folders): + """预扫各文件夹邮件数""" + from qq_mail_fetch import IMAP_HOST, IMAP_PORT, EMAIL + server = imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) + server.login(EMAIL, AUTH_CODE) + counts = {f: count_folder(server, f) for f in folders} + server.logout() + return counts + +def write_progress(progress): + progress["updated_at"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + with open(PROGRESS_FILE, "w", encoding="utf-8") as fp: + json.dump(progress, fp, ensure_ascii=False, indent=2) def main(): if not AUTH_CODE: print("无授权码") return 1 folders = list_folders() + counts = get_folder_counts(folders) + total_emails = sum(counts.values()) + start_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S") all_emails = [] stats = {} - for f in folders: + done_emails = 0 + for i, f in enumerate(folders): try: emails = fetch_emails(days=365*20, limit=0, all_mail=True, progress=False, folder=f) stats[f] = len(emails) for e in emails: e["_folder"] = f all_emails.extend(emails) - print(f" {f}: {len(emails)}") + done_emails += len(emails) + elapsed = (datetime.now() - datetime.strptime(start_at, "%Y-%m-%d %H:%M:%S")).total_seconds() + eta_sec = (elapsed / done_emails * (total_emails - done_emails)) if done_emails else 0 + progress = { + "total_folders": len(folders), + "done_folders": i + 1, + "total_emails": total_emails, + "done_emails": done_emails, + "pct": round(done_emails / total_emails * 100, 1) if total_emails else 0, + "current_folder": f, + "start_at": start_at, + "eta_minutes": round(eta_sec / 60, 1), + } + write_progress(progress) + print(f" [{i+1}/{len(folders)}] {f}: {len(emails)} | 总进度 {done_emails}/{total_emails} ({progress['pct']}%) ETA {progress['eta_minutes']}min") except Exception as ex: print(f" {f}: 失败 {ex}") stats[f] = 0 @@ -33,6 +78,17 @@ def main(): json.dump(all_emails, fp, ensure_ascii=False, indent=None) with open(OUT / "qq_folders_stats.json", "w", encoding="utf-8") as fp: json.dump(stats, fp, ensure_ascii=False, indent=2) + write_progress({ + "total_folders": len(folders), + "done_folders": len(folders), + "total_emails": total_emails, + "done_emails": len(all_emails), + "pct": 100, + "status": "completed", + "start_at": start_at, + "finished_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "eta_minutes": 0, + }) print(f"\n合计: {len(all_emails)} 封") return 0 diff --git a/02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_progress.sh b/02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_progress.sh new file mode 100644 index 00000000..2d78dc19 --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_progress.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# 查看 QQ 邮箱全量拉取进度 +P="/Users/karuo/Documents/卡若Ai的文件夹/报告/qq_fetch_progress.json" +if [ ! -f "$P" ]; then + echo "进度文件不存在,拉取可能未启动或使用旧版脚本" + exit 1 +fi +python3 -c " +import json +from pathlib import Path +p = Path('/Users/karuo/Documents/卡若Ai的文件夹/报告/qq_fetch_progress.json') +d = json.load(open(p, encoding='utf-8')) +print('=== QQ 邮箱全量拉取进度 ===') +print(f\"进度: {d.get('done_emails',0)} / {d.get('total_emails',0)} 封 ({d.get('pct',0)}%)\") +print(f\"文件夹: {d.get('done_folders',0)} / {d.get('total_folders',0)}\") +print(f\"当前: {d.get('current_folder','-')}\") +print(f\"开始: {d.get('start_at','-')}\") +print(f\"更新: {d.get('updated_at','-')}\") +eta = d.get('eta_minutes',0) +if eta > 0: + print(f\"预计剩余: {eta} 分钟\") +if d.get('status')=='completed': + print(f\"完成: {d.get('finished_at','-')}\") +" diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 7dd54c9d..fd56129d 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -119,3 +119,4 @@ | 2026-02-23 21:19:17 | 🔄 卡若AI 同步 2026-02-23 21:19 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 | | 2026-02-23 21:31:11 | 🔄 卡若AI 同步 2026-02-23 21:31 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 | | 2026-02-23 23:22:09 | 🔄 卡若AI 同步 2026-02-23 23:22 | 更新:总索引与入口、水桥平台对接、卡土、运营中枢工作台 | 排除 >20MB: 10 个 | +| 2026-02-23 23:41:16 | 🔄 卡若AI 同步 2026-02-23 23:41 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 10 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 812d1b60..d32b6b92 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -122,3 +122,4 @@ | 2026-02-23 21:19:17 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 21:19 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-02-23 21:31:11 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 21:31 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-02-23 23:22:09 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 23:22 | 更新:总索引与入口、水桥平台对接、卡土、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-02-23 23:41:16 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 23:41 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |