1
0
Files
Skill/openspec/specs/kb-document-ingestion/spec.md

4.3 KiB
Raw Blame History

ADDED Requirements

Requirement: 扫描并识别待处理文件

系统 SHALL 扫描项目 sources/ 目录下的所有文件,并根据扩展名判断解析方式:

  • Office 文档(.docx、.pdf、.pptx、.xlsx调用 lyxy-reader-office skill 解析
  • 其他文件(.md、.txt、.csv、.json、.xml、.yaml、.yml、.log、.html 等):直接读取内容

Scenario: sources 中有 office 文档

  • WHEN sources/ 中存在 报告.docx
  • THEN 系统 SHALL 使用 lyxy-reader-office skill通过 lyxy-runner-python 执行)将其解析为 markdown

Scenario: sources 中有纯文本文件

  • WHEN sources/ 中存在 config.json
  • THEN 系统 SHALL 直接读取文件内容作为 parsed 产物

Scenario: sources 目录为空

  • WHEN sources/ 中没有任何文件
  • THEN 系统 SHALL 提示用户 sources/ 中无待处理文件

Requirement: 同名不同扩展名冲突检测

系统 SHALL 在解析前检测 sources/ 中是否存在同名但不同扩展名的文件(如 技术方案.pdf技术方案.docx),因为 parsed 产物都会命名为相同的 .md 文件。同时也需检测 sources/ 中的文件名是否与 manifest.json 中已有记录的不同扩展名文件冲突。

Scenario: sources 中存在同名不同扩展名文件

  • WHEN sources/ 中同时存在 技术方案.pdf技术方案.docx
  • THEN 系统 SHALL 拒绝处理这两个文件,并提示用户重命名其中一个以消除冲突

Scenario: sources 中文件与已入库文件同名但不同扩展名

  • WHEN manifest.json 中已有 技术方案ext: .pdf)的记录,且 sources/ 中出现 技术方案.docx
  • THEN 系统 SHALL 拒绝处理该文件,并提示用户重命名

Requirement: 生成 parsed markdown 文件

系统 SHALL 将解析后的内容写入 parsed/<文件名>.md,文件头部 MUST 包含元信息注释:

<!-- source: <原始文件名含扩展名> -->
<!-- archived: archive/<文件名_时间戳>.<扩展名> -->
<!-- parsed_at: <解析时间 YYYY-MM-DD HH:mm> -->

若 parsed/ 中已存在同名文件同一文档的更新版本SHALL 覆盖旧文件。

Scenario: 首次解析文件

  • WHEN 解析 需求文档.docxparsed/ 中不存在 需求文档.md
  • THEN 系统创建 parsed/需求文档.md,头部包含 source、archived、parsed_at 元信息,正文为解析后的 markdown 内容

Scenario: 更新已有文件

  • WHEN 解析 技术方案.pdfparsed/ 中已存在 技术方案.md(上一版本)
  • THEN 系统覆盖 parsed/技术方案.md,元信息更新为最新版本的 archive 路径和时间

Requirement: 归档原始文件

系统 SHALL 将已解析的原始文件从 sources/ 移动到 archive/,文件名格式为 <文件名_YYYYMMDDHHmm>.<扩展名>。每个进入 archive 的文件都 MUST 带有时间戳后缀,即使该文件只有一个版本。

Scenario: 归档文件

  • WHEN 需求文档.docx 解析完成,当前时间为 2026-02-18 16:00
  • THEN 原始文件移动为 archive/需求文档_202602181600.docx

Scenario: 同名文件多次入库

  • WHEN 技术方案.pdf 第二次入库archive 中已有 技术方案_202602181600.pdf
  • THEN 新版本归档为 技术方案_202602181725.pdf(以当前时间为时间戳),两个版本并存于 archive

Requirement: 更新 manifest.json

系统 SHALL 在每个文件处理完成后更新 manifest.json

  • 新文件:在 files 数组中追加新条目,包含 name、ext、parsed 路径versions 数组包含首个版本的 archived 路径、hash 和 ingested_at
  • 已有文件更新:在对应条目的 versions 数组中追加新版本记录
  • last_ingest 时间戳 SHALL 更新为当前 ingest 的时间

Scenario: 新文件入库更新 manifest

  • WHEN 需求文档.docx 首次解析完成
  • THEN manifest.json 的 files 数组中追加 {"name": "需求文档", "ext": ".docx", "parsed": "parsed/需求文档.md", "versions": [{"archived": "archive/需求文档_202602181600.docx", "hash": "sha256:...", "ingested_at": "2026-02-18T16:00"}]}

Scenario: 已有文件更新 manifest

  • WHEN 技术方案.pdf 第二次入库
  • THEN manifest.json 中该文件条目的 versions 数组追加新版本记录,不删除旧版本记录