Skip to content

chore(release): v2.6.0 - #198

Merged
MarTrepodi merged 64 commits into
mainfrom
release/v2.6.0
Oct 22, 2026
Merged

MarTrepodi merged 64 commits into
mainfrom
release/v2.6.0

Conversation

@MarTrepodi

Copy link
Copy Markdown
Collaborator

Automated release prep for v2.6.0. CHANGELOG.md regenerated via git-changelog.

Merging promotes develop -> main with the changelog already in place.
Afterwards, run the release workflow on main to build, publish, and tag v2.6.0.

No open issues are referenced by the 22 pull requests merged since v2.5.0.


v2.6.0 (2026-10-22)

Features

  • helpers: add get_era_units for an Era's unit roster (38b44cd)

Bug Fixes

  • statcalc: build units that start above one star (c19921b)
  • parity: pass strict=True to zip in the list comparators (0cdc467)

Code Refactoring

  • helpers: narrow TB reward table ids to str in get_tb_mission_scores (4edfb76)

Docs

  • transport errors arrive as SwgohComlinkException (ed3d204)
  • api: order client pages for first-time readers (df8dc90)
  • document the accidental major bump gotcha in commit messages (93e05eb)

Merge note: main carried six docs/CI commits from #190 and #192 that develop later revised, and they conflicted in .github/workflows/docs.yml and CONTRIBUTING.md. origin/main is merged into this branch with every conflict resolved to the develop side. The tree is byte-identical to the staged release/v2.6.0, so this PR ships exactly develop plus the changelog. Merge with Create a merge commit.

🤖 Generated with Claude Code

MarTrepodi and others added 30 commits October 13, 2026 08:30
git-changelog's angular convention marks a commit as major when any
message line matches ^break(s|ing changes?)?[ :] case-insensitively, so
a wrapped body line in 32039aa computed v3.0.0 instead of v2.5.0.

