fplkit 2.3.1__tar.gz → 2.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. {fplkit-2.3.1 → fplkit-2.3.2}/CHANGELOG.md +8 -0
  2. {fplkit-2.3.1 → fplkit-2.3.2}/PKG-INFO +1 -1
  3. {fplkit-2.3.1 → fplkit-2.3.2}/docs/command-reference.md +1 -1
  4. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/_version.py +2 -2
  5. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_league_recap_history.py +13 -2
  6. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_league_recap.py +67 -0
  7. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/README.md +0 -0
  8. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/TOOLS.md +0 -0
  9. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/create-pr/SKILL.md +0 -0
  10. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/SKILL.md +0 -0
  11. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/references/output-template.md +0 -0
  12. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/references/rules.md +0 -0
  13. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/scripts/_bootstrap.py +0 -0
  14. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/scripts/bench_order.py +0 -0
  15. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/scripts/extract_classic_squad.py +0 -0
  16. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/scripts/starting_xi.py +0 -0
  17. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/scripts/transfer_eval.py +0 -0
  18. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/gw-prep/scripts/validate_draft_waivers.py +0 -0
  19. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/preview-ingest/SKILL.md +0 -0
  20. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/release/SKILL.md +0 -0
  21. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/release-notes/SKILL.md +0 -0
  22. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/squad-builder/SKILL.md +0 -0
  23. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/squad-builder/references/output-template.md +0 -0
  24. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/squad-builder/references/rules.md +0 -0
  25. {fplkit-2.3.1 → fplkit-2.3.2}/.agents/skills/update-gw-prep/SKILL.md +0 -0
  26. {fplkit-2.3.1 → fplkit-2.3.2}/.claude/output-styles/fpl-mate.md +0 -0
  27. {fplkit-2.3.1 → fplkit-2.3.2}/.claude/settings.json +0 -0
  28. {fplkit-2.3.1 → fplkit-2.3.2}/.env.example +0 -0
  29. {fplkit-2.3.1 → fplkit-2.3.2}/.github/workflows/ci.yml +0 -0
  30. {fplkit-2.3.1 → fplkit-2.3.2}/.github/workflows/pr-title.yml +0 -0
  31. {fplkit-2.3.1 → fplkit-2.3.2}/.github/workflows/release.yml +0 -0
  32. {fplkit-2.3.1 → fplkit-2.3.2}/.gitignore +0 -0
  33. {fplkit-2.3.1 → fplkit-2.3.2}/AGENTS.md +0 -0
  34. {fplkit-2.3.1 → fplkit-2.3.2}/CLAUDE.md +0 -0
  35. {fplkit-2.3.1 → fplkit-2.3.2}/CONTRIBUTING.md +0 -0
  36. {fplkit-2.3.1 → fplkit-2.3.2}/LICENSE +0 -0
  37. {fplkit-2.3.1 → fplkit-2.3.2}/README.md +0 -0
  38. {fplkit-2.3.1 → fplkit-2.3.2}/cliff.toml +0 -0
  39. {fplkit-2.3.1 → fplkit-2.3.2}/config/team_ratings_overrides.yaml +0 -0
  40. {fplkit-2.3.1 → fplkit-2.3.2}/docs/architecture.md +0 -0
  41. {fplkit-2.3.1 → fplkit-2.3.2}/docs/custom-analysis.md +0 -0
  42. {fplkit-2.3.1 → fplkit-2.3.2}/docs/fpl-rules.md +0 -0
  43. {fplkit-2.3.1 → fplkit-2.3.2}/docs/images/fpl-player-demo-v1-0.png +0 -0
  44. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/__init__.py +0 -0
  45. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/__init__.py +0 -0
  46. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/action/__init__.py +0 -0
  47. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/action/waiver.py +0 -0
  48. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/analysis/__init__.py +0 -0
  49. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/analysis/bench_order.py +0 -0
  50. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/analysis/captain.py +0 -0
  51. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/analysis/squad_analyzer.py +0 -0
  52. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/analysis/starting_xi.py +0 -0
  53. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/analysis/stats.py +0 -0
  54. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/analysis/transfer_eval.py +0 -0
  55. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/base.py +0 -0
  56. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/common.py +0 -0
  57. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/data/__init__.py +0 -0
  58. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/data/fixture.py +0 -0
  59. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/data/price.py +0 -0
  60. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/data/scout.py +0 -0
  61. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/orchestration/__init__.py +0 -0
  62. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/agents/orchestration/report.py +0 -0
  63. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/__init__.py +0 -0
  64. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/contract.py +0 -0
  65. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/core_insights.py +0 -0
  66. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/dataset_fetcher.py +0 -0
  67. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/football_data.py +0 -0
  68. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/fpl.py +0 -0
  69. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/fpl_draft.py +0 -0
  70. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/historical.py +0 -0
  71. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/historical_types.py +0 -0
  72. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/providers/__init__.py +0 -0
  73. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/providers/_models.py +0 -0
  74. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/providers/anthropic.py +0 -0
  75. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/providers/openai_compat.py +0 -0
  76. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/providers/perplexity.py +0 -0
  77. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/understat.py +0 -0
  78. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/api/vaastav.py +0 -0
  79. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/__init__.py +0 -0
  80. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_banner.py +0 -0
  81. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_context.py +0 -0
  82. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_fines.py +0 -0
  83. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_fines_config.py +0 -0
  84. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_helpers.py +0 -0
  85. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_json.py +0 -0
  86. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_league_recap_data.py +0 -0
  87. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_league_recap_types.py +0 -0
  88. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_plan_grid.py +0 -0
  89. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_review_analysis.py +0 -0
  90. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_review_classic.py +0 -0
  91. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_review_draft.py +0 -0
  92. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/_review_summarisation.py +0 -0
  93. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/allocate.py +0 -0
  94. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/captain.py +0 -0
  95. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/chips.py +0 -0
  96. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/credentials.py +0 -0
  97. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/differentials.py +0 -0
  98. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/doctor.py +0 -0
  99. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/doctor_providers.py +0 -0
  100. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/fdr.py +0 -0
  101. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/fixtures.py +0 -0
  102. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/history.py +0 -0
  103. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/init.py +0 -0
  104. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/intel.py +0 -0
  105. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/league.py +0 -0
  106. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/league_fines.py +0 -0
  107. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/league_recap.py +0 -0
  108. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/player.py +0 -0
  109. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/preview.py +0 -0
  110. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/price_changes.py +0 -0
  111. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/price_history.py +0 -0
  112. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/ratings.py +0 -0
  113. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/returnees.py +0 -0
  114. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/review.py +0 -0
  115. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/sell_prices.py +0 -0
  116. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/squad.py +0 -0
  117. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/stats.py +0 -0
  118. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/status.py +0 -0
  119. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/targets.py +0 -0
  120. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/transfer_eval.py +0 -0
  121. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/waivers.py +0 -0
  122. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/cli/xg.py +0 -0
  123. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/config/defaults.yaml +0 -0
  124. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/config/fixture_predictions.yaml +0 -0
  125. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/config/previews/EXAMPLE.yaml +0 -0
  126. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/config/team_managers.yaml +0 -0
  127. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/constants.py +0 -0
  128. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/models/__init__.py +0 -0
  129. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/models/chip_plan.py +0 -0
  130. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/models/fixture.py +0 -0
  131. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/models/league_history.py +0 -0
  132. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/models/player.py +0 -0
  133. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/models/team.py +0 -0
  134. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/models/types.py +0 -0
  135. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/parsers/__init__.py +0 -0
  136. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/parsers/recommendations.py +0 -0
  137. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/paths.py +0 -0
  138. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/prompts/__init__.py +0 -0
  139. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/prompts/league_recap.py +0 -0
  140. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/prompts/returnees.py +0 -0
  141. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/prompts/review.py +0 -0
  142. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/prompts/scout.py +0 -0
  143. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/scraper/__init__.py +0 -0
  144. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/scraper/fpl_prices.py +0 -0
  145. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/season.py +0 -0
  146. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/__init__.py +0 -0
  147. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/fixture_predictions.py +0 -0
  148. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/league_history.py +0 -0
  149. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/league_history_counters.py +0 -0
  150. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/league_history_fines.py +0 -0
  151. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/league_history_notes.py +0 -0
  152. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/matchup.py +0 -0
  153. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/player_prior.py +0 -0
  154. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/returnee_radar.py +0 -0
  155. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/__init__.py +0 -0
  156. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/constants.py +0 -0
  157. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/data_prep.py +0 -0
  158. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/display.py +0 -0
  159. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/evaluation.py +0 -0
  160. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/ownership.py +0 -0
  161. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/shrinkage.py +0 -0
  162. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/signals.py +0 -0
  163. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/single_gw.py +0 -0
  164. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/scoring/value_quality.py +0 -0
  165. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/season_previews.py +0 -0
  166. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/squad_allocator.py +0 -0
  167. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/team_form.py +0 -0
  168. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/team_ratings.py +0 -0
  169. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/services/team_ratings_prior.py +0 -0
  170. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/templates/gw_league_recap.md.j2 +0 -0
  171. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/templates/gw_preview.md.j2 +0 -0
  172. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/templates/gw_review.md.j2 +0 -0
  173. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/utils/__init__.py +0 -0
  174. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/utils/files.py +0 -0
  175. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/utils/gameweek.py +0 -0
  176. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/utils/markdown.py +0 -0
  177. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/utils/teams.py +0 -0
  178. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/utils/text.py +0 -0
  179. {fplkit-2.3.1 → fplkit-2.3.2}/fpl_cli/utils/time.py +0 -0
  180. {fplkit-2.3.1 → fplkit-2.3.2}/pyproject.toml +0 -0
  181. {fplkit-2.3.1 → fplkit-2.3.2}/pyrightconfig.json +0 -0
  182. {fplkit-2.3.1 → fplkit-2.3.2}/requirements.lock +0 -0
  183. {fplkit-2.3.1 → fplkit-2.3.2}/scripts/backtest_early_season_prior_blend.py +0 -0
  184. {fplkit-2.3.1 → fplkit-2.3.2}/scripts/calibrate_promoted_prior.py +0 -0
  185. {fplkit-2.3.1 → fplkit-2.3.2}/scripts/calibrate_quality_ceilings.py +0 -0
  186. {fplkit-2.3.1 → fplkit-2.3.2}/tests/__init__.py +0 -0
  187. {fplkit-2.3.1 → fplkit-2.3.2}/tests/conftest.py +0 -0
  188. {fplkit-2.3.1 → fplkit-2.3.2}/tests/fixtures/classic_squad_fixture.md +0 -0
  189. {fplkit-2.3.1 → fplkit-2.3.2}/tests/fixtures/recommendations_fixture.md +0 -0
  190. {fplkit-2.3.1 → fplkit-2.3.2}/tests/fixtures/validate_draft_waivers/recs_clean.md +0 -0
  191. {fplkit-2.3.1 → fplkit-2.3.2}/tests/fixtures/validate_draft_waivers/squad_grid.json +0 -0
  192. {fplkit-2.3.1 → fplkit-2.3.2}/tests/fixtures/validate_draft_waivers/waivers.json +0 -0
  193. {fplkit-2.3.1 → fplkit-2.3.2}/tests/fixtures/waiver_ranked_golden.json +0 -0
  194. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_agents_action.py +0 -0
  195. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_agents_analysis.py +0 -0
  196. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_agents_analysis_squad.py +0 -0
  197. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_agents_base.py +0 -0
  198. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_agents_data.py +0 -0
  199. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_agents_data_price.py +0 -0
  200. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_agents_orchestration.py +0 -0
  201. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_allocate.py +0 -0
  202. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_client.py +0 -0
  203. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_core_insights.py +0 -0
  204. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_dataset_fetcher.py +0 -0
  205. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_draft.py +0 -0
  206. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_football_data.py +0 -0
  207. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_historical.py +0 -0
  208. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_understat.py +0 -0
  209. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_api_vaastav.py +0 -0
  210. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_bench_order_script.py +0 -0
  211. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_classic_squad_extraction.py +0 -0
  212. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_allocate.py +0 -0
  213. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_banner.py +0 -0
  214. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_captain.py +0 -0
  215. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_chips.py +0 -0
  216. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_credentials.py +0 -0
  217. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_custom_analysis.py +0 -0
  218. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_differentials.py +0 -0
  219. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_doctor.py +0 -0
  220. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_doctor_providers.py +0 -0
  221. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_fdr.py +0 -0
  222. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_fdr_blanks.py +0 -0
  223. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_fixtures.py +0 -0
  224. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_format.py +0 -0
  225. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_format_suppression.py +0 -0
  226. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_history.py +0 -0
  227. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_init.py +0 -0
  228. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_intel.py +0 -0
  229. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_json.py +0 -0
  230. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_json_contract.py +0 -0
  231. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_league.py +0 -0
  232. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_league_fines.py +0 -0
  233. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_plan_grid.py +0 -0
  234. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_player.py +0 -0
  235. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_preview.py +0 -0
  236. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_price_changes.py +0 -0
  237. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_price_history.py +0 -0
  238. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_returnees.py +0 -0
  239. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_review.py +0 -0
  240. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_sell_prices.py +0 -0
  241. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_settings_warning.py +0 -0
  242. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_squad.py +0 -0
  243. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_stats.py +0 -0
  244. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_status.py +0 -0
  245. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_targets.py +0 -0
  246. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_transfer_eval.py +0 -0
  247. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_waivers.py +0 -0
  248. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_warnings_stderr.py +0 -0
  249. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_cli_xg.py +0 -0
  250. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_common.py +0 -0
  251. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_common_scoring.py +0 -0
  252. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_data_prep_harmonisation.py +0 -0
  253. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_doc_consistency.py +0 -0
  254. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_fines.py +0 -0
  255. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_fines_config.py +0 -0
  256. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_fixture_predictions.py +0 -0
  257. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_fpl_prices.py +0 -0
  258. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_init.py +0 -0
  259. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_init_fines.py +0 -0
  260. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_league_history_counters.py +0 -0
  261. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_league_history_fines.py +0 -0
  262. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_league_history_notes.py +0 -0
  263. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_league_history_store.py +0 -0
  264. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_league_recap.py +0 -0
  265. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_matchup_service.py +0 -0
  266. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_models.py +0 -0
  267. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_paths.py +0 -0
  268. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_player_prior.py +0 -0
  269. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_player_resolution.py +0 -0
  270. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_preseason.py +0 -0
  271. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_providers.py +0 -0
  272. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_recommendations_parser.py +0 -0
  273. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_report_agent.py +0 -0
  274. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_report_paths.py +0 -0
  275. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_returnee_radar.py +0 -0
  276. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_review.py +0 -0
  277. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_rolling_pts_per_m.py +0 -0
  278. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_scoring.py +0 -0
  279. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_scraper.py +0 -0
  280. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_season.py +0 -0
  281. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_season_awareness.py +0 -0
  282. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_season_previews.py +0 -0
  283. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_sell_prices.py +0 -0
  284. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_squad_allocator.py +0 -0
  285. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_starting_xi_agent.py +0 -0
  286. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_stats.py +0 -0
  287. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_team_ratings.py +0 -0
  288. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_team_ratings_prior.py +0 -0
  289. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_transfer_eval_agent.py +0 -0
  290. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_utils_gameweek.py +0 -0
  291. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_utils_markdown.py +0 -0
  292. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_utils_text.py +0 -0
  293. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_utils_time.py +0 -0
  294. {fplkit-2.3.1 → fplkit-2.3.2}/tests/test_validate_draft_waivers.py +0 -0
