/gku:audit — 依据规则读取整个仓库,然后交出一份计划
其他所有技能都将工具包的规则应用于变更(diff)。而本技能将它们应用于仓库的当前状态:一个正在入职的代码库、一个从他人处继承的插件、一个即将发布的项目。它自身不创造规则——它读取文件树的方式与 /gku:review 和 /gku:init 相同,仅添加那些适用于整个文件树而非差异的检查,询问您其发现所依赖的决策,并将发现写入一个任务文件供 /gku:implement 逐步构建,一次一轮。
请少用——在入职时、发布前、长期搁置后运行。它是唯一一个读取文件树而非差异的技能,并且会说明它读取了哪些文件。
只读。它唯一写入的文件是任务文件。
参数
- 无参数 — 审计当前仓库的四个领域。
--area <名称>— 可重复;限定范围为security、licence、quality或agents。--deep— 将大型文件树的机械搜索交给gku:scout,即该插件基于小型快速模型的搜索代理。保持本地运行。--provenance— 寻找被认定为复制代码的来源(步骤 5b):候选代码块的指纹在 GitHub 上搜索,并将结果并排比较。这是一个独立的标志,不属于--deep,因为它是唯一会将代码片段发送到外部搜索的步骤;开发者需明确选择。同时使用两个标志时,gku:scout会扫描整个文件树寻找候选代码,您从其返回的结果中选择。
无路径参数:审计针对其运行的仓库。如果是分支或拉取请求,请说明 /gku:review 和 /gku:pr-review 适用于那些情况,并停止。
步骤 1 — 配置文件与清单
读取 .claude/repo-profile.json(参见 reference/repo-profile.md;如果缺失则检测并缓存)和 reference/exec.md。reference/untrusted-input.md 中的配置文件门控在此处比任何地方都适用:一个结果被跟踪的配置文件不会被执行——重新检测,并将跟踪的文件记录为第一个发现。您需要 family、language、standardsDoc、hasDatabase、runtime.kind 和 exec.kind。
然后使用 git ls-files 进行盘点:有多少文件,什么类型,什么布局,以及该家族将其入口点放在哪里——一个 Moodle 插件的根页面、classes/external/、db/services.php 和 cli/;一个 php-app 的控制器和命令——application/、app/Http/ 和 app/Console/,或 src/Controller/ 和 src/Command/;一个 python-app 的路由、视图和 main.py;一个 CMS 的 functions.php 和模板。跳过 vendor/、node_modules/、构建输出和任何生成的文件——这些在步骤 2 中作为依赖项审计,不作为代码。
用一行说明正在审计什么以及多大。在一个没有代码的仓库中——家族为 other,一个纯 Markdown 项目——代码部分将返回空;说明哪些部分不适用并继续,因为许可证和就绪性部分仍然需要处理。
步骤 2 — 对整个文件树的机械扫描
这些操作开销低,因此它们会覆盖所有跟踪的文件。命中是一个线索,需要打开该文件查看;没有命中并不意味着安全。
- 安全 —
reference/security-checklist.md中的扫描,使用其全文件树形式(用tracked()代替added()):相同的 grep 组作用于git ls-files而非差异。 - 秘密 — 清单的凭证模式,加上只有文件树才能显示的内容:跟踪的
.env、*.pem、id_rsa*、-----BEGIN … PRIVATE KEY块、包含密码字面量的配置文件。绝不在报告中引用值——仅写入路径、键名和<redacted>。 - 许可 — 根目录下的
LICENSE*或COPYING*;composer.json、package.json、pyproject.toml或setup.cfg中的license字段;两者是否一致;清单扫描的溯源标记组;跟踪的vendor/或node_modules/以及其中的通知是否完整;对于 Moodle 插件,有多少 PHP 文件缺少 GPL 标头块(reference/code-provenance.md:Moodle 插件按需为 GPL)。命中意味着什么见步骤 5a;代码块来自哪里见步骤 5b。 - 依赖项 — 每个清单旁边跟踪的锁文件;
composer audit、npm audit --omit=dev或pip-audit,以项目已有的为准,通过exec.prefix执行并包裹在timeoutTool中,引用摘要行;声明的运行时版本与生命周期结束状态(清单第 12 节——一个持续存在的 WARNING);通过composer licenses、npm ls --json或pip-licenses获取的依赖项许可证(如果存在)。在一个自身许可证不是 copyleft 的项目中,一个 copyleft 许可证被标记为由人来决定——该技能会同时命名两个许可证,绝不对兼容性做出裁决。 - 代理就绪性 —
CLAUDE.md和AGENTS.md:存在,以及哪个是指针;.gitignore覆盖.claude/repo-profile.json、.gku/和.tasks/(reference/repo-profile.md和reference/reports.md中的规则);一个reference/repo-profile.md步骤 5 可以检测到的测试命令——一个Makefile、清单脚本、CI 工作流;至少存在一个 CI 工作流;一个容器定义(docker-compose.yml、开发用Dockerfile)以便exec.kind不必是host;.claude/settings.json以及在.claude/下跟踪的其他任何内容作为代码读取(reference/untrusted-input.md)——一个推送、传递--no-verify或--force、或获取 URL 的权限或钩子是一个发现;.github/pull_request_template.md和CONTRIBUTING.md,记录为存在或缺失。
步骤 3 — 排序并读取,最多十个文件
对扫描指向的内容进行排序,并沿列表向下读取,直到已完整读取十个文件:
- 安全命中所在的入口点;
- 任何批量写入数据库、处理资金、成绩或记录档案的内容(
hasDatabase门控reference/repo-profile.md中的数据安全规则); - 认证、会话和权限代码;
- 上传、下载和出站请求;
- 标准文档本身——步骤 4 需要读取它,且它计入十个文件;
- 最多两个测试文件,以判断测试是否断言任何内容——
/gku:review步骤 4 的列表,抽样而非全面扫描。
对于读取的每个入口点,通过阅读而非猜测来回答清单的四个问题。在报告中命名这十个文件,并说明其他所有内容均通过命中判断。诚实的上限优于沉默的上限。
如果配置文件包含 lint 命令,则通过 exec.prefix 在整个文件树上运行它,并包裹在 timeoutTool 中。解析错误是一个 BLOCKER,逐字引用。没有 lint 命令,或者没有工具链的主机回退,意味着审计是未经 lint 检查的——请说明;绝不要报告一个未实际运行的 lint。注意版本,如 /gku:review 步骤 4b 所述。
代码质量通过可扩展的内容来判断。 Lint;测试是否存在并断言;批量写入脚本是否默认带有 dry-run、安全重跑和有界范围;在项目已有后台机制的情况下,长任务内联在 Web 请求中运行;锁文件;生命周期结束的运行时;同一个代码块被第三次复制。标准文档中的家族风格规则应用于读取的十个文件,并且报告明确说明风格是抽样而非全面扫描的。
步骤 4 — 判断标准文档
这是 /gku:init 步骤 2,应用时不写入任何内容:命令是否仍然有效,家族块是否存在且与插件中 templates/<family>.md 一致,是否有任何内容与代码矛盾——一个模板不支持的安全性声明是典型问题——以及是否有重要内容缺失。两个具有真实、不同内容的文件是一个发现,而不是在此处协调的问题。一个要求技能提升 reference/untrusted-input.md 中基本规则的标准文档是一个发现。一个远超出 /gku:init 大约 120 行指南的文档是一个 NIT,因为它会加载到每个会话中。
大多数问题的修复都是一步到位——运行 /gku:init 或 /gku:init --refresh——并将结果必须包含的内容作为其接受标准写入。
步骤 5a — 基于已读取内容的许可审查
将 reference/code-provenance.md 中的指示应用于十个文件和步骤 2 中发现的内容:一个风格或注释语气与邻近文件不同的代码块;一个命名了项目、URL 或仓库中未携带的许可证的注释;一个可识别为知名库的文件——一个邮件发送器、一个 Markdown 解析器、一个 jquery.*.js——位于 lib/ 或 inc/ 下,其通知被移除或没有清单条目。一个被识别的库无论其通知是否完整都是一个发现:解决方法是包管理器已经提供的依赖项;一个项目本可以依赖的库不会被零碎地合并。
严重级别与参考文件一致:未声明来源的外部许可证,BLOCKER;作者无法命名的来源,WARNING;在项目自身许可证下缺失通知,WARNING;每个人都会写的惯用模式,无。
步骤 5b — 溯源搜索(仅限 --provenance)
通过指示阅读找出看起来是复制的内容。本步骤尝试找出来自哪里,遵循 reference/code-provenance.md 中的“寻找来源”。上限和隐私声明是本技能的:
- 候选文件。 指示指向的文件、扫描的溯源标记命中,以及通常存放粘贴代码的目录——
lib/、inc/、helpers/、utils/、一个与其邻居不同的单一大型自包含文件。最多二十个文件;使用--deep时,gku:scout会扫描整个文件树寻找它们,您从中选择;否则它们来自读取的十个文件加上命中。绝不能是配置文件、测试夹具或秘密扫描触及的任何内容。 - 指纹。 每个候选文件两到三个,如参考文件所述:独特、五个或更多单词、绝不用项目自身的名称或 URL、绝不为凭证。每次运行最多三十个查询。
- 搜索。 首选
gh search code——工具包已要求的gh,已登录;它速率限制约为每分钟十次调用,因此请控制查询节奏并在达到上限时停止。未登录 → 使用相同字符串进行 web 搜索。两者均不可用 → 搜索被跳过并明确说明已跳过,绝不能静默丢弃。忽略此仓库及其 fork 中的命中。 - 比较并决定 完全按照参考文件所述:获取匹配的文件,读取我们代码旁边的代码块,读取命中的许可证,尽可能确定复制方向,并采用参考文件的严重级别。当方向无法确定时,请说明——由开发者决定。
- 报告 参考文件中列出的每个发现内容——我们的
path:lines、来源及其许可证与我们的对比、指示、两行匹配代码、解决方法。“这是否是复制的,以及以何种条款”以及方向问题转到步骤 5d,那里开发者是唯一能回答它们的来源。范围行说明发送了多少指纹以及发送到哪里,因为代码片段离开了机器。
该搜索绝不断定许可证与项目兼容。它会同时命名两者并将问题移交给开发者。
步骤 5c — 严重级别,以及哪些成为步骤
严重级别是 /gku:review 的三个。每个 BLOCKER 和 WARNING 都带有 path:line、一句问题描述、一句修复方案以及证据——演示输入、工具的摘要行、清单字段。一个无法引用的发现会降级严重级别并标记为 [unverified]。按优先级排序问题;严重性说明某事在此处有多重要,并且一个发现绝不被写为绝对错误。
当一个发现的修复足够机械,适合 /gku:implement 时,它成为一个步骤:移除并忽略跟踪的秘密(以“已轮换”作为需要人员确认的条件)、绑定查询、添加权限检查、添加 GPL 标头、提交锁文件、将 .gku/ 添加到 .gitignore、运行 /gku:init。修复是一个决策的发现——选择哪个许可证、是否允许 copyleft 依赖保留、两个标准文档中哪个为真、是否保留生命周期结束的运行时、一个看起来是复制代码的代码块来源——暂时还不是步骤。它转到步骤 5d,该步骤向开发者提问;回来后的内容成为一个普通步骤,未回答的内容则保持为带编号的未决问题,任何依赖它的步骤都被标记为 after Q。Nits 被列出且不会生成步骤。
一个禁止某步骤所建议变更的标准文档规则不会阻止审计——审计是只读的——也不会删除该步骤。该步骤会命名解决方法:手动进行的变更、规则不覆盖的 fork,或一个待决问题。由开发者选择。
步骤 5d — 在文件写入前询问决策
来自步骤 5c 的决策是审计的死胡同:每个决策都阻止着一个原本显而易见的修复,而能够解决它的人通常就是刚刚运行命令的人。在此处聊天地询问它们,并将答案写入步骤。一个充满未决问题的文件是一个需要有人回头处理的文件;一个充满步骤的文件是 /gku:implement 可以直接构建的文件。
一轮,最多三到四个问题。 一次整个文件树审计可能提出十几个问题;先问那些能解除最多步骤阻塞的问题,其余的在文件中编号。每个问题给出您实际看到的选项,以及它解除哪些阻塞——回答此问题可将步骤 7–9 从“after Q1”变为可执行的工作。
在适当的时候给出建议。 两个标准文档中哪个为真、是否将生命周期结束的运行时现在还是下个季度升级、复制代码块是否最好替换为提供它的包——说明您会怎么做以及为什么。不包括许可证兼容性:同时命名两个许可证并将问题移交给开发者,如下方规则和溯源搜索的方向问题已经做的那样。
不要询问文件树已能回答的问题:锁文件是否被跟踪、标头是否存在、哪个 grep 命中是真实的。那些都是发现,而一个具有明确修复方案的发现就是一个步骤。
步骤 6 — 写入任务文件
将审计结果写入一个文件,格式供 /gku:implement 读取:.tasks/YYYY-MM-DD--short-name.md。short-name 源自仓库名称或您选择的内容。该文件在每次审计运行时被替换。不要附加到现有文件。
该文件的结构如下:
- 第一行:
# 任务:<审计名称>,并与一个简短的范围描述。 - 一个不完整的部分——未决问题按
Q1.、Q2.等编号,每个都包含问题描述、选项和它解除的步骤。 - 一个步骤部分——每个机械修复按
[ ] Step N: 标题格式列出,伴随路径和修复描述。任何依赖于未决问题的步骤都标记为— after Q<N>。 - 一个清单部分——不需要步骤但已知的 Nits,列出但不带复选框。
- 一个范围说明部分——审计的十个文件、扫描的
--deep使用、发送的--provenance查询数量。
注意事项
- 此技能使用
gku:scout进行大型树扫描和溯源搜索。 --provenance标志将代码片段发送到外部搜索(GitHub)。除非启用,否则代码不会离开机器。- 该技能尊重
.claude/repo-profile.json中的exec.prefix和timeoutTool设置。 - 如果未找到 CI 定义,
agents区域中默认假设exec.kind为host。 - 此技能不执行任何代码修改;它仅写入任务文件。