关于 wiki-lint
wiki-lint 是用于文件系统 Wiki 的只读健康检查技能。它检查页面、链接、索引条目、元数据和结构问题,并将报告存入 `archive/`。
主要功能
- 01检查链接和过期索引条目
- 02查找孤立页面与资源
- 03检查页面日期和元数据
- 04检查结构定义和标题规范
- 05将检查报告写入 `archive/`
适用场景
- 01重组页面前审查 Wiki 链接
- 02查找未列入索引的页面
- 03识别过期页面和元数据错误
- 04在不更改内容的情况下检查 Wiki 状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ vanillaflava/ llm-wiki-skills --skill wiki-lint安装后在 Claude Code 中输入/wiki-lint确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/setup-help.mdwiki-config-template.mdwiki-schema.md详细介绍
Wiki Lint
检查 Wiki 的健康状况并生成报告。绝不会修改 Wiki 内容。
配置发现
每次调用都从这里开始。 Wiki 根目录是包含 wiki-config.md 的目录。技能会在运行时确定该目录。本技能检查的页面会根据 wiki-schema.md 中的结构进行验证——这两个文件都必须存在。
-
确定范围:确定你的文件系统范围根目录,即文件系统工具可访问的顶层目录。
-
范围检查——必须停止:如果范围是裸驱动器根目录(
C:\、D:\、/)、操作系统根目录或用户主目录(C:\Users\X、/home/X、/Users/X)→ 立即停止。不要搜索。不要尝试查找wiki-config.md。 直接转到第 6 步。 -
在
<available_skills>中查找wiki-config。 记录它是否可用——下方的建议会据此调整。随附的references/setup-help.md也可用;如果用户需要指引或你遇到困难,请阅读该文件。 -
查找并读取
wiki-config.md:递归搜索(匹配到第一个即停止,最多 5 层)。如果找到,读取其中的设置(blacklist、index_excludes、ingested_folder、ingested_subdirs、log_format)。如果未找到,跳到第 6 步。 -
查找并读取
wiki-schema.md——强制检查:在与wiki-config.md相同的目录中,确认wiki-schema.md存在且能解析为 YAML。在明确判定其状态(存在/缺失/格式错误)之前,不得继续下面的工作流。 然后:-
存在且解析正常 → 读取架构(
mandatory_fields、conditional_fields、enums),然后继续工作流。 -
缺失 → 停止。不要继续。不要部署。根据
<available_skills>中是否有wiki-config(第 3 步的结果)采取相应措施:-
wiki-config可用: 严格按以下模式输出——"你的 Wiki 缺少wiki-schema.md。运行/wiki-config部署该文件并完成设置。完成后我再继续。" 本轮到此结束。不要提供随附的部署方案,也不要给出其他选项。wiki-config的引导式流程是正确路径。 -
wiki-config不可用: 提供随附的备用方案——"你的 Wiki 缺少wiki-schema.md,且未安装wiki-config技能。我可以从随附的参考文件部署默认版本,但建议安装wiki-config以使用引导式设置。要部署随附的默认版本吗?" 等待用户明确确认。用户同意后,从references/wiki-schema.md部署。
-
-
格式错误 → 停止。采用相同的两种分支:
-
wiki-config可用: "你的wiki-schema.md格式错误。运行/wiki-config——它提供引导式修复流程,并会保留你所做的自定义设置。我会等你处理完。" 本轮到此结束。不要尝试修复,也不要用随附版本覆盖。 -
wiki-config不可用: 指引用户参考references/setup-help.md手动修复。如果用户明确要求重置(而不是自动采用备用方案),请警告这会覆盖所有自定义设置;只有在用户明确同意后,才部署默认版本。
-
如果第 4 步发现
wiki-config.md本身格式错误,也适用同样的两分支结构:wiki-config可用 → 停止并建议运行/wiki-config,本轮结束;不可用 → 通过setup-help.md引导手动修复。 -
-
完全找不到配置:请用户提供 Wiki 根目录路径,并在该路径下搜索(最多 5 层)。如果仍然找不到,说明用户尚未创建 Wiki——按上面的“缺失”分支处理(建议运行
/wiki-config;如果该技能不可用,则提供随附的部署方案)。
能力要求
此技能需要文件系统读取权限(扫描所有页面)和对 archive/ 的写入权限(保存 lint 报告)。如果没有读取权限,此技能无法继续。---
工作流
配置发现步骤已将 wiki-config.md 和 wiki-schema.md 加载到上下文中。不要重新读取;从这里继续,并假设这两个文件都已可用。
第 1 步 - 构建页面清单
递归列出知识库中的所有 .md 文件。完全排除 blacklist 中的路径;不要扫描其中的内容。index_excludes(raw\、archive\、ingested\)中的路径不作为 wiki 页面,但仍可读取以验证链接目标:如果一个有效的 wiki 页面链接到 archive/ 或 ingested/ 中的文件,该链接必须能解析到真实文件。根据同时位于 blacklist 和 index_excludes 之外的文件,构建范围内页面集合。另外,列出黑名单路径、raw\、archive\ 和 ingested\ 之外的所有非 Markdown 文件,作为潜在的孤立二进制资源。
第 2 步 - 读取 index.md
读取 index.md。解析所有维基链接引用和文件路径。构建 index.md 中列出的页面及其引用路径的集合。
第 3 步 - 检查失效的维基链接
对每个范围内的 wiki 页面,提取所有 [[wikilinks]]。尝试将每个链接解析到实际文件。如果找不到匹配文件:将其标记为失效的维基链接,并注明发现该链接的页面、失效的链接文本,以及明显时可提供的修正建议。
还要标记:任何包含指向 raw/ 的链接的 wiki 页面。wiki-ingest 将文件移至 ingested/ 后,指向 raw/ 的源文件链接将失效。将这些标记为未来失效警告:"[[Page]] links to raw/: will break after ingestion. Update to ingested// once ingest is complete." 这些链接目前尚未失效,但之后一定会失效。
第 4 步 - 检查孤立页面
对范围内的每个页面,检查:
- 是否列在
index.md中? - 是否被其他范围内页面中的维基链接引用?
如果两者都不是:将其标记为孤立页面。新页面可能是合理的孤立页面;仍需标记,由人工判断。
第 5 步 - 检查过时的索引条目
对 index.md 中列出的每个页面,检查所引用的文件是否存在。如果不存在:将其标记为过时的索引条目。
第 5b 步 - 检查过长的索引条目
对 index.md 中的每个条目,测量单行描述(]]: 与末尾的 `path` 之间的文本)。如果超过 150 个字符,将其标记为过长的索引条目(软性警告)。每次运行时,每项操作技能都会完整读取 index.md,因此过长的描述会增加每次运行的成本。建议的修正方法:精简至最多 150 个字符。
第 6 步 - 定性与结构检查
概念问题: 阅读 Overview.md 并检查明显的矛盾或过时信息;查找与特定 wiki 页面似乎相矛盾的说法,或明显过时的页面。仅做定性检查,不进行完整的内容审查。
缺少的关联: 扫描 index.md 中的描述,查找彼此没有链接的页面对之间的重要术语重叠。如果页面的索引描述共享多个关键概念,但没有相互的维基链接,则可能缺少关联。标记有实质性重叠的页面对;不要标记牵强的关键词巧合。这是一项轻量级启发式检查;如果用户认可关联确实存在,wiki-integrate 会负责实际添加链接。
第 6b 步 - 检查页面标题和文件名中的长破折号
页面文件名和 title: frontmatter 字段中的长破折号(—)是 LLM 输出中持续存在的问题。它们会导致维基链接失效(指向 [[Topic - Subtopic]] 的链接无法解析到名为 Topic — Subtopic.md 的文件),使页面无法通过预期名称搜索到,并违反知识库的长破折号规范。
对每个范围内页面:
- 检查文件名是否包含任何
—字符 - 读取
title:frontmatter 字段,检查其中是否包含任何—字符
将每处都标记为长破折号违规,并注明文件路径、发现位置(文件名 / title 字段)、违规字符串,以及建议的修正方法:将 — 替换为 -(空格-连字符-空格)。
步骤 6c - 检查过时页面
对于每个范围内的页面,检查以下情况:
缺少日期字段(错误): 如果页面的 frontmatter 中既没有 date:,也没有 updated:,则标记为缺少日期字段错误。两个字段都缺失,说明创建时出了问题——该页面不是由技能编写的,或者 frontmatter 格式错误。
过时(软警告): 如果页面有 updated: 字段,且其日期距今天超过 90 天,则标记为过时页面。以下情况不纳入此检查:
status: artefact、status: snapshot、status: archived—— 按定义已冻结page_type: reference—— 参考页面的内容大多是静态的,预期更新不频繁
没有 updated: 字段(但有 date:)的页面会被静默跳过——缺少 updated: 不算错误。
对每个过时页面,标记:路径、updated: 日期、距上次更新的天数。
对每个缺少日期字段错误,标记:路径、缺少哪些字段。
步骤 6d - Schema 合规性检查(来源信息字段)
对于每个范围内的页面,验证四个来源信息字段(status:、description:、source:、reliability:)。检查结果分为两类:
错误(硬性标记):
- 有
source:,但没有reliability:—— 存在source:,但缺少reliability:。这两个字段相互关联,缺少其中一个属于内部不一致。标记为schema 错误,并注明:路径、受影响的字段对。 status:值无效 —— 存在status:,但其值不属于有效枚举值(active、stub、artefact、archived、snapshot)。标记为schema 错误,并注明:路径、字段、发现的无效值、有效值。reliability:值无效 —— 存在reliability:,但其值不属于(high、medium、low)。标记为schema 错误,并注明:路径、字段、发现的无效值、有效值。page_type:值无效 —— 存在page_type:,但其值不在 wiki-schema.md 定义的有效枚举列表中。标记为schema 错误,并注明:路径、字段、发现的无效值,以及 schema 中的有效值。
软警告(提示信息):
- 由技能处理的页面缺少
status:或description:—— 页面有updated:(表示技能在 3b 之后写入过该页面),且page_type:为knowledge、research-note或survey,但缺少status:或description:。没有updated:的旧页面会被静默跳过——它们早于 3b,后续再次处理时会补上这些字段。标记为缺少来源信息字段,并注明:路径、缺少的字段。 - 存在
source:,但没有## Sources章节 —— frontmatter 中的source:表示内容有采集来源;正文应包含## Sources章节,以便追踪补充信息。缺少该章节不属于硬性错误,但值得标记。标记为缺少 Sources 章节,并注明:路径。 - 由技能处理的页面缺少
page_type:—— 页面有updated:(表示技能写入过该页面),但缺少page_type:。没有updated:的页面会被静默跳过——它们早于此功能,后续再次处理时会补上该字段。标记为缺少 page_type,并注明:路径。
步骤 6e - 检查 log.md 大小
统计 log.md 中的 ## [ 条目数。log.md 只会在开头新增内容,而且 crystallize 和 lint 每次运行时都会完整读取,因此日志过大会持续占用上下文。如果条目超过 150 个,则标记为日志过大,并注明条目数和阈值(150)。lint 从不修改 log.md;解决方法是运行 wiki-crystallize,它会询问是否归档最早的条目,并保留最近的 50 条。
第 7 步 - 检查孤立的二进制资源
对于黑名单路径 raw\、archive\ 和 ingested\ 之外的每个非 Markdown 文件:在所有范围内页面中搜索对该文件名的引用。如果未找到:标记为孤立的二进制资源。如果文件在上下文中与相关内容放在一起(例如,某个领域子文件夹中的 PDF 被该领域的页面引用),则不算孤立;只有在任何位置都没有 Wiki 引用的文件才应标记。
第 7a 步 - 检查 ingested/ 中的孤立来源
ingested/ 中的每个文件都应至少由一个 Wiki 页面引用;引用应位于页面正文的 Sources 部分,并包含 ingested/ 路径。没有 Wiki 引用的来源已经处理过,却在知识图谱中没有留下任何痕迹。
对于 ingested/ 中的每个文件(包括所有子目录和 assets/):
- 在所有范围内的 Wiki 页面中搜索该文件的相对路径(例如
ingested/documentation/foo.md)。检查完整页面内容:## Sources部分正文、changes:frontmatter 字段,或任何其他可能出现路径引用的位置。无论匹配出现在何处,都视为有效引用。 - 如果未找到匹配项:标记为孤立来源:"ingested/[subdir]/filename 没有 Wiki 页面引用它"
ingested/assets/ 中没有引用的来源属于预期情况(它在摄入时无法读取);应以较低严重级别将其标记为备注而不是警告,以便用户知道它的存在,并在能力有所提升时重新尝试摄入。
第 8 步 - 编写 lint 报告
创建 [wiki-root]/archive/lint-YYYY-MM-DD.md:
---
title: Lint Report YYYY-MM-DD
date: YYYY-MM-DD
---
# Lint Report - YYYY-MM-DD
## Summary
- Broken wikilinks: N
- Future breakage warnings (raw/ links): N
- Orphan pages: N
- Stale index entries: N
- Over-length index entries: N
- Missing connections (candidates): N
- Em-dash violations (titles/filenames): N
- Missing date fields (errors): N
- Stale pages (updated: > 90 days): N
- Schema errors (invalid enum values, missing field pairs): N
- Missing provenance fields (skill-touched pages): N
- Missing page_type: (skill-touched pages): N
- Missing Sources sections: N
- Orphaned binary assets: N
- Orphaned sources in ingested/: N (+ N notes in assets/)
- Conceptual flags: N
- Log size: N entries (flagged if over 150)
## Broken Wikilinks
[page where found, broken link, suggested fix]
## Future Breakage Warnings
[page where found, raw/ link, suggested post-ingest destination]
## Orphan Pages
[page path, reason it may be orphaned]
## Stale Index Entries
[index entry, the path that no longer resolves]
## Over-length Index Entries
[index entry, current description length, suggested: tighten to 150 chars max]
## Missing Connections
[page pair, overlapping terms, suggested action: run wiki-integrate]
## Em-dash Violations
[file path, where found (filename / title field), suggested fix: replace — with ' - ']
## Missing Date Fields
[file path, which of date: / updated: are absent; likely indicates malformed frontmatter or non-skill creation]
## Stale Pages
[file path, updated: date, days since last touch; not flagged if status: artefact/snapshot/archived or page_type: reference]
## Schema Errors
[file path, field(s) affected, nature of error (invalid enum value / source: without reliability: / invalid page_type: value)]
## Missing Provenance Fields
[file path, which of status: / description: are absent; page has updated: and is a fact-establishing page_type]
## Missing page_type:
[file path, page has updated: but page_type: is absent; add page_type: using values from wiki-schema.md, or run wiki-integrate to infer and confirm]
## Missing Sources Sections
[file path, has source: in frontmatter but no ## Sources section in body]
## Orphaned Binary Assets
[file path, reason it has no wiki references]
## Orphaned Sources in ingested/
[file path, no wiki page references this source; consider re-ingesting or archiving]
## Notes: ingested/assets/
[file path, was unreadable at ingest time; re-attempt if capabilities have improved]
## Conceptual Flags
[page, nature of potential issue]
## Log Size
[log.md entry count; flagged if over 150 - run wiki-crystallize to archive the oldest entries, keeping the 50 most recent]
第 9 步 - 添加到 log.md 开头
在 log.md 顶部、标题行下方、所有现有条目上方添加新条目。
## [YYYY-MM-DD] lint | Full wiki pass
Summary: N broken links, N orphans, N stale entries, N missing connections, N date-field errors, N stale pages, N schema errors, N missing provenance/page_type fields, N orphaned assets.
Report: archive/lint-YYYY-MM-DD.md
第 10 步 - 呈现检查结果
报告摘要。不要提出自动修复。建议后续操作:
- 损坏的 Wiki 链接 -> 手动修复,或对受影响的页面运行 wiki-integrate
- 未来损坏警告 -> 下次摄入运行后,将 raw/ 链接更新为 ingested/ 路径
- 孤立页面 -> 运行 wiki-integrate;如果已弃用,则移至 archive/
- 过时的索引条目 -> 从 index.md 中移除,或更新路径
- 超长的索引条目 -> 将描述缩短至最多 150 个字符
- 缺少关联 -> 对标记的页面对运行 wiki-integrate
- 破折号违规 -> 重命名文件(将
—替换为-),并更新其title:字段;搜索指向旧名称的所有 Wiki 链接并更新 - 缺少日期字段 -> 检查页面;如果由 skill 编写,则说明 frontmatter 格式错误,应手动修复
- 过时页面 -> 检查并更新;如果页面有意冻结,则设置
status: artefact、snapshot或archived - Schema 错误 -> 手动修复 frontmatter:在存在
source:时添加缺失的reliability:,并更正status:、reliability:或page_type:的无效枚举值 - 缺少来源信息字段 -> 对页面重新运行 wiki-ingest 或 wiki-crystallize,以补充
status:和description:;或者根据 schema 手动添加 - 缺少 page_type:-> 根据 wiki-schema.md 中的枚举值,在页面 frontmatter 中添加
page_type:;或者运行 wiki-integrate,由其推断并确认类型 - 缺少 Sources 部分 -> 在页面正文中添加
## Sources部分,并引用source:中的路径 - 孤立的二进制资源 -> 移至合适的位置;如果不需要,则删除
- ingested/ 中的孤立来源 -> 重新摄入源文件(将其放回 raw/ 并运行 wiki-ingest),或调查为何没有创建 Wiki 页面
- ingested/assets/ 中的备注 -> 如果有新的工具或能力可用,则重新尝试摄入
- 日志过大 -> 运行 wiki-crystallize;它会提供归档最旧日志条目的选项,并保留最近的 50 条
关键规则
- 绝不修改 wiki 页面——只读,唯一例外是将 lint 报告写入 archive/
- 绝不删除文件——仅标记;由人工决定
- 不要将放置位置符合上下文的文件标记为问题——文件所在领域中有 wiki 引用,就不算孤立文件
- 完全跳过列入黑名单的路径——lint 不会扫描黑名单目录中的内容
- index_excludes 中的内容不是 wiki 页面,但可作为有效链接目标——即使 archive/ 和 ingested/ 不在页面清单中,仍可读取它们以解析链接
- 报告应存放在 archive/,而不是 wiki 根目录
云同步保险库
存储在云同步服务中的保险库可能包含尚未下载到本地的文件,这些文件会显示为零字节占位符。如果读取文件时意外返回空内容,请将其标记为可能的同步问题,并在重试前询问用户确认。不要将零字节文件视为已成功处理的空文件。