1. add apps/cache/settings.py: cache_settings_t pydantic-settings singleton
with default dir ~/.cache/online.fxreader.pr34.commands_typed.archlinux/
apps/cache/cache_dir, env var ARCHLINUX_CACHE_DIR;
2. add apps/cache/cli.py: cache_cli_t with add_arguments/extract/apply;
3. remove --cache-dir from compile and archive subcommands, they now
use cache_settings_t.singleton().dir;
4. add test_cache_settings.py;
1. move models.py into apps/specs/models.py, add compiled_entry_t
pydantic model for parsed requirements entries;
2. add apps/specs/utils.py with parse_compiled() and parse_reference()
as single source for requirements file parsing;
3. refactor cli/diff.py: remove local parse_compiled, use specs/utils,
compute_diff takes dict[str, compiled_entry_t];
4. refactor cli/download.py: remove download_requirements_t class,
use parse_compiled from specs/utils;
5. refactor cli/compile.py: compile_t class encapsulating all logic,
-p/--package with action=append, --mode (requirements/needed/full),
-o/--output, --generate-hashes default true with BooleanOptionalAction,
build_filter computed once, transitive_deps minus pinned;
6. update all imports across apps/, cli/, resolver/, tests/;
1. add resolver/common.py with constraints_t class holding all constraints
with filtered property views (install, excluded, ignored, pinned,
upgrade, requested) and resolver_base_t abstract base class;
2. refactor resolver/general.py: extend resolver_base_t, resolve() takes
constraints_t, add resolve_specs() classmethod convenience for tests;
3. refactor resolver/solv.py: solv_resolver_t extends resolver_base_t,
fix pkg_spec NameError in error messages, remove duplicate parse_reference;
4. add requested flag to package_constraint_t for tracking user-specified
packages vs reference pins;
5. update test_resolver.py and test_solv_backend.py for new interface;
1. add stop_at param to commands_typed/argparse.py parse_args();
2. when a token from stop_at is found, parsing stops and remainder is returned inclusive;
3. enables main parser to stop before subcommand so -h passes through to subcommand;
4. add test_argparse.py with 10 tests: default, double-dash, stop_at, edge cases;
5. add test_argparse to pr34 test_names config;
6. bump pr34 to v0.1.5.69;
1. add csize field to package_t (general model) for compressed download size;
2. add csize field to compile_entry_t;
3. compile.py passes pkg.csize into compile entry;
4. to_txt() emits --size=BYTES after --hash= when csize > 0;
5. download parser extracts --size= into download_entry_t.csize;
6. progress uses csize for byte-based ETA when all entries have sizes;
1. download_entry_t pydantic model (frozen=True) replaces tuples;
2. download_t class with async run(), _download_one(), _run_parallel(), _run_aria2c_batch();
3. asyncio.Semaphore for -j concurrency, run_in_executor for blocking I/O;
4. .part file pattern: download to dest.pkg.part, rename on success;
5. curl -C - and aria2c --continue=true for resume support;
6. curl/aria2c stdout/stderr redirected to devnull;
7. --dry-run, --verify-checksum BooleanOptionalAction flags;
8. --progress-mode plain|interactive using terminal.py renderer;
9. progress_t with byte-based ETA (when --size= available) and pkg-rate fallback;
10. parse --size=BYTES and --hash=sha256: from compiled requirements;
11. update test_cli.py downloader tests for .part rename and **kwargs;
12. update test_download_cli.py for pydantic model and new progress_t constructor;
1. add --progress BooleanOptionalAction flag with plain mode;
2. progress_t tracks total/done/this_run packages and bytes, shows ETA and rate;
3. rate displayed as pkg/s when fast, s/pkg when slow;
4. add -j parameter for parallel downloads via ThreadPoolExecutor;
5. for aria2c with -j>1, use download_batch_aria2c with single process and input file;
6. skip already-downloaded files, estimate total bytes from average;
7. add test_download_cli.py with full test matrix: backend(3) x jobs(2) x progress(2) x existing(3);
8. mock downloader_t.download and download_batch_aria2c in all tests;
9. add unit tests for progress_t formatting and batch aria2c input generation;
1. add commands_typed/tests.py with run_tests(), collect_tests(), filter_tests();
2. support test_names as dotted prefixes or * glob patterns via fnmatch;
3. add dry-run mode via collect subcommand in __main__ with argparse;
4. add [tool.online-fxreader-pr34.tests] section: search_paths, test_names, discovery_paths;
5. extend PyProject dataclass with Tests nested class in cli_bootstrap.py;
6. parse tests config in pyproject_load via check_dict/check_list;
7. add tests() method to commands_typed/cli.py base CLI class;
8. simplify python/cli.py to delegate to self.tests(project_name, argv);
9. auto-patch PYTHONPATH from search_paths before running tests;
10. narrow unittest discover start_dir from common prefix of test_names;
1. separate pacman-specific types (apps/pacman/types.py) from general types (models.py);
2. split CLI into cli/main.py dispatcher with compile, archive, list_installed, download subcommands;
3. move cache_db into apps/cache/db.py, pacman client/db into apps/pacman/;
4. add pacman_manager_t (apps/pacman/manager.py) implementing manager_t ABC;
5. move resolver into resolver/ with general.py (pure python) and solv.py (libsolv);
6. add solv_types.py for solv-internal types, separate from general models;
7. change package_index_t.packages to 2-level dict (name -> version -> pkg);
8. add .add() and .iter_all() helpers to package_index_t and solv_index_t;
9. fix solver: SELECTION_NAME only, SOLVER_SOLVABLE for exact name+version match;
10. default expand_groups=False to prevent group bleed-through;
11. add dedupe=True mode to cache_db.load_indices via SQL GROUP BY;
12. fix provides hijack: vim==X no longer resolves to gvim;
13. add comprehensive unit tests: test_cli, test_compile, test_db, test_models, test_pacman, test_resolver, test_solv_backend, test_integration;
14. add test fixtures in tests/res/ with core/extra .db snapshots;
15. add libsolv experiments in tests/experiments/libsolv/;
1. add argv_extract_t for targeted argument extraction from argv;
2. add --bootstrap-help and --bootstrap-override cli args;
3. apply_overrides_to_constraints patches constraint file per override;
4. fix whl_cache_download to use target python_version, not host;
5. fix whl cache check to verify python_tag matches target version;
6. parse_whl_name_version now extracts python_tag from wheel filename;
7. add parse_req_name for extracting package name from spec;
8. use contextlib.ExitStack for temp file cleanup in compile;
1. set ruff line-length to 100, reformat 18 files;
2. move pr34 version to pyproject.common.toml, read via toml in meson.build;
3. fix meson install_subdir to only include meson/toolchains, not entire meson/;
4. add meson:install:list command with --mode meson|pyproject for dry-run;
5. add .venv-whl-cache to .gitignore exceptions and .gitattributes lfs tracking;
6. release pr34 v0.1.5.66 .whl;
7. commit python/.venv-whl-cache and archlinux/.venv-whl-cache via lfs;
1. merge gitea/master into 25-llm-archlinux-package-manager;
2. incorporate master deps: tomlq, pip==25.1, django, fastapi, uvicorn;
3. add requirements.3.13.txt with version-specific mapping;
4. remove generic requirements.txt, pyproject.toml from tracking;
5. fix whl_cache_download to run once after compile, before install;
6. update m.py to use pyproject.common.toml for bootstrap;
1. exclude archlinux namespace from pr34 ruff and pyrefly configs;
2. import overload from typing (available since py3.5) instead of typing_extensions;
3. add --no-annotate --no-header to uv pip compile;
4. read version from pyproject.toml in archlinux meson.build;
5. exclude archlinux from pr34 meson.build find;
1. update cli_boostrap.py example;
1.1. allow to force whl_cache update;
not reset;
1.2. log more command calls, before executing them;
2. update oom_firefox,
to produce some logs;
2.1. still not practical solution,
since tabs crash very fast,
and no integration with the browser,
to say extensions killing,
which happens still for some reason;
3. reuse pr34_logging.setup();
1. fetch sensitive configs,
mark telegram to prevent sway idle, when fullscreen;
2. update oom_firefox tool,
to support custom worker_regex, main_regex;
3. update .whl for pr34;
1. add l keybinding
to change in realtime cgroup max memory limit;
2. make sure keybindings are not working
when a dialog is opened;
3. make sure the app correctly handles Ctrl+C;
4. improve logging format, include a timestamp
and line locatin;
1. refactor python vim module;
1.1. experiment
with fast select based on popup in vim,
and multi threaded app in python;
1.2. TODO,
figure out some thread safe way
to call vim.command from python side threads;
1.3. update pydantic validate params;
1. make metrics in commands_typed
be agnostic of fastapi, django;
2. implement ping wrapper for rest.py in checks;
3. use env settings to specify hosts to ping;
4. add pyright, ruff into Makefile;
5. test in production;