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.
Files changed (217) hide show
  1. {clutterxp-1.2.1 → clutterxp-1.2.2}/PKG-INFO +3 -3
  2. {clutterxp-1.2.1 → clutterxp-1.2.2}/README.md +2 -2
  3. clutterxp-1.2.2/assets/clutterxp_logo.png +0 -0
  4. clutterxp-1.2.2/assets/clutterxp_logo.svg +83 -0
  5. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/__init__.py +1 -1
  6. clutterxp-1.2.1/assets/clutterxp_logo.png +0 -0
  7. {clutterxp-1.2.1 → clutterxp-1.2.2}/.github/workflows/ci.yml +0 -0
  8. {clutterxp-1.2.1 → clutterxp-1.2.2}/.gitignore +0 -0
  9. {clutterxp-1.2.1 → clutterxp-1.2.2}/CHANGELOG.md +0 -0
  10. {clutterxp-1.2.1 → clutterxp-1.2.2}/config.example.yaml +0 -0
  11. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/00_PROJECT_PLAN.md +0 -0
  12. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/01_ARCHITECTURE.md +0 -0
  13. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/02_RULE_ENGINE.md +0 -0
  14. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/03_CONFIG.md +0 -0
  15. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/04_SAFE_MOVER.md +0 -0
  16. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/05_HISTORY_UNDO.md +0 -0
  17. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/06_WATCHER.md +0 -0
  18. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/07_DUPLICATES.md +0 -0
  19. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/08_CLI.md +0 -0
  20. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/09_SAFETY.md +0 -0
  21. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/10_TESTING.md +0 -0
  22. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/11_PACKAGING.md +0 -0
  23. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/12_GUI.md +0 -0
  24. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/13_ROADMAP.md +0 -0
  25. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/14_DECISIONS.md +0 -0
  26. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/15_ACCEPTANCE.md +0 -0
  27. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/16_RISKS.md +0 -0
  28. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/.gitkeep +0 -0
  29. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/acceptance_matrix.md +0 -0
  30. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/perf_report.md +0 -0
  31. {clutterxp-1.2.1 → clutterxp-1.2.2}/docs/reviews/security_review.md +0 -0
  32. {clutterxp-1.2.1 → clutterxp-1.2.2}/packaging/clutterxp.service +0 -0
  33. {clutterxp-1.2.1 → clutterxp-1.2.2}/pyproject.toml +0 -0
  34. {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/.gitkeep +0 -0
  35. {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/check_contracts.py +0 -0
  36. {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/check_ownership.py +0 -0
  37. {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/contracts.lock.json +0 -0
  38. {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/e2e.sh +0 -0
  39. {clutterxp-1.2.1 → clutterxp-1.2.2}/scripts/smoke_readme.sh +0 -0
  40. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/__init__.py +0 -0
  41. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/app.py +0 -0
  42. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_config.py +0 -0
  43. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_doctor.py +0 -0
  44. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_duplicates.py +0 -0
  45. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_gui.py +0 -0
  46. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_history.py +0 -0
  47. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_init.py +0 -0
  48. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_organize.py +0 -0
  49. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_rules.py +0 -0
  50. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_scan.py +0 -0
  51. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_service.py +0 -0
  52. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_undo.py +0 -0
  53. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/cmd_watch.py +0 -0
  54. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/errors.py +0 -0
  55. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/cli/render.py +0 -0
  56. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/__init__.py +0 -0
  57. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/jsonschema.py +0 -0
  58. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/loader.py +0 -0
  59. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/placeholders.py +0 -0
  60. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/runtime.py +0 -0
  61. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/schema.py +0 -0
  62. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/validate.py +0 -0
  63. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/config/writer.py +0 -0
  64. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/__init__.py +0 -0
  65. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/detector.py +0 -0
  66. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/hashcache.py +0 -0
  67. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/namenorm.py +0 -0
  68. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/quarantine.py +0 -0
  69. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/duplicates/report.py +0 -0
  70. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/__init__.py +0 -0
  71. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/api.py +0 -0
  72. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/app.py +0 -0
  73. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/models_qt.py +0 -0
  74. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/theme.py +0 -0
  75. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/__init__.py +0 -0
  76. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/dashboard.py +0 -0
  77. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/duplicates.py +0 -0
  78. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/folders.py +0 -0
  79. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/history.py +0 -0
  80. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/preview.py +0 -0
  81. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/rules.py +0 -0
  82. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/views/settings.py +0 -0
  83. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/gui/workers.py +0 -0
  84. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/__init__.py +0 -0
  85. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/db.py +0 -0
  86. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/pathcodec.py +0 -0
  87. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/recovery.py +0 -0
  88. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/schema.sql +0 -0
  89. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/service.py +0 -0
  90. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/history/undo.py +0 -0
  91. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/interfaces.py +0 -0
  92. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/locking.py +0 -0
  93. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/logging_setup.py +0 -0
  94. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/models.py +0 -0
  95. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/__init__.py +0 -0
  96. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/collision.py +0 -0
  97. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/fsops.py +0 -0
  98. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/mover/safe_move.py +0 -0
  99. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/organizer.py +0 -0
  100. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/paths.py +0 -0
  101. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/planner.py +0 -0
  102. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/py.typed +0 -0
  103. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/__init__.py +0 -0
  104. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/engine.py +0 -0
  105. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/matcher.py +0 -0
  106. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/template.py +0 -0
  107. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/rules/tokenizer.py +0 -0
  108. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/safety.py +0 -0
  109. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/scanner.py +0 -0
  110. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/service_install.py +0 -0
  111. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/units.py +0 -0
  112. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/__init__.py +0 -0
  113. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/debounce.py +0 -0
  114. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/events.py +0 -0
  115. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/ignore.py +0 -0
  116. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/service.py +0 -0
  117. {clutterxp-1.2.1 → clutterxp-1.2.2}/src/clutterxp/watch/settle.py +0 -0
  118. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/.gitkeep +0 -0
  119. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/__init__.py +0 -0
  120. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/__init__.py +0 -0
  121. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/conftest.py +0 -0
  122. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/__init__.py +0 -0
  123. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/doctor.json +0 -0
  124. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/duplicates.json +0 -0
  125. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/history.json +0 -0
  126. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/organize.json +0 -0
  127. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/rules_list.json +0 -0
  128. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/rules_test.json +0 -0
  129. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/schemas/scan.json +0 -0
  130. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_config.py +0 -0
  131. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_doctor.py +0 -0
  132. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_duplicates.py +0 -0
  133. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_general.py +0 -0
  134. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_gui.py +0 -0
  135. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_history.py +0 -0
  136. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_init.py +0 -0
  137. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_organize.py +0 -0
  138. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_rules.py +0 -0
  139. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_scan.py +0 -0
  140. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_service.py +0 -0
  141. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_undo.py +0 -0
  142. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/cli/test_watch.py +0 -0
  143. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/__init__.py +0 -0
  144. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/conftest.py +0 -0
  145. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_jsonschema_and_logging.py +0 -0
  146. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_loader.py +0 -0
  147. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_paths.py +0 -0
  148. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_placeholders.py +0 -0
  149. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_runtime.py +0 -0
  150. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_validate.py +0 -0
  151. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/config/test_writer.py +0 -0
  152. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/conftest.py +0 -0
  153. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/__init__.py +0 -0
  154. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_detector.py +0 -0
  155. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_hashcache.py +0 -0
  156. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_namenorm.py +0 -0
  157. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/duplicates/test_quarantine.py +0 -0
  158. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/__init__.py +0 -0
  159. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/conftest.py +0 -0
  160. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A81_gui_launches_and_cli_never_imports_qt.py +0 -0
  161. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A82_dashboard_shows_watcher_and_recent_operations.py +0 -0
  162. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A83_folders_view_edits_watch_folders_and_settings.py +0 -0
  163. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A84_rules_editor_includes_live_trace.py +0 -0
  164. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A85_preview_data_equals_cli_json_plan.py +0 -0
  165. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A86_history_view_undo_shows_exact_refusal_reasons.py +0 -0
  166. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A87_duplicates_view_progress_and_cancel.py +0 -0
  167. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A88_duplicates_quarantine_gui.py +0 -0
  168. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A89_ui_thread_never_blocks_worker_cancellation.py +0 -0
  169. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_A90_gui_extra_documented.py +0 -0
  170. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_api_extra.py +0 -0
  171. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/gui/test_models_qt.py +0 -0
  172. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/helpers.py +0 -0
  173. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/__init__.py +0 -0
  174. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_db.py +0 -0
  175. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_pathcodec.py +0 -0
  176. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_recovery.py +0 -0
  177. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_service.py +0 -0
  178. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/history/test_undo.py +0 -0
  179. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/__init__.py +0 -0
  180. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_acceptance_sweep.py +0 -0
  181. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_fault_injection.py +0 -0
  182. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_properties.py +0 -0
  183. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/integration/test_scenarios.py +0 -0
  184. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/__init__.py +0 -0
  185. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/conftest.py +0 -0
  186. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_collision.py +0 -0
  187. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_fsops.py +0 -0
  188. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_locking.py +0 -0
  189. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/mover/test_safe_move.py +0 -0
  190. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/__init__.py +0 -0
  191. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/conftest.py +0 -0
  192. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/test_organizer.py +0 -0
  193. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/test_planner.py +0 -0
  194. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/organizer/test_scanner.py +0 -0
  195. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/perf/__init__.py +0 -0
  196. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/perf/test_perf_budgets.py +0 -0
  197. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/__init__.py +0 -0
  198. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/conftest.py +0 -0
  199. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_engine.py +0 -0
  200. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_matcher.py +0 -0
  201. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_template.py +0 -0
  202. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_tokenizer.py +0 -0
  203. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/rules/test_vectors.py +0 -0
  204. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/safety/__init__.py +0 -0
  205. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/safety/test_invariants_full.py +0 -0
  206. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/safety/test_safety_module.py +0 -0
  207. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/test_harness.py +0 -0
  208. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/test_service_install.py +0 -0
  209. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/__init__.py +0 -0
  210. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/conftest.py +0 -0
  211. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_acceptance.py +0 -0
  212. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_debounce.py +0 -0
  213. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_events.py +0 -0
  214. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_ignore.py +0 -0
  215. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_invariants.py +0 -0
  216. {clutterxp-1.2.1 → clutterxp-1.2.2}/tests/watch/test_service.py +0 -0
  217. {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.1
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/0ec772e48eaf1022d81824e19f89d171e1df8640/assets/clutterxp_logo.png" alt="ClutterXP Logo" width="240">
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
- | Category | Badges |
48
+ | | |
49
49
  |:---|:---|
50
50
  | **Package** | [![PyPI Latest Release](https://img.shields.io/pypi/v/clutterxp.svg)](https://pypi.org/project/clutterxp/) [![Supported Python](https://img.shields.io/pypi/pyversions/clutterxp.svg)](https://pypi.org/project/clutterxp/) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/aigo-admin/clutterxp/blob/main/LICENSE) |
51
51
  | **Quality** | [![Test Suite](https://img.shields.io/badge/tests-584%20passed-brightgreen.svg)](https://github.com/aigo-admin/clutterxp) [![Code Style: Ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff) [![Checked with mypy](https://img.shields.io/badge/mypy-checked-blue.svg)](http://mypy-lang.org/) |
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/aigo-admin/clutterxp/0ec772e48eaf1022d81824e19f89d171e1df8640/assets/clutterxp_logo.png" alt="ClutterXP Logo" width="240">
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
- | Category | Badges |
14
+ | | |
15
15
  |:---|:---|
16
16
  | **Package** | [![PyPI Latest Release](https://img.shields.io/pypi/v/clutterxp.svg)](https://pypi.org/project/clutterxp/) [![Supported Python](https://img.shields.io/pypi/pyversions/clutterxp.svg)](https://pypi.org/project/clutterxp/) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/aigo-admin/clutterxp/blob/main/LICENSE) |
17
17
  | **Quality** | [![Test Suite](https://img.shields.io/badge/tests-584%20passed-brightgreen.svg)](https://github.com/aigo-admin/clutterxp) [![Code Style: Ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff) [![Checked with mypy](https://img.shields.io/badge/mypy-checked-blue.svg)](http://mypy-lang.org/) |
@@ -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>
@@ -1,4 +1,4 @@
1
1
  """ClutterXP - configurable, safe, fast file organizer."""
2
2
 
3
- __version__ = "1.2.1"
3
+ __version__ = "1.2.2"
4
4
 
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