{"id":49580407,"url":"https://github.com/leic4u/winget-tracker","last_synced_at":"2026-05-03T19:05:59.449Z","repository":{"id":345806831,"uuid":"1187419286","full_name":"leic4u/WinGet-Tracker","owner":"leic4u","description":"监测各种网站的软件包更新，并通过 komac 提交至 winget-pkgs 仓库","archived":false,"fork":false,"pushed_at":"2026-04-29T13:07:21.000Z","size":128,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T15:13:41.150Z","etag":null,"topics":["komac","packages","update","winget","winget-pkgs"],"latest_commit_sha":null,"homepage":"","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leic4u.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-20T17:48:40.000Z","updated_at":"2026-04-29T13:07:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"8c2b0f7d-7442-4024-89a0-b019bf15452a","html_url":"https://github.com/leic4u/WinGet-Tracker","commit_stats":null,"previous_names":["leic4u/winget-tracker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/leic4u/WinGet-Tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leic4u%2FWinGet-Tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leic4u%2FWinGet-Tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leic4u%2FWinGet-Tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leic4u%2FWinGet-Tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leic4u","download_url":"https://codeload.github.com/leic4u/WinGet-Tracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leic4u%2FWinGet-Tracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32581070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["komac","packages","update","winget","winget-pkgs"],"created_at":"2026-05-03T19:05:56.333Z","updated_at":"2026-05-03T19:05:59.440Z","avatar_url":"https://github.com/leic4u.png","language":"PowerShell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WinGet Tracker\n\nWinGet Tracker 是一个自动化工具，用于监控软件包更新并自动向 Microsoft 的 [winget-pkgs](https://github.com/microsoft/winget-pkgs) 仓库提交更新请求。\n\n## 功能特性\n\n- **自动版本检测**：定期检查已配置软件包的新版本\n- **智能更新机制**：根据配置的规则从官方源获取最新版本信息\n- **哈希计算**：自动下载安装包并计算 SHA256 哈希值\n- **重复 PR 检查**：避免重复提交相同的版本更新\n- **自动提交**：使用 `Komac` 工具自动向 winget-pkgs 提交 PR\n- **日志记录**：完整的操作日志便于追踪和调试\n\n## 项目结构\n\n```\nwinget-tracker/\n├── .github/workflows/     # GitHub Actions 工作流配置\n├── packages/               # 软件包配置文件目录\n└── scripts/                # PowerShell 脚本目录\n```\n\n## 脚本说明\n\n| 脚本 | 功能 |\n|------|------|\n| `check-version.ps1` | 主脚本：检查所有包的新版本，并行处理 |\n| `submit-winget.ps1` | 主脚本：提交更新到 winget-pkgs（使用 komac） |\n| `resolve-version.ps1` | 解析远程版本号（GitHub/API/Web三种模式） |\n| `resolve-download.ps1` | 解析下载 URL，支持变量替换 |\n| `calc-hash.ps1` | 下载文件并计算 SHA256（带重试） |\n| `check-existing-pr.ps1` | 检查 winget-pkgs 是否已存在 PR |\n| `get-installer-version.ps1` | 从 EXE/MSI/MSIX 提取内置版本号 |\n| `infer-version-from-filename.ps1` | 从 URL 文件名推断版本号 |\n| `scan-url-version.ps1` | 从 HTML 中所有 URL 扫描版本 |\n| `cleanup-merged-prs.ps1` | 清理已合并的 PR 分支（使用 komac） |\n| `validate-config.ps1` | 验证配置文件格式 |\n\n## 本地使用说明\n\n### 必需工具\n1. **PowerShell 7+** - 脚本运行环境\n2. **powershell-yaml 模块** - 用于解析 YAML 配置\n   ```powershell\n   Install-Module powershell-yaml -Scope CurrentUser -Force\n   ```\n3. **Komac** - 用于提交 winget-pkgs PR\n   ```powershell\n   winget install RussellBanks.Komac --source winget\n   ```\n4. **GitHub CLI (gh)** - 用于 PR 搜索和标题更新\n   ```powershell\n   winget install GitHub.cli --source winget\n   ```\n\n### 环境变量\n- `WINGET_TOKEN`: GitHub Personal Access Token（需要 public_repo 权限）\n\n### 使用方法\n\n#### 1. 设置环境变量\n```powershell\n$env:WINGET_TOKEN=\"your_github_personal_access_token\"\n```\n\n#### 2. 运行版本检查\n```powershell\n.\\scripts\\check-version.ps1\n```\n遍历 `packages/` 目录，检查远程版本，发现更新时写入 `updates.json`。\n\n#### 3. 提交更新\n```powershell\n.\\scripts\\submit-winget.ps1\n```\n读取 `updates.json`，检查 PR 存在性，下载并计算哈希，从安装包提取版本，使用 Komac 提交 PR，更新 YAML 配置并自动 Git 提交。\n\n## GitHub Actions 自动化使用说明\n\n项目包含 GitHub Actions 工作流，Fork 本仓库后，在 Action 中手动执行一次后，后续即可自动运行：\n\n- **触发方式**：根据 cron 表达式自动运行，或手动触发 (`workflow_dispatch`)\n- **所需 Secrets**：`WINGET_TOKEN`（GitHub Personal Access Token）\n\n## 工作流程\n\n### 完整工作流程\n```\n┌──────────────────┐\n│ packages/*.yaml  │ 配置文件（包含 checkver 和 autoupdate 规则）\n└────────┬─────────┘\n         │\n         ▼\n┌──────────────────────┐\n│ check-version.ps1    │ 1. 解析 checkver 配置\n│                      │ 2. 检查远程版本（GitHub/API/Web）\n│                      │ 3. 比较版本号\n│                      │ 4. 生成 updates.json（包含更新列表）\n└────────┬─────────────┘\n         │\n         ▼\n┌──────────────────┐\n│  updates.json    │ 中间文件格式：\n│                  │ {\n│                  │   \"id\": \"Publisher.AppName\",\n│                  │   \"version\": \"1.2.3\",        # 用于 manifest\n│                  │   \"url_version\": \"1.2.3.456\", # 原始版本\n│                  │   \"file\": \"Publisher.AppName.yaml\"\n│                  │ }\n└────────┬─────────┘\n         │\n         ▼\n┌──────────────────────┐\n│ submit-winget.ps1    │ 1. 读取 updates.json\n│                      │ 2. 检查 PR 是否已存在\n│                      │ 3. 解析 autoupdate 规则生成下载 URL\n│                      │ 4.下载安装包并计算哈希\n│                      │ 5. 从安装包提取内置版本\n│                      │ 6. 根据 version_format 配置使用 Komac 提交 PR\n│                      │ 7. 更新 YAML 配置并 Git 提交\n└──────────────────────┘\n```\n\n## 配置文件格式\n\n每个软件包需要一个 YAML 配置文件，放置在 `packages/` 目录下：\n\n```yaml\nid: Publisher.AppName\ncurrent_package:\n  version: \"1.0.0\"\n  architecture:\n    x64:\n      url: https://example.com/app-1.0.0-x64.exe\n      hash: \"SHA256_HASH\"\ncheckver:\n  url: https://example.com/releases\n  regex: Version ([\\d.]+)\nautoupdate:\n  version_format: $pkgMajor.$pkgMinor.$pkgPatch  # 可选，用于格式化 manifest 版本\n  architecture:\n    x64: https://example.com/app-$version-x64.exe\n```\n\n### 主要配置字段\n\n| 字段 | 说明 |\n|------|------|\n| `id` | Winget 包标识符（格式：Publisher.AppName） |\n| `current_package.version` | 当前已知的最新版本 |\n| `current_package.architecture` | 支持的架构及对应的下载信息，会自动更新 |\n| `checkver.url` | [GitHub/API/Web] 版本检查的目标 URL |\n| `checkver.regex` | [GitHub/API/Web] 从页面提取版本的正则表达式 |\n| `checkver.method` | [API] HTTP 请求方法（GET/POST/PUT，默认 GET） |\n| `checkver.headers` | [API] 自定义 HTTP 请求头 |\n| `checkver.body` | [API] POST/PUT 请求体 |\n| `checkver.jsonpath` | [API] 从 JSON 响应提取版本的路径，支持遍历数组 |\n| `checkver.exclude_pattern` | [API] 可选，排除匹配的版本 |\n| `autoupdate.version_format` | 可选，自定义 manifest 版本的格式 |\n| `autoupdate.architecture.[arch]` | 自动更新的下载 URL 模板 |\n| `autoupdate.architecture.[arch].jsonpath` | 可选，从 checkver 数据提取下载 URL，支持遍历数组 |\n\n## 版本检查模式\n\n### 1. GitHub Releases\n```yaml\ncheckver:\n  url: https://github.com/owner/repo\n```\n自动调用 GitHub API 获取最新 release。\n\n### 2. Web 网页（正则匹配）\n```yaml\ncheckver:\n  url: https://example.com/download\n  regex: Version ([\\d.]+)\n```\n从 HTML 中用正则表达式提取版本号。\n\n### 3. API 请求（JSON 解析）\n```yaml\ncheckver:\n  url: https://api.example.com/v1/version\n  method: GET\n  jsonpath: data.list.app_version\n  exclude_pattern: \"99\"  # 可选，排除匹配的版本\n```\n从 JSON API 响应提取版本号。\n\n## 版本号变量\n\n### 基本变量\n| 变量 | 说明 |\n|------|------|\n| `$version` | 完整版本号 |\n| `$major` | 主版本号 |\n| `$minor` | 次版本号 |\n| `$patch` | 修订版本号 |\n| `$build` | 构建号 |\n\n### URL 原始版本变量 ($url*)\n用于区分原始版本和格式化版本，支持全小写和驼峰式两种格式（`$urlversion` 或 `$urlVersion`）。\n\n### 安装包版本变量 ($pkg*)\n从安装包提取的版本，支持全小写和驼峰式两种格式（`$pkgversion` 或 `$pkgVersion`）。\n\n## PR 提交说明\n\n所有通过本工具提交的 PR 都会包含以下说明：\n\n\u003e Pull request has been created with [WinGet Tracker](https://github.com/leic4u/winget-tracker) 📦\n\n## 许可证\n\nMIT License\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleic4u%2Fwinget-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleic4u%2Fwinget-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleic4u%2Fwinget-tracker/lists"}