clutterxp 1.2.1__tar.gz → 1.2.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.
- {clutterxp-1.2.1 → clutterxp-1.2.2}/PKG-INFO +3 -3
- {clutterxp-1.2.1 → clutterxp-1.2.2}/README.md +2 -2
- clutterxp-1.2.2/assets/clutterxp_logo.png +0 -0
- clutterxp-1.2.2/assets/clutterxp_logo.svg +83 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/__init__.py +1 -1
- clutterxp-1.2.1/assets/clutterxp_logo.png +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/.github/workflows/ci.yml +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/.gitignore +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/CHANGELOG.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/config.example.yaml +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/00_PROJECT_PLAN.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/01_ARCHITECTURE.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/02_RULE_ENGINE.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/03_CONFIG.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/04_SAFE_MOVER.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/05_HISTORY_UNDO.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/06_WATCHER.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/07_DUPLICATES.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/08_CLI.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/09_SAFETY.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/10_TESTING.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/11_PACKAGING.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/12_GUI.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/13_ROADMAP.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/14_DECISIONS.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/15_ACCEPTANCE.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/16_RISKS.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/.gitkeep +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/acceptance_matrix.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/perf_report.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/security_review.md +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/packaging/clutterxp.service +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/pyproject.toml +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/.gitkeep +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/check_contracts.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/check_ownership.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/contracts.lock.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/e2e.sh +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/smoke_readme.sh +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/app.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_config.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_doctor.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_duplicates.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_gui.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_history.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_init.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_organize.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_rules.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_scan.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_service.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_undo.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_watch.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/errors.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/render.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/jsonschema.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/loader.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/placeholders.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/runtime.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/schema.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/validate.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/writer.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/detector.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/hashcache.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/namenorm.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/quarantine.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/report.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/api.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/app.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/models_qt.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/theme.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/dashboard.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/duplicates.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/folders.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/history.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/preview.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/rules.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/settings.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/workers.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/db.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/pathcodec.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/recovery.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/schema.sql +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/service.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/undo.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/interfaces.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/locking.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/logging_setup.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/models.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/collision.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/fsops.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/safe_move.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/organizer.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/paths.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/planner.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/py.typed +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/engine.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/matcher.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/template.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/tokenizer.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/safety.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/scanner.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/service_install.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/units.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/debounce.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/events.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/ignore.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/service.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/settle.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/.gitkeep +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/doctor.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/duplicates.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/history.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/organize.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/rules_list.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/rules_test.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/scan.json +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_config.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_doctor.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_duplicates.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_general.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_gui.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_history.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_init.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_organize.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_rules.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_scan.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_service.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_undo.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_watch.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_jsonschema_and_logging.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_loader.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_paths.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_placeholders.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_runtime.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_validate.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_writer.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_detector.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_hashcache.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_namenorm.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_quarantine.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A81_gui_launches_and_cli_never_imports_qt.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A82_dashboard_shows_watcher_and_recent_operations.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A83_folders_view_edits_watch_folders_and_settings.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A84_rules_editor_includes_live_trace.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A85_preview_data_equals_cli_json_plan.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A86_history_view_undo_shows_exact_refusal_reasons.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A87_duplicates_view_progress_and_cancel.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A88_duplicates_quarantine_gui.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A89_ui_thread_never_blocks_worker_cancellation.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A90_gui_extra_documented.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_api_extra.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_models_qt.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/helpers.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_db.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_pathcodec.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_recovery.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_service.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_undo.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_acceptance_sweep.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_fault_injection.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_properties.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_scenarios.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_collision.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_fsops.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_locking.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_safe_move.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/test_organizer.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/test_planner.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/test_scanner.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/perf/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/perf/test_perf_budgets.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_engine.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_matcher.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_template.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_tokenizer.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_vectors.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/safety/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/safety/test_invariants_full.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/safety/test_safety_module.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/test_harness.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/test_service_install.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/__init__.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/conftest.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_acceptance.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_debounce.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_events.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_ignore.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_invariants.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_service.py +0 -0
- {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_settle.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: clutterxp
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Configurable, safe, lightweight file organizer: rules, preview, undo, watch, duplicates.
|
|
5
5
|
Project-URL: Homepage, https://github.com/aigo-admin/clutterxp
|
|
6
6
|
Project-URL: Documentation, https://github.com/aigo-admin/clutterxp#readme
|
|
@@ -33,7 +33,7 @@ Requires-Dist: pyside6>=6.6; extra == 'gui'
|
|
|
33
33
|
Description-Content-Type: text/markdown
|
|
34
34
|
|
|
35
35
|
<p align="center">
|
|
36
|
-
<img src="https://raw.githubusercontent.com/aigo-admin/clutterxp/
|
|
36
|
+
<img src="https://raw.githubusercontent.com/aigo-admin/clutterxp/main/assets/clutterxp_logo.png" alt="ClutterXP Logo" width="220">
|
|
37
37
|
</p>
|
|
38
38
|
|
|
39
39
|
<h1 align="center">ClutterXP</h1>
|
|
@@ -45,7 +45,7 @@ Description-Content-Type: text/markdown
|
|
|
45
45
|
|
|
46
46
|
---
|
|
47
47
|
|
|
48
|
-
|
|
|
48
|
+
| | |
|
|
49
49
|
|:---|:---|
|
|
50
50
|
| **Package** | [](https://pypi.org/project/clutterxp/) [](https://pypi.org/project/clutterxp/) [](https://github.com/aigo-admin/clutterxp/blob/main/LICENSE) |
|
|
51
51
|
| **Quality** | [](https://github.com/aigo-admin/clutterxp) [](https://github.com/astral-sh/ruff) [](http://mypy-lang.org/) |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/aigo-admin/clutterxp/
|
|
2
|
+
<img src="https://raw.githubusercontent.com/aigo-admin/clutterxp/main/assets/clutterxp_logo.png" alt="ClutterXP Logo" width="220">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">ClutterXP</h1>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
-
|
|
|
14
|
+
| | |
|
|
15
15
|
|:---|:---|
|
|
16
16
|
| **Package** | [](https://pypi.org/project/clutterxp/) [](https://pypi.org/project/clutterxp/) [](https://github.com/aigo-admin/clutterxp/blob/main/LICENSE) |
|
|
17
17
|
| **Quality** | [](https://github.com/aigo-admin/clutterxp) [](https://github.com/astral-sh/ruff) [](http://mypy-lang.org/) |
|
|
Binary file
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="100%" height="100%">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Gradients -->
|
|
4
|
+
<linearGradient id="mainGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" stop-color="#6366f1" />
|
|
6
|
+
<stop offset="50%" stop-color="#06b6d4" />
|
|
7
|
+
<stop offset="100%" stop-color="#10b981" />
|
|
8
|
+
</linearGradient>
|
|
9
|
+
|
|
10
|
+
<linearGradient id="accentGrad" x1="0%" y1="100%" x2="100%" y2="0%">
|
|
11
|
+
<stop offset="0%" stop-color="#4f46e5" />
|
|
12
|
+
<stop offset="50%" stop-color="#0ea5e9" />
|
|
13
|
+
<stop offset="100%" stop-color="#34d399" />
|
|
14
|
+
</linearGradient>
|
|
15
|
+
|
|
16
|
+
<linearGradient id="sheetGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
17
|
+
<stop offset="0%" stop-color="#818cf8" />
|
|
18
|
+
<stop offset="100%" stop-color="#38bdf8" />
|
|
19
|
+
</linearGradient>
|
|
20
|
+
|
|
21
|
+
<linearGradient id="shieldGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
22
|
+
<stop offset="0%" stop-color="#10b981" />
|
|
23
|
+
<stop offset="100%" stop-color="#059669" />
|
|
24
|
+
</linearGradient>
|
|
25
|
+
|
|
26
|
+
<linearGradient id="softFill" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
27
|
+
<stop offset="0%" stop-color="#6366f1" stop-opacity="0.15" />
|
|
28
|
+
<stop offset="100%" stop-color="#06b6d4" stop-opacity="0.05" />
|
|
29
|
+
</linearGradient>
|
|
30
|
+
|
|
31
|
+
<filter id="dropShadow" x="-10%" y="-10%" width="130%" height="130%">
|
|
32
|
+
<feDropShadow dx="0" dy="12" stdDeviation="16" flood-color="#06b6d4" flood-opacity="0.2" />
|
|
33
|
+
</filter>
|
|
34
|
+
</defs>
|
|
35
|
+
|
|
36
|
+
<g filter="url(#dropShadow)">
|
|
37
|
+
<!-- Back Folder Tab -->
|
|
38
|
+
<path d="M 80 200 L 80 160 C 80 148 90 138 102 138 L 190 138 C 202 138 212 146 218 156 L 235 185 C 240 194 250 200 260 200 L 410 200 C 422 200 432 210 432 222 L 432 270"
|
|
39
|
+
fill="none" stroke="url(#mainGrad)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round" />
|
|
40
|
+
|
|
41
|
+
<!-- File Sheets Cascading In -->
|
|
42
|
+
<!-- Sheet 3 (Furthest Back / Highest) -->
|
|
43
|
+
<g transform="translate(250, 48)">
|
|
44
|
+
<path d="M 0 16 C 0 7 7 0 16 0 L 72 0 L 104 32 L 104 120 C 104 129 97 136 88 136 L 16 136 C 7 136 0 129 0 120 Z"
|
|
45
|
+
fill="url(#softFill)" stroke="url(#sheetGrad)" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" />
|
|
46
|
+
<path d="M 72 0 L 72 32 L 104 32" fill="none" stroke="url(#sheetGrad)" stroke-width="10" stroke-linejoin="round" />
|
|
47
|
+
<line x1="24" y1="55" x2="60" y2="55" stroke="url(#sheetGrad)" stroke-width="8" stroke-linecap="round" opacity="0.8" />
|
|
48
|
+
<line x1="24" y1="80" x2="80" y2="80" stroke="url(#sheetGrad)" stroke-width="8" stroke-linecap="round" opacity="0.8" />
|
|
49
|
+
</g>
|
|
50
|
+
|
|
51
|
+
<!-- Sheet 2 (Middle) -->
|
|
52
|
+
<g transform="translate(200, 95)">
|
|
53
|
+
<path d="M 0 16 C 0 7 7 0 16 0 L 82 0 L 118 36 L 118 135 C 118 144 111 151 102 151 L 16 151 C 7 151 0 144 0 135 Z"
|
|
54
|
+
fill="url(#softFill)" stroke="url(#mainGrad)" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" />
|
|
55
|
+
<path d="M 82 0 L 82 36 L 118 36" fill="none" stroke="url(#mainGrad)" stroke-width="10" stroke-linejoin="round" />
|
|
56
|
+
<line x1="26" y1="62" x2="68" y2="62" stroke="url(#mainGrad)" stroke-width="8" stroke-linecap="round" opacity="0.85" />
|
|
57
|
+
<line x1="26" y1="90" x2="92" y2="90" stroke="url(#mainGrad)" stroke-width="8" stroke-linecap="round" opacity="0.85" />
|
|
58
|
+
</g>
|
|
59
|
+
|
|
60
|
+
<!-- Sheet 1 (Front / Dropping into folder) -->
|
|
61
|
+
<g transform="translate(150, 145)">
|
|
62
|
+
<path d="M 0 16 C 0 7 7 0 16 0 L 92 0 L 132 40 L 132 150 C 132 159 125 166 116 166 L 16 166 C 7 166 0 159 0 150 Z"
|
|
63
|
+
fill="url(#softFill)" stroke="url(#accentGrad)" stroke-width="13" stroke-linecap="round" stroke-linejoin="round" />
|
|
64
|
+
<path d="M 92 0 L 92 40 L 132 40" fill="none" stroke="url(#accentGrad)" stroke-width="11" stroke-linejoin="round" />
|
|
65
|
+
<line x1="28" y1="70" x2="76" y2="70" stroke="url(#accentGrad)" stroke-width="9" stroke-linecap="round" />
|
|
66
|
+
<line x1="28" y1="102" x2="104" y2="102" stroke="url(#accentGrad)" stroke-width="9" stroke-linecap="round" />
|
|
67
|
+
</g>
|
|
68
|
+
|
|
69
|
+
<!-- Front Folder Body -->
|
|
70
|
+
<path d="M 74 245 C 64 245 56 254 57 264 L 75 425 C 77 439 89 450 103 450 L 409 450 C 423 450 435 439 437 425 L 455 264 C 456 254 448 245 438 245 L 285 245 C 275 245 266 238 261 229 L 253 216 C 248 207 239 201 229 201 L 94 201 C 83 201 74 210 74 221 Z"
|
|
71
|
+
fill="url(#softFill)" stroke="url(#mainGrad)" stroke-width="16" stroke-linecap="round" stroke-linejoin="round" />
|
|
72
|
+
|
|
73
|
+
<!-- Center Safety Shield -->
|
|
74
|
+
<g transform="translate(256, 345)">
|
|
75
|
+
<!-- Shield Outer Glow / Outline -->
|
|
76
|
+
<path d="M 0 -44 C 28 -44 48 -32 48 -32 C 48 16 30 60 0 76 C -30 60 -48 16 -48 -32 C -48 -32 -28 -44 0 -44 Z"
|
|
77
|
+
fill="url(#shieldGrad)" stroke="#ffffff" stroke-width="6" stroke-linejoin="round" />
|
|
78
|
+
<!-- Inner Checkmark Symbol for safety -->
|
|
79
|
+
<path d="M -15 2 L -4 14 L 18 -10"
|
|
80
|
+
fill="none" stroke="#ffffff" stroke-width="7" stroke-linecap="round" stroke-linejoin="round" />
|
|
81
|
+
</g>
|
|
82
|
+
</g>
|
|
83
|
+
</svg>
|
|
Binary file
|
|
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
|
|
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
|
|
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
|
{clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A81_gui_launches_and_cli_never_imports_qt.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A87_duplicates_view_progress_and_cancel.py
RENAMED
|
File without changes
|
|
File without changes
|
{clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A89_ui_thread_never_blocks_worker_cancellation.py
RENAMED
|
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
|