Github-Repo-Scan

GitHub 仓库扫描总览(Github-Repo-Scan)

把 GitHub 账号名下所有仓库的情况(CI / 许可证 / Release / Issue / 分支 / Star·Fork / 健康分 / 可选 14 天流量)拉成本地总览面板,每个单元格都带 GitHub 跳转链接。

远程仓库:https://github.com/ReSerendipity/Github-Repo-Scan

三种用法

方式 命令 说明
双击启动(推荐) 启动面板.bat 双击即启动本地服务并自动打开浏览器
交互面板 node server.mjs 同上,命令行方式启动;支持 --port 换端口
远程+本地对照 node scan.mjs [owner] 扫远程账号并对照本机 Git 仓库,重新生成 dashboard.html + scan-data.json
仅本地扫描 node scan.mjs --local-only 只扫本机 Git 仓库(不访问 GitHub),并入现有快照
本地范围/深度 node scan.mjs --local-paths "a;b" --depth 5 临时指定本地扫描根目录(分号分隔)与深度
仅远程 node scan.mjs --remote-only 跳过本地对照
仅重渲染 node scan.mjs --render-only 不重新扫描,按现有快照重渲染面板(改样式/主题后用)
启动前自动扫描 node server.mjs --scan-on-start=always 启动时若需扫描,会先开页面(用现有快照)再在后台扫描,不阻塞打开;模式 always/stale/first/off(--scan-on-start off 与 --scan-on-start=off 两种写法皆可),默认 stale(快照比 autoScanMaxAgeHours 旧才扫),由 scan-config.json 的 autoScanOnStart 控制;面板「启动前扫描」开关可联动切换 always/off。附加 --no-open 可禁止自动打开浏览器

指定账号:默认扫当前 gh 登录账号;node scan.mjs someUser 可扫指定账号。

页面功能

