diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index af915ae..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,250 +0,0 @@ -name: Release - -on: - push: - tags: - - "v*.*.*" - workflow_dispatch: - inputs: - tag: - description: "要发布的既有 tag,例如 v1.0.0" - required: true - type: string - -permissions: - contents: write - packages: write - -concurrency: - group: release-${{ github.event.inputs.tag || github.ref }} - cancel-in-progress: false - -jobs: - publish: - runs-on: ubuntu-latest - environment: release - env: - TAG_NAME: ${{ github.event.inputs.tag || github.ref_name }} - PACKAGE_OUTPUT_DIR: artifacts - CHANGELOG_BRANCH: automation/changelog-${{ github.event.inputs.tag || github.ref_name }} - CHANGELOG_COMMIT_MESSAGE: "docs: 更新 CHANGELOG 文件 ${{ github.event.inputs.tag || github.ref_name }}" - CHANGELOG_PR_TITLE: "docs: 更新 CHANGELOG 文件 ${{ github.event.inputs.tag || github.ref_name }}" - NUGET_SOURCE_URL: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json - - steps: - - name: Checkout tagged commit - uses: actions/checkout@v6 - with: - ref: ${{ github.event.inputs.tag || github.ref }} - fetch-depth: 0 - - - name: Validate tag format and main ancestry - id: validate_tag - shell: bash - run: | - set -euo pipefail - - if [[ ! "${TAG_NAME}" =~ ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ ]]; then - echo "稳定版本 tag 必须匹配 vX.Y.Z:${TAG_NAME}" >&2 - exit 1 - fi - - VERSION="${TAG_NAME#v}" - git fetch origin +refs/heads/main:refs/remotes/origin/main - git fetch --force --tags origin - - TAG_COMMIT="$(git rev-list -n 1 "${TAG_NAME}" 2>/dev/null || true)" - - if [[ -z "${TAG_COMMIT}" ]]; then - echo "未找到目标 tag:${TAG_NAME}" >&2 - exit 1 - fi - - if ! git merge-base --is-ancestor "${TAG_COMMIT}" "origin/main"; then - echo "当前 tag 指向的提交不在 origin/main 历史中:${TAG_COMMIT}" >&2 - exit 1 - fi - - echo "version=${VERSION}" >> "${GITHUB_OUTPUT}" - - - name: Validate GitHub App configuration - shell: bash - env: - APP_CLIENT_ID: ${{ vars.APP_CLIENT_ID }} - APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} - run: | - set -euo pipefail - - if [[ -z "${APP_CLIENT_ID}" ]]; then - echo "缺少 vars.APP_CLIENT_ID,无法创建 GitHub App token。" >&2 - exit 1 - fi - - if [[ -z "${APP_PRIVATE_KEY}" ]]; then - echo "缺少 secrets.APP_PRIVATE_KEY,无法创建 GitHub App token。" >&2 - exit 1 - fi - - - name: Setup .NET - uses: actions/setup-dotnet@v5 - with: - dotnet-version: 10.x - - - name: Pack release artifacts - run: dotnet pack StrangeSort/StrangeSort.csproj --configuration Release --output "${PACKAGE_OUTPUT_DIR}" -p:ContinuousIntegrationBuild=true -p:Version="${{ steps.validate_tag.outputs.version }}" - - - name: Publish package to GitHub Packages - shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - set -euo pipefail - shopt -s nullglob - - packages=("${PACKAGE_OUTPUT_DIR}"/*.nupkg) - - if [[ ${#packages[@]} -eq 0 ]]; then - echo "未找到 .nupkg 包。" >&2 - exit 1 - fi - - # GitHub Packages 只推送主包,符号包改由 GitHub Release 资产提供。 - for package in "${packages[@]}"; do - dotnet nuget push "${package}" \ - --source "${NUGET_SOURCE_URL}" \ - --api-key "${GITHUB_TOKEN}" \ - --skip-duplicate - done - - - name: Generate current tag changelog fragment - id: git_cliff - uses: orhun/git-cliff-action@v4 - with: - config: cliff.toml - args: --current --strip all - env: - OUTPUT: current-release-notes.md - GITHUB_REPO: ${{ github.repository }} - - - name: Create GitHub App token - id: app_token - uses: actions/create-github-app-token@v3 - with: - client-id: ${{ vars.APP_CLIENT_ID }} - private-key: ${{ secrets.APP_PRIVATE_KEY }} - permission-contents: write - permission-pull-requests: write - - - name: Checkout main for changelog PR - uses: actions/checkout@v6 - with: - ref: main - fetch-depth: 0 - token: ${{ steps.app_token.outputs.token }} - persist-credentials: false - path: changelog-main - - - name: Update CHANGELOG.md - id: update_changelog - shell: bash - env: - VERSION: ${{ steps.validate_tag.outputs.version }} - CHANGELOG_FRAGMENT_PATH: ${{ steps.git_cliff.outputs.changelog }} - CHANGELOG_WORKTREE: ${{ github.workspace }}/changelog-main - run: | - set -euo pipefail - - CHANGELOG_PATH="${CHANGELOG_WORKTREE}/CHANGELOG.md" - VERSION_HEADING="## [${VERSION}] - " - - if [[ -f "${CHANGELOG_PATH}" ]] && grep -Fq "${VERSION_HEADING}" "${CHANGELOG_PATH}"; then - echo "needs_pr=false" >> "${GITHUB_OUTPUT}" - exit 0 - fi - - if [[ -f "${CHANGELOG_PATH}" ]]; then - cat "${CHANGELOG_FRAGMENT_PATH}" > "${CHANGELOG_PATH}.new" - printf '\n' >> "${CHANGELOG_PATH}.new" - cat "${CHANGELOG_PATH}" >> "${CHANGELOG_PATH}.new" - mv "${CHANGELOG_PATH}.new" "${CHANGELOG_PATH}" - else - cp "${CHANGELOG_FRAGMENT_PATH}" "${CHANGELOG_PATH}" - fi - - echo "needs_pr=true" >> "${GITHUB_OUTPUT}" - - - name: Create or update changelog PR - if: steps.update_changelog.outputs.needs_pr == 'true' - uses: peter-evans/create-pull-request@v8 - with: - token: ${{ steps.app_token.outputs.token }} - branch-token: ${{ steps.app_token.outputs.token }} - path: changelog-main - add-paths: CHANGELOG.md - base: main - branch: ${{ env.CHANGELOG_BRANCH }} - delete-branch: false - commit-message: ${{ env.CHANGELOG_COMMIT_MESSAGE }} - title: ${{ env.CHANGELOG_PR_TITLE }} - body: | - 来源 tag:`${{ env.TAG_NAME }}` - - 本 PR 由 Release workflow 自动创建,使用 `git-cliff` 增量更新 `CHANGELOG.md`,并已尝试开启 auto-merge。 - - 更新文件:`CHANGELOG.md` - 生成工具:`git-cliff` - - - name: Resolve changelog PR - if: steps.update_changelog.outputs.needs_pr == 'true' - id: resolve_pr - shell: bash - env: - GH_TOKEN: ${{ steps.app_token.outputs.token }} - run: | - set -euo pipefail - - PR_URL="$(gh pr list --repo "${GITHUB_REPOSITORY}" --base main --head "${CHANGELOG_BRANCH}" --state open --json url --jq '.[0].url')" - - if [[ -z "${PR_URL}" || "${PR_URL}" == "null" ]]; then - echo "未找到 changelog PR:${CHANGELOG_BRANCH}" >&2 - exit 1 - fi - - echo "url=${PR_URL}" >> "${GITHUB_OUTPUT}" - - - name: Enable changelog PR auto-merge - if: steps.update_changelog.outputs.needs_pr == 'true' - shell: bash - env: - GH_TOKEN: ${{ steps.app_token.outputs.token }} - PR_URL: ${{ steps.resolve_pr.outputs.url }} - run: | - set -euo pipefail - - AUTO_MERGE_ENABLED="$(gh pr view "${PR_URL}" --repo "${GITHUB_REPOSITORY}" --json autoMergeRequest --jq '.autoMergeRequest != null')" - - if [[ "${AUTO_MERGE_ENABLED}" == "true" ]]; then - exit 0 - fi - - gh pr merge "${PR_URL}" --repo "${GITHUB_REPOSITORY}" --auto --squash - - - name: Create or update GitHub Release - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CHANGELOG_FRAGMENT_PATH: ${{ steps.git_cliff.outputs.changelog }} - run: | - set -euo pipefail - - if gh release view "${TAG_NAME}" --repo "${GITHUB_REPOSITORY}" >/dev/null 2>&1; then - gh release edit "${TAG_NAME}" --repo "${GITHUB_REPOSITORY}" --title "${TAG_NAME}" --notes-file "${CHANGELOG_FRAGMENT_PATH}" - else - gh release create "${TAG_NAME}" --repo "${GITHUB_REPOSITORY}" --title "${TAG_NAME}" --notes-file "${CHANGELOG_FRAGMENT_PATH}" - fi - - - name: Upload release assets - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh release upload "${TAG_NAME}" "${PACKAGE_OUTPUT_DIR}"/*.nupkg "${PACKAGE_OUTPUT_DIR}"/*.snupkg --repo "${GITHUB_REPOSITORY}" --clobber diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index ec41d8b..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,69 +0,0 @@ -## [1.0.0] - 2026-06-14 - -### 🚀 Features - -- 实现 PruneUntilSorted 随机裁剪算法 -- 实现 StalinSort RemoveOutOfOrder 算法 -- 实现 EpsteinSort RetainOnlyMinorsAndSort -- 添加 BrezhnevSort RewriteAsOrdinalSequence (#5) -- 添加 TrumpSorter ShuffleAndWin 算法实现 (#11) - -### 🐛 Bug Fixes - -- 修复 sync-wiki GitHub Action 配置文件的格式问题 (#16) - -### 🚜 Refactor - -- [**breaking**] 将 StrangeSorter 重命名为 ThanosSorter 并调整 ThanosSort 目录结构 -- 清理 dotnet format info 级诊断 - -### 📚 Documentation - -- 添加 PruneUntilSorted 实现计划 -- 补充技能文件约定与技能说明 -- 添加英文注释中文化整改计划 -- 中文化 StrangeSort 公共注释 -- 补充开发计划文件的写入约定 -- 添加审阅意见问题修复计划 -- 明确列表重载异常时的失败语义 -- 补充计划文件历史计划处理约定 -- 添加 ThanosSort 重命名与目录调整计划 -- 添加 StalinSort RemoveOutOfOrder 实现计划 -- 添加 README.md 和 LICENSE.txt -- 添加 EpsteinSort RetainOnlyMinorsAndSort 实现计划 -- 完善 README 项目说明 -- 补充 Git 与 GitHub 交互技能说明 -- 添加 dotnet format info 级别问题修复计划 -- 补充 Git 标签附注要求 -- 添加 CHANGELOG -- 补充 Git 与 GitHub 交互说明 -- 补充 GitHub Pull Request 规范 -- 补充 Pull Request 模板中的关联 Issue 项 -- 完善 PR 关联 Issue 说明与 changelog 维护流程 (#7) -- 补充 README 中的 BrezhnevSort 算法说明 (#9) -- 明确 PR 无关联 Issue 时的模板填写方式 (#10) -- 在 AGENTS.md 补充程序的运行时的说明 (#12) -- 补充 README 中的 TrumpSort 算法说明 (#13) -- 补充算法契约规范并清理旧仓库治理文件 (#14) -- 建立 GitHub Wiki 文档结构并精简 README (#15) -- 补充行为契约同步要求并调整 README 文案 (#18) -- 重组文档导航并明确规范职责 (#20) -- 更新 README 中的 Wiki 文档入口 (#21) -- 清理掉过时的 CHANGELOG 文件 (#22) - -### 🧪 Testing - -- 添加 PruneUntilSorted 随机裁剪算法的契约测试 -- 补充 comparer 异常传播测试 -- 添加 StalinSort RemoveOutOfOrder 算法的测试 -- 添加 EpsteinSort RetainOnlyMinorsAndSort 的测试 - -### ⚙️ Miscellaneous Tasks - -- 添加 .gitattributes 和 .gitignore -- 添加项目文件 -- 为项目 StrangeSortTest 添加 StrangeSort 项目的引用 -- 添加 git-cliff 配置 -- 添加 GitHub Pull Request 模板 -- 更新 sync-wiki 使用的 actions/checkout 依赖项 (#17) -- 添加 CI 与 GitHub Packages/Release 自动发布支持 (#19) diff --git a/README.md b/README.md index 5a099b9..d73ecb3 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,9 @@ `StrangeSort` 是一个基于 `.NET 10` 的 C# 类库,实现几种冠以**历史经典人物**的名字的奇异算法。只是为了好玩! -## 快速开始 - -NuGet 包名:`StrangeSort` - -GitHub Packages 源:`https://nuget.pkg.github.com/yhcedpn/index.json` - -[Wiki 快速开始](https://github.com/yhcedpn/StrangeSort/wiki/Quick-Start):安装后的最小使用路径。 - ## 文档索引 -1. [Wiki 主索引](https://github.com/yhcedpn/StrangeSort/wiki):文档入口。 +1. [Wiki 主索引](https://github.com/yhcedpn/StrangeSort/wiki):文档入口。你可以在这里获取项目的细节内容。 2. [StrangeSort 开发规范](./specs/StrangeSort%20%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83.md):架构设计要求、变更防漂移规定、各算法行为协议。 diff --git a/wiki/BrezhnevSort-Guide.md b/wiki/BrezhnevSort-Guide.md index a4bc4c2..8c034cf 100644 --- a/wiki/BrezhnevSort-Guide.md +++ b/wiki/BrezhnevSort-Guide.md @@ -1,10 +1,6 @@ # BrezhnevSort Guide -`BrezhnevSort` 不看输入值,只按输入长度生成 `1..n`。 - -## 什么时候用 - -当你要把任意数值序列直接改写成序数序列时可以用它,可以让任意数值序列和勃列日涅夫同志领导的中央的总路线一起摇摆! +`BrezhnevSort` 不看输入值,只按输入长度生成 `1..n`。该算法会把任意数值序列直接改写成序数序列,可以让任意数值序列和勃列日涅夫同志领导的中央的总路线一起摇摆! ## 示例 diff --git a/wiki/EpsteinSort-Guide.md b/wiki/EpsteinSort-Guide.md index 743f0ba..bd30360 100644 --- a/wiki/EpsteinSort-Guide.md +++ b/wiki/EpsteinSort-Guide.md @@ -1,10 +1,6 @@ # EpsteinSort Guide -`EpsteinSort` 会先过滤,再排序。只有 `[0, 18)` 内的值能留下来。 - -## 什么时候用 - -当你需要固定区间过滤加排序,而不是通用排序时可以用它。像爱泼斯坦先生一样,保留并排序未成年人! +`EpsteinSort` 会先过滤,再排序。只有 `[0, 18)` 内的值能留下来。它就像爱泼斯坦先生一样,只保留并排序未成年人! ## 示例 diff --git a/wiki/Home.md b/wiki/Home.md index 3be508e..70867e2 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -2,23 +2,16 @@ 这里是 StrangeSort 的文档主索引。 -## 先看哪里 +## 指示牌 -1. 想先跑起来:看 [Quick Start](Quick-Start)。 -2. 想了解具体算法怎么用:看下面的算法教程页。 -3. 想确认精确行为和测试要求:看仓库 `specs/` 里的两份规范。 +想了解具体算法怎么用?看下面的索引列出的算法教程页。 -## 页面索引 - -1. [Quick Start](Quick-Start) -2. [StalinSort Guide](StalinSort-Guide) -3. [ThanosSort Guide](ThanosSort-Guide) -4. [EpsteinSort Guide](EpsteinSort-Guide) -5. [BrezhnevSort Guide](BrezhnevSort-Guide) -6. [TrumpSort Guide](TrumpSort-Guide) +想确认精确行为和测试要求?看 [StrangeSort 开发规范](https://github.com/yhcedpn/StrangeSort/blob/main/specs/StrangeSort%20%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83.md) 和 [StrangeSortTest 测试规范](https://github.com/yhcedpn/StrangeSort/blob/main/specs/StrangeSortTest%20%E6%B5%8B%E8%AF%95%E8%A7%84%E8%8C%83.md) -## 规范入口 +## 页面索引 -1. [StrangeSort 开发规范](https://github.com/yhcedpn/StrangeSort/blob/main/specs/StrangeSort%20%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83.md) -2. [StrangeSortTest 测试规范](https://github.com/yhcedpn/StrangeSort/blob/main/specs/StrangeSortTest%20%E6%B5%8B%E8%AF%95%E8%A7%84%E8%8C%83.md) -3. [README](https://github.com/yhcedpn/StrangeSort#readme) +1. [StalinSort Guide](StalinSort-Guide) +2. [ThanosSort Guide](ThanosSort-Guide) +3. [EpsteinSort Guide](EpsteinSort-Guide) +4. [BrezhnevSort Guide](BrezhnevSort-Guide) +5. [TrumpSort Guide](TrumpSort-Guide) diff --git a/wiki/Quick-Start.md b/wiki/Quick-Start.md deleted file mode 100644 index f349720..0000000 --- a/wiki/Quick-Start.md +++ /dev/null @@ -1,42 +0,0 @@ -# Quick Start - -## 1. 安装包 - -示例命令: - -```powershell -dotnet nuget add source "https://nuget.pkg.github.com/yhcedpn/index.json" --name github-yhcedpn --username YOUR_GITHUB_USERNAME --password YOUR_GITHUB_PAT -dotnet add package StrangeSort --version --source github-yhcedpn -``` - -## 2. 引入命名空间 - -```csharp -using StrangeSort.BrezhnevSort; -using StrangeSort.EpsteinSort; -using StrangeSort.StalinSort; -using StrangeSort.ThanosSort; -using StrangeSort.TrumpSort; -``` - -## 3. 选择一个算法调用 - -```csharp -int[] source = [3, 1, 2, 4]; - -int[] stalin = StalinSorter.RemoveOutOfOrder(source); -int[] thanos = ThanosSorter.PruneUntilSorted( - source, - comparer: null, - removalStrategy: RemovalCountStrategy.FloorHalf, - random: new Random(2026)); -int[] epstein = EpsteinSorter.RetainOnlyMinorsAndSort(source); -int[] brezhnev = BrezhnevSorter.RewriteAsOrdinalSequence(source); -int[] trump = TrumpSorter.ShuffleAndWin(source, new Random(2026)); -``` - -## 4. 接下来读什么 - -1. 想看某个算法的使用说明:进入对应 `*-Guide` 页面。 -2. 想确认精确行为:看 `specs/StrangeSort 开发规范.md`。 -3. 想确认测试覆盖重点:看 `specs/StrangeSortTest 测试规范.md`。 diff --git a/wiki/StalinSort-Guide.md b/wiki/StalinSort-Guide.md index 2a63925..ff1d005 100644 --- a/wiki/StalinSort-Guide.md +++ b/wiki/StalinSort-Guide.md @@ -1,10 +1,6 @@ # StalinSort Guide -`StalinSort` 会从左到右删除违序元素,最后留下一个保持原顺序的有序子序列。 - -## 什么时候用 - -当你想保留原始相对顺序,只移除“不合队列”的元素时可以用它。它专为沿袭斯大林同志的方针设计,一键清洗不正确的元素! +`StalinSort` 会从左到右删除违序元素,最后留下一个保持原顺序的有序子序列。它专为沿袭斯大林同志的方针设计,一键清洗不正确的元素! ## 示例 diff --git a/wiki/ThanosSort-Guide.md b/wiki/ThanosSort-Guide.md index b8bb8df..70e3ec5 100644 --- a/wiki/ThanosSort-Guide.md +++ b/wiki/ThanosSort-Guide.md @@ -1,10 +1,6 @@ # ThanosSort Guide -`ThanosSort` 会反复随机删除一半元素,直到剩余结果有序。 - -## 什么时候用 - -当你想保留原顺序,但接受用随机裁剪换取“最终有序”时可以用它。灭霸在此! +`ThanosSort` 会反复随机删除一半元素,直到剩余结果有序。灭霸在此! ## 示例 diff --git a/wiki/TrumpSort-Guide.md b/wiki/TrumpSort-Guide.md index 136f052..0c0b68f 100644 --- a/wiki/TrumpSort-Guide.md +++ b/wiki/TrumpSort-Guide.md @@ -1,10 +1,6 @@ # TrumpSort Guide -`TrumpSort` 会对输入执行一次随机重排,不保证结果有序。 - -## 什么时候用 - -当你只想打乱顺序,而不是排序或过滤时可以用它。无论如何,先赢再说!用它的人每一天都会赢! +`TrumpSort` 会对输入执行一次随机重排,不保证结果有序。无论如何,先赢再说!用它的人每一天都在赢! ## 示例 diff --git a/wiki/_Sidebar.md b/wiki/_Sidebar.md index da6d084..7655101 100644 --- a/wiki/_Sidebar.md +++ b/wiki/_Sidebar.md @@ -1,5 +1,4 @@ - [Home](Home) -- [Quick Start](Quick-Start) - [StalinSort Guide](StalinSort-Guide) - [ThanosSort Guide](ThanosSort-Guide) - [EpsteinSort Guide](EpsteinSort-Guide)