Skip to content

feat(repo): repo scan 分类 registry (v2) —— 三分层 references 归组、others 兜底、list/clone 兼容 - #32

Merged
qdriven merged 5 commits into
mainfrom
repo-scan-categorized
Nov 12, 2026
Merged

qdriven merged 5 commits into
mainfrom
repo-scan-categorized

Conversation

@qdriven

@qdriven qdriven commented Nov 12, 2026

Copy link
Copy Markdown
Contributor

修改原因(背景)

references/ 参考仓已改为三分层结构(skills/products/plugins → 子分类 → 项目),旧的扁平 projects: [name/repo/path] 格式无法表达 category/subcategory 层级,spark repo scan 也不识别该结构:分类目录会被误当成项目、根级仓会被误当分类、list 无法分组展示。需要 registry 升级为分类格式(v2),并保持对旧两层格式的向后兼容。

改动内容

  • internal/registry(v2):version: 2 + categories[{name, subcategories[{name, projects[]}]}];Categorize() 归组规则——一级子目录=分类(跳过含 .git 的目录避免把项目误当分类/子分类)、others 桶恒存在且排最后(无子分类项目归入)、根级仓库打印 WARNING 不入册、无一级分类目录时自动回退旧扁平格式;Read 为旧调用者派生扁平 Projects,Write/WriteJSON 双 wire,FindByName 走 AllProjects。
  • cmd/repo:scan 归组打印 + 根级 WARNING + 回退 NOTE;list 输出 # cat / sub (n) 分组头(行格式不变);clone 按 path 深度从浅到深(先父项目再其内部嵌套仓);--flatten/help/docs 标注仅适用旧两层布局(三分层下 flatten 会把 skills/agent/repo 错移到 skills/repo)。
  • 包含 --json / --flatten(原 26-repo-scan-flatten-json):分类功能构建在 WriteJSON 之上,分支基于该分支开发,一并合入。
  • 文档同步:docs/zh/usage/repo.md、docs/en/usage/repo.md、AGENTS.md、docs/{zh,en}/Agents.md、CHANGELOG.md。

测试

  • go vet ./... 通过;go test ./... = 328 passed / 2 failed,2 个失败均为本机环境既有问题、与本次改动无关:
    • cmd/magic/flush_dns_test.go:54 flushDNS 需要提权;
    • internal/skill/skill_test.go:39 期望 builtin skill len=1,本机实际扫到 58 个(HOME 桩不覆盖 USERPROFILE/内置包路径)。
  • 新增 internal/registry/category_test.go(归组/others 兜底/嵌套 path 序/v2 YAML+JSON 形状/legacy 兼容/根级仓不成为分类)。
  • 装机冒烟:合并后本地构建安装,spark repo list -f registry_references.yaml 正确解析 v2 并分组输出(skills/dev-tool (22) … skills/others (0) 收尾)。
  • 真实数据验证:37 仓(17 顶层 + 20 嵌套)扫描幂等,registry v2 随 references/** 变更由 pre-commit 钩子自动更新入库。

- --json writes a formatted registry_<folder>.json alongside the YAML
- --flatten moves repositories nested deeper than two levels (category/repo)
  up into the two-level layout before scanning; conflicts are skipped with
  a warning and never overwritten, empty intermediate dirs are removed

Refs: #26
…ategory/others

spark repo scan 扫描三分层目录 <分类>/<子分类>/<项目> 时输出分类格式:

- internal/registry: 新增 Subcategory / Category / Registry.Version(=2) 与
  Categorize()——分类取一级子目录(git 仓目录不会被误当分类/子分类);
  无子分类的项目归 others 且每个分类恒有 others 桶;根级仓库跳过并告警;
  无一级分类目录的目录回退旧扁平格式。Read 为旧调用者派生扁平视图,
  Write / WriteJSON 按格式分别序列化,FindByName 走 AllProjects
- cmd/repo/scan: 合并后归组入库,按 分类/子分类 分组打印;全部项目都没有
  分类时写旧扁平 registry 并打印提示;--json 同步输出 v2
- cmd/repo/list: 分类格式打印 `# cat / sub (n)` 分组头(行格式 name/repo/path 不变)
- cmd/repo/clone: 按 path 深度从浅到深克隆(先父项目,再其内部嵌套仓)
- 测试: internal/registry 新增 Categorize / v2 往返 / JSON / 旧格式兼容用例,
  该包全过;docs zh+en/usage/repo、AGENTS.md、CHANGELOG 同步
- --flatten 保持旧两层语义,help 与 docs 明确标注禁止用于三分层分类树

验证:go vet ./... 通过;go test ./... 中 internal/registry、cmd/repo 全过
(整仓 328 passed / 2 failed 均为本机环境相关既有失败:flushDNS 需要提权;
skill.Discover 扫到本机 builtin_skills 得到 58 个技能,与用例 len=1 的环境假设
冲突)。新二进制已安装 ~/.local/bin,并在 skills 仓真实扫出 37 仓的 v2 registry。
# Conflicts:
#	docs/en/Agents.md
#	docs/zh/Agents.md
@qdriven
qdriven merged commit aed20e4 into main Nov 12, 2026
@qdriven
qdriven deleted the repo-scan-categorized branch November 12, 2026 09: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.

1 participant