After "Compute next version", a new step lists every triggering line in
the job summary whenever the bump is a major. It reuses git-changelog's
own parse, so the commits and regex cannot drift. With bump=auto the run
stops before anything is pushed unless one line is the exact
"BREAKING CHANGE: <description>" footer; an explicit bump=major is only
reported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The angular convention's subject regex has no "!", so git-changelog
silently drops "feat!: ..." style commits from the changelog and never
treats them as major. Enforce subject-exclamation-mark=never so they
fail Commit Lint and the local commit-msg hook instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Explain that any body line starting with "break", "breaks" or "breaking
change(s)" bumps the major version, that only the exact upper-case
footer form should be used, and how prepare-release now reports and
blocks an unintended major.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bumps [typing-extensions](https://github.com/python/typing_extensions) from 4.15.0 to 4.16.0.
- [Release notes](https://github.com/python/typing_extensions/releases)
- [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md)
- [Commits](python/typing_extensions@4.15.0...4.16.0)

---
updated-dependencies:
- dependency-name: typing-extensions
  dependency-version: 4.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
The local hook (third-party rev v9.21.0) resolved @commitlint/cli 19.8.1
with an unpinned config-conventional 20.5.0, while CI installed whatever
npm served (21.2.3 of both). Rules such as subject-exclamation-mark
behave differently across those majors.

Replace the third-party hook with a local node hook that pins cli,
config-conventional and Node exactly, and have the Commit Lint workflow
run that hook through pre-commit instead of its own npm install. The
hook environment is cached on the config's hash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Switching the ecosystem to uv made Dependabot open one PR per locked
dependency, and every one failed Commit Lint: with no Dependabot commit
in main's recent history to copy, it guessed "build(deps-dev): Bump"
from human commits, and subject-case rejects the capital.

Group updates (all actions; ruff and ty; everything else in uv) and pin
the "chore(deps)" prefix the existing Dependabot commits already use.
Casing still comes from Dependabot's heuristic, so Commit Lint now skips
commits authored by Dependabot on PRs Dependabot opened; human commits
pushed onto those PRs are still linted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI used unpinned `uvx ruff` (latest on PyPI), pre-commit pinned
ruff-pre-commit at v0.15.4 (not tracked by Dependabot), and uv.lock
held 0.15.15. Make uv.lock the single source of truth so Dependabot
uv bumps move all three together.

- Add a `lint` dependency group with ruff; `dev` includes it.
- CI lint job: `uv sync --locked --only-group lint`, then
  `uv run --no-sync ruff ...`.
- pre-commit: replace ruff-pre-commit with local `uv run ruff` hooks,
  matching the existing local ty hook.
- Update CONTRIBUTING.md and the PR template to `uv run ruff`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n_scores

The set comprehension filtered on one zone.get("encounterRewardTableId")
call but yielded a second, so its elements stayed typed Any | None. ty
0.0.86 (Dependabot PR #175) rejects sorting such a set. Bind the id with
a walrus in the filter, as the scoring loop below already does, and
annotate the set as set[str]. Behaviour is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both _compare helpers return early when list lengths differ, so the zip
always sees equal-length inputs. strict=True states that invariant and
satisfies ruff B905. The scripts are also run through ruff format, which
they had drifted from because CI never checked parity/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI only checked formatting under src/ and tests/, so these drifted.
The pre-commit hygiene hooks also fixed trailing whitespace and final
newlines in a few of them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixtures are only read through json.loads, so the trailing newline added
by end-of-file-fixer does not change any test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The format step had continue-on-error set, so drift never failed the
build. Everything is formatted now, so drop it and widen the check to
examples/ and parity/. Lint parity/ too; examples/ stays out of lint,
matching the pre-commit ruff hook.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ruff 0.17 formats Python code blocks inside Markdown, and the format
check now covers examples/, so the Dependabot ruff 0.17.0 bump would fail
Lint on this file. Apply its formatting (PEP 8 blank lines around the
top-level function) now. ruff 0.15 skips Markdown, so this passes on the
currently locked version too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
refactor(helpers): narrow TB reward table ids to str in get_tb_mission_scores
ci(release): guard prepare-release against accidental major bumps
ci(ci): pin commitlint once and run the same hook in CI
ci(ci): group Dependabot updates and stop linting its own commits
…-extensions-4.16.0

build(deps): Bump typing-extensions from 4.15.0 to 4.16.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 9.0.3 to 9.1.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@9.0.3...9.1.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [ty](https://github.com/astral-sh/ty) from 0.0.56 to 0.0.86.
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ty@0.0.56...0.0.86)

---
updated-dependencies:
- dependency-name: ty
  dependency-version: 0.0.86
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
…-9.1.1

build(deps-dev): Bump pytest from 9.0.3 to 9.1.1
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.7.6 to 9.7.7.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](squidfunk/mkdocs-material@9.7.6...9.7.7)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-version: 9.7.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
…-material-9.7.7

build(deps-dev): Bump mkdocs-material from 9.7.6 to 9.7.7
Bumps [git-changelog](https://github.com/pawamoy/git-changelog) from 2.9.4 to 2.10.0.
- [Release notes](https://github.com/pawamoy/git-changelog/releases)
- [Changelog](https://github.com/pawamoy/git-changelog/blob/main/CHANGELOG.md)
- [Commits](pawamoy/git-changelog@2.9.4...2.10.0)

---
updated-dependencies:
- dependency-name: git-changelog
  dependency-version: 2.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…angelog-2.10.0

build(deps-dev): Bump git-changelog from 2.9.4 to 2.10.0
build(deps-dev): Bump ty from 0.0.56 to 0.0.86
MarTrepodi and others added 18 commits October 14, 2026 10:30
Give the SwgohComlink and SwgohComlinkAsync pages the same outline:
Quick Start, Connecting to Comlink, Handling Errors, Retries and Pacing,
Stat Calculation, API Reference.

The sync page previously opened with retry backoff details and had no
quick start; it now shows how to create, use and close a client, and how
to point it at a service and enable HMAC signing. The async page moves
error handling ahead of retries and links to the sync page for the
shared constructor and retry details.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs(api): order client pages for first-time readers
Replace the single-version deploy-pages workflow with mike deploys to a
gh-pages branch so the 2.x product line and the 3.x pre-release line can
share https://swgoh-utils.github.io/comlink-python/ behind Material's
version picker. This is the 2.x half; the 3.x line carries the same
docs.yml and overrides, with `extra.prerelease: true` in mkdocs.yml.

- docs.yml: deploy on main and release/v* (plus manual runs on v* tags);
  the version comes from CHANGELOG.md like release.yml: main -> X.Y +
  `latest`, pre-release lines -> X.Y + `dev` titled "(pre-release)";
  stable release/vX.Y.Z staging branches are skipped. The first stable
  deploy runs `mike set-default latest` so the root keeps opening 2.x.
  fetch-depth 0, bot git identity, contents: write, one gh-pages
  concurrency group, and a guard so forks never publish.
- mkdocs.yml: extra.version.provider mike, default alias `latest`.
- overrides/main.html: "older version" banner (pre-release banner when a
  line sets extra.prerelease).
- docs dependency group: add mike.
- ci.yml: build-check docs with --strict, matching the deploy.
- CONTRIBUTING: "Publishing the docs" with the one-time cutover steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The v1 -> v2 migration guide and README told readers to replace
`except requests.RequestException` with `except httpx.RequestError`, but
the clients catch httpx.RequestError and re-raise SwgohComlinkException,
so that handler never fires. Point readers at SwgohComlinkException and
list the SwgohComlinkHTTPError family (v2.3+) in the hierarchy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Per review: docs deploy from branches named release/*, each published
under its own version; latest/default follows the newest stable release
and pre-releases get an alias for their kind.

- docs.yml: trigger on pushes to release/** (same path filters, plus the
  new helper) and workflow_dispatch; the job runs only in
  swgoh-utils/comlink-python on refs/heads/release/*. main, develop and
  tags no longer deploy.
- .github/scripts/docs_version.py: version = PEP 440 version in the branch
  name (release/v2.5.0 -> 2.5.0); invalid or local versions fail with
  ::error::. Reads `mike list --json`: a stable version takes `latest`
  (and set-default) only if >= every deployed stable; a pre-release takes
  alpha/beta/rc/dev (dev wins) only if >= every deployed version of its
  kind, and never touches latest. Unit tests in
  tests/unit/test_docs_version.py.
- mkdocs.yml: extra.prerelease reads DOCS_PRERELEASE (set from the
  decision), defaulting to the line's own value for local builds;
  check-yaml skips mkdocs.yml (the strict docs build validates it).
- setup-uv cache disabled in the publishing job (zizmor cache-poisoning).
- .gitignore: un-ignore .github/scripts/ (a bare `scripts/` rule hid it).
- CONTRIBUTING: version/alias rules, release timing (prepare-release.yml
  pushes with GITHUB_TOKEN, which does not start workflows, so run the
  deploy by hand), and the cutover steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ci(docs): publish versioned docs from release/* branches with mike
prepare-release.yml pushes release/vX.Y.Z with GITHUB_TOKEN, and GitHub
does not start workflows from GITHUB_TOKEN pushes, so docs.yml's
`push: release/**` trigger never fired for a staged release. Dispatch
docs.yml on the new branch right after pushing it (workflow_dispatch is
the documented exception), which needs `actions: write`.

CONTRIBUTING: drop the manual "run Deploy docs" step, add the
github-pages environment's gh-pages deployment branch to the cutover
(branch-based Pages builds still deploy through that environment, so it
must not be deleted), and record that the cutover is done.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…docs

ci(release): dispatch the docs deploy on the staged release branch
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.17.0 to 0.17.1.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.17.0...0.17.1)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.17.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [ty](https://github.com/astral-sh/ty) from 0.0.86 to 0.0.88.
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ty@0.0.86...0.0.88)

---
updated-dependencies:
- dependency-name: ty
  dependency-version: 0.0.88
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
….17.1

build(deps-dev): Bump ruff from 0.17.0 to 0.17.1
build(deps-dev): Bump ty from 0.0.86 to 0.0.88
List the base ids of an Era's units from the game data eraDefinition
collection: its eraUnitId roster plus its journey unit, with the units
it loans to players added on request (include_loaned=True). With no
era_id the Era active now is read, its window taken as half-open since
consecutive Eras share their boundary millisecond.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(helpers): add get_era_units for an Era's unit roster
GameDataBuilder only promoted a unit's rarity-1 definition to its base
entry, so a unit with no ONE_STAR row was silently dropped from
unitData even though its growth tables were collected. ADELPHIRANGER
starts at 2 stars and was missing as a result.

Use each unit's lowest-rarity definition as its base instead. The
fields the builder reads (skills, gear tiers, relics, categories, crew)
are identical across rarities, so this is equivalent for every unit
that does have a 1-star row. Unknown rarity enums (normalised to 0)
are still ignored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ne-star

fix(statcalc): build units that start above one star
# Conflicts:
#	.github/workflows/docs.yml
#	CONTRIBUTING.md
@github-actions github-actions Bot added documentation Improvements or additions to documentation ci Changes related to continuous integration processes dependencies Updates to package dependency libraries code testing labels Oct 22, 2026
@MarTrepodi
MarTrepodi marked this pull request as ready for review October 22, 2026 16:12
A release PR into main carries every develop commit, and Commit Lint
re-checked all of them. Dependabot's "Bump ..." subjects fail
subject-case and are only exempt on PRs Dependabot opened, so the
v2.6.0 release PR failed the required check on eight commits that had
already passed it on their way into develop.

On PRs into main, also exclude commits reachable from develop, which
requires the same check. PRs into develop lint exactly as before. The
fetch now names its refspecs with "+" so it updates refs that
actions/checkout already created instead of relying on FETCH_HEAD.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MarTrepodi
MarTrepodi merged commit b13bab7 into main Oct 22, 2026
16 checks passed
@MarTrepodi
MarTrepodi deleted the release/v2.6.0 branch October 22, 2026 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci Changes related to continuous integration processes code dependencies Updates to package dependency libraries documentation Improvements or additions to documentation testing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant