Skip to content

feat: search 结果与 add 建议显示包的可用版本(默认最新 3 个,--all-versions 全量) - #488

Open
wellwei wants to merge 1 commit into
mcpp-community:mainfrom
wellwei:feat/add-search-show-versions
Open

feat: search 结果与 add 建议显示包的可用版本(默认最新 3 个,--all-versions 全量)#488
wellwei wants to merge 1 commit into
mcpp-community:mainfrom
wellwei:feat/add-search-show-versions

Conversation

@wellwei

@wellwei wellwei commented Aug 22, 2026

Copy link
Copy Markdown
Member

Summary

Closes #487,补上 #324 遗留的「建议不带版本」半边。

mcpp search <keyword>:命中行追加该包描述符 per-OS 版本表的并集——semver 降序、按键去重,默认显示最新 3 个并以 , ... 标记截断;--all-versions 显示全部。描述符不可读或未发布任何版本的包保持原两列输出,富化是尽力而为的展示,不是新的失败路径。

$ mcpp search imgui
  compat:imgui      Dear ImGui immediate-mode GUI library core sources       (1.92.8, 1.92.8-docking)
  mcpplibs:imgui    C++23 module package for Dear ImGui core and GLFW/OpenGL3 backends  (0.0.6, 0.0.5, 0.0.4)
  ocornut:imgui     Dear ImGui 1.92.8 core and GLFW/OpenGL3 backend modules for mcpp (import imgui.core;)  (1.92.8)

$ mcpp search imgui --all-versions   # mcpplibs:imgui → (0.0.6, 0.0.5, 0.0.4, 0.0.3, 0.0.2, 0.0.1)

mcpp add ns.name@ver 未命中时:跨命名空间建议从裸 FQN 升级为带版本:

  a package with this name exists under another namespace:
    compat.eui-neo (0.5.6, 0.5.5, 0.5.3)

数据是白捡的:did-you-mean 扫描本就要打开每个候选 .lua 读身份(#278),版本只是同一段文本的再一次遍历。build 失败路径的同款提示同步升级,两条路径不说两套话。warn_unpublished_version 的 warn-not-fail 策略不动。

实现

Test plan

  • 单测 95 通过 0 失败(新增:merge 排序 8 例含预发布/四段/不可解析键;扫描携带版本 3 例;versions_for_hit 3 例)
  • tests/e2e/162_bare_name_namespace_scope.sh 扩展并全绿:build 路径断言 acme.widget (1.0.0)、add 路径断言 compat.gadget (2.0.0),且被拒的 add 不写 manifest
  • 相邻 E2E 用 fresh 二进制通过:12_add_command.sh93_xpkg_parse.sh
  • 真机实测:mcpp search imgui [--all-versions]mcpp add mcpplibs.eui-neo@1.0.0 输出符合上述契约

`mcpp search` 的命中行追加描述符 per-OS 版本表的并集:semver 降序、按键去重,
默认显示最新 3 个并以 ", ..." 标记截断,--all-versions 显示全部;描述符不可读
或未发布版本的包保持原两列输出——富化是尽力而为的展示,不是新的失败路径。

`mcpp add` 未命中时的跨命名空间建议从裸 FQN 升级为带版本:
compat.eui-neo (0.5.6, 0.5.5, 0.5.3)。数据是白捡的:did-you-mean 扫描本就要
打开每个候选 .lua 读身份(mcpp-community#278),版本只是同一段文本的再一次遍历。build 失败
路径的同款提示同步升级,两条路径不说两套话。

实现:

- manifest 新增 merge_xpkg_versions_desc:per-OS 键列表的并集视图。排序用
  version_req 的 SemVer 解析;不可解析的键保留原文排在最后(mcpp-community#363 的教训:
  任意的索引键无法从解析形态复原);等值异写("1.0"/"1.0.0")保持首见序。
- mcpp-community#278 的扫描由 scan_fqns_with_short_name 改为 scan_short_name_matches,
  携带 fqn + versions;三条约束不变(只在已失败路径调用、结果只进错误文本/
  展示、空结果不是错误),版本列表受同一纪律约束——描述存在性,不做解析输入。
- cross_namespace_matches 更名 cross_namespace_suggestions 返回富记录;
  prepare.cppm 与 commands.cppm 两个调用点同步渲染。
- Fetcher 新增 versions_for_hit:search 命中的 ns:name → 描述符 → 版本并集;
  无 ns 前缀或读不到描述符时返回空。
- search_packages 增加 --all-versions;cli 注册选项。

测试:merge 排序 8 例(含预发布/四段/不可解析键)、扫描携带版本 3 例、
versions_for_hit 3 例;e2e 162 断言 build 与 add 两侧建议都带版本
(acme.widget (1.0.0) / compat.gadget (2.0.0)),且被拒的 add 不写 manifest。

Closes mcpp-community#487
Refs mcpp-community#324
@wellwei
wellwei requested review from Sunrisepeak, ZheFeng7110 and speak-agent and removed request for Sunrisepeak and speak-agent August 23, 2026 07:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add 建议与 search 结果显示包的可用版本(最新少数 + --all-versions)

1 participant