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. bump online.fxreader.pr34 to v0.1.5.67;
2. bump archlinux package to v0.24 with pr34>=0.1.5.67 as main dependency;
3. move online.fxreader.pr34 from dev extras to main dependencies;
4. add cli entry point as cli.main:main;
5. add [tool.online-fxreader-pr34.tests] config with search_paths, test_names, discovery_paths;
6. remove -c constraints from Makefile python_put_archlinux_venv;
7. copy pr34 v0.1.5.67 wheel into archlinux deps/whl;
8. release archlinux wheels v0.11 through v0.24;
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 dev extras with online.fxreader.pr34, toml-cli, ninja, patchelf;
2. add modules section for module:switch support;
3. move name/version/scripts into module definition;
4. add pip_find_links for deps/whl with pr34 wheel;
5. fix pyrefly excludes with full relative paths for tests/experiments;
6. update ruff excludes for tests/res and experiments;
7. update Makefile python_put_archlinux_venv with solv extra and constraints;
8. add requirements.3.13.txt for version-specific pinning;
9. update .venv-whl-cache with cp313 wheels;
10. release archlinux v0.10 .whl;
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. add python/pyproject.common.toml with module definitions;
2. add meson/online/.../archlinux/ with meson.build, m.py, pyproject.common.toml;
3. meson.build uses fs.relative_to for python sources from ../../python/;
4. m.py is cli_bootstrap.py copy with last 5 lines patched for paths;
5. update Makefile with python_put_archlinux_venv rule;
6. rename python/pyproject.toml to pyproject.toml.bak;
7. update .gitignore, docker-compose.local.yml, requirements.txt;
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. use BufWinEnter,
instead of BufEnter;
1.1. it is being trigger
when the user switches between buffers,
as well as when buffers
are populated first time from vim session
into window panes;
1. disable filetype plugin;
2. add import into beta.py augroup;
3. add ++nested for BufEnter,
but at the end, just disable filetype
plugin;
since can't figure out the way
to override its effect;
1. some refactor for nginx_config.py;
1.1. just tested
that ssl-app can correctly
show a remote_addr;
1.1.1 TODO,
figure out how to preserve this info
when doing proxy_pass
to ssl app; (hm, seems like no way);
2. exposed ssl-app port
at SSL_APP_PORTS endpoint;
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. configure for_window in sway config
to inhibit-idle when they are fullscreen;
tried idlehack-git, but not sure
whether it's bugger, stick to for_window for now;
1. fix rss being in KiB;
2. get rid of --slice, use --unit-name;
3. fix columns strings being cut,
use two calls to ps,
to get full cmd and cgroup;
4. tested manually that it works;
1. add few random scripts;
1.1. systemd_gtk, oom_firefox
are vibe coded initially;
oom_firefox is useful,
but migrated to ps subprocess
manually;
since psutils is very inefficient,
puts too much load on CPU;