SuperAPI AI 工具集

invoke-task-conventions

编程与开发

查看项目

更新于 10-16 02:28

技能介绍

用途:在 tasks.py 或 tasks/ 包中新增、重命名或审查 invoke 任务时,统一命名与接线方式,使 inv <namespace>.<task> 读作祈使命令:命名空间是主语,任务是动作。

三条规则:

  1. 任务名以动词开头,命名动作而非产物,如 apt.install-base、ai.install-skills。多词任务名动词在前(zsh.configure-omz),仅当一对任务在 inv --list 中作为家族相邻可读时才保留对象在前(format-check/format-apply)。
  2. 社区约定优先于规则,已有的 status、list、version、check、diff 等名称保留,如 gnome.status、deps.tree。这些名称具有实际作用:自 2026-08-25 起,机器的 Claude Code 白名单会自动批准 inv <ns>.status|check|diff|list|show 等名称;因此这类任务必须只检查、不变更,会变更的任务应使用 fix、apply、sync、configure 等名称。
  3. 有些命名空间本身即动作,如 setup、verify、clean、deploy、test,此时叶子名表示范围或对象,如 verify.all、clean.caches、test.unit。

一致性:每个含义固定一个动词,跨命名空间复用;任务 docstring 以动词开头时,该动词通常即任务名。

重命名的影响:不是字符串替换。Python 函数名随 CLI 名变化,phase 列表或 pre= 链直接引用函数对象;任务名还会出现在文档、配置文件、Dockerfile、CI 工作流、引导脚本及其他仓库文档中。脚本化重命名后需检查字符串字面量中的下划线拼写,并运行任务阅读输出;注意 Markdown 标题中的任务名会改变锚点。重命名应直接改掉,而非用 @task(aliases=[...]) 保留旧名。

接线陷阱:被导入的任务即被发布的任务,Collection.from_module 会把模块命名空间中每个 Task 对象都加入,导入用于 pre= 链的任务会被二次发布。任何导入任务的模块都应声明模块级命名空间,例如:ns = Collection(setup)。依赖升级后应运行 inv --list,而不只是跑测试。

任务不得运行等待键入输入的命令,无论是否 pty=True。invoke 会回显 stdin 并与子进程竞争;在 Python 3.14 上 invoke 完全无法转发 stdin,会触发 SystemError: buffer overflow,pty=True 只是掩盖第一个原因。应把交互式子进程作为继承真实终端的普通子进程运行,其余保持非交互:先认证 sudo 再用 sudo -n,apt 使用 DEBIAN_FRONTEND=noninteractive 加 --force-confold。可用 rg 'pty=True' 审查。

审计:inv --list | grep -oP '^ [a-z0-9.-]+' 获取完整接口,对照模块源码而非记忆,将每个名称分类为已动词优先、社区约定、动作命名空间或真实违规,并在持久位置记录有意合规的例外。