@@ -1,6 +1,14 @@
1
1
  # Changelog
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
+ ## [2.3.1] - 2026-08-26
5
+
6
+ ### Bug Fixes
7
+
8
+ - keep draft players matched to the main game when FPL renames them (#171)
9
+ - judge a replayed gameweek's blanks by the clubs players had then (#173)
10
+ - keep the club and name a replayed gameweek already recorded (#175)
11
+
4
12
  ## [2.3.0] - 2026-08-26
5
13
 
6
14
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: fplkit
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: CLI tool for Fantasy Premier League analysis - classic and draft formats
5
5
  Project-URL: Homepage, https://github.com/rossgroomio/fpl-cli
6
6
  Project-URL: Repository, https://github.com/rossgroomio/fpl-cli
@@ -794,7 +794,7 @@ it shares the channel: `synthesis_provider_unavailable`.
794
794
  | `league_history_backfill_manager_unreachable` | One manager's history could not be fetched; their gameweeks stay unknown and are re-attempted next run |
795
795
  | `league_history_backfill_replay_failed` | One gameweek could not be replayed in detail; the others are unaffected |
796
796
  | `league_history_backfill_write_failed` | A backfilled gameweek could not be written; the rest of the backfill continues |
797
- | `league_history_identity_carried` | A replayed gameweek kept the name, club or position it already had recorded for one or more players rather than the ones today's bootstrap gives them, or restored a player reference the replay had lost. Any one of the four on its own raises it |
797
+ | `league_history_identity_carried` | A finished gameweek kept the name, club or position it already had recorded for one or more players rather than the ones today's bootstrap gives them, or restored a player reference this capture had lost. Raised by a re-capture of a finished gameweek as well as by a replay; any one of the four on its own raises it |
798
798
  | `synthesis_provider_unavailable` | `--summarise` was asked for but the synthesis provider had no usable key; everything else in the recap, the capture included, ran normally |
799
799
 
800
800
  None of these change the exit code — `league-recap` exits 0 whenever the recap itself
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.3.1'
22
- __version_tuple__ = version_tuple = (2, 3, 1)
21
+ __version__ = version = '2.3.2'
22
+ __version_tuple__ = version_tuple = (2, 3, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -944,8 +944,8 @@ def _carry_recorded_identity(
944
944
  warnings, HISTORY_WARNING_IDENTITY_CARRIED,
945
945
  f"League history: GW{gameweek} kept the name, club, position or player "
946
946
  f"reference already recorded for {carried} player(s) rather than the ones "
947
- f"they carry today. A replay resolves picks against the current bootstrap, "
948
- f"which has moved on.",
947
+ f"they carry today. Picks are resolved against the current bootstrap, "
948
+ f"which has moved on since the gameweek was played.",
949
949
  )
950
950
  return carried
951
951
 
@@ -1408,6 +1408,17 @@ async def capture_recap_history(
1408
1408
  captured_at=datetime.now(tz=timezone.utc),
1409
1409
  is_live_gw=is_live_gw,
1410
1410
  )
1411
+ # A gameweek whose fixtures have all finished is done moving: its picks,
1412
+ # captain and transfers are fixed, and this run's rows are resolved
1413
+ # against *today's* bootstrap, which may have moved on since (issue #178).
1414
+ # `finished_gameweeks` -- not `is_live_gw` -- is the gate, because a
1415
+ # gameweek stays "current" (and so keeps landing on this path) for the
1416
+ # whole window between its last fixture and the next deadline, and that
1417
+ # window is exactly when a transfer can restamp a correct recorded row.
1418
+ # `_carry_recorded_identity` already no-ops when nothing is recorded yet,
1419
+ # so a genuine first capture is unaffected.
1420
+ if data["gameweek"] in finished_gameweeks:
1421
+ _carry_recorded_identity(store, data["gameweek"], rows, warnings=warnings)
1411
1422
  if fpl_format == "draft" and rows:
1412
1423
  _fill_draft_cumulative_totals(
1413
1424
  store, rows,
@@ -2914,6 +2914,73 @@ class TestReplayKeepsRecordedIdentity:
2914
2914
  assert resolved[1].transfers[0].player_out_code == 222
2915
2915
 
2916
2916
 
2917
+ # ---------------------------------------------------------------------------
2918
+ # issue #178: a current-gameweek recapture must not restamp a recorded row
2919
+ # ---------------------------------------------------------------------------
2920
+
2921
+
2922
+ class TestLiveCaptureKeepsRecordedIdentity:
2923
+ """`capture_recap_history`'s direct write path -- no `replay_gameweek`
2924
+ involved -- is what the ordinary `league-recap` command runs every time.
2925
+ A gameweek stays "current" (and so keeps landing on this path) for the
2926
+ whole window between its last fixture and the next deadline, and FPL
2927
+ keeps processing transfers throughout that window (issue #178)."""
2928
+
2929
+ def _data(self, squad, *, gameweek: int = 1, **manager_kwargs):
2930
+ return _recap_data(
2931
+ gameweek=gameweek,
2932
+ managers=[_manager(name="Alice", entry_id=1, squad=squad, **manager_kwargs)],
2933
+ cohort=_cohort((1, "Alice", 1, 60, 300)),
2934
+ )
2935
+
2936
+ async def test_a_recapture_of_a_finished_gameweek_keeps_the_recorded_club(self):
2937
+ await capture_recap_history(
2938
+ self._data([_player(name="Mover", code=510_281, team="MCI", is_captain=True)]),
2939
+ season=SEASON, finished_gameweeks=[1],
2940
+ )
2941
+ await capture_recap_history(
2942
+ self._data([_player(name="Mover", code=510_281, team="TOT", is_captain=True)]),
2943
+ season=SEASON, finished_gameweeks=[1],
2944
+ )
2945
+ resolved = _store().resolved_gameweek(1)
2946
+ assert resolved[1].squad[0].team == "MCI"
2947
+
2948
+ async def test_a_recapture_reports_the_carry(self):
2949
+ await capture_recap_history(
2950
+ self._data([_player(name="Mover", code=510_281, team="MCI", is_captain=True)]),
2951
+ season=SEASON, finished_gameweeks=[1],
2952
+ )
2953
+ result = await capture_recap_history(
2954
+ self._data([_player(name="Mover", code=510_281, team="TOT", is_captain=True)]),
2955
+ season=SEASON, finished_gameweeks=[1],
2956
+ )
2957
+ assert any(w["code"] == HISTORY_WARNING_IDENTITY_CARRIED for w in result.warnings)
2958
+
2959
+ async def test_a_gameweek_not_yet_finished_is_not_gated_into_carrying(self):
2960
+ """Absent from `finished_gameweeks`, the gameweek is still being
2961
+ played, so its squad can legitimately change between captures -- the
2962
+ carry must not run."""
2963
+ await capture_recap_history(
2964
+ self._data([_player(name="Mover", code=510_281, team="MCI", is_captain=True)]),
2965
+ season=SEASON, finished_gameweeks=[],
2966
+ )
2967
+ await capture_recap_history(
2968
+ self._data([_player(name="Mover", code=510_281, team="TOT", is_captain=True)]),
2969
+ season=SEASON, finished_gameweeks=[],
2970
+ )
2971
+ resolved = _store().resolved_gameweek(1)
2972
+ assert resolved[1].squad[0].team == "TOT"
2973
+
2974
+ async def test_a_first_capture_is_unaffected(self):
2975
+ result = await capture_recap_history(
2976
+ self._data([_player(name="Mover", code=510_281, team="TOT", is_captain=True)]),
2977
+ season=SEASON, finished_gameweeks=[1],
2978
+ )
2979
+ resolved = _store().resolved_gameweek(1)
2980
+ assert resolved[1].squad[0].team == "TOT"
2981
+ assert not any(w["code"] == HISTORY_WARNING_IDENTITY_CARRIED for w in result.warnings)
2982
+
2983
+
2917
2984
  class TestPairSquads:
2918
2985
  """issue #175 review: which recorded entry each replayed one supersedes."""
2919
2986
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes