Skip to content

[Bug]: 自动折叠单子目录链导致源码结构丢失、Token浪费及用户体验问题 #1713

@walnut-tom

Description

@walnut-tom

Bug Description

OpenViking 在通过 ov add-resource 索引本地目录时,默认会自动折叠单子目录链(当父目录仅包含一个子目录时,跳过中间层级)。这一行为对 Java Maven/Gradle 项目的多级包结构(如 com/fasterxml/jackson/datatype/jsr310/)造成严重影响:

  1. 结构丢失:真实的多级包路径被压缩,用户无法通过 ov ls/tree 看到完整源码层级;
  2. Token 浪费:后续修改目录结构(如加文件触发重索引)时,旧 URI 的索引内容不会自动清理,导致同一文件被重复索引;
  3. 用户困惑:折叠过程无提示/警告,用户不知道目录结构被修改;CLI 无关闭折叠的选项,被迫使用 .keep 占位文件等 workaround。

Steps to Reproduce

  1. 准备标准 Java 包结构目录:
    src/main/java/
      com/                  ← 仅含 fasterxml/
        fasterxml/          ← 仅含 jackson/
          jackson/          ← 仅含 datatype/
            datatype/       ← 仅含 jsr310/
              jsr310/
                Test.java  ← 实际文件
    
  2. 执行索引命令:
    ov add-resource src/main/java --to viking://resources/java --timeout 300
  3. 查看索引后的目录结构:
    ov tree viking://resources/java/ -L 5
  4. src/main/java/com/ 下新增一个文件 README.md,触发重索引:
    touch src/main/java/com/README.md
    ov add-resource src/main/java --to viking://resources/java --timeout 300
  5. 再次查看结构并检查是否存在重复索引。

Expected Behavior

  1. 保留完整层级:即使目录链每层仅含单个子目录,也应保留原始路径结构(尤其对 src/java/ 等源码目录应智能识别);
  2. 重索引清理:重索引时自动清理旧 URI 的冗余内容,避免同一文件多份索引;
  3. 用户友好
    • 折叠时输出警告日志(如 折叠目录: src/main/java/com/);
    • 提供 CLI 参数(如 --no-collapse)关闭自动折叠;
  4. 源码适配:对常见源码结构(Maven/Gradle 的 src/main/java/、前端 src/ 等)默认保留层级。

Actual Behavior

  1. 结构折叠:步骤3中 ov tree 输出类似:
    viking://resources/java/
      Test.java  ← 实际路径是 com/fasterxml/jackson/datatype/jsr310/Test.java
    
    真实包结构完全丢失。
  2. 重复索引:步骤5重索引后,旧 URI(viking://resources/java/Test.java)和新 URI(viking://resources/java/com/README.md 及新结构)共存,导致 Token 浪费。
  3. 无提示/无开关:全程无日志说明目录被折叠;CLI 无 --no-collapse 等参数,用户只能手动在每层加 .keep 或调整目录结构。

Minimal Reproducible Example

- 每层单子目录加 `.keep` 占位文件- 直接索引最深层目录 `ov add-resource src/main/java/com/fasterxml/jackson/datatype/jsr310 --to viking://resources/java/...`);
- 重索引前手动 `ov rm` 旧目录

Error Logs

OpenViking Version

0.3.10

Python Version

3.12.13

Operating System

Linux

Model Backend

None

Additional Context

Workarounds (Current)

  • 每层单子目录加 .keep 占位文件;

  • 直接索引最深层目录(如 ov add-resource src/main/java/com/fasterxml/jackson/datatype/jsr310 --to viking://resources/java/...);

  • 重索引前手动 ov rm 旧目录。

  • 该问题对所有天然多级单子目录链的场景(如 Java 包、前端 src/components/ui/...)都适用;

  • 用户反馈:把结构困惑留给用户,不符合开发者工具易用性原则;

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

Status

Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions