/checklist: 项目进度检查清单
/checklist 在当前项目目录中安装缺失的清单文件,然后在专用聊天中显示清单。不会覆盖或更改任何现有内容。
工作原理:
- 项目目录为当前目录。所有命令均从此目录执行。
<base>是此技能顶部显示的「Base directory」。模板位于<base>/modelli/。- 每个路径中的命令都放在引号内:基本目录和项目目录可能包含空格。
- 按顺序执行步骤,除非步骤另有说明,否则无需确认。
- 每次
grep均使用-a:在 Claude Code 中,grep可能将非 UTF-8 文件视为二进制文件,从而找不到实际存在的行。
步骤 1:初步检查
- 执行
command -v node。如果没有输出,则写一行(「需要 Node.js 18 或更高版本:请安装后重新运行 /checklist」)并停止。 - 执行
git rev-parse --path-format=absolute --git-dir和git rev-parse --path-format=absolute --git-common-dir。如果两者结果不同,说明你在一个二级工作树中:写一行(「你在一个工作树中:记录会随它消失。请从项目主目录运行 /checklist」)并停止。如果两个命令均失败,则没有 git:继续。 - 执行
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:项目名称
- 如果
CLAUDE.md中存在该块,则名称是首次出现的「Aggiorna la checklist di 」之后到右引号»之前的内容。命令:grep -ao 'Aggiorna la checklist di [^»]*' CLAUDE.md | head -1,去掉前缀。如果名称存在,则不询问。如果命令无输出或名称为空(用户修改了行),则转到第 2 点。 - 否则使用 AskUserQuestion 提问。首选推荐选项:目录名称。第二选项:变体,即如果存在且不同于目录名称,则为 README 中的
#标题,否则为使用不同大小写或空格的目录名称。用户始终可以输入其他名称。 - 如果无法提问(例如在非交互模式下),则使用目录名称并写一行说明。
当获得名称(以下称为 <PROJECT>)时,本步骤结束。
步骤 4:安装缺失的组件
仅执行步骤 2 中发现缺失的内容。绝不覆盖或修改已有内容。
- 记录。 如果缺失:
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 隐藏项目清单文件。 - 脚本。 如果缺失:
mkdir -p strumenti-locali/avanzamento和cp -n "<base>/modelli/stato.mjs" strumenti-locali/avanzamento/stato.mjs。 - 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:名称可能包含/或&。
- 读取
- 排除行,仅在有 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/')。
- 没有 git 时,写一行警告:「此处没有 git:小组件中的 repo 行将保持为空。」
当所有缺失的组件均已创建时,本步骤结束。如果没有缺失任何内容,本步骤立即结束。
步骤 5:打开清单聊天
无论是在安装之后还是已经一切就绪,均执行此步骤。
- 如果
mcp__ccd_session__start_session和mcp__ccd_session_mgmt__detach_session是延迟工具,请使用 ToolSearch 加载它们。 - 使用以下参数调用
start_session:initiation:user_askedcontext:freshuse_worktree:falseeffort:low(该聊天仅运行脚本并构造小组件:不需要启动会话的努力)title: 「清单:」prompt: 「执行node strumenti-locali/avanzamento/stato.mjs并按 CLAUDE.md 所示显示清单」background: 「项目 的进度检查清单:脚本为strumenti-locali/avanzamento/stato.mjs。项目的 CLAUDE.md 说明记录是什么、如何显示清单以及何时更新记录。」
- 紧接着使用返回的 id 调用
detach_session:这是一个主聊天,不是子聊天。 - 如果
start_session缺失(CLI)或拒绝:执行node strumenti-locali/avanzamento/stato.mjs并在当前聊天中显示清单,如<base>/modelli/claude-md.md所述:使用show_widget,如果show_widget缺失则使用 markdown 表格。 - 如果
start_session成功但分离失败或拒绝,写一行:「从侧边栏使用 Detach to top level 分离它。」 - 每次运行都打开一个新聊天:不要查找之前的聊天。
当聊天已打开并分离,或清单已在当前聊天中显示时,本步骤结束。
步骤 6:最终消息
写两到三行:
- 你添加了什么,或「一切已经就绪」;
- 如有警告;
- 在哪里找到清单聊天。
同时说明要添加或关闭工作只需在聊天中说明:CLAUDE.md 中的规则会更新记录。
当消息已写入时,本步骤结束。