All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
web/app.py:APP_VERSIONnow comes frompackage_maximizer.__version__; the stale0.6.1fallback is gone. The fallback versions in__init__.py,pyproject.toml(setuptools_scm.fallback_version) andCITATION.cffare synced to0.29.0and checked bytests/test_version_sync.py.package-maximizer tuiwithout thetuiextra (textual) now falls back to the textshellinstead of exiting with an error.APTParser:dpkg -lheader/legend rows (Desired=…,||/ Name …,+++-…) are no longer parsed as packages.- Homebrew:
brew list --formula --cask(mutually exclusive flags, always failed) replaced withbrew list -1; installed packages are markedinstalled.
tests/test_real_system.py(real_systemmarker):RealRepoIntegrationagainst the host's real APT/Homebrew. Skipped when the tool is absent.
- CHANGELOG: removed the stale "Planned" section (JWT, Flask-Limiter) and merged the duplicated
[0.6.0]sections.
These releases were tagged without CHANGELOG entries. Main changes, from merged PRs:
- 0.11.0–0.12.0: maximize/propose endpoints use metadata adapters;
--metadataflag (#78, #84). - 0.13.0–0.17.0: TUI metadata checkbox;
benchmark,analyze,compareCLI commands and web endpoints; CLIshellandhistory(#85–#89). - 0.18.0–0.21.x: TUI enhancements; web API history and export endpoints; real-world data runner with
--parallel(#91–#93). - 0.22.0–0.29.0: real-world solver benchmarks and nixpkgs-derived package data; fixed conflict detection from nixpkgs sources (#95–#101).
- NpmMetadataAdapter: парсер метаданных npm (package-lock.json v2/v3)
parse(): парситnpm viewJSON иpackage-lock.jsonparse_lockfile(): разбирает lockfile v2/v3fetch(): зовётnpm view <pkg> json
- BrewMetadataAdapter: парсер метаданных brew
parse(): парсит JSON отbrew info --json=v2fetch(): зовётbrew info --json=v2 <pkg>- Поддержка dependencies, conflicts_with, versions
- get_adapter() теперь поддерживает npm и brew
- 14 тестов для NpmMetadataAdapter и BrewMetadataAdapter
- Всего 779 тестов
- CLI
proposecommand: automatic metadata extraction + maximizationpackage-maximizer propose nginx apache2 --manager apt --explain- Auto-fetches depends/conflicts via adapters
--explainshows why packages were excluded
- Web API
/api/v1/propose: POST endpoint with automatic metadata extraction- Accepts
packages,manager,solver,explainfields - Returns
metadata_fetched,metadatasummary, and optionalexcludedreasons
- Accepts
- Adapter
fetch()method: subprocess call + parse for APT, pip, pacmanAPTMetadataAdapter.fetch()→apt-cache showPipMetadataAdapter.fetch()→pip showPacmanMetadataAdapter.fetch()→pacman -Si
get_adapter(manager)factory: get adapter by manager name- Tests: 8 tests for propose CLI, 5 tests for propose web API
- Adapters now support both
parse()(from raw string) andfetch()(from repository)
- Metadata adapters (
adapters/): парсеры метаданных для APT, pip, pacmanAPTMetadataAdapter: парситapt-cache show/dpkg -sPipMetadataAdapter: парситpip show/ METADATAPacmanMetadataAdapter: парситpacman -Si/-Qi
- E2E tests на реальных фикстурах: nginx, apache2, requests, certifi, vim
- Dependency support:
dependsfield now properly encoded as implications in all solvers.Package(depends=["pkg2"])→selected(pkg1) ⇒ selected(pkg2)- Greedy, EnhancedGreedy, Z3, PuLP, OR-Tools, MaxSAT, MiniSAT all respect dependencies
- Model encoder (
core/model_encoder.py): intermediate constraint layer shared by all solvers - CLI
--dependsflag: specify dependencies via-d pkg dep - CLI
--explainflag: shows why packages were excluded (conflicts, missing deps) - Web API
dependsfield: POST/api/v1/maximizeacceptsdepends: [["pkg", "dep"]] - Web API
explainflag: returns exclusion reasons in response
- Solvers now use
ModelConstraintsfromencode_packages()for consistent constraint encoding - Greedy solver sorts by weight (descending) in weighted mode
- Version sync:
__init__.py,CITATION.cff, web health/OpenAPI now read fromimportlib.metadata(single source of truth). PackageManagerTypeenum now matchesPARSER_REGISTRYkeys exactly (removed Nix/Guix/Spack/XBPS without parsers; added pip/npm/cargo/etc.).- Auto parser selection via
get_parser(self.manager.value)instead of hardcoded 4-entry map. EnhancedGreedySolvernow correctly inferred from instance (was falling back toGREEDY).- Web server now refuses to start without
PM_API_KEYset (no moredev-key-change-in-productiondefault).
- CHANGELOG order:
[0.6.0]moved above[0.5.0]. - Removed "Planned" section from
[0.6.0](JWT/Flask-Limiter are debt, not features).
- Textual TUI (
pm tui) for interactive terminal UX. - Optional property-based tests via
hypothesis(skipped when missing). - LRU cache decorators for solver/parser factory lookups.
- Benchmark report export (
json,csv). - Sphinx documentation with ReadTheDocs config (
.readthedocs.yaml). - CI coverage gate (
--cov-fail-under=85, currently non-blocking at ~76%). - Rate limiting for web API (in-memory, per API key).
- Conda and Portage parsers.
- Result exporters: JSON, CSV, GraphML.
- Config-driven CLI defaults via
-C/--config.
- Lazy solver/parser registries to avoid optional-dependency import failures.
SolverTypeenum extended withENHANCED_GREEDY.- README badges and multi-manager support documentation.
- Z3Solver
Solver→Optimizecritical bug. pulp_solverimport compatibility.- Makefile
PYTHONoverride for venv compatibility.
- 12 new package managers: apk, zypper, yum, pip, gem, yarn, composer, vcpkg, nuget, winget, scoop, choco.
- Registered CondaParser and PortageParser (were implemented but not registered).
- Total registered package managers: 8 → 22.
- CLI
list-managerscommand shows all supported package managers. - Updated README with full list of 22 package managers.
- Updated
--managerhelp text with all 22 options. - Updated package description to reflect 22+ package manager support.
- Added 24 tests for all new parsers.
- Added tests for
list-managersCLI command. - Total: 492 passed, 2 skipped.
- Coverage: 85%.