clutterxp 1.2.2__tar.gz → 1.2.3__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 (219) hide show
  1. {clutterxp-1.2.2 → clutterxp-1.2.3}/PKG-INFO +1 -1
  2. clutterxp-1.2.3/assets/clutterxp_logo.png +0 -0
  3. clutterxp-1.2.3/assets/orbiting_green_folder_icon.png +0 -0
  4. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/__init__.py +1 -1
  5. clutterxp-1.2.3/src/clutterxp/assets/clutterxp_logo.png +0 -0
  6. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/app.py +12 -1
  7. clutterxp-1.2.2/assets/clutterxp_logo.png +0 -0
  8. {clutterxp-1.2.2 → clutterxp-1.2.3}/.github/workflows/ci.yml +0 -0
  9. {clutterxp-1.2.2 → clutterxp-1.2.3}/.gitignore +0 -0
  10. {clutterxp-1.2.2 → clutterxp-1.2.3}/CHANGELOG.md +0 -0
  11. {clutterxp-1.2.2 → clutterxp-1.2.3}/README.md +0 -0
  12. {clutterxp-1.2.2 → clutterxp-1.2.3}/assets/clutterxp_logo.svg +0 -0
  13. {clutterxp-1.2.2 → clutterxp-1.2.3}/config.example.yaml +0 -0
  14. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/00_PROJECT_PLAN.md +0 -0
  15. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/01_ARCHITECTURE.md +0 -0
  16. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/02_RULE_ENGINE.md +0 -0
  17. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/03_CONFIG.md +0 -0
  18. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/04_SAFE_MOVER.md +0 -0
  19. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/05_HISTORY_UNDO.md +0 -0
  20. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/06_WATCHER.md +0 -0
  21. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/07_DUPLICATES.md +0 -0
  22. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/08_CLI.md +0 -0
  23. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/09_SAFETY.md +0 -0
  24. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/10_TESTING.md +0 -0
  25. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/11_PACKAGING.md +0 -0
  26. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/12_GUI.md +0 -0
  27. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/13_ROADMAP.md +0 -0
  28. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/14_DECISIONS.md +0 -0
  29. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/15_ACCEPTANCE.md +0 -0
  30. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/16_RISKS.md +0 -0
  31. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/reviews/.gitkeep +0 -0
  32. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/reviews/acceptance_matrix.md +0 -0
  33. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/reviews/perf_report.md +0 -0
  34. {clutterxp-1.2.2 → clutterxp-1.2.3}/docs/reviews/security_review.md +0 -0
  35. {clutterxp-1.2.2 → clutterxp-1.2.3}/packaging/clutterxp.service +0 -0
  36. {clutterxp-1.2.2 → clutterxp-1.2.3}/pyproject.toml +0 -0
  37. {clutterxp-1.2.2 → clutterxp-1.2.3}/scripts/.gitkeep +0 -0
  38. {clutterxp-1.2.2 → clutterxp-1.2.3}/scripts/check_contracts.py +0 -0
  39. {clutterxp-1.2.2 → clutterxp-1.2.3}/scripts/check_ownership.py +0 -0
  40. {clutterxp-1.2.2 → clutterxp-1.2.3}/scripts/contracts.lock.json +0 -0
  41. {clutterxp-1.2.2 → clutterxp-1.2.3}/scripts/e2e.sh +0 -0
  42. {clutterxp-1.2.2 → clutterxp-1.2.3}/scripts/smoke_readme.sh +0 -0
  43. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/__init__.py +0 -0
  44. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/app.py +0 -0
  45. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_config.py +0 -0
  46. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_doctor.py +0 -0
  47. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_duplicates.py +0 -0
  48. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_gui.py +0 -0
  49. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_history.py +0 -0
  50. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_init.py +0 -0
  51. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_organize.py +0 -0
  52. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_rules.py +0 -0
  53. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_scan.py +0 -0
  54. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_service.py +0 -0
  55. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_undo.py +0 -0
  56. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/cmd_watch.py +0 -0
  57. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/errors.py +0 -0
  58. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/cli/render.py +0 -0
  59. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/__init__.py +0 -0
  60. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/jsonschema.py +0 -0
  61. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/loader.py +0 -0
  62. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/placeholders.py +0 -0
  63. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/runtime.py +0 -0
  64. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/schema.py +0 -0
  65. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/validate.py +0 -0
  66. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/config/writer.py +0 -0
  67. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/duplicates/__init__.py +0 -0
  68. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/duplicates/detector.py +0 -0
  69. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/duplicates/hashcache.py +0 -0
  70. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/duplicates/namenorm.py +0 -0
  71. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/duplicates/quarantine.py +0 -0
  72. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/duplicates/report.py +0 -0
  73. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/__init__.py +0 -0
  74. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/api.py +0 -0
  75. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/models_qt.py +0 -0
  76. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/theme.py +0 -0
  77. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/__init__.py +0 -0
  78. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/dashboard.py +0 -0
  79. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/duplicates.py +0 -0
  80. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/folders.py +0 -0
  81. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/history.py +0 -0
  82. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/preview.py +0 -0
  83. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/rules.py +0 -0
  84. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/views/settings.py +0 -0
  85. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/gui/workers.py +0 -0
  86. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/history/__init__.py +0 -0
  87. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/history/db.py +0 -0
  88. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/history/pathcodec.py +0 -0
  89. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/history/recovery.py +0 -0
  90. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/history/schema.sql +0 -0
  91. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/history/service.py +0 -0
  92. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/history/undo.py +0 -0
  93. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/interfaces.py +0 -0
  94. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/locking.py +0 -0
  95. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/logging_setup.py +0 -0
  96. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/models.py +0 -0
  97. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/mover/__init__.py +0 -0
  98. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/mover/collision.py +0 -0
  99. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/mover/fsops.py +0 -0
  100. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/mover/safe_move.py +0 -0
  101. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/organizer.py +0 -0
  102. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/paths.py +0 -0
  103. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/planner.py +0 -0
  104. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/py.typed +0 -0
  105. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/rules/__init__.py +0 -0
  106. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/rules/engine.py +0 -0
  107. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/rules/matcher.py +0 -0
  108. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/rules/template.py +0 -0
  109. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/rules/tokenizer.py +0 -0
  110. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/safety.py +0 -0
  111. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/scanner.py +0 -0
  112. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/service_install.py +0 -0
  113. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/units.py +0 -0
  114. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/watch/__init__.py +0 -0
  115. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/watch/debounce.py +0 -0
  116. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/watch/events.py +0 -0
  117. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/watch/ignore.py +0 -0
  118. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/watch/service.py +0 -0
  119. {clutterxp-1.2.2 → clutterxp-1.2.3}/src/clutterxp/watch/settle.py +0 -0
  120. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/.gitkeep +0 -0
  121. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/__init__.py +0 -0
  122. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/__init__.py +0 -0
  123. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/conftest.py +0 -0
  124. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/__init__.py +0 -0
  125. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/doctor.json +0 -0
  126. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/duplicates.json +0 -0
  127. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/history.json +0 -0
  128. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/organize.json +0 -0
  129. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/rules_list.json +0 -0
  130. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/rules_test.json +0 -0
  131. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/schemas/scan.json +0 -0
  132. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_config.py +0 -0
  133. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_doctor.py +0 -0
  134. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_duplicates.py +0 -0
  135. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_general.py +0 -0
  136. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_gui.py +0 -0
  137. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_history.py +0 -0
  138. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_init.py +0 -0
  139. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_organize.py +0 -0
  140. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_rules.py +0 -0
  141. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_scan.py +0 -0
  142. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_service.py +0 -0
  143. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_undo.py +0 -0
  144. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/cli/test_watch.py +0 -0
  145. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/__init__.py +0 -0
  146. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/conftest.py +0 -0
  147. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/test_jsonschema_and_logging.py +0 -0
  148. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/test_loader.py +0 -0
  149. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/test_paths.py +0 -0
  150. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/test_placeholders.py +0 -0
  151. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/test_runtime.py +0 -0
  152. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/test_validate.py +0 -0
  153. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/config/test_writer.py +0 -0
  154. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/conftest.py +0 -0
  155. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/duplicates/__init__.py +0 -0
  156. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/duplicates/test_detector.py +0 -0
  157. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/duplicates/test_hashcache.py +0 -0
  158. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/duplicates/test_namenorm.py +0 -0
  159. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/duplicates/test_quarantine.py +0 -0
  160. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/__init__.py +0 -0
  161. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/conftest.py +0 -0
  162. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A81_gui_launches_and_cli_never_imports_qt.py +0 -0
  163. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A82_dashboard_shows_watcher_and_recent_operations.py +0 -0
  164. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A83_folders_view_edits_watch_folders_and_settings.py +0 -0
  165. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A84_rules_editor_includes_live_trace.py +0 -0
  166. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A85_preview_data_equals_cli_json_plan.py +0 -0
  167. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A86_history_view_undo_shows_exact_refusal_reasons.py +0 -0
  168. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A87_duplicates_view_progress_and_cancel.py +0 -0
  169. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A88_duplicates_quarantine_gui.py +0 -0
  170. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A89_ui_thread_never_blocks_worker_cancellation.py +0 -0
  171. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_A90_gui_extra_documented.py +0 -0
  172. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_api_extra.py +0 -0
  173. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/gui/test_models_qt.py +0 -0
  174. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/helpers.py +0 -0
  175. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/history/__init__.py +0 -0
  176. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/history/test_db.py +0 -0
  177. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/history/test_pathcodec.py +0 -0
  178. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/history/test_recovery.py +0 -0
  179. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/history/test_service.py +0 -0
  180. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/history/test_undo.py +0 -0
  181. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/integration/__init__.py +0 -0
  182. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/integration/test_acceptance_sweep.py +0 -0
  183. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/integration/test_fault_injection.py +0 -0
  184. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/integration/test_properties.py +0 -0
  185. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/integration/test_scenarios.py +0 -0
  186. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/mover/__init__.py +0 -0
  187. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/mover/conftest.py +0 -0
  188. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/mover/test_collision.py +0 -0
  189. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/mover/test_fsops.py +0 -0
  190. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/mover/test_locking.py +0 -0
  191. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/mover/test_safe_move.py +0 -0
  192. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/organizer/__init__.py +0 -0
  193. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/organizer/conftest.py +0 -0
  194. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/organizer/test_organizer.py +0 -0
  195. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/organizer/test_planner.py +0 -0
  196. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/organizer/test_scanner.py +0 -0
  197. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/perf/__init__.py +0 -0
  198. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/perf/test_perf_budgets.py +0 -0
  199. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/rules/__init__.py +0 -0
  200. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/rules/conftest.py +0 -0
  201. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/rules/test_engine.py +0 -0
  202. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/rules/test_matcher.py +0 -0
  203. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/rules/test_template.py +0 -0
  204. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/rules/test_tokenizer.py +0 -0
  205. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/rules/test_vectors.py +0 -0
  206. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/safety/__init__.py +0 -0
  207. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/safety/test_invariants_full.py +0 -0
  208. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/safety/test_safety_module.py +0 -0
  209. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/test_harness.py +0 -0
  210. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/test_service_install.py +0 -0
  211. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/__init__.py +0 -0
  212. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/conftest.py +0 -0
  213. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/test_acceptance.py +0 -0
  214. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/test_debounce.py +0 -0
  215. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/test_events.py +0 -0
  216. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/test_ignore.py +0 -0
  217. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/test_invariants.py +0 -0
  218. {clutterxp-1.2.2 → clutterxp-1.2.3}/tests/watch/test_service.py +0 -0
  219. {clutterxp-1.2.2 → clutterxp-1.2.3}/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.2