功能 实现
扫描更新 页面右上角「重新扫描」→ 本地服务 → gh CLI → GitHub API;完成后表格原地刷新,同时把 dashboard.html 与 scan-data.json 写回磁盘
自动刷新 工具栏可选每 10 / 30 / 60 分钟自动扫描一次,选择会记住
明暗切换 右上角主题按钮(默认浅色;GitHub 亮 / 暗两套配色),切换后选择记忆在浏览器 localStorage
排序 全部表头可点击:仓库 / 健康 / CI 状态 / 许可证 / Release / Issue / 远程分支 / 本地分支 / Star / Fork / 语言 / 流量 / 最近推送;再点一次切换升降序,空值恒沉底,排序选择会记住
健康评分 每仓 0-100 分:CI 40 + 新鲜度 30 + Issue 卫生 15 + 发布节奏 15(归档仓打七折),A/B/C/D 四档,悬停看构成
自定义视图 「+存视图」把当前搜索/筛选/排序存成命名视图,下拉一键切换,保存在浏览器 localStorage
流量(14天) 设环境变量 SCAN_WITH_TRAFFIC=1 后重新扫描,展示近 14 天浏览量与克隆数(每仓多 2 次 API 调用,需 push 权限)
筛选与搜索 按仓库名/描述搜索、按语言筛选、按状态筛选(CI 通过/失败/运行中/无 CI/有 Issue/未声明许可证)、一键隐藏 fork
CI 趋势 每仓展示最近 5 次 Actions 运行的点阵(绿=通过、红=失败、黄=运行中),悬停看时间与结论
本地对照 每仓显示本机是否有对应 Git 仓库(本地有 / 本地缺失),主表「本地分支」列与「本地」列带本地/远程分支标注、脏状态、领先落后;支持按本地状态筛选与排序
仅本地视图 「仅扫本地」只读本机 .git;「仅本地仓库」模式列出全部本机仓库(含远程账号名下没有的),「本地目录…」设置扫描范围
API 配额 页脚实时显示 GitHub API 剩余额度与重置时间
CI/CD 状态 最近一次 GitHub Actions 运行:通过 / 失败 / 运行中 + 工作流名与触发分支,点击直达该次运行页
许可证类型 SPDX 标识(MIT、Apache-2.0 等),点击直达 LICENSE 文件页
CLI 形态 每仓三态:CLI(有正式命令行入口:manifest bin/entry_points 或 cli 命名入口文件)/ 脚本集(scripts·tools 目录承载命令行脚本但无统一入口)/ 无;本地有克隆的仓按本地代码检测,远程-only 仓走文件树 + 清单(pushedAt 未变复用快照);悬停看判定依据;gradlew、vitepress build 之类构建工具链不算仓库自有 CLI
Release 最新发布 tag + 名称 + 时间,点击直达 release 页
Issue 开放 issue 数(不含 PR),点击直达 issues 页;开放 PR 数单独列出并链接
分支 主表「远程分支」列(GitHub 默认分支名 + 分支总数,带「远程」标签)与「本地分支」列(本机检出分支 + 其远程跟踪分支,带「本地/远程」标签)相邻展示,一眼区分远程与本地;悬停可查看全部远程分支 / 全部本地分支 / 全部远程跟踪分支名单(超 50 个截断并显示总数);过长分支名单行省略号截断、悬停查看全名;点击直达 branches 页
仓库信息 star / fork / 主语言 / 描述 / 可见性 / 最近推送,均链接到对应 GitHub 页面
可见性排序/筛选 「可见性」列可点表头按公开/私有排序(私有优先);状态筛选下拉含「仅公开 / 仅私有」;顶部指标卡显示公开/私有数量
仓库大小 「大小」列显示 GitHub 磁盘占用(自动 KB/MB/GB 换算),可点表头排序;顶部指标卡显示总大小
最近变更文件 「最近变更」列显示最近一次提交变更的文件数,点「N 文件」就地展开文件清单(A 增 / M 改 / D 删,带 +− 行数,链接到提交页)
导出 CSV 右上角「导出 CSV」把当前筛选/排序结果导出为 UTF-8(带 BOM)CSV,Excel 可直接打开
隐藏归档 工具栏「隐藏归档」复选框一键隐藏 archived 仓库
低健康分筛选 状态筛选「仅低健康分(<50)」快速定位问题仓库
启动前自动扫描 面板「启动前扫描」开关 + scan-config.json 的 autoScanOnStart(always/stale/first/off),双击启动面板可先自动扫描再打开
只扫本账户 面板「只扫本账户」开关(默认开启)+ scan-config.json 的 localOwnerOnly;开启后本地对照只保留当前 gh 登录账号名下的仓库,第三方克隆与纯本地仓被忽略
创建时间排序 「创建时间」列可点表头按仓库创建时间排序
语言分布 顶部「语言分布」面板按仓库数 Top 8 展示各语言占比条(颜色取自 GitHub 语言色)
聚合视图 顶部「聚合视图」面板一键列出 CI 失败 / 低健康分(<50) / 未声明许可证 / 无 CI 记录 / 本地缺失 的数量,点 chip 直接套用对应筛选
复制 clone 右上角「复制 clone」把当前可见仓库的 git clone <url> 命令批量复制到剪贴板(Excel/终端可直接粘贴)
仅归档筛选 状态筛选含「仅归档仓库」;聚合视图面板单独列出归档仓库数量,点 chip 一键筛选
Star 排行榜 顶部「排行 Top5」面板按 Star 数从高到低展示仓库名与占比条;点面板内 Star/Fork/Issue/健康分 按钮可切换排行指标(点击仓库名直达 GitHub)
归档仓库分区 顶部「归档仓库」独立分区汇总列出全部 archived 仓库(含健康分档),不参与活跃度评比;状态筛选另有「仅归档仓库」可一键只看归档
聚合视图可折叠 顶部「聚合视图」容器(指标卡 + 聚合 chip + 语言分布 + 排行 + 归档分区)可一键折叠/展开,折叠偏好记入浏览器 localStorage,下次打开自动记住
Star 周增长趋势 表格中该列已改为「本地分支」;近 7 天 Star 增量仍在顶部指标卡「本周新增★」与 Star 排行榜 Top5「+N/周」展示(基于 scan-data-history.json 按天累积,红涨绿跌遵循 A 股惯例,需 ≥6 天历史,否则显示「—」不编造数据);导出 CSV 仍含「近7天★」列
先探测再扫描(增量) 「重新扫描」默认先拉一次仓库列表(1–2 次 GraphQL)与上次快照逐仓比对;未变的仓库直接复用上次明细(许可证 / CI / 提交 / 流量),不发任何额外请求 —— 无变更时秒级返回。元信息显示「本次:无变更·复用快照 / 增量扫描 N/M / 强制全量 · 用时」。按住 Shift 点「重新扫描」= 强制全量扫描
启动不阻塞 + 自动刷新 启动时若触发自动扫描,服务先开页面(现有快照)再后台扫描;页面每 3 秒轮询 /api/status,扫描完成后自动刷新,无需手工等待或刷新页面
魔搭魔粒余额 顶部「魔搭魔粒」条展示 ModelScope(魔搭社区)魔粒余额(可用 / 总 / 冻结),点击「刷新」走 GET /openapi/v1/magicubes/balance 实时拉取;打开页面只读本地缓存(瞬开、不刷网络)。认证优先 MODELSCOPE_API_TOKEN 环境变数,其次 scan-config.json 的 modelscopeToken,兜底复用本机 modelscope login 登录态(零配置)

