Community生产力与协作github.com

Wolftux/checklist

/checklist 在当前项目目录中安装缺失的清单文件,然后在专用聊天中显示清单。不会覆盖或更改任何现有内容。

checklist 是什么?

这是一个用于项目进度检查清单的 AI 技能。它会在当前项目目录中检查并安装缺失的清单组件(如工作日志文件、状态脚本、CLAUDE.md 中的清单块以及 Git 忽略规则),然后将清单显示在一个专用的独立聊天窗口中。该技能明确声明不会覆盖或修改任何已有文件,确保安全。它支持 Claude Code 等平台,通过 MCP 工具(如 mcp__ccd_session__start_session)创建独立的聊天会话,或回退到在当前聊天中直接显示清单。整个流程分为六个步骤:初步安全检查、检查四个必需组件、获取项目名称、安装缺失组件、打开清单聊天、以及输出最终消息。该技能还考虑了 Git worktree、家庭目录等边界情况,并提供了详细的错误处理逻辑。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Wolftux/checklist/tree/HEAD/plugins/checklist/checklist

Installed? Explore more 生产力与协作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

/checklist: 项目进度检查清单

/checklist 在当前项目目录中安装缺失的清单文件,然后在专用聊天中显示清单。不会覆盖或更改任何现有内容。

工作原理:

  • 项目目录为当前目录。所有命令均从此目录执行。
  • <base> 是此技能顶部显示的「Base directory」。模板位于 <base>/modelli/。
  • 每个路径中的命令都放在引号内:基本目录和项目目录可能包含空格。
  • 按顺序执行步骤,除非步骤另有说明,否则无需确认。
  • 每次 grep 均使用 -a:在 Claude Code 中,grep 可能将非 UTF-8 文件视为二进制文件,从而找不到实际存在的行。

步骤 1:初步检查

  1. 执行 command -v node。如果没有输出,则写一行(「需要 Node.js 18 或更高版本:请安装后重新运行 /checklist」)并停止。
  2. 执行 git rev-parse --path-format=absolute --git-dir 和 git rev-parse --path-format=absolute --git-common-dir。如果两者结果不同,说明你在一个二级工作树中:写一行(「你在一个工作树中:记录会随它消失。请从项目主目录运行 /checklist」)并停止。如果两个命令均失败,则没有 git:继续。
  3. 执行 pwd -P 和 (cd ~ && pwd -P)。如果结果相同,说明你在家目录中:写一行(「你在家目录中:CLAUDE.md 中的块将适用于所有项目。请在项目目录中运行 /checklist」)并停止。

当 node 存在且目录既不是二级工作树也不是家目录时,本步骤结束。

步骤 2:检查四个组件

不写任何内容。逐一记录是否存在:

  • 记录:文件 documenti/lavori.yaml 存在;
  • 脚本:文件 strumenti-locali/avanzamento/stato.mjs 存在;
  • 块:grep -aqx '## Checklist di avanzamento' CLAUDE.md 成功(如果 CLAUDE.md 不存在,则块缺失);
  • 排除行,仅在有 git 时(git rev-parse --is-inside-work-tree 输出 true):由 git rev-parse --git-path info/exclude 输出的文件包含确切行 **/documenti/lavori.yaml 和 **/strumenti-locali/avanzamento/。这些仅是技能的文件:项目中其他 documenti/ 目录仍对 git 可见。分别使用 grep -aqxF '**/documenti/lavori.yaml' "<exclude 文件>" 和 grep -aqxF '**/strumenti-locali/avanzamento/' "<exclude 文件>" 检查每一行。如果文件不存在,则两行均缺失。

当你知道哪些组件缺失时,本步骤结束。

步骤 3:项目名称

  1. 如果 CLAUDE.md 中存在该块,则名称是首次出现的「Aggiorna la checklist di 」之后到右引号 » 之前的内容。命令:grep -ao 'Aggiorna la checklist di [^»]*' CLAUDE.md | head -1,去掉前缀。如果名称存在,则不询问。如果命令无输出或名称为空(用户修改了行),则转到第 2 点。
  2. 否则使用 AskUserQuestion 提问。首选推荐选项:目录名称。第二选项:变体,即如果存在且不同于目录名称,则为 README 中的 # 标题,否则为使用不同大小写或空格的目录名称。用户始终可以输入其他名称。
  3. 如果无法提问(例如在非交互模式下),则使用目录名称并写一行说明。

当获得名称(以下称为 <PROJECT>)时,本步骤结束。

步骤 4:安装缺失的组件

