diff --git a/openspec/changes/archive/2026-02-25-optimize-skills-structure/.openspec.yaml b/openspec/changes/archive/2026-02-25-optimize-skills-structure/.openspec.yaml new file mode 100644 index 0000000..e331c97 --- /dev/null +++ b/openspec/changes/archive/2026-02-25-optimize-skills-structure/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-25 diff --git a/openspec/changes/archive/2026-02-25-optimize-skills-structure/design.md b/openspec/changes/archive/2026-02-25-optimize-skills-structure/design.md new file mode 100644 index 0000000..b7b1a46 --- /dev/null +++ b/openspec/changes/archive/2026-02-25-optimize-skills-structure/design.md @@ -0,0 +1,76 @@ +## Context + +当前项目包含 4 个 skills(lyxy-runner-python、lyxy-runner-js、lyxy-reader-office、lyxy-kb),每个 SKILL.md 文件内容在 200-300 行之间。根据 `document/the-complete-guide-to-building-skill.md` 中的渐进式披露原则,SKILL.md 应保持精简(建议 5000 字以内),详细文档应放在 `references/` 目录中。 + +**当前状态**: +- SKILL.md 包含完整的工作流程、示例、错误处理、最佳实践等所有内容 +- 无 references/ 目录结构 +- 每次 Claude 加载 skill 时需要处理全部内容 + +## Goals / Non-Goals + +**Goals:** +- 遵循三层渐进式披露结构:YAML 前置元数据 → SKILL.md 核心指令 → references/ 详细文档 +- 减少 skill 加载时的 token 消耗 +- 保持 lyxy-runner-python 和 lyxy-runner-js 的 description 宽泛性 +- 为 4 个现有 skills 创建 references/ 目录并迁移内容 + +**Non-Goals:** +- 不修改 skill 的功能逻辑 +- 不修改 scripts/ 目录中的可执行代码 +- 不新增 skill 或删除现有 skill + +## Decisions + +### 决策 1:三层结构内容划分 + +| 层级 | 位置 | 内容 | 加载时机 | +|-----|------|------|---------| +| 第一层 | YAML 前置元数据 | name、description、compatibility | 始终加载到系统提示 | +| 第二层 | SKILL.md 正文 | 核心工作流、关键命令、快速参考 | Claude 判断相关时加载 | +| 第三层 | references/*.md | 详细示例、错误处理、最佳实践、API 参考 | 按需导航和发现 | + +**理由**:遵循官方指南的渐进式披露原则,最小化 token 消耗的同时保持完整能力。 + +### 决策 2:SKILL.md 保留内容 + +每个 SKILL.md 正文保留以下核心部分: +1. **Purpose**:简要说明用途和关键依赖 +2. **When to Use**:适用/不适用场景(简化版) +3. **Quick Reference**:核心命令表格或流程图 +4. **Workflow**:简化的执行步骤 +5. **References 链接**:指向 references/ 中详细文档的链接 + +**理由**:保留足够信息让 Claude 完成任务,详细内容按需加载。 + +### 决策 3:references/ 目录结构 + +``` +references/ +├── examples.md # 详细示例 +├── error-handling.md # 错误处理和故障排除 +├── best-practices.md # 最佳实践和注意事项 +└── api-reference.md # API/命令参数详细说明(可选) +``` + +**理由**:按主题分类,便于 Claude 按需定位和加载。 + +### 决策 4:Description 格式 + +采用统一格式:`[做什么] + [何时使用] + [关键能力]` + +- lyxy-runner-python:保持 "Any task that requires Python processing should use this skill."(宽泛) +- lyxy-runner-js:保持 "Any task that requires Javascript/Typescript processing should use this skill."(宽泛) +- lyxy-reader-office:保持当前描述,已包含具体文件类型和操作 +- lyxy-kb:可优化添加用户触发短语 + +**理由**:runner skills 需要宽泛以匹配所有相关任务,reader/kb skills 可以更具体以精准触发。 + +## Risks / Trade-offs + +| 风险 | 缓解措施 | +|-----|---------| +| references/ 文件未被 Claude 发现 | 在 SKILL.md 中明确列出 references/ 文件并说明用途 | +| 拆分后信息不完整 | 核心工作流程保留在 SKILL.md,确保基本任务可完成 | +| 迁移过程中遗漏内容 | 逐个 skill 处理,对比前后内容确保完整性 | +| 文件数量增加 | references/ 文件按需加载,不影响初始 token 消耗 | diff --git a/openspec/changes/archive/2026-02-25-optimize-skills-structure/proposal.md b/openspec/changes/archive/2026-02-25-optimize-skills-structure/proposal.md new file mode 100644 index 0000000..0346d66 --- /dev/null +++ b/openspec/changes/archive/2026-02-25-optimize-skills-structure/proposal.md @@ -0,0 +1,30 @@ +## Why + +当前 skills 的 SKILL.md 文件内容较长(200-300 行),未遵循渐进式披露(Progressive Disclosure)原则。根据 skill 编写指南,应采用三层结构:YAML 前置元数据(触发判断)→ SKILL.md 正文(核心指令)→ references/(详细文档)。这样可以减少 token 消耗,提高 Claude 的响应效率。 + +## What Changes + +- **结构优化**:为每个 skill 创建 `references/` 目录,将详细文档、示例、错误处理等内容从 SKILL.md 正文移至 references/ +- **SKILL.md 精简**:保留核心工作流程和关键指令,将详细说明改为链接到 references/ 中的文档 +- **Description 优化**:确保 description 同时包含「做什么」和「何时使用」两部分,便于 Claude 判断是否加载 +- **lyxy-runner-python/js 保持宽泛**:这两个 runner skill 的 description 需要保持宽泛,以便匹配所有 Python/JS 处理任务 + +## Capabilities + +### New Capabilities + +- `skill-progressive-disclosure`: 定义 skill 渐进式披露的三层结构规范,包括 YAML 前置元数据、SKILL.md 正文、references/ 目录的职责划分和内容组织方式 + +### Modified Capabilities + +(无现有 spec 需要修改) + +## Impact + +- **文件结构变更**:每个 skill 目录新增 `references/` 子目录 +- **SKILL.md 重构**:4 个 skills 的 SKILL.md 文件需要精简,详细内容迁移到 references/ + - `skills/lyxy-runner-python/SKILL.md` + - `skills/lyxy-runner-js/SKILL.md` + - `skills/lyxy-reader-office/SKILL.md` + - `skills/lyxy-kb/SKILL.md` +- **向后兼容**:功能不变,仅优化文档结构,**无破坏性变更** diff --git a/openspec/changes/archive/2026-02-25-optimize-skills-structure/specs/skill-progressive-disclosure/spec.md b/openspec/changes/archive/2026-02-25-optimize-skills-structure/specs/skill-progressive-disclosure/spec.md new file mode 100644 index 0000000..6bbfe99 --- /dev/null +++ b/openspec/changes/archive/2026-02-25-optimize-skills-structure/specs/skill-progressive-disclosure/spec.md @@ -0,0 +1,77 @@ +## ADDED Requirements + +### Requirement: 三层渐进式披露结构 + +每个 skill 目录 SHALL 采用三层渐进式披露结构,按加载时机分为:第一层(YAML 前置元数据)、第二层(SKILL.md 正文)、第三层(references/ 目录)。 + +#### Scenario: skill 目录包含完整三层结构 +- **WHEN** 检查任意 skill 目录结构 +- **THEN** 目录 SHALL 包含 SKILL.md 文件和 references/ 子目录 + +#### Scenario: 第一层始终加载 +- **WHEN** Claude 启动会话时 +- **THEN** 所有 skill 的 YAML 前置元数据 SHALL 被加载到系统提示中 + +### Requirement: YAML 前置元数据内容规范 + +YAML 前置元数据 SHALL 仅包含触发判断所需的最小信息,使 Claude 能够判断何时使用该 skill。 + +#### Scenario: 必需字段 +- **WHEN** 编写 SKILL.md 的 YAML 前置元数据 +- **THEN** SHALL 包含 name 和 description 字段 + +#### Scenario: description 格式 +- **WHEN** 编写 description 字段 +- **THEN** SHALL 同时包含「做什么」和「何时使用」两部分信息 + +#### Scenario: description 长度限制 +- **WHEN** 检查 description 字段 +- **THEN** 内容 SHALL 少于 1024 个字符 + +#### Scenario: runner skill 的 description 宽泛性 +- **WHEN** skill 用途为通用脚本执行(如 Python/JavaScript runner) +- **THEN** description SHALL 保持宽泛,以匹配所有相关处理任务 + +### Requirement: SKILL.md 正文内容规范 + +SKILL.md 正文 SHALL 包含核心工作流程和关键指令,保持精简以减少 token 消耗。 + +#### Scenario: SKILL.md 必需章节 +- **WHEN** 编写 SKILL.md 正文 +- **THEN** SHALL 包含以下章节:Purpose、When to Use、Quick Reference、Workflow、References 链接 + +#### Scenario: SKILL.md 长度建议 +- **WHEN** 检查 SKILL.md 总字数 +- **THEN** 建议控制在 5000 字以内(含 YAML 前置元数据) + +#### Scenario: 详细内容迁移 +- **WHEN** SKILL.md 包含详细示例、完整错误处理、最佳实践等冗长内容 +- **THEN** 这些内容 SHALL 迁移到 references/ 目录,SKILL.md 中保留链接引用 + +### Requirement: references 目录结构规范 + +每个 skill SHALL 包含 references/ 子目录,用于存放按需加载的详细文档。 + +#### Scenario: references 目录存在性 +- **WHEN** 检查 skill 目录结构 +- **THEN** SHALL 存在 references/ 子目录 + +#### Scenario: references 文件分类 +- **WHEN** 组织 references/ 目录内容 +- **THEN** SHALL 按主题分类为独立的 markdown 文件,如 examples.md、error-handling.md、best-practices.md + +#### Scenario: SKILL.md 引用 references +- **WHEN** SKILL.md 需要引用详细文档 +- **THEN** SHALL 在 SKILL.md 中明确列出 references/ 中的文件并说明用途 + +### Requirement: 内容迁移完整性 + +从 SKILL.md 迁移内容到 references/ 时,SHALL 确保所有原有信息被完整保留。 + +#### Scenario: 迁移前后对比 +- **WHEN** 完成单个 skill 的内容迁移 +- **THEN** references/ 中的文件 SHALL 包含原 SKILL.md 中被移除的所有详细内容 + +#### Scenario: 功能不变性 +- **WHEN** 完成结构优化后 +- **THEN** skill 的功能逻辑 SHALL 保持不变,仅文档结构发生变化 diff --git a/openspec/changes/archive/2026-02-25-optimize-skills-structure/tasks.md b/openspec/changes/archive/2026-02-25-optimize-skills-structure/tasks.md new file mode 100644 index 0000000..fca4d88 --- /dev/null +++ b/openspec/changes/archive/2026-02-25-optimize-skills-structure/tasks.md @@ -0,0 +1,45 @@ +## 1. lyxy-runner-python 结构优化 + +- [x] 1.1 创建 `skills/lyxy-runner-python/references/` 目录 +- [x] 1.2 提取示例代码到 `references/examples.md` +- [x] 1.3 提取错误处理内容到 `references/error-handling.md` +- [x] 1.4 提取最佳实践和注意事项到 `references/best-practices.md` +- [x] 1.5 精简 SKILL.md,保留 Purpose、When to Use、Quick Reference、Workflow 章节 +- [x] 1.6 在 SKILL.md 末尾添加 References 链接章节 +- [x] 1.7 验证 description 保持宽泛("Any task that requires Python processing...") + +## 2. lyxy-runner-js 结构优化 + +- [x] 2.1 创建 `skills/lyxy-runner-js/references/` 目录 +- [x] 2.2 提取示例代码到 `references/examples.md` +- [x] 2.3 提取错误处理内容到 `references/error-handling.md` +- [x] 2.4 提取最佳实践和输出处理到 `references/best-practices.md` +- [x] 2.5 精简 SKILL.md,保留 Purpose、When to Use、Quick Reference、Workflow 章节 +- [x] 2.6 在 SKILL.md 末尾添加 References 链接章节 +- [x] 2.7 验证 description 保持宽泛("Any task that requires Javascript/Typescript processing...") + +## 3. lyxy-reader-office 结构优化 + +- [x] 3.1 创建 `skills/lyxy-reader-office/references/` 目录 +- [x] 3.2 提取详细示例到 `references/examples.md` +- [x] 3.3 提取解析器说明和依赖安装到 `references/parsers.md` +- [x] 3.4 提取错误处理和限制说明到 `references/error-handling.md` +- [x] 3.5 精简 SKILL.md,保留 Purpose、When to Use、Quick Reference、Workflow 章节 +- [x] 3.6 在 SKILL.md 末尾添加 References 链接章节 + +## 4. lyxy-kb 结构优化 + +- [x] 4.1 创建 `skills/lyxy-kb/references/` 目录 +- [x] 4.2 提取目录结构和文件格式详细说明到 `references/structure.md` +- [x] 4.3 提取文档生命周期和处理策略到 `references/workflow.md` +- [x] 4.4 提取渐进式查询策略到 `references/query-strategy.md` +- [x] 4.5 精简 SKILL.md,保留 Purpose、When to Use、Quick Reference、Workflow 章节 +- [x] 4.6 在 SKILL.md 末尾添加 References 链接章节 +- [x] 4.7 优化 description 添加用户触发短语 + +## 5. 验证与收尾 + +- [x] 5.1 对比每个 skill 的原始 SKILL.md 和重构后内容,确保信息完整 +- [x] 5.2 验证每个 skill 的 references/ 目录包含必要文件 +- [x] 5.3 验证每个 SKILL.md 的 References 章节正确链接到 references/ 文件 +- [x] 5.4 验证所有 description 符合格式要求(<1024 字符) diff --git a/openspec/specs/skill-progressive-disclosure/spec.md b/openspec/specs/skill-progressive-disclosure/spec.md new file mode 100644 index 0000000..0629028 --- /dev/null +++ b/openspec/specs/skill-progressive-disclosure/spec.md @@ -0,0 +1,83 @@ +# skill-progressive-disclosure + +## Purpose + +定义 skill 的渐进式披露(Progressive Disclosure)结构规范,将 skill 内容按加载时机分为三层:YAML 前置元数据、SKILL.md 正文、references/ 详细文档。通过分层加载减少 token 消耗,提高 Claude 的响应效率。 + +## Requirements + +### Requirement: 三层渐进式披露结构 + +每个 skill 目录 SHALL 采用三层渐进式披露结构,按加载时机分为:第一层(YAML 前置元数据)、第二层(SKILL.md 正文)、第三层(references/ 目录)。 + +#### Scenario: skill 目录包含完整三层结构 +- **WHEN** 检查任意 skill 目录结构 +- **THEN** 目录 SHALL 包含 SKILL.md 文件和 references/ 子目录 + +#### Scenario: 第一层始终加载 +- **WHEN** Claude 启动会话时 +- **THEN** 所有 skill 的 YAML 前置元数据 SHALL 被加载到系统提示中 + +### Requirement: YAML 前置元数据内容规范 + +YAML 前置元数据 SHALL 仅包含触发判断所需的最小信息,使 Claude 能够判断何时使用该 skill。 + +#### Scenario: 必需字段 +- **WHEN** 编写 SKILL.md 的 YAML 前置元数据 +- **THEN** SHALL 包含 name 和 description 字段 + +#### Scenario: description 格式 +- **WHEN** 编写 description 字段 +- **THEN** SHALL 同时包含「做什么」和「何时使用」两部分信息 + +#### Scenario: description 长度限制 +- **WHEN** 检查 description 字段 +- **THEN** 内容 SHALL 少于 1024 个字符 + +#### Scenario: runner skill 的 description 宽泛性 +- **WHEN** skill 用途为通用脚本执行(如 Python/JavaScript runner) +- **THEN** description SHALL 保持宽泛,以匹配所有相关处理任务 + +### Requirement: SKILL.md 正文内容规范 + +SKILL.md 正文 SHALL 包含核心工作流程和关键指令,保持精简以减少 token 消耗。 + +#### Scenario: SKILL.md 必需章节 +- **WHEN** 编写 SKILL.md 正文 +- **THEN** SHALL 包含以下章节:Purpose、When to Use、Quick Reference、Workflow、References 链接 + +#### Scenario: SKILL.md 长度建议 +- **WHEN** 检查 SKILL.md 总字数 +- **THEN** 建议控制在 5000 字以内(含 YAML 前置元数据) + +#### Scenario: 详细内容迁移 +- **WHEN** SKILL.md 包含详细示例、完整错误处理、最佳实践等冗长内容 +- **THEN** 这些内容 SHALL 迁移到 references/ 目录,SKILL.md 中保留链接引用 + +### Requirement: references 目录结构规范 + +每个 skill SHALL 包含 references/ 子目录,用于存放按需加载的详细文档。 + +#### Scenario: references 目录存在性 +- **WHEN** 检查 skill 目录结构 +- **THEN** SHALL 存在 references/ 子目录 + +#### Scenario: references 文件分类 +- **WHEN** 组织 references/ 目录内容 +- **THEN** SHALL 按主题分类为独立的 markdown 文件,如 examples.md、error-handling.md、best-practices.md + +#### Scenario: SKILL.md 引用 references +- **WHEN** SKILL.md 需要引用详细文档 +- **THEN** SHALL 在 SKILL.md 中明确列出 references/ 中的文件并说明用途 + +### Requirement: 内容迁移完整性 + +从 SKILL.md 迁移内容到 references/ 时,SHALL 确保所有原有信息被完整保留。 + +#### Scenario: 迁移前后对比 +- **WHEN** 完成单个 skill 的内容迁移 +- **THEN** references/ 中的文件 SHALL 包含原 SKILL.md 中被移除的所有详细内容 + +#### Scenario: 功能不变性 +- **WHEN** 完成结构优化后 +- **THEN** skill 的功能逻辑 SHALL 保持不变,仅文档结构发生变化 diff --git a/skills/lyxy-kb/SKILL.md b/skills/lyxy-kb/SKILL.md index f97bfc8..6ea653e 100644 --- a/skills/lyxy-kb/SKILL.md +++ b/skills/lyxy-kb/SKILL.md @@ -1,6 +1,6 @@ --- name: lyxy-kb -description: 基于文件的个人知识库管理 skill,提供知识项目的目录结构规范、文档解析入库、渐进式问答等底层能力定义。配合 commands/lyxy-kb/ 下的 command 使用。 +description: 基于文件的个人知识库管理 skill。当用户说"创建知识库"、"初始化知识项目"、"入库文档"、"知识问答"、"基于文档回答"时使用。支持文档解析入库、增量摘要、渐进式问答。配合 /lyxy-kb-init、/lyxy-kb-ingest、/lyxy-kb-ask 等 command 使用。 compatibility: 依赖 lyxy-reader-office skill 解析 office 文档(.docx/.pdf/.pptx/.xlsx),依赖 lyxy-runner-python skill 执行 Python 脚本。 --- @@ -30,7 +30,7 @@ compatibility: 依赖 lyxy-reader-office skill 解析 office 文档(.docx/.pdf - 需要跨多个知识项目关联查询 - 需要多人协作或权限控制 -## 配套 Commands +## Quick Reference | Command | 触发方式 | 说明 | |---------|----------|------| @@ -39,255 +39,38 @@ compatibility: 依赖 lyxy-reader-office skill 解析 office 文档(.docx/.pdf | rebuild | `/lyxy-kb-rebuild ` | 全量重新生成 project.md | | ask | `/lyxy-kb-ask ` | 基于知识库进行会话问答 | -## 项目名称规则 +## Workflow -项目名称只允许使用以下字符: -- 中文字符 -- 英文字母(a-z、A-Z) -- 数字(0-9) -- 短横线(-) -- 下划线(_) - -**不允许包含空格或其他特殊字符。** 不符合规则时应提示用户修改。 - -## 知识项目目录结构 - -每个知识项目是当前工作目录(CWD)下的一个子目录,包含以下固定结构: +### 知识项目目录结构 ``` / ├── project.md # 高度摘要 + 文件索引 ├── manifest.json # 增量追踪 -├── parsed/ # 解析后的 markdown(中间产物) +├── parsed/ # 解析后的 markdown ├── sources/ # 待处理区(用户放入原始文档) └── archive/ # 原始文件备份(带时间戳) ``` -### 各目录/文件职责 +### 基本工作流程 -| 路径 | 职责 | -|------|------| -| `project.md` | 项目的高度摘要和文件索引,作为问答时的入口文件 | -| `manifest.json` | 记录已处理文件的元信息,用于增量检测和版本追踪 | -| `parsed/` | 存放解析后的 markdown 文件,便于大模型读取分析 | -| `sources/` | 用户放入待处理文档的目录,解析后文件会被移走 | -| `archive/` | 原始文件的备份,每个文件都带时间戳后缀 | +1. **初始化**:使用 `/lyxy-kb-init ` 创建项目目录结构 +2. **入库**:将文档放入 `sources/`,执行 `/lyxy-kb-ingest ` +3. **问答**:使用 `/lyxy-kb-ask ` 基于知识库回答问题 -### 结构完整性验证 - -执行任何 command(ingest / rebuild / ask)时,必须先验证项目目录结构是否完整,即以下 5 项是否全部存在: -- `/project.md` -- `/manifest.json` -- `/parsed/` -- `/sources/` -- `/archive/` - -若不完整,提示用户先执行 `/lyxy-kb-init `,终止当前操作。 - -## project.md 格式规范 - -```markdown -# <项目名称> - -## 概述 -(高度总结的项目信息,几百字以内) - -## 关键信息 -(从所有文档中提炼的核心要点) - -## 文件索引 - -| 文件名 | 解析文件 | 最新归档 | 摘要 | -|--------|----------|----------|------| -| 需求文档 | parsed/需求文档.md | archive/需求文档_202602181600.docx | 简要摘要... | - -## 更新记录 -- 2026-02-18 16:00: 解析 需求文档.docx -``` - -### 更新策略 - -**增量追加**(默认,由 ingest 触发): -- 新文件:在文件索引表追加新行,在更新记录追加条目 -- 已有文件更新:覆盖文件索引表中对应行的最新归档路径和摘要 -- 概述和关键信息部分**不**自动更新 - -**全量重写**(由 rebuild 触发): -- 读取所有 parsed/*.md 文件 -- 重新生成概述、关键信息、文件索引 -- 保留历史更新记录,追加本次 rebuild 条目 - -## manifest.json 结构 - -```json -{ - "project": "<项目名称>", - "created_at": "2026-02-18T16:00", - "last_ingest": "2026-02-18T17:25", - "files": [ - { - "name": "需求文档", - "ext": ".docx", - "parsed": "parsed/需求文档.md", - "versions": [ - { - "archived": "archive/需求文档_202602181600.docx", - "hash": "sha256:abc123...", - "ingested_at": "2026-02-18T16:00" - } - ] - } - ] -} -``` - -### 字段说明 - -| 字段 | 说明 | -|------|------| -| `project` | 项目名称 | -| `created_at` | 项目创建时间 | -| `last_ingest` | 最近一次 ingest 的时间 | -| `files[].name` | 文件名(不含扩展名) | -| `files[].ext` | 原始文件扩展名 | -| `files[].parsed` | 解析产物的相对路径 | -| `files[].versions` | 版本历史数组 | -| `files[].versions[].archived` | 归档文件的相对路径 | -| `files[].versions[].hash` | 文件内容的 SHA-256 哈希(使用 `sha256sum` 命令计算) | -| `files[].versions[].ingested_at` | 该版本的入库时间 | - -## 文件类型解析策略 - -| 文件类型 | 解析方式 | -|----------|----------| -| `.docx`, `.pdf`, `.pptx`, `.xlsx` | 使用名为 **lyxy-reader-office** 的 skill 解析 | -| 其他所有文件(`.md`, `.txt`, `.csv`, `.json`, `.xml`, `.yaml`, `.yml`, `.log`, `.html` 等) | 直接读取文件内容 | - -### Office 文档解析 - -解析 office 文档时,必须查找当前环境中名为 **lyxy-reader-office** 的 skill,阅读其 SKILL.md 获取具体的执行方式和命令。 - -**如果环境中不存在 lyxy-reader-office skill,且没有其他可替代的文档解析 skill,则提示用户无法处理 office 文档,中止整个 ingest 流程。** - -### sources/ 扫描规则 - -扫描 sources/ 时**递归检查所有子目录**中的文件。parsed 产物的路径仍为 `parsed/<文件名>.md`(扁平化存放),不保留 sources 中的子目录结构。 - -### 空文件处理 - -sources/ 中 0 字节的空文件应**跳过处理**,不解析、不归档、不更新 manifest。处理完成后向用户列出被跳过的空文件列表,提示用户检查。 - -### 解析失败处理 - -如果某个文件解析失败(如文档损坏、解析器报错),该文件**保留在 sources/ 中不移动**,报告错误信息,继续处理其他文件。 - -## parsed 文件元信息标记 - -每个 parsed markdown 文件头部必须包含元信息注释: - -```markdown - - - - -# 技术方案 -(文档正文内容...) -``` - -| 元信息 | 说明 | -|--------|------| -| `source` | 原始文件名(含扩展名) | -| `archived` | 对应的归档文件相对路径 | -| `parsed_at` | 解析时间(YYYY-MM-DD HH:mm 格式) | - -## 文档生命周期 - -``` -用户放入 sources/(支持子目录) - │ - ▼ - 检查文件(跳过空文件、检测冲突) - │ - ▼ - 解析文件内容(失败则保留在 sources/) - │ - ├──▶ 写入 parsed/<文件名>.md(含头部元信息) - │ - ├──▶ 移动原始文件到 archive/<文件名_YYYYMMDDHHmm>. - │ - ├──▶ 更新 manifest.json - │ - └──▶ 增量更新 project.md(追加文件索引和更新记录) -``` - -### 归档命名规则 - -所有进入 archive 的文件都必须带时间戳后缀,格式为 `<文件名_YYYYMMDDHHmm>.<扩展名>`,即使只有一个版本。 - -示例: -- `需求文档.docx` → `archive/需求文档_202602181600.docx` -- `技术方案.pdf`(第二次入库)→ `archive/技术方案_202602181725.pdf` - -### 同名文件更新 - -同名同扩展名的文件再次入库时: -- `parsed/` 中的 markdown 文件被覆盖为最新版本 -- `archive/` 中保留所有历史版本(每个版本独立的时间戳文件) -- `manifest.json` 中该文件条目的 `versions` 数组追加新版本记录 - -## 同名不同扩展名冲突检测 - -因为 parsed 产物以文件名(不含扩展名)+ `.md` 命名,同名不同扩展名的文件会产生冲突。 - -### 检测规则 - -1. **sources/ 内部检测**:扫描 sources/ 中所有文件(含子目录),如果存在同名但不同扩展名的文件(如 `技术方案.pdf` 和 `技术方案.docx`),拒绝处理并提示用户重命名 -2. **与已入库文件检测**:将 sources/ 中文件的名称(不含扩展名)与 manifest.json 中已有记录对比,如果名称相同但扩展名不同,拒绝处理并提示用户重命名 - -### 处理方式 - -冲突文件不予处理,保留在 sources/ 中,提示用户重命名后重新执行 ingest。非冲突文件正常处理。 - -## 渐进式查询策略 - -问答时采用分层加载策略,节省 token: +### 渐进式查询策略 1. **读取 project.md**:获取项目概述和文件索引(低 token 开销) -2. **判断相关文件**:根据用户问题和文件索引中的摘要,判断需要查阅哪些 parsed 文件 +2. **判断相关文件**:根据用户问题和摘要判断需要查阅哪些 parsed 文件 3. **按需加载**:读取相关 parsed 文件的全部或部分内容 4. **回答并标注来源**:基于获取的信息回答问题 -### 来源引用格式 +## References -回答中引用具体信息时,使用以下格式标注来源: +详细文档请参阅 `references/` 目录: -``` -根据《文件名》(parsed/文件名.md),... -``` - -多个来源时分别标注各信息点的来源文件。 - -### 无相关信息 - -当知识库中未找到与用户问题相关的信息时,明确告知用户,不编造答案。 - -### 空知识库 - -如果 project.md 文件索引为空(尚无已入库文件),应告知用户知识库为空,建议先使用 `/lyxy-kb-ingest` 入库文档。 - -## Notes - -### 依赖关系 - -| 依赖 | 用途 | +| 文件 | 内容 | |------|------| -| lyxy-reader-office | 解析 .docx、.pdf、.pptx、.xlsx 文件为 markdown | -| lyxy-runner-python | 通过 uv 执行 lyxy-reader-office 的 Python 解析脚本 | - -### 限制 - -- 不支持向量化语义搜索 -- 不支持跨知识项目关联查询 -- 不支持文档版本对比或 diff -- 不支持多用户协作或权限控制 -- 大量文件全量重写时 token 消耗较高 +| `references/structure.md` | 目录结构规范、project.md 格式、manifest.json 结构、parsed 元信息标记 | +| `references/workflow.md` | 文档生命周期、归档命名规则、冲突检测、解析策略 | +| `references/query-strategy.md` | 渐进式查询策略、来源引用格式、依赖关系、限制说明 | diff --git a/skills/lyxy-kb/references/query-strategy.md b/skills/lyxy-kb/references/query-strategy.md new file mode 100644 index 0000000..dd786c1 --- /dev/null +++ b/skills/lyxy-kb/references/query-strategy.md @@ -0,0 +1,43 @@ +# 渐进式查询策略 + +## 分层加载策略 + +问答时采用分层加载策略,节省 token: + +1. **读取 project.md**:获取项目概述和文件索引(低 token 开销) +2. **判断相关文件**:根据用户问题和文件索引中的摘要,判断需要查阅哪些 parsed 文件 +3. **按需加载**:读取相关 parsed 文件的全部或部分内容 +4. **回答并标注来源**:基于获取的信息回答问题 + +## 来源引用格式 + +回答中引用具体信息时,使用以下格式标注来源: + +``` +根据《文件名》(parsed/文件名.md),... +``` + +多个来源时分别标注各信息点的来源文件。 + +## 无相关信息 + +当知识库中未找到与用户问题相关的信息时,明确告知用户,不编造答案。 + +## 空知识库 + +如果 project.md 文件索引为空(尚无已入库文件),应告知用户知识库为空,建议先使用 `/lyxy-kb-ingest` 入库文档。 + +## 依赖关系 + +| 依赖 | 用途 | +|------|------| +| lyxy-reader-office | 解析 .docx、.pdf、.pptx、.xlsx 文件为 markdown | +| lyxy-runner-python | 通过 uv 执行 lyxy-reader-office 的 Python 解析脚本 | + +## 限制 + +- 不支持向量化语义搜索 +- 不支持跨知识项目关联查询 +- 不支持文档版本对比或 diff +- 不支持多用户协作或权限控制 +- 大量文件全量重写时 token 消耗较高 diff --git a/skills/lyxy-kb/references/structure.md b/skills/lyxy-kb/references/structure.md new file mode 100644 index 0000000..6eeac41 --- /dev/null +++ b/skills/lyxy-kb/references/structure.md @@ -0,0 +1,125 @@ +# 知识项目目录结构 + +## 目录结构 + +每个知识项目是当前工作目录(CWD)下的一个子目录,包含以下固定结构: + +``` +/ +├── project.md # 高度摘要 + 文件索引 +├── manifest.json # 增量追踪 +├── parsed/ # 解析后的 markdown(中间产物) +├── sources/ # 待处理区(用户放入原始文档) +└── archive/ # 原始文件备份(带时间戳) +``` + +### 各目录/文件职责 + +| 路径 | 职责 | +|------|------| +| `project.md` | 项目的高度摘要和文件索引,作为问答时的入口文件 | +| `manifest.json` | 记录已处理文件的元信息,用于增量检测和版本追踪 | +| `parsed/` | 存放解析后的 markdown 文件,便于大模型读取分析 | +| `sources/` | 用户放入待处理文档的目录,解析后文件会被移走 | +| `archive/` | 原始文件的备份,每个文件都带时间戳后缀 | + +### 结构完整性验证 + +执行任何 command(ingest / rebuild / ask)时,必须先验证项目目录结构是否完整,即以下 5 项是否全部存在: +- `/project.md` +- `/manifest.json` +- `/parsed/` +- `/sources/` +- `/archive/` + +若不完整,提示用户先执行 `/lyxy-kb-init `,终止当前操作。 + +## 项目名称规则 + +项目名称只允许使用以下字符: +- 中文字符 +- 英文字母(a-z、A-Z) +- 数字(0-9) +- 短横线(-) +- 下划线(_) + +**不允许包含空格或其他特殊字符。** 不符合规则时应提示用户修改。 + +## project.md 格式规范 + +```markdown +# <项目名称> + +## 概述 +(高度总结的项目信息,几百字以内) + +## 关键信息 +(从所有文档中提炼的核心要点) + +## 文件索引 + +| 文件名 | 解析文件 | 最新归档 | 摘要 | +|--------|----------|----------|------| +| 需求文档 | parsed/需求文档.md | archive/需求文档_202602181600.docx | 简要摘要... | + +## 更新记录 +- 2026-02-18 16:00: 解析 需求文档.docx +``` + +## manifest.json 结构 + +```json +{ + "project": "<项目名称>", + "created_at": "2026-02-18T16:00", + "last_ingest": "2026-02-18T17:25", + "files": [ + { + "name": "需求文档", + "ext": ".docx", + "parsed": "parsed/需求文档.md", + "versions": [ + { + "archived": "archive/需求文档_202602181600.docx", + "hash": "sha256:abc123...", + "ingested_at": "2026-02-18T16:00" + } + ] + } + ] +} +``` + +### 字段说明 + +| 字段 | 说明 | +|------|------| +| `project` | 项目名称 | +| `created_at` | 项目创建时间 | +| `last_ingest` | 最近一次 ingest 的时间 | +| `files[].name` | 文件名(不含扩展名) | +| `files[].ext` | 原始文件扩展名 | +| `files[].parsed` | 解析产物的相对路径 | +| `files[].versions` | 版本历史数组 | +| `files[].versions[].archived` | 归档文件的相对路径 | +| `files[].versions[].hash` | 文件内容的 SHA-256 哈希(使用 `sha256sum` 命令计算) | +| `files[].versions[].ingested_at` | 该版本的入库时间 | + +## parsed 文件元信息标记 + +每个 parsed markdown 文件头部必须包含元信息注释: + +```markdown + + + + +# 技术方案 +(文档正文内容...) +``` + +| 元信息 | 说明 | +|--------|------| +| `source` | 原始文件名(含扩展名) | +| `archived` | 对应的归档文件相对路径 | +| `parsed_at` | 解析时间(YYYY-MM-DD HH:mm 格式) | diff --git a/skills/lyxy-kb/references/workflow.md b/skills/lyxy-kb/references/workflow.md new file mode 100644 index 0000000..6f20439 --- /dev/null +++ b/skills/lyxy-kb/references/workflow.md @@ -0,0 +1,86 @@ +# 文档生命周期和处理策略 + +## 文档生命周期 + +``` +用户放入 sources/(支持子目录) + │ + ▼ + 检查文件(跳过空文件、检测冲突) + │ + ▼ + 解析文件内容(失败则保留在 sources/) + │ + ├──▶ 写入 parsed/<文件名>.md(含头部元信息) + │ + ├──▶ 移动原始文件到 archive/<文件名_YYYYMMDDHHmm>. + │ + ├──▶ 更新 manifest.json + │ + └──▶ 增量更新 project.md(追加文件索引和更新记录) +``` + +## 归档命名规则 + +所有进入 archive 的文件都必须带时间戳后缀,格式为 `<文件名_YYYYMMDDHHmm>.<扩展名>`,即使只有一个版本。 + +示例: +- `需求文档.docx` → `archive/需求文档_202602181600.docx` +- `技术方案.pdf`(第二次入库)→ `archive/技术方案_202602181725.pdf` + +## 同名文件更新 + +同名同扩展名的文件再次入库时: +- `parsed/` 中的 markdown 文件被覆盖为最新版本 +- `archive/` 中保留所有历史版本(每个版本独立的时间戳文件) +- `manifest.json` 中该文件条目的 `versions` 数组追加新版本记录 + +## 同名不同扩展名冲突检测 + +因为 parsed 产物以文件名(不含扩展名)+ `.md` 命名,同名不同扩展名的文件会产生冲突。 + +### 检测规则 + +1. **sources/ 内部检测**:扫描 sources/ 中所有文件(含子目录),如果存在同名但不同扩展名的文件(如 `技术方案.pdf` 和 `技术方案.docx`),拒绝处理并提示用户重命名 +2. **与已入库文件检测**:将 sources/ 中文件的名称(不含扩展名)与 manifest.json 中已有记录对比,如果名称相同但扩展名不同,拒绝处理并提示用户重命名 + +### 处理方式 + +冲突文件不予处理,保留在 sources/ 中,提示用户重命名后重新执行 ingest。非冲突文件正常处理。 + +## 文件类型解析策略 + +| 文件类型 | 解析方式 | +|----------|----------| +| `.docx`, `.pdf`, `.pptx`, `.xlsx` | 使用名为 **lyxy-reader-office** 的 skill 解析 | +| 其他所有文件(`.md`, `.txt`, `.csv`, `.json`, `.xml`, `.yaml`, `.yml`, `.log`, `.html` 等) | 直接读取文件内容 | + +### Office 文档解析 + +解析 office 文档时,必须查找当前环境中名为 **lyxy-reader-office** 的 skill,阅读其 SKILL.md 获取具体的执行方式和命令。 + +**如果环境中不存在 lyxy-reader-office skill,且没有其他可替代的文档解析 skill,则提示用户无法处理 office 文档,中止整个 ingest 流程。** + +### sources/ 扫描规则 + +扫描 sources/ 时**递归检查所有子目录**中的文件。parsed 产物的路径仍为 `parsed/<文件名>.md`(扁平化存放),不保留 sources 中的子目录结构。 + +### 空文件处理 + +sources/ 中 0 字节的空文件应**跳过处理**,不解析、不归档、不更新 manifest。处理完成后向用户列出被跳过的空文件列表,提示用户检查。 + +### 解析失败处理 + +如果某个文件解析失败(如文档损坏、解析器报错),该文件**保留在 sources/ 中不移动**,报告错误信息,继续处理其他文件。 + +## 更新策略 + +**增量追加**(默认,由 ingest 触发): +- 新文件:在文件索引表追加新行,在更新记录追加条目 +- 已有文件更新:覆盖文件索引表中对应行的最新归档路径和摘要 +- 概述和关键信息部分**不**自动更新 + +**全量重写**(由 rebuild 触发): +- 读取所有 parsed/*.md 文件 +- 重新生成概述、关键信息、文件索引 +- 保留历史更新记录,追加本次 rebuild 条目 diff --git a/skills/lyxy-reader-office/SKILL.md b/skills/lyxy-reader-office/SKILL.md index ee73976..fb87a92 100644 --- a/skills/lyxy-reader-office/SKILL.md +++ b/skills/lyxy-reader-office/SKILL.md @@ -14,21 +14,6 @@ compatibility: Requires Python 3.6+. DOCX/PPTX/XLSX 无需额外依赖(XML 原 **依赖选项**:此 skill 必须优先使用 lyxy-runner-python skill 执行,不可用时降级到直接 Python 执行。 -### 必须使用 lyxy-runner-python - -如果环境中存在 lyxy-runner-python skill,**必须**使用它来执行 parser.py 脚本: -- lyxy-runner-python 使用 uv 管理依赖,自动安装所需的第三方库 -- 环境隔离,不污染系统 Python -- 跨平台兼容(Windows/macOS/Linux) - -### 降级到直接执行 - -**仅当** lyxy-runner-python skill 不存在时,才降级到直接 Python 执行: -- 需要用户手动安装依赖 -- DOCX/PPTX/XLSX 无需依赖也可通过 XML 原生解析工作 -- PDF 至少需要安装 pypdf -- **禁止自动执行 pip install**,仅向用户提示安装建议 - ## When to Use 任何需要读取或解析 .docx、.xlsx、.pptx、.pdf 文件内容的任务都应使用此 skill。 @@ -41,100 +26,12 @@ compatibility: Requires Python 3.6+. DOCX/PPTX/XLSX 无需额外依赖(XML 原 - **内容搜索**:在文档中搜索关键词或模式 - **PDF OCR**:对扫描版 PDF 启用 OCR 高精度解析 -### 不适用场景 -- 需要提取图片内容(仅支持纯文本) -- 需要保留复杂的格式信息(字体、颜色、布局) -- 需要编辑或修改文档 -- 需要处理 .doc、.xls、.ppt 等旧格式 - ### 触发词 +- 中文:"读取/解析/打开 docx/word/xlsx/excel/pptx/pdf 文档" +- 英文:"read/parse/extract docx/word/xlsx/excel/pptx/powerpoint/pdf" +- 文件扩展名:`.docx`、`.xlsx`、`.pptx`、`.pdf` -**中文触发词** -- "读取/解析/打开 docx/word 文档" -- "读取/解析/打开 xlsx/excel 文件" -- "读取/解析/打开 pptx/ppt 文件" -- "读取/解析/打开 pdf 文件" - -**英文触发词** -- "read/parse/extract docx/word/xlsx/excel/pptx/powerpoint/pdf" - -**文件扩展名** -- `.docx`、`.xlsx`、`.pptx`、`.pdf` - -## Capabilities - -### 1. 全文转换为 Markdown -将完整文档解析为 Markdown 格式,移除图片但保留文本格式(标题、列表、表格、粗体、斜体等)。 - -各格式的输出特点: -- **DOCX**:标准 Markdown 文档结构 -- **PPTX**:每张幻灯片以 `## Slide N` 为标题,幻灯片之间以 `---` 分隔 -- **XLSX**:以 `## SheetName` 区分工作表,数据以 Markdown 表格呈现 -- **PDF**:纯文本流,使用 `--high-res` 可启用 OCR 版面分析识别标题 - -### 2. 获取文档元信息 -- 字数统计(`-c` 参数) -- 行数统计(`-l` 参数) - -### 3. 标题列表提取 -提取文档中所有 1-6 级标题(`-t` 参数),按原始层级关系返回。 - -### 4. 指定章节内容提取 -根据标题名称提取特定章节的完整内容(`-tc` 参数),包含上级标题链和所有下级内容。 - -### 5. 正则表达式搜索 -在文档中搜索关键词或模式(`-s` 参数),支持自定义上下文行数(`-n` 参数,默认 2 行)。 - -### 6. PDF OCR 高精度模式 -对 PDF 文件启用 OCR 版面分析(`--high-res` 参数),适用于扫描版 PDF 或需要识别标题层级的场景。 - -## Execution - -### 详细用法参考 - -**执行前请阅读 `scripts/README.md`**,其中包含: -- 完整的命令行参数说明 -- 各格式的依赖安装指南(pip 和 uv 方式) -- 解析器优先级和对比 -- 输出格式说明 -- 错误处理和常见问题 - -### 基本语法 - -```bash -python parser.py [options] -``` - -### 使用 lyxy-runner-python 执行(必须优先使用) - -```bash -# DOCX - 推荐依赖 -uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py /path/to/file.docx - -# PPTX - 推荐依赖 -uv run --with "markitdown[pptx]" skills/lyxy-reader-office/scripts/parser.py /path/to/file.pptx - -# XLSX - 推荐依赖 -uv run --with "markitdown[xlsx]" skills/lyxy-reader-office/scripts/parser.py /path/to/file.xlsx - -# PDF - 推荐依赖 -uv run --with "markitdown[pdf]" --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/file.pdf - -# PDF OCR 高精度模式 -uv run --with docling --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/file.pdf --high-res -``` - -> **注意**:以上为最小推荐依赖,更多解析器依赖和完整安装命令请查阅 `scripts/README.md` 的安装部分。 - -### 降级到直接 Python 执行 - -仅当 lyxy-runner-python skill 不存在时使用: - -```bash -python3 skills/lyxy-reader-office/scripts/parser.py /path/to/file.docx -``` - -### 互斥参数 +## Quick Reference | 参数 | 说明 | |------|------| @@ -142,71 +39,36 @@ python3 skills/lyxy-reader-office/scripts/parser.py /path/to/file.docx | `-c` | 字数统计 | | `-l` | 行数统计 | | `-t` | 提取所有标题 | -| `-tc ` | 提取指定标题的章节内容(name 不含 # 号) | +| `-tc ` | 提取指定标题的章节内容 | | `-s ` | 正则表达式搜索 | -| `-n ` | 与 `-s` 配合,指定上下文行数(默认 2) | +| `-n ` | 与 `-s` 配合,指定上下文行数 | | `--high-res` | PDF 专用,启用 OCR 版面分析 | -## Examples +## Workflow + +1. **检查依赖**:优先使用 lyxy-runner-python,否则降级到直接 Python 执行 +2. **选择格式**:根据文件扩展名自动识别格式 +3. **执行解析**:调用 `scripts/parser.py` 并传入参数 +4. **输出结果**:返回 Markdown 格式内容或统计信息 + +### 基本语法 -### 提取完整文档内容 ```bash -# DOCX -uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py /path/to/report.docx +# 使用 lyxy-runner-python(推荐) +uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py /path/to/file.docx -# PPTX -uv run --with "markitdown[pptx]" skills/lyxy-reader-office/scripts/parser.py /path/to/slides.pptx - -# XLSX -uv run --with "markitdown[xlsx]" skills/lyxy-reader-office/scripts/parser.py /path/to/data.xlsx - -# PDF -uv run --with "markitdown[pdf]" --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/doc.pdf +# 降级到直接执行 +python3 skills/lyxy-reader-office/scripts/parser.py /path/to/file.docx ``` -### 获取文档字数 -```bash -uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -c /path/to/report.docx -``` +## References -### 提取所有标题 -```bash -uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -t /path/to/report.docx -``` +详细文档请参阅 `references/` 目录: -### 提取指定章节 -```bash -uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -tc "第一章" /path/to/report.docx -``` +| 文件 | 内容 | +|------|------| +| `references/examples.md` | 各格式完整提取、字数统计、标题提取、章节提取、搜索等示例 | +| `references/parsers.md` | 解析器说明、依赖安装、各格式输出特点、能力说明 | +| `references/error-handling.md` | 限制说明、最佳实践、依赖执行策略 | -### 搜索关键词 -```bash -uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -s "关键词" -n 3 /path/to/report.docx -``` - -### PDF OCR 高精度解析 -```bash -uv run --with docling --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/scanned.pdf --high-res -``` - -## Notes - -### 多策略解析降级 - -每种文件格式配备多个解析器,按优先级依次尝试,前一个失败自动回退到下一个。详细的解析器优先级和对比请查阅 `scripts/README.md`。 - -### 限制 - -- 不支持图片提取(仅纯文本) -- 不支持复杂的格式保留(字体、颜色、布局等) -- 不支持文档编辑或修改 -- 仅支持 .docx、.xlsx、.pptx、.pdf 格式(不支持 .doc、.xls、.ppt 等旧格式) -- PDF 无内置 XML 原生解析,至少需要安装 pypdf - -### 最佳实践 - -1. **必须优先使用 lyxy-runner-python**:如果环境中存在,必须使用 lyxy-runner-python 执行脚本 -2. **查阅 README**:详细参数、依赖安装、解析器对比等信息请阅读 `scripts/README.md` -3. **大文件处理**:对于大文档,建议使用章节提取(`-tc`)或搜索(`-s`)来限制处理范围 -4. **PDF 标题**:PDF 是版面描述格式,默认不含语义化标题;需要标题层级时使用 `--high-res` -5. **禁止自动安装**:降级到直接 Python 执行时,仅向用户提示安装依赖,不得自动执行 pip install +> **详细用法**:请阅读 `scripts/README.md` 获取完整的命令行参数和依赖安装指南。 diff --git a/skills/lyxy-reader-office/references/error-handling.md b/skills/lyxy-reader-office/references/error-handling.md new file mode 100644 index 0000000..75d5d44 --- /dev/null +++ b/skills/lyxy-reader-office/references/error-handling.md @@ -0,0 +1,41 @@ +# 错误处理和限制说明 + +## 限制 + +- 不支持图片提取(仅纯文本) +- 不支持复杂的格式保留(字体、颜色、布局等) +- 不支持文档编辑或修改 +- 仅支持 .docx、.xlsx、.pptx、.pdf 格式(不支持 .doc、.xls、.ppt 等旧格式) +- PDF 无内置 XML 原生解析,至少需要安装 pypdf + +## 最佳实践 + +1. **必须优先使用 lyxy-runner-python**:如果环境中存在,必须使用 lyxy-runner-python 执行脚本 +2. **查阅 README**:详细参数、依赖安装、解析器对比等信息请阅读 `scripts/README.md` +3. **大文件处理**:对于大文档,建议使用章节提取(`-tc`)或搜索(`-s`)来限制处理范围 +4. **PDF 标题**:PDF 是版面描述格式,默认不含语义化标题;需要标题层级时使用 `--high-res` +5. **禁止自动安装**:降级到直接 Python 执行时,仅向用户提示安装依赖,不得自动执行 pip install + +## 依赖执行策略 + +### 必须使用 lyxy-runner-python + +如果环境中存在 lyxy-runner-python skill,**必须**使用它来执行 parser.py 脚本: +- lyxy-runner-python 使用 uv 管理依赖,自动安装所需的第三方库 +- 环境隔离,不污染系统 Python +- 跨平台兼容(Windows/macOS/Linux) + +### 降级到直接执行 + +**仅当** lyxy-runner-python skill 不存在时,才降级到直接 Python 执行: +- 需要用户手动安装依赖 +- DOCX/PPTX/XLSX 无需依赖也可通过 XML 原生解析工作 +- PDF 至少需要安装 pypdf +- **禁止自动执行 pip install**,仅向用户提示安装建议 + +## 不适用场景 + +- 需要提取图片内容(仅支持纯文本) +- 需要保留复杂的格式信息(字体、颜色、布局) +- 需要编辑或修改文档 +- 需要处理 .doc、.xls、.ppt 等旧格式 diff --git a/skills/lyxy-reader-office/references/examples.md b/skills/lyxy-reader-office/references/examples.md new file mode 100644 index 0000000..3c894f8 --- /dev/null +++ b/skills/lyxy-reader-office/references/examples.md @@ -0,0 +1,55 @@ +# 示例 + +## 提取完整文档内容 + +```bash +# DOCX +uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py /path/to/report.docx + +# PPTX +uv run --with "markitdown[pptx]" skills/lyxy-reader-office/scripts/parser.py /path/to/slides.pptx + +# XLSX +uv run --with "markitdown[xlsx]" skills/lyxy-reader-office/scripts/parser.py /path/to/data.xlsx + +# PDF +uv run --with "markitdown[pdf]" --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/doc.pdf +``` + +## 获取文档字数 + +```bash +uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -c /path/to/report.docx +``` + +## 提取所有标题 + +```bash +uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -t /path/to/report.docx +``` + +## 提取指定章节 + +```bash +uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -tc "第一章" /path/to/report.docx +``` + +## 搜索关键词 + +```bash +uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py -s "关键词" -n 3 /path/to/report.docx +``` + +## PDF OCR 高精度解析 + +```bash +uv run --with docling --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/scanned.pdf --high-res +``` + +## 降级到直接 Python 执行 + +仅当 lyxy-runner-python skill 不存在时使用: + +```bash +python3 skills/lyxy-reader-office/scripts/parser.py /path/to/file.docx +``` diff --git a/skills/lyxy-reader-office/references/parsers.md b/skills/lyxy-reader-office/references/parsers.md new file mode 100644 index 0000000..514f9c1 --- /dev/null +++ b/skills/lyxy-reader-office/references/parsers.md @@ -0,0 +1,58 @@ +# 解析器说明和依赖安装 + +## 多策略解析降级 + +每种文件格式配备多个解析器,按优先级依次尝试,前一个失败自动回退到下一个。 + +详细的解析器优先级和对比请查阅 `scripts/README.md`。 + +## 依赖安装 + +### 使用 uv(推荐) + +```bash +# DOCX - 推荐依赖 +uv run --with "markitdown[docx]" skills/lyxy-reader-office/scripts/parser.py /path/to/file.docx + +# PPTX - 推荐依赖 +uv run --with "markitdown[pptx]" skills/lyxy-reader-office/scripts/parser.py /path/to/file.pptx + +# XLSX - 推荐依赖 +uv run --with "markitdown[xlsx]" skills/lyxy-reader-office/scripts/parser.py /path/to/file.xlsx + +# PDF - 推荐依赖 +uv run --with "markitdown[pdf]" --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/file.pdf + +# PDF OCR 高精度模式 +uv run --with docling --with pypdf skills/lyxy-reader-office/scripts/parser.py /path/to/file.pdf --high-res +``` + +> **注意**:以上为最小推荐依赖,更多解析器依赖和完整安装命令请查阅 `scripts/README.md` 的安装部分。 + +## 各格式输出特点 + +- **DOCX**:标准 Markdown 文档结构 +- **PPTX**:每张幻灯片以 `## Slide N` 为标题,幻灯片之间以 `---` 分隔 +- **XLSX**:以 `## SheetName` 区分工作表,数据以 Markdown 表格呈现 +- **PDF**:纯文本流,使用 `--high-res` 可启用 OCR 版面分析识别标题 + +## 能力说明 + +### 1. 全文转换为 Markdown +将完整文档解析为 Markdown 格式,移除图片但保留文本格式(标题、列表、表格、粗体、斜体等)。 + +### 2. 获取文档元信息 +- 字数统计(`-c` 参数) +- 行数统计(`-l` 参数) + +### 3. 标题列表提取 +提取文档中所有 1-6 级标题(`-t` 参数),按原始层级关系返回。 + +### 4. 指定章节内容提取 +根据标题名称提取特定章节的完整内容(`-tc` 参数),包含上级标题链和所有下级内容。 + +### 5. 正则表达式搜索 +在文档中搜索关键词或模式(`-s` 参数),支持自定义上下文行数(`-n` 参数,默认 2 行)。 + +### 6. PDF OCR 高精度模式 +对 PDF 文件启用 OCR 版面分析(`--high-res` 参数),适用于扫描版 PDF 或需要识别标题层级的场景。 diff --git a/skills/lyxy-runner-js/SKILL.md b/skills/lyxy-runner-js/SKILL.md index f3e2437..85806c1 100644 --- a/skills/lyxy-runner-js/SKILL.md +++ b/skills/lyxy-runner-js/SKILL.md @@ -8,319 +8,69 @@ compatibility: Requires Bun runtime (https://bun.sh) 基于 Bun 的 JavaScript/TypeScript 执行技能,提供隔离的脚本执行和自动依赖管理。 -## 快速参考 +## Purpose -根据您的需求选择使用方式: +**必需依赖**: 此 skill 需要 Bun 运行时,不兼容其他 JavaScript 运行时。 -| 场景 | 描述 | 命令 | -| --------- | ------------------------ | ---------------------------------- | -| **场景1** | 直接执行已存在的脚本文件 | `bun ` | -| **场景2** | 在指定路径创建脚本并执行 | 使用 Write 工具创建 → `bun ` | -| **场景3** | 使用临时路径执行(默认) | 生成临时路径 → `bun ` | +Bun 特性: +- 自动检测和下载依赖(无需 package.json) +- 即时转译 TypeScript +- 跨平台兼容(Windows/macOS/Linux) -**重要提示:** 所有场景在执行脚本前都必须先检查 Bun 环境:`bun --version` +**重要**: 如果 Bun 未安装,立即停止任务并引导用户安装。禁止使用 nodejs、npm、yarn、pnpm 等替代工具。 -## 前置条件 +## When to Use -### 安装 Bun +任何 JavaScript/TypeScript 处理任务都应使用此 skill。 -lyxy-runner-js 需要安装 Bun。Bun 是一个快速的 JavaScript 运行时,内置包管理器。 +### 典型场景 +- **数据处理**: JSON/CSV 解析、数据转换 +- **API 交互**: HTTP 请求、Web API 调用 +- **文件操作**: 文件读写、批量处理 +- **脚本自动化**: 构建脚本、任务自动化 -**macOS/Linux:** +### 不适用场景 +- ✗ 需要 Node.js 特定 API(如部分原生模块) +- ✗ 需要持久化进程(如服务器) + +## Quick Reference + +| 场景 | 描述 | 命令 | +|------|------|------| +| 场景1 | 直接执行已存在的脚本 | `bun ` | +| 场景2 | 在指定路径创建脚本并执行 | 使用 Write 工具创建 → `bun ` | +| 场景3 | 使用临时路径执行(默认) | 生成临时路径 → `bun ` | + +**重要**: 所有场景执行前必须先检查 Bun 环境:`bun --version` + +## Workflow + +1. **检查 Bun 环境**:执行 `bun --version`,失败则停止并提示安装 +2. **选择执行场景**:根据用户意图选择场景1/2/3 +3. **执行脚本**:使用 `bun