本地 Git 仓库扫描(对照 + 独立)

性能与增量

依赖说明(是否依赖 gh CLI)

前置:Node ≥ 18(CI 在 Node 22 上验证,见 .github/workflows/release.yml);扫描功能需要 gh CLI 已登录(gh auth login)。

文件

快照入库策略:scan-data.json / dashboard.html / all_repos_report.txt / scan_run*.txt 为生成物快照,按约定随主分支入库以保留每次扫描的可回溯性(接受大 diff);快照刷新与代码变更分批提交。决策细节见 docs/adr/0003-snapshot-committing.md。路径脱敏(对应评估报告 R2 P1-3):入库快照中的本地路径已相对化为 ~/…(不含本机用户目录名),页面点击「打开文件夹」由本地服务展开还原并校验路径在扫描根目录内。

测试

node --test

本地门禁:新克隆需要各激活一次

下面三道落地前闸门不会随克隆自动生效——未激活时它们惰性存在,改动只能等 push 之后的 CI 兜底。

闸门 作用 激活命令 自查命令
hooks/pre-push 推送前跑 node --test,失败即阻断 cp hooks/pre-push .git/hooks/pre-push diff hooks/pre-push .git/hooks/pre-push(无输出即未分叉)
.pre-commit-config.yaml(gitleaks) 提交前扫密钥 pre-commit install pre-commit run gitleaks-system --all-files
.qoder/settings.json(编码 agent 编辑后闸门) 核心模块被编辑即跑 node --test cp hooks/qoder-settings.example.json .qoder/settings.json 向 node hooks/post-edit-validate.mjs 送一条 tool_input.file_path 指向 scan-core.mjs 的 JSON 事件,全绿时应回报 ✓ …(N 项)

.qoder/ 不入库,所以脚本本体(hooks/post-edit-validate.mjs)虽随仓库分发,却没有调用方;hooks/qoder-settings.example.json 就是那份可复制的调用方注册,内容与本机生效注册逐字一致。已有 .qoder/settings.json 的话,把 hooks.PostToolUse 这一段并进去即可,别整体覆盖。

hooks/pre-push 是版本库内的唯一来源,复制到 .git/hooks/ 后生效。两份一旦分叉,实际执行的是 .git/hooks/ 那一份,版本库里的改动不会生效——上面那条 diff 就是用来发现这件事的(本仓曾真的分叉过一行注释)。

未采用 git config core.hooksPath hooks 这种更省事的接法:它会让 git 不再看 .git/hooks/pre-commit,等于顺手关掉 gitleaks 密钥门(hooks/ 目录里没有 pre-commit 入口)。

覆盖:CI 状态映射、相对时间分档、时区格式化、fmtSize 大小换算、computeStarWeek 周增长(含历史不足 / 无历史)、repoUnchanged 变更探测、面板渲染(内嵌数据转义 / XSS 注入防护 / 默认主题 / 配额展示)。

维护者须知:客户端脚本专项守卫与「提交前必须运行 node --test」的开发纪律说明写在维护者对内文档 docs/README.internal.md 里——该文件按约定不入库,克隆里取不到;可机检的等价约束见上表「本地门禁」与 .github/workflows/test.yml。

数据口径