仅执行步骤 2 中发现缺失的内容。绝不覆盖或修改已有内容。

  1. 记录。 如果缺失:mkdir -p documenti 和 [ -e documenti/lavori.yaml ] || sed "s/<OGGI>/$(date +%F)/g" "<base>/modelli/lavori.yaml" > documenti/lavori.yaml(即使步骤 2 出错,此防护也保护现有记录)。 但若脚本已存在,项目可能已有自己的清单并使用其他记录(例如 lavori.json):首先使用 AskUserQuestion 询问是否创建 documenti/lavori.yaml。首选推荐选项:不创建。如果回答为否,或无法提问,则不创建,写一行说明,并跳过排除行(第 4 点),因为排除行会向 git 隐藏项目清单文件。
  2. 脚本。 如果缺失:mkdir -p strumenti-locali/avanzamento 和 cp -n "<base>/modelli/stato.mjs" strumenti-locali/avanzamento/stato.mjs。
  3. CLAUDE.md 中的块。 如果缺失:
    • 读取 <base>/modelli/claude-md.md 并将每个 <PROJECT> 替换为名称;
    • 执行 mktemp -d 并使用文件写入工具将已替换的块写入 <tmp>/blocco.md(<tmp> 是输出的目录);
    • 如果 CLAUDE.md 存在且非空,准备以下两个命令(不要读取或重写文件): if [ -s CLAUDE.md ] && [ -n "$(tail -c1 CLAUDE.md)" ]; then printf '\n' >> CLAUDE.md; fi(如果缺少换行符则添加) if [ -s CLAUDE.md ] && [ -n "$(tail -n1 CLAUDE.md)" ]; then printf '\n' >> CLAUDE.md; fi(如果最后一行非空则添加空行)
    • 追加块:cat "<tmp>/blocco.md" >> CLAUDE.md(如果文件不存在则创建)。用户的文本绝不会被重写。
    • 不要使用 sed:名称可能包含 / 或 &。
  4. 排除行,仅在有 git 时。 设 <exclude> 为由 git rev-parse --git-path info/exclude 输出的路径。
    • mkdir -p "$(dirname "<exclude>")"。
    • 如果缺少换行符则添加:if [ -s "<exclude>" ] && [ -n "$(tail -c1 "<exclude>")" ]; then printf '\n' >> "<exclude>"; fi。
    • 对于 **/documenti/lavori.yaml 和 **/strumenti-locali/avanzamento/ 中缺失的每一行:printf '%s\n' '**/documenti/lavori.yaml' >> "<exclude>"(或 '**/strumenti-locali/avanzamento/')。
  5. 没有 git 时,写一行警告:「此处没有 git:小组件中的 repo 行将保持为空。」

当所有缺失的组件均已创建时,本步骤结束。如果没有缺失任何内容,本步骤立即结束。

步骤 5:打开清单聊天

无论是在安装之后还是已经一切就绪,均执行此步骤。

  1. 如果 mcp__ccd_session__start_session 和 mcp__ccd_session_mgmt__detach_session 是延迟工具,请使用 ToolSearch 加载它们。
  2. 使用以下参数调用 start_session:
    • initiation: user_asked
    • context: fresh
    • use_worktree: false
    • effort: low(该聊天仅运行脚本并构造小组件:不需要启动会话的努力)
    • title: 「清单:」
    • prompt: 「执行 node strumenti-locali/avanzamento/stato.mjs 并按 CLAUDE.md 所示显示清单」
    • background: 「项目 的进度检查清单:脚本为 strumenti-locali/avanzamento/stato.mjs。项目的 CLAUDE.md 说明记录是什么、如何显示清单以及何时更新记录。」
  3. 紧接着使用返回的 id 调用 detach_session:这是一个主聊天,不是子聊天。
  4. 如果 start_session 缺失(CLI)或拒绝:执行 node strumenti-locali/avanzamento/stato.mjs 并在当前聊天中显示清单,如 <base>/modelli/claude-md.md 所述:使用 show_widget,如果 show_widget 缺失则使用 markdown 表格。
  5. 如果 start_session 成功但分离失败或拒绝,写一行:「从侧边栏使用 Detach to top level 分离它。」
  6. 每次运行都打开一个新聊天:不要查找之前的聊天。

当聊天已打开并分离,或清单已在当前聊天中显示时,本步骤结束。

步骤 6:最终消息

写两到三行:

  • 你添加了什么,或「一切已经就绪」;
  • 如有警告;
  • 在哪里找到清单聊天。

同时说明要添加或关闭工作只需在聊天中说明:CLAUDE.md 中的规则会更新记录。

当消息已写入时,本步骤结束。

相关技能