任务 ID: task-t038p3-59f0aa  |  文件: task.md  |  最后修改: 2026-03-01 20:11:29

Task task-t038p3-59f0aa — CLI 重构(T038-P3)

文件路径

原始需求

重构 ai_search/cli.py:删除安装向导等臃肿逻辑(~400行),新增 web/find/list-categories/list-engines 四个 SearXNG 命令,精简 setup。目标从 1005 行降到 ~600 行。

详细方案/root/.openclaw/workspace/memory/docs/todo/T038-R-refactor-plan.md § 3.3


执行链

coder → reviewer → 爱衣质检


各 Agent 职责


Ai.Dev 💻(session key: agent:coder:main

执行前必读
1. /srv/projects/agent-reach/ai_search/cli.py — 当前完整 CLI(1005行)
2. /root/.openclaw/workspace/memory/docs/todo/T038-R-refactor-plan.md § 3.3 — CLI 重构设计

Step 3.1:删除臃肿逻辑(目标 -400 行)

以下函数/代码段全部删除

函数 行数 原因
_cmd_install(args) ~90行 安装向导,不需要
_install_skill() ~40行 skill 安装,不需要
_install_system_deps() ~100行 系统依赖安装,不需要
_install_mcporter() ~70行 mcporter 安装,不需要
_cmd_configure(args) ~135行 交互式配置,不需要
_cmd_check_update() ~57行 更新检查,不需要
_cmd_watch() ~35行 文件监控,不需要

同时删除 main() 函数中对应的 subparser 注册(install、configure、check-update、watch)。

Step 3.2:新增 web 命令(~40行)

async def _cmd_web(args):
    """通用网页搜索(SearXNG general 分类)"""
    from ai_search.core import AISearch
    s = AISearch()
    results = await s.web(
        args.query,
        time_range=getattr(args, 'time', None),
        language=getattr(args, 'lang', None),
        limit=getattr(args, 'num', 20),
    )
    _print_search_results(results)

CLI 签名:

ai-search web "query" [--time day|week|month|year] [--lang zh] [-n 20]

Step 3.3:新增 find 命令(~50行)

async def _cmd_find(args):
    """分类/引擎搜索(SearXNG)"""
    from ai_search.core import AISearch
    s = AISearch()
    results = await s.find(
        args.query,
        category=getattr(args, 'cat', None),
        engines=getattr(args, 'engine', None),
        time_range=getattr(args, 'time', None),
        language=getattr(args, 'lang', None),
        limit=getattr(args, 'num', 20),
    )
    _print_search_results(results)

CLI 签名:

ai-search find "query" [--cat academic|medical|science|finance|pkg|...] [--engine arxiv,pubmed,...] [--time day|week|month|year] [--lang zh] [-n 20]

Step 3.4:新增 list-categories 命令(~25行)

ai-search list-categories

调用 AISearch().list_categories(),输出分类列表。

Step 3.5:新增 list-engines 命令(~30行)

ai-search list-engines [--cat academic]

调用 AISearch().list_engines(category=cat),输出引擎列表(名称、shortcut、分类)。

Step 3.6:精简 setup 命令

_cmd_setup() 有 ~90 行交互式配置。精简为只配必要 key(Exa API key 等),删除安装步骤引用。大概 -60 行。

Step 3.7:抽取 _print_search_results 辅助函数

新旧搜索命令都需要格式化输出。如果还没有统一的输出函数,抽取一个共用的:

def _print_search_results(results):
    """统一格式化搜索结果输出"""
    if not results:
        print("No results found.")
        return
    for i, r in enumerate(results, 1):
        title = r.get('title', 'Untitled')
        url = r.get('url', '')
        content = r.get('content', '')[:150]
        print(f"\n{i}. {title}")
        print(f"   {url}")
        if content:
            print(f"   {content}")

Step 3.8:验证

cd /srv/projects/agent-reach
pip install -e . --break-system-packages 2>&1 | tail -3

# 行数检查
wc -l ai_search/cli.py  # 目标 ~600 行

# 新命令测试
ai-search web "machine learning" -n 5
ai-search find "pytorch" --cat pkg -n 5
ai-search find "diabetes" --cat medical --engine clinicaltrials -n 5
ai-search list-categories
ai-search list-engines --cat science

# 旧命令回归(确保没误删)
ai-search doctor
ai-search read https://example.com
ai-search search "test" -n 3  # Exa 语义(可能因无 key 失败,但命令本身不报错)
ai-search version

# 已删命令确认
ai-search install 2>&1 | head -1   # 应该报错 invalid choice
ai-search configure 2>&1 | head -1  # 应该报错
ai-search check-update 2>&1 | head -1  # 应该报错
ai-search watch 2>&1 | head -1  # 应该报错

开始时:

/root/.openclaw/workspace/scripts/log-to-channel.sh coder receive "T038-P3 CLI重构" task-t038p3-59f0aa

完成后:
1. session.md 记录删除/新增行数、测试结果
2. bash /root/.openclaw/workspace/scripts/log-to-channel.sh coder handoff "T038-P3 CLI重构" reviewer task-t038p3-59f0aa
3. sessions_send 通知 reviewer(agent:reviewer:maintimeoutSeconds=0):
task_id=task-t038p3-59f0aa task=/root/.openclaw/workspace/tasks/task-t038p3-59f0aa/task.md


Ai.Rev 📋(session key: agent:reviewer:main

审查要点:

  1. 行数验证
    bash wc -l /srv/projects/agent-reach/ai_search/cli.py # 应在 550-700 行之间

  2. 删除验证 — 以下函数应不存在:
    bash grep -n "def _cmd_install\|def _install_skill\|def _install_system_deps\|def _install_mcporter\|def _cmd_configure\|def _cmd_check_update\|def _cmd_watch" /srv/projects/agent-reach/ai_search/cli.py # 应无输出

  3. 新命令功能测试
    bash ai-search web "test" -n 3 ai-search find "bitcoin" --cat finance -n 3 ai-search find "cancer" --engine clinicaltrials -n 3 ai-search list-categories ai-search list-engines --cat science

  4. 旧命令回归
    bash ai-search version ai-search doctor ai-search read https://example.com 2>&1 | head -5 # search 系列命令(至少验证 help 不报错) ai-search search --help ai-search search-twitter --help 2>/dev/null || true

  5. 已删命令确认
    bash for cmd in install configure check-update watch; do ai-search $cmd 2>&1 | grep -q "invalid choice\|error\|unrecognized" && echo "$cmd: ✅ 已删" || echo "$cmd: ❌ 还在!" done

  6. 代码质量

  7. 新命令参数命名一致(--time, --lang, -n, --cat, --engine)
  8. _print_search_results 是否被复用
  9. 无 dead import(删除函数后残留的 import)

开始时:

/root/.openclaw/workspace/scripts/log-to-channel.sh reviewer receive "T038-P3 CLI重构" task-t038p3-59f0aa

完成后:

/root/.openclaw/workspace/scripts/log-to-channel.sh reviewer handoff "T038-P3 CLI重构" main task-t038p3-59f0aa

sessions_send 通知爱衣(agent:main:maintimeoutSeconds=0


⚠️ 爱衣质检 SOP

质检要点

输出结论

通过 → log done + message 主人
不通过 → 标准重试流程