适用于以下场景:(1)用户提供 GitHub 仓库 URL 或本地仓库路径,并请求将其转换为其他格式;(2)用户请求导出 GitHub 仓库……
Core Phition是一项面向实际任务的技能,主要用于此技能将 GitHub 寄存器的内容和元数据转换为目标格式( Markdown 文档、 JSON 元数据、 CSV 表格、 文件夹树 JSON );它保存了结构 和 c。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
本能力将 GitHub 仓库内容与元数据 转换为目标格式(Markdown 文档、JSON 元数据、CSV 表格、目录树 JSON)。它在不同格式间保持结构完整性与内容保真度——并非简单的文件复制,而是一种语义化转换,严格遵循 GitHub 的数据模型(仓库、树、提交、Issues、PRs、Releases)。
关键职责:
.git 目录解析 GitHub 仓库结构(分支、目录树、文件)/convert-github-repository --markdown仓库 → Markdown 文档。 将整个仓库转换为一组 Markdown 文件:
README.mdREADME.md 描述其内容issues/YYYY-MM-DD-{number}-{title}.mdpull-requests/YYYY-MM-DD-{number}-{title}.mdreleases/v{semver}.md/convert-github-repository --json仓库 → JSON 元数据。 将仓库结构与内容导出为一个 JSON 文件:
{
"repo": { "name": "...", "description": "...", "stars": N, "license": "...", "topics": [...] },
"files": [{ "path": "...", "size": N, "type": "file|dir", "sha": "..." }],
"branches": [{ "name": "...", "last_commit": "..." }],
"contributors": [{ "login": "...", "contributions": N }]
}
/convert-github-repository --csvIssues + PRs → CSV。 将 Issues 和 Pull Requests 导出为 CSV 行,列名包括:number, title, state, author, created_at, updated_at, labels, assignees, milestone, body_preview。
/convert-github-repository --tree仓库 → 目录树 JSON。 输出一个表示仓库布局的树状结构:
{
"path": "/",
"type": "directory",
"children": [
{ "path": "src/index.js", "type": "file", "size": 1234, "language": "JavaScript" },
{ "path": "tests/", "type": "directory", "children": [...] }
]
}
/convert-github-repository --readme-to-jsonREADME.md → 结构化 JSON。 解析 README.md 并提取:标题(首个 H1)、描述(标题后首个段落)、安装步骤、使用示例、贡献指南、许可证信息。
远程 GitHub 仓库: 解析 URL 提取 owner 和 repo:
https://github.com/owner/repo -> {owner: "owner", repo: "repo"}
使用环境变量中的 GITHUB_TOKEN(os.getenv("GITHUB_TOKEN"))调用 GitHub API。
本地仓库: 验证 .git 目录是否存在。使用 git CLI 提取以下信息:
git ls-files 获取文件列表git log --oneline 获取最近提交记录git remote get-url origin 确认仓库身份若无法识别任一来源,则报告:“无法识别仓库来源 —— 请提供 GitHub URL(如 https://github.com/owner/repo)或包含 .git 目录的本地路径。”
对于远程仓库,调用 GitHub API:
GET https://api.github.com/repos/{owner}/{repo}
Authorization: Bearer {GITHUB_TOKEN}
Accept: application/vnd.github+json
响应中包含:full_name、description、stargazers_count、forks_count、license.spdx_id、topics、default_branch、created_at、updated_at、homepage、language。
若缺失 Token 或遭遇限流(HTTP 403),尝试无认证请求(限流更低),或报告:“GitHub API 不可用 —— 请检查 GITHUB_TOKEN 或稍后重试(无认证请求限流:60 次/小时)。”
获取默认分支树:
GET https://api.github.com/repos/{owner}/{repo}/git/trees/{default_branch}?recursive=1
返回所有文件的扁平化列表,含 path、type(blob/tree)、size、sha 字段。
对于本地仓库: 运行 git ls-tree -r --name-only {branch} 获取文件列表,再通过 git show {sha}:{path} 读取文件内容。
过滤常见非必要路径:
node_modules/、.git/、vendor/ —— 默认跳过,除非显式指定 --include-ignored.gitignore 中声明但未提交的文件 —— 跳过--markdown 转换:
README.md:原样保留,并更新相对链接指向本地文件.js → ```javascript、.py → ```python、.go → ```go、.rs → ```rust 等README.md,列出其包含的文件{number}-{slug}.md,含 frontmatter:--- number: 42 state: open author: username created: 2024-01-15 labels: [bug, help-wanted] --- # Title body text...
merged 字段及审查评论--json 转换:
--csv 转换:
number,title,state,author,created_at,updated_at,labels,assignees,milestone,body_preview; 分隔符连接; 分隔符连接""--tree 转换:
.js → JavaScript、.py → Python 等)--readme-to-json 转换:
# Heading → titleinstallation、usage、contributing 等)code_examples 数组[text](url) → 收集至 links 数组交付前执行以下校验:
json.loads() 解析并确认无错误返回转换结果及清单:
{
"format": "markdown",
"files_converted": 142,
"files_skipped": 3,
"skipped_reasons": [
{"path": "node_modules/package/index.js", "reason": "binary or non-text, excluded by default"},
{"path": ".git/config", "reason": "contains sensitive data"}
],
"total_size_bytes": 2048576,
"output_path": "./{repo-name}-converted/"
}
os.getenv("GITHUB_TOKEN").gitignore 中列出的文件,除非用户显式指定 --include-ignoredskipped_reasons 中明确记录files_converted、files_skipped、skipped_reasons 的清单uFFFDgit CLI —— 不得假定可直接访问原始文件系统node_modules、.git、pycache、build/、dist/)| 评估项 | 最低要求 | 理想目标 |
|---|---|---|
| 内容保全 | 100% 文本文件内容完整保留 | 二进制文件仅在清单中列出,不丢失内容 |
| 格式有效性 | 输出能通过对应格式解析器 | 严格执行 Schema 校验(JSON:draft-7;CSV:列结构一致) |
| 清单完整性 | 每个跳过文件均注明原因 | 每个已转换文件均列出其大小与类型 |
| 编码正确性 | 所有文本文件使用 UTF-8 编码 | 无效字节统一替换为 U+FFFD,而非丢弃或乱码 |
| 限流处理 | HTTP 403 触发重新认证尝试 | 主动分页 + 403 时刷新 Token |
| 大型仓库处理 | 10K 文件以内仓库内存占用 < 500MB | JSON 流式输出、文件分块写入 |
高质量输出应满足:通过目标格式解析器无报错、语义内容完全保留、且附带完整清单说明转换内容及跳过原因。
| 场景 | 劣质实现 | 优质实现 |
|---|---|---|
| 缺失 Token | 无限重试无认证请求 | 报告“GitHub API 认证必需 —— 请设置 GITHUB_TOKEN 环境变量” |
| 二进制文件 | 尝试以文本读取,导致内容损坏 | 跳过该二进制文件,并在清单中记录:{"path": "logo.png", "reason": "binary/image, excluded"} |
| 大型仓库 | 将全部文件载入内存,最终崩溃 | 采用流式处理,报告“已处理 8,432 / 12,000 个文件(70%)” |
| 遭遇限流 | 三次请求后静默失败 | 报告“超出速率限制(HTTP 403)—— 请于 14:32 UTC 后重试,或设置 GITHUB_TOKEN” |
| 字段缺失 | 字段不存在时直接跳过(如 homepage) |
显式包含 "homepage": null —— 不静默丢弃任何字段 |
| 格式错误 | 输出含尾随逗号的非法 JSON | 使用 json.dumps() 校验,报告“输出非法:第 847 行出现意外 token” |
| 本地仓库路径 | 假定 ~/repo 路径存在 |
检查 .git 目录,报告“路径不是 Git 仓库:./myrepo” |