ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Skill Seekers Man Page 技能生成解析:references/index.md 参考索引的结构、分类机制与统计口径

Skill Seekers Man Page 技能生成解析:references/index.md 参考索引的结构、分类机制与统计口径 Skill Seekers Man Page 技能生成解析references/index.md 参考索引的结构、分类机制与统计口径【免费下载链接】Skill_SeekersConvert documentation websites, GitHub repositories, and PDFs into Claude AI skills with automatic conflict detection项目地址: https://gitcode.com/gh_mirrors/sk/Skill_Seekers本篇技术指南以 Skill Seekers 开源项目中 man 页面技能生成的黄金参考索引tests/golden/phase2/man/references/index.md为核心线索系统讲解man 页面 → Claude Skill转换管线的输出结构、自动分类机制、统计口径以及黄金测试的字节级验证方式。读完本文你将理解--man-names/--man-path/--sections/--from-json四个 CLI 参数背后的完整工作流并能读懂任何由该工具生成的技能目录中references/与SKILL.md的每个字段。一、黄金参考索引是什么tests/golden/phase2/man/references/index.md是 Skill Seekers 项目中 man 页面抓取器Man Page Scraper生成的技能目录里的导航枢纽。它由转换器在构建阶段自动写出作用是把某个技能下所有 man 页面按照分类聚合后的引用文件组织起来形成三类信息Categories分类清单——列出每个分类及其对应的引用文件例如[Git](https://link.gitcode.com/i/0bd7801b34e8d2d96ee9a45b4e0fbd64) (2 man page(s))All Man Pages全量页面清单——按名称排序列出每一页的命令名与标题例如git-diff(1) -- git-diff - Show changes between commitsStatistics统计口径——汇总本次转换的总页数、总选项数、总示例数与跨引用数。该文件之所以放在tests/golden/目录下是因为它同时也是黄金golden测试的基准快照测试代码会把转换器重新生成的结果与该目录下的文件逐字节比对以验证重构后的代码与旧实现完全一致。因此这个文件不仅是一份技能产物更是一份生成规则的冻结契约。与之配套的还有同目录下的分类引用文件 git_01.md、curl_02.md以及技能入口文件 SKILL.md。四个文件共同构成一个完整的 man 技能产物。二、index.md 三大部分逐段解读以 golden 目录中的 index.md 为例全文仅四段但每一段都对应ManPageToSkillConverter._generate_index()的一行生成逻辑。2.1 Categories分类与引用文件的映射## Categories - [Git](https://link.gitcode.com/i/0bd7801b34e8d2d96ee9a45b4e0fbd64) (2 man page(s)) - [Curl](https://link.gitcode.com/i/2d1e2d18ea6060c473fcd44a26bcba3a) (1 man page(s))这一段的生成逻辑位于 man_scraper.py遍历categorize_content()产出的分类字典对每个分类写出- {title} ({count} man page(s))。其中link_filename的命名规则是分类总数只有 1 个时引用文件为无编号的{cat_key}.md如man_single黄金树中的情形分类总数大于 1 时引用文件为带两位序号的文件名{cat_key}_{cat_num:02d}.mdcat_num从 1 开始递增。本示例有git与curl两个分类因此得到git_01.md与curl_02.md。序号来自分类在字典中的遍历顺序而非页面的重要性排序。2.2 All Man Pages按名称排序的全量清单## All Man Pages - **curl** -- curl - **git-diff(1)** -- git-diff - Show changes between commits - **git-log(1)** -- git-log - Show commit logs对应生成代码见 man_scraper.py把解析出的所有页面按name字段排序后每行输出- **{name}{section_label}** -- {title}。有两个细节值得注意section_label只在页面确实携带手册分区号时出现形如(1)没有分区号的页面如本示例中的curl则直接输出裸命令名排序用的是 Python 字典序因此curl排在git-diff、git-log之前。2.3 Statistics四类统计数字的来源## Statistics - Total man pages: 3 - Total options: 3 - Total examples: 3 - Cross-references: 3生成逻辑见 man_scraper.py四个数字均来自提取阶段extract_manpages()写入中间 JSON 的汇总字段字段含义计算方式total_pages总页数解析成功的页面列表长度total_options总选项数所有页面options列表长度之和total_examples总示例数所有页面examples列表长度之和see_also跨引用数所有页面see_also列表去重排序后的长度值得注意的是Cross-references这一行是条件输出的只有当see_also列表非空时才写入man_scraper.py。因此当抓取的 man 页面全部没有 SEE ALSO 引用时索引的统计段会少一行黄金测试同样会验证这种边界。三、从 man 页面到索引的完整管线references/index.md只是产物链的最后一环其上游是一条清晰的四级管线全部封装在 man_scraper.py 的ManPageToSkillConverter中该类继承自DocumentSkillBuilderSOURCE_TYPE manpage提取extract_manpages从三个来源之一获取 man 页面原文——调用系统man命令、扫描目录中的.1–.8/.man文件、或读取此前保存的中间 JSON清洗与解析剥离 troff/groff 排版指令将纯文本按 34 个标准节名NAME、SYNOPSIS、OPTIONS、EXAMPLES、SEE ALSO、ENVIRONMENT等见 man_scraper.py切分为结构化页面并抽取options、examples、see_also分类categorize_content把多页 man 文档聚合成若干分类详见下一节生成依次写出references/{cat}.md引用文件、references/index.md索引、SKILL.md技能入口。提取结果会先以中间 JSON 落盘默认路径由data_file_for()决定打印格式为✅ Extracted N man page(s), M options, K examples。这样做的设计意图在模块 docstring 中有明确说明把耗时且依赖系统环境的提取步骤与技能生成步骤解耦便于--from-json直接复用之前的提取产物。3.1 系统命令提取的细节当使用--man-names时_run_man_command()会执行man [section] name并设置三个关键环境变量保证输出可解析MANWIDTH999与COLUMNS999避免终端宽度导致的换行折行MAN_KEEP_FORMATTING0关闭颜色转义。命令执行设置了 30 秒超时输出会再通过col -bx去除退格覆盖backspace overstriking格式若系统没有col则回退到正则.\x08手工删除退格符man_scraper.py。3.2 目录扫描的细节使用--man-path时_extract_from_directory()会递归扫描目录识别的扩展名集合为MAN_FILE_EXTENSIONS {.1...{.8} } ∪ {.man, .1p, .3p}并支持.gz、.bz2、.xz三种压缩格式读取时自动解压文件名如git.1.gz会被剥离出git。分区号通过_section_from_suffix()从扩展名推导1p取首字符得到 1若指定了--sections不属于目标分区的文件会被过滤但无分区后缀的.man文件不会被误删——这是 man_scraper.py 中特意处理的边界。3.3 troff 清洗与结构化解析_strip_troff_formatting()处理了 ANSI 转义、退格覆盖、.TH/.PP/.TP等宏指令、\fB字体切换、\-等特殊字符最终把原文折叠为至多连续两个空行的纯文本。随后_parse_man_output()以行首无缩进且内容匹配标准节名为判定条件切分章节并分别调用_extract_options()用正则匹配-f, --flag、--long-optionVALUE等选项行连续缩进行作为描述续行_extract_examples()以$、#、%、前缀或 4 空格缩进判定命令块其余行视为描述文字因此纯文字示例无命令也会被保留golden 中 git-log 的 Prose-only example with no command 正是这种边界_extract_see_also()用([\w.-])\s*\(\d\)提取形如git-diff(1), gitk(1)的引用并去重排序。四、分类机制前缀分组、关键字分类与 other 兜底索引中的 Categories 段直接由categorize_content()man_scraper.py决定它支持三种模式golden 目录用三个变体分别覆盖黄金树目录模式行为tests/golden/phase2/man/自动前缀分组git-log、git-diff以-为界取前缀git归入同一分类curl单独成类tests/golden/phase2/man_kw/显式关键字分类按配置的categories关键字匹配页面未命中任何分类的页面落入other兜底桶tests/golden/phase2/man_single/单页模式只有一页时直接以页面名作为唯一分类引用文件无编号前缀分组并非无脑应用只有当len(prefix_groups) len(pages)即分组确实能减少分类数量时才启用否则所有页面统一落入名为commands的分类man_scraper.py。这一设计避免了每个前缀都是唯一前缀时产生一堆无意义单页分类。在关键字模式中每个页面的description与title会被转为小写后与各分类关键字比对计分得分最高的分类胜出所有得分为 0 的页面进入other标题为 Other。man_kw黄金树即用于验证该兜底路径的输出。五、引用文件结构git_01.md 与 curl_02.md索引只是导航真正的技术细节沉淀在分类引用文件中。以 git_01.md 为例每个页面按_generate_reference_file()man_scraper.py固定输出以下小节标题行## git-log(1)分区号存在时带(1)NAME 行**git-log - Show commit logs**当 title 与命令名相同如curl时该加粗行会被跳过Synopsis放入无语言标注的代码块例如git log [options] [revision-range] [[--] path...]Description超过 3000 字符时截断并追加*... (truncated)*golden 中 git-diff 的超长描述正是验证点Options- \{flag} -- {description}形式单条描述超过 200 字符时截断golden 中--max-count 即演示了该截断Examples**Example N:** {description}加 bash 代码块纯文字示例不输出代码块See Also反引号包裹的引用列表额外节除NAME/SYNOPSIS/DESCRIPTION/OPTIONS/EXAMPLES/EXAMPLE/SEE ALSO之外的标准节如ENVIRONMENT、NOTES会以### {节名}追加输出超过 1500 字符截断空节仅空白字符直接跳过——golden 中BUGS节为空白即验证了跳过逻辑。curl_02.md 则演示了另一组边界无分区号标题行无(N)、title 与 name 相同加粗行跳过、无 synopsis整节不输出、无 SEE ALSO。六、与 SKILL.md 的关系索引不是孤立的。生成的技能目录中SKILL.md 是面向 Agent 的入口它以 YAML frontmatter 携带name与description描述由infer_description_from_manpages()从 NAME 行自动推断形如 Use when ...正文包含 When to Use、Quick Command Reference汇总各页 synopsis、Man Page Overview、Common Options每命令最多展示 5 条、每条描述截断到 120 字符、Examples最多 15 条、Related Commands (SEE ALSO)最多 30 条、Documentation Statistics 以及 Navigation。Navigation 段会列出references/下的每个引用文件并以See references/index.md for complete reference structure.指回本文主角——这正是 index.md 在整个技能产物中的定位供人和 Agent 快速导航的目录页。注意 SKILL.md 底部保留了 Generated by Skill Seekers | Man Page Scraper 的水印源码注释特别说明该拼写Skill Seekers 而非 Skill Seeker是刻意保留的因为黄金树要求字节级一致。七、CLI 参数与典型用法man 技能生成可通过统一 CLI 的manpage子命令解析器见 manpage_parser.py参数定义见 arguments/manpage.py或独立转换器调用。模块 docstring 给出三种典型用法# 方式一按命令名抓取系统 man 页面 skill-seekers man --man-names git,curl --name unix-tools # 方式二扫描本地 man 页面目录无需系统安装 man skill-seekers man --man-path /usr/share/man/man1 --name coreutils # 方式三复用已提取的中间 JSON跳过提取步骤 skill-seekers man --from-json unix-tools_extracted.json参数说明来自 arguments/manpage.py 与 arguments/create.py参数说明--man-names逗号分隔的命令名如ls,grep,find--man-path包含 man 页面文件的目录路径--sections逗号分隔的手册分区号如1,3,8与--man-path联用时过滤文件--from-json从提取好的 JSON 直接构建技能manpage 子命令的一个重要默认值是--enhance-level被强制设为0默认禁用 AI 增强因为 man 页面本身已经是结构化、高质量的内容无需再走增强管线需要时仍可手动提升增强级别。八、黄金测试如何保证输出契约tests/golden/phase2/man/下的文件来自旧版DocumentSkillBuilder重构之前代码的真实输出。tests/test_phase2_golden_man.py通过assert_matches_golden(build_snapshot(converter), man)将当前转换器重建的产物与该目录逐字节比对——因此任何对生成格式的无意改动哪怕一个空格、一个空行都会让测试失败。该测试的PAGES数据构造了几乎所有生成分支test_phase2_golden_man.py分区号存在与缺失git-log(1)vscurltitle 与 name 相同/不同curl 跳过加粗行缺失 synopsiscurl 不输出 Synopsis 节超过 3000 字符的描述截断git-diff与超过 1500 字符的额外节截断NOTES超过 200 字符的选项描述截断--max-count纯文字示例无命令空白节跳过BUGS空options/examples/see_also。三个变体man、man_kw、man_single分别锁定前缀分组 多分类编号文件、关键字分类 other 兜底、单页单分类无编号文件三条路径。若你要为技能产物开发解析器、渲染器或索引器这些 golden 文件就是最可靠的格式规范来源。九、扩展与边界把 man 技能接入更大工作流理解了索引与引用文件的结构后可以进一步利用 Skill Seekers 的既有能力冲突检测与安装生成后的技能目录可通过项目的 install/packaging 流程落地例如用 安装指南 与 打包说明 将 man 技能与其他来源文档网站、GitHub 仓库、PDF生成的技能统一管理检索与增强man 技能产出的是纯 Markdown天然适配 技能索引 与嵌入管线embedding可被 RAG 工作流直接消费回归验证修改生成逻辑后运行 test_phase2_golden_man.py即可快速确认 man 输出的三类黄金树是否仍保持字节级一致。需要留意的是本项目的 man 提取依赖运行环境--man-names需要系统安装man与对应手册页缺失时返回None并跳过该页--man-path则无此限制压缩格式、POSIX 扩展名1p/3p与递归子目录man1/、man2/均已被支持适合在不便安装手册页的容器环境离线生成技能。十、小结tests/golden/phase2/man/references/index.md虽是一份测试基准但它精确地记录了 Skill Seekers man 页面转技能管线的三个核心设计以分类为组织的导航结构——分类命名规则{cat_key}_{NN}.md与All Man Pages的排序、分区标注方式可解释的统计口径——total_pages、total_options、total_examples、see_also四个指标全部源自提取阶段的真实解析结果条件输出与边界处理——Cross-references条件行、无分区页面、纯文字示例、空白节跳过等细节共同构成了输出的稳定性。配合 man_scraper.py 的extract → parse → categorize → generate四阶段实现与 test_phase2_golden_man.py 的分支覆盖你可以放心地把这份结构当作解析、渲染或二次开发 man 技能产物的格式契约。【免费下载链接】Skill_SeekersConvert documentation websites, GitHub repositories, and PDFs into Claude AI skills with automatic conflict detection项目地址: https://gitcode.com/gh_mirrors/sk/Skill_Seekers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表