Ehsas317/people-helper

GitHub: Ehsas317/people-helper

扫描 GitHub 仓库,自动识别、评分并提取可独立运行的代码组件,生成结构化报告和包脚手架。

Stars: 0 | Forks: 0

# 人员 Helper [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Tests: 286](https://img.shields.io/badge/tests-286%20passing-brightgreen.svg)](#testing) People Helper 会读取你的 GitHub 仓库(始终为只读),识别出值得提取的独立组件,验证它们是否确实能独立运行,在 GitHub 上搜索类似项目,并生成一份包含评分、差异化分析和建议名称的结构化报告。使用 `--extract` 参数,它还可以将文件复制出来并生成包的基础脚手架(pyproject.toml、package.json、Cargo.toml、go.mod、README、LICENSE-REVIEW.md、SOURCE-LICENSE)。 ## 它的功能(与局限性) **功能:** - 发现你仓库中可提取的代码 - 验证其是否真正独立(相对导入、同级文件解析、缺失同级文件拦截) - 从 6 个维度(代码质量、实用性、独特性、相关性、可维护性、需求度)对候选对象进行评分 - 在 GitHub 上搜索类似项目,以评估需求和独特性 - 生成结构化的 Markdown 报告 - 使用 `--extract`:复制出文件,保留源版权声明,生成包的脚手架,将源 LICENSE 复制为 SOURCE-LICENSE,生成 LICENSE-REVIEW.md 引导你了解 5 种许可证情况 **局限性:** - 不会为你编写测试 - 不会自动调整导入(你需要审查并修复) - 不会发布到 PyPI/npm/crates.io - 无法很好地处理存在跨包依赖的 monorepo(单体仓库) - 不会自动分配许可证(你 MUST 进行审查并选择 — 参见 LICENSE-REVIEW.md) ## 快速开始 ``` pipx install people-helper export PEOPLE_HELPER_PAT=github_pat_your_token_here people-helper --repo your-username/your-repo ``` 或者从源码运行: ``` git clone https://github.com/Ehsas317/people-helper.git cd people-helper python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -e . people-helper --repo your-username/your-repo ``` ## 局限性 在使用前请注意以下几点: 1. **所有 13 种语言均支持圈复杂度计算。** Python 使用基于 AST 的复杂度计算(最准确)。其他语言使用基于正则表达式的复杂度计算(统计 if/for/while/case/catch/&&/||/? 的数量 —— 这是一种近似方法,但评分相对公平)。扇入(Fan-in)和导入循环检测仅支持 Python。 2. **大型仓库(>5万 个文件)可能会很慢。** 该工具会遍历每个文件。对于拥有 15万+ 个文件的仓库(如 gcc、Azure SDK),建议使用 `--language` 进行过滤。 3. **语言检测遵循 GitHub linguist 规则**(按代码行数统计)。像 numpy 这样的仓库会被识别为 C 语言(C 扩展代码比 Python 代码多),尽管它是一个“Python 库”。这是正确的行为,但可能会让你感到意外。 4. **`--extract` 功能生成的是一个起点,而不是一个完整的包。** 源码的版权头信息会被保留(这是大多数许可证的要求)。工具会生成一个 LICENSE-REVIEW.md 文件 —— 在发布前,你 MUST 确定正确的开源许可证。源仓库的 LICENSE 文件将被复制为 SOURCE-LICENSE 供参考。你仍然需要审查代码、调整导入、添加测试并验证编译。 5. **GitHub Search API 的速率限制**为**已验证身份的请求每分钟 30 次**(与未验证身份的请求相同)。Core API 的限制是每小时 5000 次,但 Search API 要低得多。对于大规模分析,请使用 `--no-network` 并单独运行搜索。当受到速率限制时,工具会返回中性的独特性得分(5.0),而不是具有误导性的“真正独特”得分 8.0。 ## 工作原理 ``` Your repo │ ▼ ┌────────────────┐ ┌────────────────────┐ ┌─────────────────────┐ │ Shallow clone │───▶│ Detect files │───▶│ Verify extraction │ │ (read-only) │ │ that pass │ │ • relative imports │ └────────────────┘ │ extractable │ │ • sibling resolve │ │ heuristics │ │ • license present │ └────────────────────┘ └──────────┬──────────┘ │ ┌────────────────────┐ ┌─────────────────────┐ │ │ Markdown report │◀───│ Score candidates │◀──────────┘ │ • 6 dimensions │ │ 6 dimensions, │ │ • Extraction type │ │ verified │ │ • License status │ │ standalone-ness │ │ • Starter code │ └─────────────────────┘ └────────────────────┘ ``` ## 核心问题:“它真的是独立的吗?” 大多数寻找“可提取”代码的工具只是检查启发式条件 —— 如文件大小、导入数量、是否有文档字符串。但是,一个文件可能通过了所有这些检查,但在你提取它的那一刻**仍然会报错**,因为它包含像 `from .utils import helper` 这样的相对导入。 People Helper 会**验证**独立性,而不是仅仅靠猜: | 信号 | 检查内容 | 重要性 | |---|---|---| | **相对导入** | `from . import X`, `from .X import Y`, `./utils`, `super::X` | 这些是结构性依赖 —— 没有同级文件,该文件实际上无法运行 | | **同级文件解析** | 引用的同级文件是否存在于仓库中? | 如果存在 → 需多文件提取。如果不存在 → 强制拦截(会产生损坏的代码) | | **许可证存在性** | 仓库根目录下是否有 LICENSE/COPYING/UNLICENSE 文件? | 没有许可证,提取在法律上等同于“保留所有权利” | 每个候选对象都会被标记上一个**提取类型**: - `✅ single` — 验证为独立,无相对导入,可直接按原样提取 - `⚠ multi` — 需要连同同级文件一起提取(在报告中列出) - `⛔ blocked` — 引用了缺失的同级文件,会产生损坏的代码(跳过) ## 评分 共六个维度,均基于完整的文件内容进行计算: | 维度 | 权重 | 衡量标准 | |---|---|---| | **代码质量** | 25% | 有测试 (+2.5),有文档 (+1.5),无内部导入 (+1.5),外部依赖少 (+1.5),已验证独立 (+1.0),实用类文件名 (+0.5),扇入=0 (+0.5);对高复杂度、循环依赖、无测试无文档扣分 (-1.5);优秀加分 (+1.0) | | **实用性** | 20% | 通用函数名 (+1.5),通用文件名 (+1.0),50-300 行代码 (LOC) (+1.0),API 数量 ≥3 (+1.0),仅使用标准库 (+0.5);对无 API 扣分 (-1.0),仅代码片段扣分 (-0.5) | | **独特性** | 15% | GitHub 上类似项目越少得分越高(0个结果: 8,1-2个: 6,3-5个: 4,6个以上: 2)。--no-network 模式或被限流:中性得分 5.0 | | **相关性** | 15% | 验证为单文件 (+2.5),多文件 (-1.5),仅使用标准库 (+2.0),API ≥3 (+1.5),无许可证 (-1.0),包含特定项目引用 (-2.0) | | **可维护性** | 15% | 注释率 ≥15% (+2.0),有文档字符串 (+1.0),低复杂度 (+1.5),50-200 行代码 (LOC) (+1.0),有测试 (+0.5) | | **需求信号** | 10% | 类似项目的 Star 数、fork 数和打开的 issue 数(线性封顶,按排名加权) | **计算公式:** `combined = 0.25×quality + 0.20×usefulness + 0.15×uniqueness + 0.15×relevance + 0.15×maintainability + 0.10×demand` 如果 `relevance < 3.0`,总得分将减半 —— 一个并非真正独立的文件是无法仅靠良好的代码质量来挽救的。 ## 安装 ### 选项 A:pipx(推荐用于 CLI 使用) ``` pipx install people-helper ``` ### 选项 B:从源码安装 ``` git clone https://github.com/Ehsas317/people-helper.git cd people-helper python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -e . ``` ### 选项 C:直接运行脚本(无需安装) ``` git clone https://github.com/Ehsas317/people-helper.git cd people-helper pip install -r requirements.txt # only httpx python people_helper.py --repo you/repo ``` **要求 Python 3.10+**(使用了 PEP 604 的 `X | None` 语法)。 ## 设置(仅需一次) 创建一个 **细粒度的 GitHub PAT**: 1. 前往 [github.com/settings/personal-access-tokens/new](https://github.com/settings/personal-access-tokens/new) 2. Resource owner:你自己 3. Repository access:**Only select repositories** → 选择你想要分析的仓库 4. Permissions: - **Contents**:Read - **Metadata**:Read(自动选中) 5. Expiration:90 天或更短 6. 复制 token ``` export PEOPLE_HELPER_PAT=github_pat_your_token_here ``` ### 可选:为提取的包配置作者信息 如果你使用了 `--extract`,生成的清单文件(如 pyproject.toml、package.json 等)会包含作者信息。请设置这些环境变量以避免出现 "Your Name" 占位符: ``` export PEOPLE_HELPER_AUTHOR_NAME="Jane Doe" export PEOPLE_HELPER_AUTHOR_EMAIL="jane@example.com" ``` ## 使用方法 ``` # 基本用法(生成 report.md) people-helper --repo your-username/your-repo # 指定输出路径 people-helper --repo your-username/your-repo --output my-report.md # Verbose 模式(查看每个步骤) people-helper --repo your-username/your-repo --verbose # Debug 模式(在出错时显示 stack traces) people-helper --repo your-username/your-repo --debug # 显示版本 people-helper --version # 仅限本地(不进行 GitHub 搜索,速度更快) people-helper --repo your-username/your-repo --no-network # 按语言筛选(根据支持的语言进行验证) people-helper --repo your-username/your-repo --language Python # 提取热门候选者到 ./extracted/(创建 package scaffolds) people-helper --repo your-username/your-repo --extract ./extracted/ # 使用自定义阈值进行提取 people-helper --repo your-username/your-repo --extract ./extracted/ --max-extract 3 --extract-min-score 7.0 # 控制输出大小 people-helper --repo your-username/your-repo --max-candidates 5 --min-stars 10 ``` 你也可以作为 Python 模块调用: ``` python -m people_helper --repo you/repo ``` 或者在不安装的情况下,通过克隆的仓库运行: ``` python people_helper.py --repo you/repo ``` ## 检测目标 如果一个文件符合以下条件,则被视为**高价值可提取候选对象**: - 至少包含 10 行实际代码(无严格上限 —— 对于大文件会实施阶梯式的可维护性扣分:超过 500 行的部分,每 150 LOC 扣 0.1 分) - 拥有模块级别的 docstring、JSDoc 或包注释 - 包含零个或一个内部项目导入(自包含) - 外部导入很少(依赖占用空间小) - 有对应的测试文件 - 具有实用性质的文件名(如 `util`、`helper`、`parser`、`validator` 等) - **已验证是独立的**(无相对导入,或者对于多文件提取存在同级文件) - **不是**框架的路由文件(如 Next.js pages、SvelteKit routes 等) - **本身不是**测试文件 - **不是** CLI 入口点 - **不是**配置文件、SWIG 输出或声明文件 ## 报告输出 生成的 Markdown 报告会为每个候选对象提供以下信息: - **评分**:包含全部 6 个维度及综合得分 - **提取类型**:`✅ single`、`⚠ multi` 或 `⛔ blocked` - **必需的同级文件**:如果是多文件提取,列出必须一起提取的文件 - **源仓库许可证**:该仓库是否拥有许可证文件 - **功能描述**:从文档字符串或代码中提取 - **可提取的原因**:基于分析得出的确凿理由 - **类似项目**:GitHub 搜索结果,包含 star 数、fork 数和最后提交日期 - **你的差异化优势**:具体的比较点 - **建议名称**:简洁且可发布的包名 - **建议标签**:用于提升发现率的 GitHub topics - **起始脚手架(前 30 行)**:包含自动隐去敏感信息的代码预览 ## 信任边界 People Helper **在设计上是只读的**: - 使用细粒度的 PAT,且仅具有 **Contents: Read** 和 **Metadata: Read** 权限 - 强制拒绝具有写入权限范围(`repo`、`admin:*`、`write:*`、`delete:*`)的经典 PAT - 注意:经典 PAT 的范围会经过严格验证;细粒度 PAT 的范围无法通过 API 进行内部检查,因此用户必须正确遵循设置说明 —— 工具会发出警告但不会强制阻止。 - 无写入操作 —— 没有推送、没有 PR、不创建 issue - 代码保留在你的计算机上;仅调用 GitHub 公开的搜索 API - 每次运行后(包括超时在内的所有失败路径下)都会清理临时克隆 - 克隆完成后,会清除 `.git/config` 中的 PAT(深度防御) - 所有错误消息和异常参数中涉及的 PAT 都会被隐去 - 报告内容经过净化处理:转义了三个反引号,过滤了 `