3
+ Version: 1.2.3
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
@@ -1,4 +1,4 @@
1
1
  """ClutterXP - configurable, safe, fast file organizer."""
2
2
 
3
- __version__ = "1.2.2"
3
+ __version__ = "1.2.3"
4
4
 
@@ -16,7 +16,7 @@ from pathlib import Path
16
16
  from typing import Any
17
17
 
18
18
  from PySide6.QtCore import QTimer
19
- from PySide6.QtGui import QAction
19
+ from PySide6.QtGui import QAction, QIcon
20
20
  from PySide6.QtWidgets import (
21
21
  QApplication,
22
22
  QMainWindow,
@@ -50,6 +50,17 @@ class ClutterXPMainWindow(QMainWindow):
50
50
  self.resize(1080, 720)
51
51
  self.setMinimumSize(880, 580)
52
52
 
53
+ # Set application and window icon
54
+ icon_path = Path(__file__).resolve().parent.parent / "assets" / "clutterxp_logo.png"
55
+ if not icon_path.exists():
56
+ icon_path = Path(__file__).resolve().parents[3] / "assets" / "clutterxp_logo.png"
57
+ if icon_path.exists():
58
+ icon = QIcon(str(icon_path))
59
+ self.setWindowIcon(icon)
60
+ app_inst = QApplication.instance()
61
+ if app_inst is not None:
62
+ app_inst.setWindowIcon(icon)
63
+
53
64
  app_instance = QApplication.instance()
54
65
  if app_instance is not None:
55
66
  apply_theme(app_instance)
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