From 1c6c0bc92cd4fb2c2e8f1b23dd909b07c533c60b Mon Sep 17 00:00:00 2001 From: Marvin8 Date: Wed, 13 May 2026 13:54:42 +1000 Subject: [PATCH 1/9] docs: initial automated release including update to CHANGELOG.md --- AGENTS.md | 1 + cliff.toml | 31 +++++++++++++++++++++++++++++++ justfile | 30 ++++++++++++++++++++++++++++++ pyproject.toml | 14 ++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 cliff.toml create mode 100644 justfile diff --git a/AGENTS.md b/AGENTS.md index 08babeb..3ef8575 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,3 +61,4 @@ was done a particular way. ## style guidelines - comments and docs should be capitalized: and +- commit messages must be in commitizen style diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..70fbb30 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,31 @@ +[changelog] +# trim = false so the trailing blank line in the body template is preserved, +# ensuring git-cliff --prepend leaves a blank line before any existing content. +trim = false +body = """{% if version %}## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}{% else %}## [unreleased]{% endif %} + +{% for group, commits in commits | group_by(attribute="group") %}### {{ group | striptags | trim | upper_first }} + +{% for commit in commits %}- {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }} +{% endfor %}{% if not loop.last %} +{% endif %}{% endfor %} +""" + +[git] +conventional_commits = false +filter_unconventional = false +# Strip everything from the first newline so that subjects wrapped across +# two lines (without the required blank-line separator) still parse correctly. +commit_preprocessors = [ + { pattern = "\\n[\\s\\S]*", replace = "" }, +] +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^docs", group = "Documentation" }, + { message = "^refactor", group = "Refactoring" }, + { message = "^perf", group = "Performance" }, + { message = "^test", group = "Testing" }, + { message = "^ci", group = "CI" }, + { message = "^chore", skip = true }, +] diff --git a/justfile b/justfile new file mode 100644 index 0000000..008da28 --- /dev/null +++ b/justfile @@ -0,0 +1,30 @@ +set shell := ["bash", "-c"] + +# Release - Usage: just release patch|minor|major +release type: + #!/usr/bin/env bash + set -euo pipefail + type="{{type}}" + + if [[ "$type" != "patch" && "$type" != "minor" && "$type" != "major" ]]; then + echo "Error: argument must be patch, minor, or major (got: $type)" + exit 1 + fi + + NEXT=$(uv run bump-my-version show new_version --increment "$type") + echo "Releasing $NEXT" + + uv run git-cliff --tag "$NEXT" --unreleased --prepend CHANGELOG.md + + echo "" + echo "CHANGELOG.md updated. Edit it now, then press Enter to commit and release $NEXT." + echo "(Ctrl+C to abort at any time)" + read -r -p "Press Enter to continue: " + +# git add CHANGELOG.md +# git commit -m "docs: update changelog for $NEXT" + + uv run bump-my-version bump "$type" + +# git push +# git push origin "$NEXT" diff --git a/pyproject.toml b/pyproject.toml index d5235ce..8b40fce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -93,3 +93,17 @@ dev = [ # Drop this pin once pymdown-extensions stops passing None. "pygments<2.20", ] + +[tool.bumpversion] +commit = true +tag = true +tag_name = "{new_version}" +parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)" +serialize = ["{major}.{minor}.{patch}"] +message = "chore: bump: version {current_version} → {new_version}" +pre_commit_hooks = ["uv sync", "git add uv.lock"] + +[[tool.bumpversion.files]] +filename = "pyproject.toml" +search = 'version = "{current_version}"' +replace = 'version = "{new_version}"' From 416210d687be57ffee9148eee332457a8d077ea4 Mon Sep 17 00:00:00 2001 From: Marvin8 Date: Wed, 13 May 2026 14:00:31 +1000 Subject: [PATCH 2/9] chore: add dev dependencies and empty CHANGELOG.md file --- CHANGELOG.md | 0 pyproject.toml | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/pyproject.toml b/pyproject.toml index 8b40fce..196bc2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,6 +92,8 @@ dev = [ # `BlockHtmlFormatter` passes through when a code block has no title. # Drop this pin once pymdown-extensions stops passing None. "pygments<2.20", + "bump-my-version~=1.3", + "git-cliff~=2.12", ] [tool.bumpversion] From 83f283d48f87e0f25d225c6e7f291d587b1e54bb Mon Sep 17 00:00:00 2001 From: Marvin8 Date: Wed, 13 May 2026 14:05:50 +1000 Subject: [PATCH 3/9] chore: change bump-my-version settings to update Cargo.toml --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 196bc2a..e2be8d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,8 +92,8 @@ dev = [ # `BlockHtmlFormatter` passes through when a code block has no title. # Drop this pin once pymdown-extensions stops passing None. "pygments<2.20", - "bump-my-version~=1.3", - "git-cliff~=2.12", + "bump-my-version>=1.3", + "git-cliff>=2.12", ] [tool.bumpversion] @@ -106,6 +106,6 @@ message = "chore: bump: version {current_version} → {new_version}" pre_commit_hooks = ["uv sync", "git add uv.lock"] [[tool.bumpversion.files]] -filename = "pyproject.toml" +filename = "Cargo.toml" search = 'version = "{current_version}"' replace = 'version = "{new_version}"' From de676c8f8102295c60058cae5db88cd1d617dd74 Mon Sep 17 00:00:00 2001 From: Marvin8 Date: Thu, 14 May 2026 06:41:05 +1000 Subject: [PATCH 4/9] chore: bootstrap bump-my-version with current_version and fix justfile release steps --- justfile | 8 ++++---- pyproject.toml | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index 008da28..a49f9a7 100644 --- a/justfile +++ b/justfile @@ -21,10 +21,10 @@ release type: echo "(Ctrl+C to abort at any time)" read -r -p "Press Enter to continue: " -# git add CHANGELOG.md -# git commit -m "docs: update changelog for $NEXT" + git add CHANGELOG.md + git commit -m "docs: update changelog for $NEXT" uv run bump-my-version bump "$type" -# git push -# git push origin "$NEXT" + git push + git push origin "$NEXT" diff --git a/pyproject.toml b/pyproject.toml index e2be8d5..5f42a71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,6 +97,7 @@ dev = [ ] [tool.bumpversion] +current_version = "0.0.28" commit = true tag = true tag_name = "{new_version}" From 692576d265a01c6fd302291eb3d834ea1d499bd4 Mon Sep 17 00:00:00 2001 From: Marvin8 Date: Tue, 19 May 2026 13:52:12 +1000 Subject: [PATCH 5/9] refactor(release): address PR #110 review feedback - Remove prescriptive commit-message style guideline from AGENTS.md - Switch changelog categorization from commit prefixes to PR labels via git-cliff GitHub integration; add contributors section to template - Add [remote.github] to cliff.toml for PR label and contributor data - Fix tag_name to use v{new_version} prefix in bump-my-version config - Anchor Cargo.toml version search to [workspace.package] section with regex to prevent false matches on pinned dependencies - Extract inline justfile script to scripts/release.sh; drop justfile - Rename `type` param to `bump_type` to avoid bash builtin shadowing - Fix bare `git push` to `git push origin HEAD` for explicit ref - Add github-release job to release.yml to publish GH Release after PyPI publish, using git-cliff to generate release notes from PR labels --- .github/workflows/release.yml | 19 ++ AGENTS.md | 1 - cliff.toml | 27 ++- justfile | 30 --- pyproject.toml | 7 +- scripts/release.sh | 28 +++ uv.lock | 366 ++++++++++++++++++++++++++++++++++ 7 files changed, 435 insertions(+), 43 deletions(-) delete mode 100644 justfile create mode 100755 scripts/release.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4362b54..f092753 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,3 +50,22 @@ jobs: path: dist - uses: astral-sh/setup-uv@v7 - run: uv publish dist/* + + github-release: + runs-on: ubuntu-latest + needs: [publish] + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - uses: astral-sh/setup-uv@v7 + - name: Create GitHub release + run: | + uv run git-cliff --tag "${{ github.ref_name }}" --current --strip header \ + | gh release create "${{ github.ref_name }}" \ + --title "${{ github.ref_name }}" \ + --notes-file - + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/AGENTS.md b/AGENTS.md index 3ef8575..08babeb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,4 +61,3 @@ was done a particular way. ## style guidelines - comments and docs should be capitalized: and -- commit messages must be in commitizen style diff --git a/cliff.toml b/cliff.toml index 70fbb30..f09ea44 100644 --- a/cliff.toml +++ b/cliff.toml @@ -6,11 +6,19 @@ body = """{% if version %}## [{{ version | trim_start_matches(pat="v") }}] - {{ {% for group, commits in commits | group_by(attribute="group") %}### {{ group | striptags | trim | upper_first }} -{% for commit in commits %}- {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }} +{% for commit in commits %}- {{ commit.message | upper_first }} {% endfor %}{% if not loop.last %} {% endif %}{% endfor %} +{% if contributors %}### Contributors + +{% for contributor in contributors %}- @{{ contributor.username }} +{% endfor %}{% endif %} """ +[remote.github] +owner = "thejchap" +repo = "tryke" + [git] conventional_commits = false filter_unconventional = false @@ -19,13 +27,14 @@ filter_unconventional = false commit_preprocessors = [ { pattern = "\\n[\\s\\S]*", replace = "" }, ] +# Groups are driven by PR labels, not commit message prefixes. +# Commits without a recognised label are skipped. commit_parsers = [ - { message = "^feat", group = "Features" }, - { message = "^fix", group = "Bug Fixes" }, - { message = "^docs", group = "Documentation" }, - { message = "^refactor", group = "Refactoring" }, - { message = "^perf", group = "Performance" }, - { message = "^test", group = "Testing" }, - { message = "^ci", group = "CI" }, - { message = "^chore", skip = true }, + { label = "^enhancement$", group = "Features" }, + { label = "^bug$", group = "Bug Fixes" }, + { label = "^breaking$", group = "Breaking Changes" }, + { label = "^documentation$", group = "Documentation" }, + { label = "^performance$", group = "Performance" }, + { label = "^internal$", skip = true }, + { skip = true }, ] diff --git a/justfile b/justfile deleted file mode 100644 index a49f9a7..0000000 --- a/justfile +++ /dev/null @@ -1,30 +0,0 @@ -set shell := ["bash", "-c"] - -# Release - Usage: just release patch|minor|major -release type: - #!/usr/bin/env bash - set -euo pipefail - type="{{type}}" - - if [[ "$type" != "patch" && "$type" != "minor" && "$type" != "major" ]]; then - echo "Error: argument must be patch, minor, or major (got: $type)" - exit 1 - fi - - NEXT=$(uv run bump-my-version show new_version --increment "$type") - echo "Releasing $NEXT" - - uv run git-cliff --tag "$NEXT" --unreleased --prepend CHANGELOG.md - - echo "" - echo "CHANGELOG.md updated. Edit it now, then press Enter to commit and release $NEXT." - echo "(Ctrl+C to abort at any time)" - read -r -p "Press Enter to continue: " - - git add CHANGELOG.md - git commit -m "docs: update changelog for $NEXT" - - uv run bump-my-version bump "$type" - - git push - git push origin "$NEXT" diff --git a/pyproject.toml b/pyproject.toml index 5f42a71..cbc7fe2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,7 +100,7 @@ dev = [ current_version = "0.0.28" commit = true tag = true -tag_name = "{new_version}" +tag_name = "v{new_version}" parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)" serialize = ["{major}.{minor}.{patch}"] message = "chore: bump: version {current_version} → {new_version}" @@ -108,5 +108,6 @@ pre_commit_hooks = ["uv sync", "git add uv.lock"] [[tool.bumpversion.files]] filename = "Cargo.toml" -search = 'version = "{current_version}"' -replace = 'version = "{new_version}"' +regex = true +search = '\[workspace\.package\]\nversion = "{current_version}"' +replace = '[workspace.package]\nversion = "{new_version}"' diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..b1616ef --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +bump_type="${1:?Usage: release.sh patch|minor|major}" + +if [[ "$bump_type" != "patch" && "$bump_type" != "minor" && "$bump_type" != "major" ]]; then + echo "Error: argument must be patch, minor, or major (got: $bump_type)" + exit 1 +fi + +NEXT_VERSION=$(uv run bump-my-version show new_version --increment "$bump_type") +NEXT_TAG="v$NEXT_VERSION" +echo "Releasing $NEXT_TAG" + +uv run git-cliff --tag "$NEXT_TAG" --unreleased --prepend CHANGELOG.md + +echo "" +echo "CHANGELOG.md updated. Edit it now, then press Enter to commit and release $NEXT_TAG." +echo "(Ctrl+C to abort at any time)" +read -r -p "Press Enter to continue: " + +git add CHANGELOG.md +git commit -m "docs: update changelog for $NEXT_TAG" + +uv run bump-my-version bump "$bump_type" + +git push origin HEAD +git push origin "$NEXT_TAG" diff --git a/uv.lock b/uv.lock index 876fe1d..e781872 100644 --- a/uv.lock +++ b/uv.lock @@ -2,6 +2,66 @@ version = 1 revision = 3 requires-python = ">=3.12" +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "bracex" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/9a/fec38644694abfaaeca2798b58e276a8e61de49e2e37494ace423395febc/bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7", size = 26642, upload-time = "2025-06-22T19:12:31.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/2a/9186535ce58db529927f6cf5990a849aa9e052eea3e2cfefe20b9e1802da/bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952", size = 11508, upload-time = "2025-06-22T19:12:29.781Z" }, +] + +[[package]] +name = "bump-my-version" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "questionary" }, + { name = "rich" }, + { name = "rich-click" }, + { name = "tomlkit" }, + { name = "wcmatch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/61/07b90027091a4192b4a0290dc3da1aeea6b9e7b6b4c0f7fd30dab36070c1/bump_my_version-1.3.0.tar.gz", hash = "sha256:5780137a8d93378af3839798fcba01c7e6cb28dcc5aa5a7ab4d8507787f1995c", size = 1142429, upload-time = "2026-03-22T13:27:34.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/01/b168791bfbfb0322ef6d38d236f6f17a02e41fb7753e23e4cdb0f19ac969/bump_my_version-1.3.0-py3-none-any.whl", hash = "sha256:3cdaa54588d2443a29303b77e7539417187952c3d22f87bfdd32c0fe6af2f570", size = 64878, upload-time = "2026-03-22T13:27:33.006Z" }, +] + +[[package]] +name = "certifi" +version = "2026.4.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, +] + [[package]] name = "click" version = "8.3.1" @@ -44,6 +104,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, ] +[[package]] +name = "git-cliff" +version = "2.13.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/57/b12494e2cbc3c9154c942e64659b5aec2b1ce9f12d07f6dc6167e2c63ae5/git_cliff-2.13.1.tar.gz", hash = "sha256:e949ea9c3951ba6037b99eec465162be2584f27f0836ace45f44d6f45650f8c6", size = 113119, upload-time = "2026-04-26T10:33:42.331Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/dd/24768c3c0030710d36706c17b997d06aee27cb76b27ab2abb058ae254175/git_cliff-2.13.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:08a9cb0ec760e165210ed22fefa295b6549a3520b420db995ccbb3620cbb1fbe", size = 7260035, upload-time = "2026-04-26T10:33:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/22/df/842973ead79d27a58cd1eccd167191c0a71513e5c1e9dc30337dafdb7d36/git_cliff-2.13.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e92cf470ecbe73f7d2963dfa80e8961a6b76888d0c19949b0f028a28a0a0470c", size = 6854384, upload-time = "2026-04-26T10:33:18.808Z" }, + { url = "https://files.pythonhosted.org/packages/7c/4d/6d6efa7d61be8632563990ccd402e401695e4a85a0bb1002f28730d03268/git_cliff-2.13.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e8d8e420adf6a36b97e0fbdbf2b07e47712199a9baf3675c9a759430243ea26", size = 7308164, upload-time = "2026-04-26T10:33:20.869Z" }, + { url = "https://files.pythonhosted.org/packages/f0/4a/98b8d2f53a2d0b7d313e98ab363ad7e0d6a514e878a8d678f22402cb0ec7/git_cliff-2.13.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab059d671565189faa4f3858b2fb42535aa39fe265ad95d84d5c116a2724fc7", size = 7687163, upload-time = "2026-04-26T10:33:23.096Z" }, + { url = "https://files.pythonhosted.org/packages/c7/07/cdd149b3909644aa3f0be7960406d9bbb38598f8618e039ac48cbb43ded6/git_cliff-2.13.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:a93db30da45967c42df607fbbc2092111fcd576b0ca9e2fbddd3f653d8c71be7", size = 7317670, upload-time = "2026-04-26T10:33:25.323Z" }, + { url = "https://files.pythonhosted.org/packages/2e/11/6d377a7f3113f6e26d87a28a32013eb05bd62bce176d6f8ee808e4868c1f/git_cliff-2.13.1-py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df9f5a2bd16e5225030c9c2362e6ac70b34a906c0fbb83f8cbf5ae46932ba0d2", size = 7502294, upload-time = "2026-04-26T10:33:27.315Z" }, + { url = "https://files.pythonhosted.org/packages/80/6b/e1da9acf3aec99e6600be02b6ce0c9e8bd42d072e3120384514c905231e2/git_cliff-2.13.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c12276784d280aa6a7148d3e52ff139e891f4c97720cd9be581b19892ea39fe0", size = 7927258, upload-time = "2026-04-26T10:33:29.554Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ea/9f2188a5e474e5f02193d9c1cdf7028773d483a3f508a1df4f1d93c9cc80/git_cliff-2.13.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:17da93dc605cbc48c762770402067fa726437cedbd62514f9caef6e0ccb58a43", size = 7308153, upload-time = "2026-04-26T10:33:31.589Z" }, + { url = "https://files.pythonhosted.org/packages/b3/70/5e2b2a0e42c07956f911e1eccd6dc6d79b96fc6c8a604a526c1ee0474c84/git_cliff-2.13.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cd4a08cf3f638ec71d2ed451aa8673bef99e1107a36366153db97ca18d981655", size = 7502287, upload-time = "2026-04-26T10:33:33.894Z" }, + { url = "https://files.pythonhosted.org/packages/05/50/cc4c1d3d360621c0235d66d2c74472d9993d8aadf23ffa311eaf29d7a3aa/git_cliff-2.13.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c5bb87f6e1db18be09e50c9d59234dc949713e20c2700e94eca378d22ad79719", size = 7927253, upload-time = "2026-04-26T10:33:36.205Z" }, + { url = "https://files.pythonhosted.org/packages/86/5d/717d30f37dad65a6cc5220b04a3ef1bc44c31fb56d0ce2895114e159df4f/git_cliff-2.13.1-py3-none-win32.whl", hash = "sha256:c8878972e0a6c26d9137fc406a611116239333578d95ac05064d2807920bd83c", size = 6718261, upload-time = "2026-04-26T10:33:38.1Z" }, + { url = "https://files.pythonhosted.org/packages/99/b2/99fac50978b9a90bfec0f1b89354a667ec83f4990301f6c708abce05484e/git_cliff-2.13.1-py3-none-win_amd64.whl", hash = "sha256:856d831a0bede9c258229dbd4d4c2b1c0810d8fce3d3882729669e8dc09c72bf", size = 7714969, upload-time = "2026-04-26T10:33:40.163Z" }, +] + [[package]] name = "griffelib" version = "2.0.0" @@ -53,6 +133,52 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl", hash = "sha256:01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f", size = 142004, upload-time = "2026-02-09T19:09:40.561Z" }, ] +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -74,6 +200,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + [[package]] name = "markupsafe" version = "3.0.3" @@ -137,6 +275,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "mergedeep" version = "1.3.4" @@ -256,6 +403,122 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, +] + [[package]] name = "pygments" version = "2.19.2" @@ -302,6 +565,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + [[package]] name = "pyyaml" version = "6.0.3" @@ -360,6 +632,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, ] +[[package]] +name = "questionary" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/45/eafb0bba0f9988f6a2520f9ca2df2c82ddfa8d67c95d6625452e97b204a5/questionary-2.1.1.tar.gz", hash = "sha256:3d7e980292bb0107abaa79c68dd3eee3c561b83a0f89ae482860b181c8bd412d", size = 25845, upload-time = "2025-08-28T19:00:20.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rich-click" +version = "1.9.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/27/091e140ea834272188e63f8dd6faac1f5c687582b687197b3e0ec3c78ebf/rich_click-1.9.7.tar.gz", hash = "sha256:022997c1e30731995bdbc8ec2f82819340d42543237f033a003c7b1f843fc5dc", size = 74838, upload-time = "2026-01-31T04:29:27.707Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/e5/d708d262b600a352abe01c2ae360d8ff75b0af819b78e9af293191d928e6/rich_click-1.9.7-py3-none-any.whl", hash = "sha256:2f99120fca78f536e07b114d3b60333bc4bb2a0969053b1250869bcdc1b5351b", size = 71491, upload-time = "2026-01-31T04:29:26.777Z" }, +] + [[package]] name = "ruff" version = "0.15.4" @@ -394,12 +705,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "tomlkit" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/db/03eaf4331631ef6b27d6e3c9b68c54dc6f0d63d87201fed600cc409307fd/tomlkit-0.15.0.tar.gz", hash = "sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3", size = 161875, upload-time = "2026-05-10T07:38:22.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/43/8bd850ee71a191bf072e31302c73a66be413fecdd98fdcd111ecbcce13ca/tomlkit-0.15.0-py3-none-any.whl", hash = "sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738", size = 41328, upload-time = "2026-05-10T07:38:23.517Z" }, +] + [[package]] name = "tryke" source = { editable = "." } [package.dev-dependencies] dev = [ + { name = "bump-my-version" }, + { name = "git-cliff" }, { name = "mkdocstrings-python" }, { name = "pygments" }, { name = "pygments-ansi-color" }, @@ -413,6 +735,8 @@ dev = [ [package.metadata.requires-dev] dev = [ + { name = "bump-my-version", specifier = ">=1.3" }, + { name = "git-cliff", specifier = ">=2.12" }, { name = "mkdocstrings-python", specifier = ">=1.16.12" }, { name = "pygments", specifier = "<2.20" }, { name = "pygments-ansi-color", specifier = ">=0.3.0" }, @@ -446,6 +770,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/8f/bf041a06260d77662c0605e56dacfe90b786bf824cbe1aed238d15fe5e84/ty-0.0.34-py3-none-win_arm64.whl", hash = "sha256:ea09108cbcb16b6b06d7596312b433bf49681e78d30e4dc7fb3c1b248a95e09a", size = 10846945, upload-time = "2026-05-01T23:06:44.428Z" }, ] +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + [[package]] name = "watchdog" version = "6.0.0" @@ -470,6 +815,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] +[[package]] +name = "wcmatch" +version = "10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bracex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/3e/c0bdc27cf06f4e47680bd5803a07cb3dfd17de84cde92dd217dcb9e05253/wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af", size = 117421, upload-time = "2025-06-22T19:14:02.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/d8/0d1d2e9d3fabcf5d6840362adcf05f8cf3cd06a73358140c3a97189238ae/wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a", size = 39854, upload-time = "2025-06-22T19:14:00.978Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, +] + [[package]] name = "zensical" version = "0.0.26" From 7679d83c16fda2cea03583e3167ac825d8f15543 Mon Sep 17 00:00:00 2001 From: Justin Chapman Date: Mon, 25 May 2026 19:20:11 -0400 Subject: [PATCH 6/9] some fixes --- .markdownlint-cli2.yaml | 2 + CHANGELOG.md | 117 ++++++++++++++++++++++++++++++++++++++++ cliff.toml | 21 ++++---- pyproject.toml | 2 +- scripts/release.sh | 14 +++++ 5 files changed, 144 insertions(+), 12 deletions(-) diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index 8a90251..11f1b27 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -17,3 +17,5 @@ config: - ul - video MD041: false + MD024: + siblings_only: true diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29..b9b3bb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1,117 @@ +## [unreleased] + +### Features + +- Add configurable discovery cache directory (#128) +- Feat: add clean cache command (#129) + +## [0.0.29] - 2026-05-18 + +### Bug Fixes + +- Fix(reporter): honor --collect-only in next, sugar, dot, junit (#115) +- Fix(server): close stale-worker race via in-band did_change RPC (#118) +- Fix multiline CLI diagnostics (#124) + +### Documentation + +- Docs: add highlights to README, align index.md getting-started with README (#121) + +### Features + +- Highlight received assertion values (#123) +- Add watch shortcut to clear results (#125) + +## [0.0.28] - 2026-05-08 + +## [0.0.27] - 2026-05-03 + +## [0.0.26] - 2026-05-02 + +### Bug Fixes + +- Remove interpreter version check from `tryke_runner` (#92) + +### Documentation + +- Update documentation examples with labeled expectations (#87) + +### Features + +- Feat(cases): allow @test("label").cases(...) composition (#90) + +## [0.0.25] - 2026-04-28 + +### Features + +- Feat(reporter): add `next` and `sugar` reporters (#71) +- Add --no-progress flag to disable terminal native progress bar (#72) + +## [0.0.24] - 2026-04-26 + +### Bug Fixes + +- Fix(runner): drain worker stderr to prevent RPC hang on chatty suites (#66) +- Replace importlib.reload with worker subprocess restart (#68) + +### Documentation + +- Docs: refresh stale tryke test banner version to 0.0.23 (#65) + +### Features + +- Feat(discovery): restrict walk + skip import graph when paths are passed (#64) +- Feat(hooks): accept Annotated[T, Depends(...)] alongside default-form (#67) + +## [0.0.23] - 2026-04-25 + +## [0.0.22] - 2026-04-25 + +### Features + +- Watch: add --all flag to rerun the full test set on every change (#59) +- Feat(discovery): track PEP 810 lazy imports in dependency graph (#60) +- Feat(discovery): resolve absolute imports across multiple src roots (#61) +- Test labels (#62) + +## [0.0.21] - 2026-04-23 + +## [0.0.20] - 2026-04-23 + +## [0.0.19] - 2026-04-23 + +### Documentation + +- Docs: correct dot-reporter glyphs and add to_be_instance_of matcher (#53) +- Docs: add session continuity and commit cadence to LLM migration prompt (#55) +- Docs: drop stale _all/before_all/wrap_all hook terminology (#56) + +## [0.0.18] - 2026-04-19 + +## [0.0.17] - 2026-04-18 + +## [0.0.15] - 2026-04-15 + +## [0.0.14] - 2026-04-14 + +## [0.0.13] - 2026-03-29 + +## [0.0.12] - 2026-03-26 + +## [0.0.11] - 2026-03-21 + +## [0.0.10] - 2026-03-17 + +## [0.0.9] - 2026-03-17 + +## [0.0.7] - 2026-03-09 + +## [0.0.6] - 2026-03-08 + +## [0.0.5] - 2026-03-08 + +## [0.0.4] - 2026-02-28 + +## [0.0.3] - 2026-02-28 + +## [0.0.2] - 2026-02-28 diff --git a/cliff.toml b/cliff.toml index f09ea44..fdf2d2e 100644 --- a/cliff.toml +++ b/cliff.toml @@ -3,13 +3,12 @@ # ensuring git-cliff --prepend leaves a blank line before any existing content. trim = false body = """{% if version %}## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}{% else %}## [unreleased]{% endif %} - -{% for group, commits in commits | group_by(attribute="group") %}### {{ group | striptags | trim | upper_first }} +{% for group, commits in commits | group_by(attribute="group") %} +### {{ group | striptags | trim | upper_first }} {% for commit in commits %}- {{ commit.message | upper_first }} -{% endfor %}{% if not loop.last %} -{% endif %}{% endfor %} -{% if contributors %}### Contributors +{% endfor %}{% endfor %}{% if contributors %} +### Contributors {% for contributor in contributors %}- @{{ contributor.username }} {% endfor %}{% endif %} @@ -30,11 +29,11 @@ commit_preprocessors = [ # Groups are driven by PR labels, not commit message prefixes. # Commits without a recognised label are skipped. commit_parsers = [ - { label = "^enhancement$", group = "Features" }, - { label = "^bug$", group = "Bug Fixes" }, - { label = "^breaking$", group = "Breaking Changes" }, - { label = "^documentation$", group = "Documentation" }, - { label = "^performance$", group = "Performance" }, - { label = "^internal$", skip = true }, + { field = "github.pr_labels", pattern = "enhancement", group = "Features" }, + { field = "github.pr_labels", pattern = "bug(fix)?", group = "Bug Fixes" }, + { field = "github.pr_labels", pattern = "breaking", group = "Breaking Changes" }, + { field = "github.pr_labels", pattern = "documentation", group = "Documentation" }, + { field = "github.pr_labels", pattern = "performance", group = "Performance" }, + { field = "github.pr_labels", pattern = "internal", skip = true }, { skip = true }, ] diff --git a/pyproject.toml b/pyproject.toml index 762215f..3766065 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,7 +86,7 @@ dev = [ ] [tool.bumpversion] -current_version = "0.0.28" +current_version = "0.0.29" commit = true tag = true tag_name = "v{new_version}" diff --git a/scripts/release.sh b/scripts/release.sh index b1616ef..025996f 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -8,6 +8,18 @@ if [[ "$bump_type" != "patch" && "$bump_type" != "minor" && "$bump_type" != "maj exit 1 fi +CARGO_VERSION=$( + cargo metadata --no-deps --format-version 1 | + uv run python -c 'import json, sys; print(next(package["version"] for package in json.load(sys.stdin)["packages"] if package["name"] == "tryke"))' +) +BUMP_VERSION=$(uv run bump-my-version show current_version) + +if [[ "$CARGO_VERSION" != "$BUMP_VERSION" ]]; then + echo "Error: Cargo.toml version ($CARGO_VERSION) does not match bump-my-version current_version ($BUMP_VERSION)." >&2 + echo "Update [tool.bumpversion].current_version before releasing." >&2 + exit 1 +fi + NEXT_VERSION=$(uv run bump-my-version show new_version --increment "$bump_type") NEXT_TAG="v$NEXT_VERSION" echo "Releasing $NEXT_TAG" @@ -19,6 +31,8 @@ echo "CHANGELOG.md updated. Edit it now, then press Enter to commit and release echo "(Ctrl+C to abort at any time)" read -r -p "Press Enter to continue: " +uvx prek run end-of-file-fixer markdownlint-cli2 --files CHANGELOG.md + git add CHANGELOG.md git commit -m "docs: update changelog for $NEXT_TAG" From ef2c9ce6636d7b0bc7cccea1dec6ded74f949516 Mon Sep 17 00:00:00 2001 From: Justin Chapman Date: Mon, 25 May 2026 19:35:00 -0400 Subject: [PATCH 7/9] more fixes --- CHANGELOG.md | 221 ++++++++++++++++++++++++++++++++++++++++++++------- cliff.toml | 26 +++--- 2 files changed, 207 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9b3bb7..0907c21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,18 @@ -## [unreleased] +## unreleased ### Features - Add configurable discovery cache directory (#128) - Feat: add clean cache command (#129) -## [0.0.29] - 2026-05-18 +### Contributors + +- @sarvesh1327 +- @thejchap + +## 0.0.29 + +Released on 2026-05-18. ### Bug Fixes @@ -22,11 +29,30 @@ - Highlight received assertion values (#123) - Add watch shortcut to clear results (#125) -## [0.0.28] - 2026-05-08 +### Contributors + +- @thejchap + +## 0.0.28 + +Released on 2026-05-08. + +### Contributors + +- @thejchap +- @dependabot[bot] + +## 0.0.27 + +Released on 2026-05-03. -## [0.0.27] - 2026-05-03 +### Contributors -## [0.0.26] - 2026-05-02 +- @thejchap + +## 0.0.26 + +Released on 2026-05-02. ### Bug Fixes @@ -40,14 +66,26 @@ - Feat(cases): allow @test("label").cases(...) composition (#90) -## [0.0.25] - 2026-04-28 +### Contributors + +- @thejchap + +## 0.0.25 + +Released on 2026-04-28. ### Features - Feat(reporter): add `next` and `sugar` reporters (#71) - Add --no-progress flag to disable terminal native progress bar (#72) -## [0.0.24] - 2026-04-26 +### Contributors + +- @thejchap + +## 0.0.24 + +Released on 2026-04-26. ### Bug Fixes @@ -63,9 +101,21 @@ - Feat(discovery): restrict walk + skip import graph when paths are passed (#64) - Feat(hooks): accept Annotated[T, Depends(...)] alongside default-form (#67) -## [0.0.23] - 2026-04-25 +### Contributors + +- @thejchap + +## 0.0.23 -## [0.0.22] - 2026-04-25 +Released on 2026-04-25. + +### Contributors + +- @thejchap + +## 0.0.22 + +Released on 2026-04-25. ### Features @@ -74,11 +124,30 @@ - Feat(discovery): resolve absolute imports across multiple src roots (#61) - Test labels (#62) -## [0.0.21] - 2026-04-23 +### Contributors + +- @thejchap +- @claude + +## 0.0.21 + +Released on 2026-04-23. + +### Contributors + +- @thejchap + +## 0.0.20 -## [0.0.20] - 2026-04-23 +Released on 2026-04-23. -## [0.0.19] - 2026-04-23 +### Contributors + +- @thejchap + +## 0.0.19 + +Released on 2026-04-23. ### Documentation @@ -86,32 +155,130 @@ - Docs: add session continuity and commit cadence to LLM migration prompt (#55) - Docs: drop stale _all/before_all/wrap_all hook terminology (#56) -## [0.0.18] - 2026-04-19 +### Contributors + +- @thejchap +- @claude + +## 0.0.18 + +Released on 2026-04-19. + +### Contributors + +- @thejchap +- @claude + +## 0.0.17 + +Released on 2026-04-18. + +### Contributors + +- @thejchap + +## 0.0.15 + +Released on 2026-04-15. + +### Contributors + +- @thejchap + +## 0.0.14 + +Released on 2026-04-14. + +### Contributors + +- @thejchap + +## 0.0.13 + +Released on 2026-03-29. + +### Contributors + +- @thejchap +- @dependabot[bot] + +## 0.0.12 + +Released on 2026-03-26. + +### Contributors + +- @thejchap + +## 0.0.11 + +Released on 2026-03-21. + +### Contributors + +- @thejchap + +## 0.0.10 + +Released on 2026-03-17. + +### Contributors + +- @thejchap + +## 0.0.9 + +Released on 2026-03-17. + +### Contributors + +- @thejchap + +## 0.0.7 + +Released on 2026-03-09. + +### Contributors + +- @thejchap +- @dependabot[bot] + +## 0.0.6 + +Released on 2026-03-08. + +### Contributors + +- @thejchap + +## 0.0.5 + +Released on 2026-03-08. -## [0.0.17] - 2026-04-18 +### Contributors -## [0.0.15] - 2026-04-15 +- @thejchap -## [0.0.14] - 2026-04-14 +## 0.0.4 -## [0.0.13] - 2026-03-29 +Released on 2026-02-28. -## [0.0.12] - 2026-03-26 +### Contributors -## [0.0.11] - 2026-03-21 +- @thejchap -## [0.0.10] - 2026-03-17 +## 0.0.3 -## [0.0.9] - 2026-03-17 +Released on 2026-02-28. -## [0.0.7] - 2026-03-09 +### Contributors -## [0.0.6] - 2026-03-08 +- @thejchap -## [0.0.5] - 2026-03-08 +## 0.0.2 -## [0.0.4] - 2026-02-28 +Released on 2026-02-28. -## [0.0.3] - 2026-02-28 +### Contributors -## [0.0.2] - 2026-02-28 +- @thejchap diff --git a/cliff.toml b/cliff.toml index fdf2d2e..772676a 100644 --- a/cliff.toml +++ b/cliff.toml @@ -2,15 +2,17 @@ # trim = false so the trailing blank line in the body template is preserved, # ensuring git-cliff --prepend leaves a blank line before any existing content. trim = false -body = """{% if version %}## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}{% else %}## [unreleased]{% endif %} +body = """{% if version %}## {{ version | trim_start_matches(pat="v") }} + +Released on {{ timestamp | date(format="%Y-%m-%d") }}.{% else %}## unreleased{% endif %} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | striptags | trim | upper_first }} {% for commit in commits %}- {{ commit.message | upper_first }} -{% endfor %}{% endfor %}{% if contributors %} +{% endfor %}{% endfor %}{% if github.contributors %} ### Contributors -{% for contributor in contributors %}- @{{ contributor.username }} +{% for contributor in github.contributors %}- @{{ contributor.username }} {% endfor %}{% endif %} """ @@ -23,17 +25,15 @@ conventional_commits = false filter_unconventional = false # Strip everything from the first newline so that subjects wrapped across # two lines (without the required blank-line separator) still parse correctly. -commit_preprocessors = [ - { pattern = "\\n[\\s\\S]*", replace = "" }, -] +commit_preprocessors = [{ pattern = "\\n[\\s\\S]*", replace = "" }] # Groups are driven by PR labels, not commit message prefixes. # Commits without a recognised label are skipped. commit_parsers = [ - { field = "github.pr_labels", pattern = "enhancement", group = "Features" }, - { field = "github.pr_labels", pattern = "bug(fix)?", group = "Bug Fixes" }, - { field = "github.pr_labels", pattern = "breaking", group = "Breaking Changes" }, - { field = "github.pr_labels", pattern = "documentation", group = "Documentation" }, - { field = "github.pr_labels", pattern = "performance", group = "Performance" }, - { field = "github.pr_labels", pattern = "internal", skip = true }, - { skip = true }, + { field = "github.pr_labels", pattern = "enhancement", group = "Features" }, + { field = "github.pr_labels", pattern = "bug(fix)?", group = "Bug Fixes" }, + { field = "github.pr_labels", pattern = "breaking", group = "Breaking Changes" }, + { field = "github.pr_labels", pattern = "documentation", group = "Documentation" }, + { field = "github.pr_labels", pattern = "performance", group = "Performance" }, + { field = "github.pr_labels", pattern = "internal", skip = true }, + { skip = true }, ] From 8e12b3298154b9e432984d378943f5d487b06982 Mon Sep 17 00:00:00 2001 From: Justin Chapman Date: Mon, 25 May 2026 19:45:22 -0400 Subject: [PATCH 8/9] cleanup --- CHANGELOG.md | 101 +++++++++++++++++++++++++++++++++++++++++---------- cliff.toml | 4 +- 2 files changed, 84 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0907c21..5b03f6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,13 @@ ## unreleased +### Documentation + +- Mention uvx quickstart and playground in README and getting started (#127) + ### Features - Add configurable discovery cache directory (#128) -- Feat: add clean cache command (#129) +- Add clean cache command (#129) ### Contributors @@ -16,16 +20,20 @@ Released on 2026-05-18. ### Bug Fixes -- Fix(reporter): honor --collect-only in next, sugar, dot, junit (#115) -- Fix(server): close stale-worker race via in-band did_change RPC (#118) +- Skip teardown drain when event loop is closed (#109) +- Surface worker spawn and hook replay errors in test results (#107) +- Honor --collect-only in next, sugar, dot, and junit reporters (#115) +- Close stale worker race with in-band did_change RPC (#118) - Fix multiline CLI diagnostics (#124) ### Documentation -- Docs: add highlights to README, align index.md getting-started with README (#121) +- Add highlights to README and align getting started with README (#121) ### Features +- Format durations over a minute as M:SS.SS in reporter summaries (#116) +- Remove generated examples and default to watch mode (#120) - Highlight received assertion values (#123) - Add watch shortcut to clear results (#125) @@ -37,6 +45,10 @@ Released on 2026-05-18. Released on 2026-05-08. +### Features + +- Add --now flag to run tests immediately on watch startup (#102) + ### Contributors - @thejchap @@ -46,6 +58,10 @@ Released on 2026-05-08. Released on 2026-05-03. +### Features + +- Unify Rust and Python worker logging via TRYKE_LOG (#94) + ### Contributors - @thejchap @@ -54,17 +70,22 @@ Released on 2026-05-03. Released on 2026-05-02. +### Breaking Changes + +- Fold tryke watch into tryke test --watch (#73) + ### Bug Fixes -- Remove interpreter version check from `tryke_runner` (#92) +- Remove interpreter version check from tryke_runner (#92) ### Documentation +- Improve CLI documentation generation with detailed help text (#79) - Update documentation examples with labeled expectations (#87) ### Features -- Feat(cases): allow @test("label").cases(...) composition (#90) +- Support labeled test cases with @test("label").cases(...) (#90) ### Contributors @@ -76,8 +97,8 @@ Released on 2026-04-28. ### Features -- Feat(reporter): add `next` and `sugar` reporters (#71) -- Add --no-progress flag to disable terminal native progress bar (#72) +- Add next and sugar reporters (#71) +- Add --no-progress flag to disable terminal progress bars (#72) ### Contributors @@ -89,17 +110,17 @@ Released on 2026-04-26. ### Bug Fixes -- Fix(runner): drain worker stderr to prevent RPC hang on chatty suites (#66) +- Drain worker stderr to prevent RPC hangs on chatty suites (#66) - Replace importlib.reload with worker subprocess restart (#68) ### Documentation -- Docs: refresh stale tryke test banner version to 0.0.23 (#65) +- Refresh stale tryke test banner version to 0.0.23 (#65) ### Features -- Feat(discovery): restrict walk + skip import graph when paths are passed (#64) -- Feat(hooks): accept Annotated[T, Depends(...)] alongside default-form (#67) +- Restrict discovery walk and skip import graph when paths are passed (#64) +- Accept Annotated[T, Depends(...)] alongside default-form dependencies (#67) ### Contributors @@ -117,12 +138,16 @@ Released on 2026-04-25. Released on 2026-04-25. +### Bug Fixes + +- Replay hooks on respawn and stop unsafe test retries (#58) + ### Features -- Watch: add --all flag to rerun the full test set on every change (#59) -- Feat(discovery): track PEP 810 lazy imports in dependency graph (#60) -- Feat(discovery): resolve absolute imports across multiple src roots (#61) -- Test labels (#62) +- Add --all flag to rerun the full test set on every change (#59) +- Track PEP 810 lazy imports in dependency graph (#60) +- Resolve absolute imports across multiple source roots (#61) +- Add test labels (#62) ### Contributors @@ -149,11 +174,22 @@ Released on 2026-04-23. Released on 2026-04-23. +### Bug Fixes + +- Share event loop across async fixtures and tests, and accept patch versions (#51) +- Tag server runs with run_id and serialize concurrent runs (#54) + ### Documentation -- Docs: correct dot-reporter glyphs and add to_be_instance_of matcher (#53) -- Docs: add session continuity and commit cadence to LLM migration prompt (#55) -- Docs: drop stale _all/before_all/wrap_all hook terminology (#56) +- Add comprehensive pytest-to-Tryke migration guide (#49) +- Correct dot-reporter glyphs and add to_be_instance_of matcher (#53) +- Add session continuity and commit cadence to LLM migration prompt (#55) +- Drop stale _all/before_all hook terminology and fix --lf migration row (#56) + +### Features + +- Add to_be_instance_of matcher for type checking (#50) +- Add fixtures, parametrization, Python 3.15 support, and docs (#52) ### Contributors @@ -164,6 +200,10 @@ Released on 2026-04-23. Released on 2026-04-19. +### Bug Fixes + +- Ship python/tryke_guard.py in the built wheel (#48) + ### Contributors - @thejchap @@ -173,6 +213,11 @@ Released on 2026-04-19. Released on 2026-04-18. +### Features + +- Add @test.cases parametrization primitive (#46) +- Add in-source testing via tryke_guard.__TRYKE_TESTING__ (#47) + ### Contributors - @thejchap @@ -189,6 +234,10 @@ Released on 2026-04-15. Released on 2026-04-14. +### Features + +- Add @fixture and Depends() for setup, teardown, and DI (#39) + ### Contributors - @thejchap @@ -230,6 +279,15 @@ Released on 2026-03-17. Released on 2026-03-17. +### Documentation + +- Revise documentation structure and installation guides (#30) + +### Features + +- Improve changed-test selection, discovery, docs, and benchmarks (#18) +- Add doctest support for Python doctests (#32) + ### Contributors - @thejchap @@ -238,6 +296,11 @@ Released on 2026-03-17. Released on 2026-03-09. +### Documentation + +- Update README (#9) +- Update README (#10) + ### Contributors - @thejchap diff --git a/cliff.toml b/cliff.toml index 772676a..b323a44 100644 --- a/cliff.toml +++ b/cliff.toml @@ -8,7 +8,7 @@ Released on {{ timestamp | date(format="%Y-%m-%d") }}.{% else %}## unreleased{% {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | striptags | trim | upper_first }} -{% for commit in commits %}- {{ commit.message | upper_first }} +{% for commit in commits %}- {% if commit.remote.pr_title %}{{ commit.remote.pr_title | upper_first }}{% if commit.remote.pr_number %} (#{{ commit.remote.pr_number }}){% endif %}{% else %}{{ commit.message | upper_first }}{% endif %} {% endfor %}{% endfor %}{% if github.contributors %} ### Contributors @@ -29,7 +29,7 @@ commit_preprocessors = [{ pattern = "\\n[\\s\\S]*", replace = "" }] # Groups are driven by PR labels, not commit message prefixes. # Commits without a recognised label are skipped. commit_parsers = [ - { field = "github.pr_labels", pattern = "enhancement", group = "Features" }, + { field = "github.pr_labels", pattern = "(feature|enhancement)", group = "Features" }, { field = "github.pr_labels", pattern = "bug(fix)?", group = "Bug Fixes" }, { field = "github.pr_labels", pattern = "breaking", group = "Breaking Changes" }, { field = "github.pr_labels", pattern = "documentation", group = "Documentation" }, From 5ebf7f1c8acadef265b885dc6e5ce14e237207f5 Mon Sep 17 00:00:00 2001 From: Justin Chapman Date: Mon, 25 May 2026 19:57:23 -0400 Subject: [PATCH 9/9] address copilot comment --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f092753..0042e58 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,6 +63,8 @@ jobs: - uses: astral-sh/setup-uv@v7 - name: Create GitHub release run: | + set -euo pipefail + uv run git-cliff --tag "${{ github.ref_name }}" --current --strip header \ | gh release create "${{ github.ref_name }}" \ --title "${{ github.ref_name }}" \