chutils 3.4.0__tar.gz → 3.4.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 (601) hide show
  1. {chutils-3.4.0 → chutils-3.4.2}/PKG-INFO +1 -1
  2. {chutils-3.4.0 → chutils-3.4.2}/api_map.md +6 -6
  3. {chutils-3.4.0/conductor/archive/fallback_alias_20260707 → chutils-3.4.2/conductor/tracks/ai_context_opt_20260728}/index.md +1 -1
  4. chutils-3.4.2/conductor/tracks/ai_context_opt_20260728/metadata.json +8 -0
  5. chutils-3.4.2/conductor/tracks/ai_context_opt_20260728/plan.md +17 -0
  6. chutils-3.4.2/conductor/tracks/ai_context_opt_20260728/spec.md +23 -0
  7. {chutils-3.4.0/conductor/archive/config_remote_push_20260702 → chutils-3.4.2/conductor/tracks/async_lifecycle_20260728}/index.md +1 -1
  8. chutils-3.4.2/conductor/tracks/async_lifecycle_20260728/metadata.json +8 -0
  9. chutils-3.4.2/conductor/tracks/async_lifecycle_20260728/plan.md +16 -0
  10. chutils-3.4.2/conductor/tracks/async_lifecycle_20260728/spec.md +26 -0
  11. {chutils-3.4.0/conductor/archive/qt_integration_20260521 → chutils-3.4.2/conductor/tracks/browser_profiles_20260728}/index.md +5 -5
  12. chutils-3.4.2/conductor/tracks/browser_profiles_20260728/metadata.json +8 -0
  13. chutils-3.4.2/conductor/tracks/browser_profiles_20260728/plan.md +23 -0
  14. chutils-3.4.2/conductor/tracks/browser_profiles_20260728/spec.md +33 -0
  15. chutils-3.4.2/conductor/tracks/queue_monitoring_20260728/index.md +5 -0
  16. chutils-3.4.2/conductor/tracks/queue_monitoring_20260728/metadata.json +8 -0
  17. chutils-3.4.2/conductor/tracks/queue_monitoring_20260728/plan.md +16 -0
  18. chutils-3.4.2/conductor/tracks/queue_monitoring_20260728/spec.md +26 -0
  19. {chutils-3.4.0/conductor/archive/dev_watch_20260702 → chutils-3.4.2/conductor/tracks/stream_crypto_20260728}/index.md +1 -1
  20. chutils-3.4.2/conductor/tracks/stream_crypto_20260728/metadata.json +8 -0
  21. chutils-3.4.2/conductor/tracks/stream_crypto_20260728/plan.md +16 -0
  22. chutils-3.4.2/conductor/tracks/stream_crypto_20260728/spec.md +22 -0
  23. chutils-3.4.2/conductor/tracks/telegram_access_20260729/index.md +5 -0
  24. chutils-3.4.2/conductor/tracks/telegram_access_20260729/metadata.json +8 -0
  25. chutils-3.4.2/conductor/tracks/telegram_access_20260729/plan.md +18 -0
  26. chutils-3.4.2/conductor/tracks/telegram_access_20260729/spec.md +24 -0
  27. chutils-3.4.2/conductor/tracks/telegram_formatting_20260729/index.md +5 -0
  28. chutils-3.4.2/conductor/tracks/telegram_formatting_20260729/metadata.json +8 -0
  29. chutils-3.4.2/conductor/tracks/telegram_formatting_20260729/plan.md +17 -0
  30. chutils-3.4.2/conductor/tracks/telegram_formatting_20260729/spec.md +14 -0
  31. chutils-3.4.2/conductor/tracks/telegram_keyboard_20260729/index.md +5 -0
  32. chutils-3.4.2/conductor/tracks/telegram_keyboard_20260729/metadata.json +8 -0
  33. chutils-3.4.2/conductor/tracks/telegram_keyboard_20260729/plan.md +18 -0
  34. chutils-3.4.2/conductor/tracks/telegram_keyboard_20260729/spec.md +15 -0
  35. chutils-3.4.2/conductor/tracks/telegram_logging_20260729/index.md +5 -0
  36. chutils-3.4.2/conductor/tracks/telegram_logging_20260729/metadata.json +8 -0
  37. chutils-3.4.2/conductor/tracks/telegram_logging_20260729/plan.md +17 -0
  38. chutils-3.4.2/conductor/tracks/telegram_logging_20260729/spec.md +16 -0
  39. chutils-3.4.2/conductor/tracks/telegram_media_20260729/index.md +5 -0
  40. chutils-3.4.2/conductor/tracks/telegram_media_20260729/metadata.json +8 -0
  41. chutils-3.4.2/conductor/tracks/telegram_media_20260729/plan.md +18 -0
  42. chutils-3.4.2/conductor/tracks/telegram_media_20260729/spec.md +15 -0
  43. chutils-3.4.2/conductor/tracks/telegram_notifier_20260729/index.md +5 -0
  44. chutils-3.4.2/conductor/tracks/telegram_notifier_20260729/metadata.json +8 -0
  45. chutils-3.4.2/conductor/tracks/telegram_notifier_20260729/plan.md +17 -0
  46. chutils-3.4.2/conductor/tracks/telegram_notifier_20260729/spec.md +18 -0
  47. chutils-3.4.2/conductor/tracks/telegram_ratelimit_20260729/index.md +5 -0
  48. chutils-3.4.2/conductor/tracks/telegram_ratelimit_20260729/metadata.json +8 -0
  49. chutils-3.4.2/conductor/tracks/telegram_ratelimit_20260729/plan.md +19 -0
  50. chutils-3.4.2/conductor/tracks/telegram_ratelimit_20260729/spec.md +21 -0
  51. chutils-3.4.2/conductor/tracks/telegram_send_file_20260729/index.md +5 -0
  52. chutils-3.4.2/conductor/tracks/telegram_send_file_20260729/metadata.json +8 -0
  53. chutils-3.4.2/conductor/tracks/telegram_send_file_20260729/plan.md +18 -0
  54. chutils-3.4.2/conductor/tracks/telegram_send_file_20260729/spec.md +14 -0
  55. chutils-3.4.2/conductor/tracks/telegram_whitelist_20260729/index.md +5 -0
  56. chutils-3.4.2/conductor/tracks/telegram_whitelist_20260729/metadata.json +8 -0
  57. chutils-3.4.2/conductor/tracks/telegram_whitelist_20260729/plan.md +17 -0
  58. chutils-3.4.2/conductor/tracks/telegram_whitelist_20260729/spec.md +19 -0
  59. chutils-3.4.2/conductor/tracks.md +91 -0
  60. {chutils-3.4.0 → chutils-3.4.2}/docs/INTEGRATION_AI.md +25 -2
  61. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_lint.md +24 -5
  62. chutils-3.4.2/docs/cli/check.md +97 -0
  63. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/dev.md +138 -17
  64. chutils-3.4.2/docs/cli/validate.md +130 -0
  65. {chutils-3.4.0 → chutils-3.4.2}/docs/dependencies.md +6 -1
  66. {chutils-3.4.0 → chutils-3.4.2}/docs/qt.md +128 -128
  67. {chutils-3.4.0 → chutils-3.4.2}/examples/22_qt_logging.py +41 -41
  68. {chutils-3.4.0 → chutils-3.4.2}/examples/23_qt_async.py +58 -58
  69. {chutils-3.4.0 → chutils-3.4.2}/examples/24_qt_typed_signals.py +73 -73
  70. {chutils-3.4.0 → chutils-3.4.2}/examples/concurrency_scraping_usage.py +50 -50
  71. {chutils-3.4.0 → chutils-3.4.2}/project_index.json +385 -141
  72. {chutils-3.4.0 → chutils-3.4.2}/pyproject.toml +1 -1
  73. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/__init__.py +8 -1
  74. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/api.py +2 -1
  75. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cache/decorator.py +3 -3
  76. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cli.py +4 -0
  77. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/__init__.py +2 -0
  78. chutils-3.4.2/src/chutils/commands/check.py +238 -0
  79. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/diagnostics.py +6 -2
  80. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/generate_context.py +30 -5
  81. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/watch.py +105 -105
  82. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/utils.py +19 -2
  83. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/validate.py +17 -4
  84. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/integrations.py +124 -124
  85. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/sse.py +258 -258
  86. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/webhook_server.py +217 -217
  87. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/ai_lint.py +4 -7
  88. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/ast_indexer.py +18 -4
  89. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/changelog_parser.py +3 -3
  90. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/project_metadata.py +7 -0
  91. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/dependency_sync.py +5 -13
  92. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/runners.py +202 -201
  93. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/scaffold.py +17 -18
  94. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/upgrade_client.py +33 -4
  95. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/watcher.py +424 -424
  96. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/di/container.py +6 -7
  97. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/lifecycle.py +35 -11
  98. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/__init__.py +9 -1
  99. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/masking.py +55 -0
  100. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/metrics/timer.py +2 -1
  101. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/qt/__init__.py +49 -49
  102. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/qt/asyncio.py +145 -141
  103. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/qt/logging.py +87 -87
  104. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/qt/shim.py +91 -90
  105. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/qt/signals.py +179 -179
  106. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/qt/widgets.py +95 -95
  107. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/__init__.py +5 -5
  108. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/concurrency/__init__.py +19 -19
  109. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/concurrency/base.py +63 -63
  110. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/concurrency/limiter.py +114 -114
  111. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/concurrency/models.py +41 -41
  112. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/concurrency/pool.py +128 -128
  113. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/concurrency/queues.py +391 -387
  114. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/backends/redis.py +2 -1
  115. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/decorator.py +2 -1
  116. chutils-3.4.2/tests/unit/cli/test_cli_check.py +60 -0
  117. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_dev_watch.py +118 -118
  118. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_utils_internal.py +15 -0
  119. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_integrations.py +95 -95
  120. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_sse.py +155 -155
  121. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_sse_integration.py +79 -79
  122. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_webhook.py +137 -137
  123. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_lifecycle.py +32 -0
  124. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_changelog_parser.py +8 -0
  125. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_runners.py +101 -101
  126. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_upgrade_client.py +21 -2
  127. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_watcher.py +135 -135
  128. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_masking.py +24 -0
  129. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_concurrency_imports.py +20 -20
  130. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_concurrency_limiter.py +43 -43
  131. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_concurrency_pool.py +58 -58
  132. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_concurrency_queues.py +161 -143
  133. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_config_alias_choices.py +45 -45
  134. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_config_fallback.py +72 -72
  135. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_db_operations.py +2 -1
  136. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_qt_asyncio.py +102 -100
  137. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_qt_logging.py +117 -115
  138. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_qt_shim.py +75 -75
  139. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_qt_signals.py +111 -109
  140. chutils-3.4.2/tests/unit/test_qt_widgets.py +127 -0
  141. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_store_backends_external.py +6 -1
  142. {chutils-3.4.0 → chutils-3.4.2}/uv.lock +403 -277
  143. chutils-3.4.0/conductor/archive/config_remote_push_20260702/metadata.json +0 -8
  144. chutils-3.4.0/conductor/archive/config_remote_push_20260702/plan.md +0 -29
  145. chutils-3.4.0/conductor/archive/config_remote_push_20260702/spec.md +0 -47
  146. chutils-3.4.0/conductor/archive/dev_watch_20260702/metadata.json +0 -8
  147. chutils-3.4.0/conductor/archive/dev_watch_20260702/plan.md +0 -29
  148. chutils-3.4.0/conductor/archive/dev_watch_20260702/spec.md +0 -52
  149. chutils-3.4.0/conductor/archive/fallback_alias_20260707/metadata.json +0 -8
  150. chutils-3.4.0/conductor/archive/fallback_alias_20260707/plan.md +0 -27
  151. chutils-3.4.0/conductor/archive/fallback_alias_20260707/spec.md +0 -37
  152. chutils-3.4.0/conductor/archive/qt_integration_20260521/metadata.json +0 -8
  153. chutils-3.4.0/conductor/archive/qt_integration_20260521/plan.md +0 -30
  154. chutils-3.4.0/conductor/archive/qt_integration_20260521/spec.md +0 -31
  155. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/index.md +0 -5
  156. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/metadata.json +0 -8
  157. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/plan.md +0 -27
  158. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/spec.md +0 -22
  159. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/index.md +0 -5
  160. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/metadata.json +0 -8
  161. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/plan.md +0 -45
  162. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/spec.md +0 -46
  163. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/index.md +0 -5
  164. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/metadata.json +0 -8
  165. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/plan.md +0 -47
  166. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/spec.md +0 -111
  167. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/index.md +0 -5
  168. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/metadata.json +0 -8
  169. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/plan.md +0 -38
  170. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/spec.md +0 -34
  171. chutils-3.4.0/conductor/tracks.md +0 -7
  172. chutils-3.4.0/docs/cli/validate.md +0 -78
  173. chutils-3.4.0/tests/unit/test_qt_widgets.py +0 -58
  174. {chutils-3.4.0 → chutils-3.4.2}/.chutilsignore +0 -0
  175. {chutils-3.4.0 → chutils-3.4.2}/.gitattributes +0 -0
  176. {chutils-3.4.0 → chutils-3.4.2}/.github/workflows/ci.yml +0 -0
  177. {chutils-3.4.0 → chutils-3.4.2}/.github/workflows/publish-docs.yml +0 -0
  178. {chutils-3.4.0 → chutils-3.4.2}/.gitignore +0 -0
  179. {chutils-3.4.0 → chutils-3.4.2}/CODE_OF_CONDUCT.md +0 -0
  180. {chutils-3.4.0 → chutils-3.4.2}/CONTRIBUTING.md +0 -0
  181. {chutils-3.4.0 → chutils-3.4.2}/GEMINI.md +0 -0
  182. {chutils-3.4.0 → chutils-3.4.2}/LICENSE +0 -0
  183. {chutils-3.4.0 → chutils-3.4.2}/README.md +0 -0
  184. {chutils-3.4.0 → chutils-3.4.2}/ai-lint.toml +0 -0
  185. {chutils-3.4.0 → chutils-3.4.2}/benchmarks/cold_start.py +0 -0
  186. {chutils-3.4.0 → chutils-3.4.2}/conductor/.gitignore +0 -0
  187. {chutils-3.4.0 → chutils-3.4.2}/conductor/GEMINI.md +0 -0
  188. {chutils-3.4.0 → chutils-3.4.2}/conductor/code_styleguides/python.md +0 -0
  189. {chutils-3.4.0 → chutils-3.4.2}/conductor/index.md +0 -0
  190. {chutils-3.4.0 → chutils-3.4.2}/conductor/product-guidelines.md +0 -0
  191. {chutils-3.4.0 → chutils-3.4.2}/conductor/product.md +0 -0
  192. {chutils-3.4.0 → chutils-3.4.2}/conductor/setup_state.json +0 -0
  193. {chutils-3.4.0 → chutils-3.4.2}/conductor/tech-stack.md +0 -0
  194. {chutils-3.4.0 → chutils-3.4.2}/conductor/workflow.md +0 -0
  195. {chutils-3.4.0 → chutils-3.4.2}/docs/CODE_OF_CONDUCT_RU.md +0 -0
  196. {chutils-3.4.0 → chutils-3.4.2}/docs/CONTRIBUTING_RU.md +0 -0
  197. {chutils-3.4.0 → chutils-3.4.2}/docs/README_RU.md +0 -0
  198. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/README.md +0 -0
  199. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/configuration/README.md +0 -0
  200. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/configuration/bad_pattern.py +0 -0
  201. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/configuration/good_pattern.py +0 -0
  202. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/error_handling/README.md +0 -0
  203. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/error_handling/bad_pattern.py +0 -0
  204. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/error_handling/good_pattern.py +0 -0
  205. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/logging/README.md +0 -0
  206. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/logging/bad_pattern.py +0 -0
  207. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/logging/good_pattern.py +0 -0
  208. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/optional_deps/README.md +0 -0
  209. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/optional_deps/bad_pattern.py +0 -0
  210. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/optional_deps/good_pattern.py +0 -0
  211. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/secrets/README.md +0 -0
  212. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/secrets/bad_pattern.py +0 -0
  213. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_examples/secrets/good_pattern.py +0 -0
  214. {chutils-3.4.0 → chutils-3.4.2}/docs/ai_hints.md +0 -0
  215. {chutils-3.4.0 → chutils-3.4.2}/docs/api.md +0 -0
  216. {chutils-3.4.0 → chutils-3.4.2}/docs/audit.md +0 -0
  217. {chutils-3.4.0 → chutils-3.4.2}/docs/captcha.md +0 -0
  218. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/config.md +0 -0
  219. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/db.md +0 -0
  220. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/env.md +0 -0
  221. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/index.md +0 -0
  222. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/init.md +0 -0
  223. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/pypi.md +0 -0
  224. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/secrets.md +0 -0
  225. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/show_paths.md +0 -0
  226. {chutils-3.4.0 → chutils-3.4.2}/docs/cli/template.md +0 -0
  227. {chutils-3.4.0 → chutils-3.4.2}/docs/custom_config_providers.md +0 -0
  228. {chutils-3.4.0 → chutils-3.4.2}/docs/http.md +0 -0
  229. {chutils-3.4.0 → chutils-3.4.2}/docs/index.md +0 -0
  230. {chutils-3.4.0 → chutils-3.4.2}/docs/migration.md +0 -0
  231. {chutils-3.4.0 → chutils-3.4.2}/docs/plugins.md +0 -0
  232. {chutils-3.4.0 → chutils-3.4.2}/docs/recipes.md +0 -0
  233. {chutils-3.4.0 → chutils-3.4.2}/docs/scraping.md +0 -0
  234. {chutils-3.4.0 → chutils-3.4.2}/docs/store.md +0 -0
  235. {chutils-3.4.0 → chutils-3.4.2}/docs/testing.md +0 -0
  236. {chutils-3.4.0 → chutils-3.4.2}/docs/web.md +0 -0
  237. {chutils-3.4.0 → chutils-3.4.2}/examples/.env +0 -0
  238. {chutils-3.4.0 → chutils-3.4.2}/examples/01_configuration.py +0 -0
  239. {chutils-3.4.0 → chutils-3.4.2}/examples/02_logging.py +0 -0
  240. {chutils-3.4.0 → chutils-3.4.2}/examples/03_secrets.py +0 -0
  241. {chutils-3.4.0 → chutils-3.4.2}/examples/04_full_example.py +0 -0
  242. {chutils-3.4.0 → chutils-3.4.2}/examples/05_different_log_levels.py +0 -0
  243. {chutils-3.4.0 → chutils-3.4.2}/examples/06_local_config_override.py +0 -0
  244. {chutils-3.4.0 → chutils-3.4.2}/examples/07_decorators_example.py +0 -0
  245. {chutils-3.4.0 → chutils-3.4.2}/examples/08_multiple_loggers_example.py +0 -0
  246. {chutils-3.4.0 → chutils-3.4.2}/examples/09_disable_keyring.py +0 -0
  247. {chutils-3.4.0 → chutils-3.4.2}/examples/10_universal_env_override.py +0 -0
  248. {chutils-3.4.0 → chutils-3.4.2}/examples/11_retry_decorator.py +0 -0
  249. {chutils-3.4.0 → chutils-3.4.2}/examples/12_secret_masking.py +0 -0
  250. {chutils-3.4.0 → chutils-3.4.2}/examples/13_pydantic_validation.py +0 -0
  251. {chutils-3.4.0 → chutils-3.4.2}/examples/15_context_logging.py +0 -0
  252. {chutils-3.4.0 → chutils-3.4.2}/examples/16_cloud_secret_managers.py +0 -0
  253. {chutils-3.4.0 → chutils-3.4.2}/examples/17_timeout_decorator.py +0 -0
  254. {chutils-3.4.0 → chutils-3.4.2}/examples/18_config_hot_reload.py +0 -0
  255. {chutils-3.4.0 → chutils-3.4.2}/examples/19_remote_config.py +0 -0
  256. {chutils-3.4.0 → chutils-3.4.2}/examples/20_opentelemetry_tracing.py +0 -0
  257. {chutils-3.4.0 → chutils-3.4.2}/examples/21_config_diagnostics.py +0 -0
  258. {chutils-3.4.0 → chutils-3.4.2}/examples/22_circuit_breaker_decorator.py +0 -0
  259. {chutils-3.4.0 → chutils-3.4.2}/examples/22_safe_path_resolution.py +0 -0
  260. {chutils-3.4.0 → chutils-3.4.2}/examples/23_event_bus.py +0 -0
  261. {chutils-3.4.0 → chutils-3.4.2}/examples/24_task_scheduler.py +0 -0
  262. {chutils-3.4.0 → chutils-3.4.2}/examples/25_testing_fixtures_example.py +0 -0
  263. {chutils-3.4.0 → chutils-3.4.2}/examples/26_metrics_prometheus.py +0 -0
  264. {chutils-3.4.0 → chutils-3.4.2}/examples/27_rate_limiting.py +0 -0
  265. {chutils-3.4.0 → chutils-3.4.2}/examples/28_dependency_injection.py +0 -0
  266. {chutils-3.4.0 → chutils-3.4.2}/examples/captcha_solvers_usage.py +0 -0
  267. {chutils-3.4.0 → chutils-3.4.2}/examples/config.yml +0 -0
  268. {chutils-3.4.0 → chutils-3.4.2}/examples/scraping_humanize_usage.py +0 -0
  269. {chutils-3.4.0 → chutils-3.4.2}/examples/web_client_usage.py +0 -0
  270. {chutils-3.4.0 → chutils-3.4.2}/mkdocs.yml +0 -0
  271. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/__init__.pyi +0 -0
  272. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/__main__.py +0 -0
  273. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/antigravity.md +0 -0
  274. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/__init__.py +0 -0
  275. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/_hash.py +0 -0
  276. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/backends/__init__.py +0 -0
  277. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/backends/base.py +0 -0
  278. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/backends/file.py +0 -0
  279. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/backends/postgres.py +0 -0
  280. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/backends/sqlite.py +0 -0
  281. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/audit/schema.py +0 -0
  282. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cache/__init__.py +0 -0
  283. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cache/base.py +0 -0
  284. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cache/in_memory.py +0 -0
  285. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cache/utils.py +0 -0
  286. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cli_booster.py +0 -0
  287. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/cli_utils.py +0 -0
  288. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/base.py +0 -0
  289. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/config.py +0 -0
  290. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/db.py +0 -0
  291. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/__init__.py +0 -0
  292. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/ai_lint.py +0 -0
  293. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/base.py +0 -0
  294. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/chat_context.py +0 -0
  295. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/clean.py +0 -0
  296. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/dashboard.py +0 -0
  297. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/few_shot.py +0 -0
  298. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/hooks.py +0 -0
  299. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/mock.py +0 -0
  300. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/profile_imports.py +0 -0
  301. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/scaffold.py +0 -0
  302. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/setup_github_actions.py +0 -0
  303. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/dev/sync_env.py +0 -0
  304. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/env.py +0 -0
  305. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/init.py +0 -0
  306. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/paths.py +0 -0
  307. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/pypi.py +0 -0
  308. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/secrets.py +0 -0
  309. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/commands/template.py +0 -0
  310. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/GEMINI.md +0 -0
  311. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/__init__.py +0 -0
  312. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/ast_fallback_parser.py +0 -0
  313. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/core.py +0 -0
  314. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/custom_providers.py +0 -0
  315. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/dev.py +0 -0
  316. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/diagnostics.py +0 -0
  317. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/generator.py +0 -0
  318. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/getters.py +0 -0
  319. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/manager.py +0 -0
  320. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/providers.py +0 -0
  321. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/schema.py +0 -0
  322. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/utils.py +0 -0
  323. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/config/watcher.py +0 -0
  324. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/context.py +0 -0
  325. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/crypto.py +0 -0
  326. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/db.py +0 -0
  327. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/decorators.py +0 -0
  328. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/__init__.py +0 -0
  329. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/chat_context.py +0 -0
  330. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/cleaner.py +0 -0
  331. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/constants.py +0 -0
  332. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/dashboard/__init__.py +0 -0
  333. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/dashboard/indexer.py +0 -0
  334. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/dashboard/input.py +0 -0
  335. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/dashboard/tui.py +0 -0
  336. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/env_parser.py +0 -0
  337. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/env_sync.py +0 -0
  338. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/few_shot/__init__.py +0 -0
  339. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/few_shot/detector.py +0 -0
  340. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/few_shot/models.py +0 -0
  341. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/few_shot/renderer.py +0 -0
  342. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/few_shot/writer.py +0 -0
  343. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/github_actions.py +0 -0
  344. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/mock_server.py +0 -0
  345. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/models/__init__.py +0 -0
  346. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/models/base.py +0 -0
  347. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/models/index.py +0 -0
  348. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/models/node.py +0 -0
  349. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/models/symbol.py +0 -0
  350. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/profile_imports.py +0 -0
  351. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/__init__.py +0 -0
  352. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/api_map.py +0 -0
  353. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/decomposition.py +0 -0
  354. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/docstring.py +0 -0
  355. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/env.py +0 -0
  356. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/integration.py +0 -0
  357. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/linter_coverage.py +0 -0
  358. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/manifest.py +0 -0
  359. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/security.py +0 -0
  360. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/rules/upgrade_check.py +0 -0
  361. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/dev/version_detector.py +0 -0
  362. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/di/__init__.py +0 -0
  363. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/di/__init__.pyi +0 -0
  364. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/diagnostics/__init__.py +0 -0
  365. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/diagnostics/manager.py +0 -0
  366. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/diagnostics/models.py +0 -0
  367. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/diagnostics/web.py +0 -0
  368. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/env.py +0 -0
  369. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/env.pyi +0 -0
  370. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/events/__init__.py +0 -0
  371. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/events/core.py +0 -0
  372. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/__init__.py +0 -0
  373. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/audit.py +0 -0
  374. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/base.py +0 -0
  375. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/cache.py +0 -0
  376. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/config.py +0 -0
  377. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/di.py +0 -0
  378. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/events.py +0 -0
  379. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/logger.py +0 -0
  380. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/resilience.py +0 -0
  381. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/secrets.py +0 -0
  382. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/system.py +0 -0
  383. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/validation.py +0 -0
  384. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/exceptions/watcher.py +0 -0
  385. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/features.py +0 -0
  386. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/fs.py +0 -0
  387. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/http/__init__.py +0 -0
  388. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/http/api.py +0 -0
  389. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/http/client.py +0 -0
  390. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/http/fallback.py +0 -0
  391. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/http/resilience.py +0 -0
  392. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/http/streaming.py +0 -0
  393. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/http/tracing.py +0 -0
  394. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/GEMINI.md +0 -0
  395. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/core.py +0 -0
  396. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/formatters.py +0 -0
  397. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/handlers.py +0 -0
  398. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/internal/builder.py +0 -0
  399. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/internal/levels.py +0 -0
  400. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/logger/internal/utils.py +0 -0
  401. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/metrics/__init__.py +0 -0
  402. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/metrics/base.py +0 -0
  403. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/metrics/in_memory.py +0 -0
  404. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/metrics/prometheus.py +0 -0
  405. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/plugins/__init__.py +0 -0
  406. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/plugins/core.py +0 -0
  407. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/plugins/interfaces.py +0 -0
  408. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/captcha/__init__.py +0 -0
  409. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/captcha/anticaptcha.py +0 -0
  410. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/captcha/base.py +0 -0
  411. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/captcha/capmonster.py +0 -0
  412. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/captcha/exceptions.py +0 -0
  413. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/captcha/rucaptcha.py +0 -0
  414. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/humanize/__init__.py +0 -0
  415. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/humanize/actions.py +0 -0
  416. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/humanize/antidetect.py +0 -0
  417. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/humanize/math_utils.py +0 -0
  418. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/scraping/humanize/warmer.py +0 -0
  419. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/GEMINI.md +0 -0
  420. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/__init__.py +0 -0
  421. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/core.py +0 -0
  422. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/providers/__init__.py +0 -0
  423. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/providers/aws.py +0 -0
  424. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/providers/base.py +0 -0
  425. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/providers/dotenv.py +0 -0
  426. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/providers/env.py +0 -0
  427. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/providers/gcp.py +0 -0
  428. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/secret_manager/providers/keyring_provider.py +0 -0
  429. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/__init__.py +0 -0
  430. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/backends/__init__.py +0 -0
  431. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/backends/base.py +0 -0
  432. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/backends/memcached.py +0 -0
  433. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/backends/memory.py +0 -0
  434. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/store/manager.py +0 -0
  435. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/tasks/__init__.py +0 -0
  436. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/tasks/__init__.pyi +0 -0
  437. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/tasks/core.py +0 -0
  438. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/testing/__init__.py +0 -0
  439. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/testing/fixtures.py +0 -0
  440. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/text.py +0 -0
  441. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/time.py +0 -0
  442. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/tracing.py +0 -0
  443. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/typing.py +0 -0
  444. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/validation.py +0 -0
  445. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/validation.pyi +0 -0
  446. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/web/__init__.py +0 -0
  447. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/web/client.py +0 -0
  448. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/web/proxy_pool.py +0 -0
  449. {chutils-3.4.0 → chutils-3.4.2}/src/chutils/web/user_agent.py +0 -0
  450. {chutils-3.4.0 → chutils-3.4.2}/tests/conftest.py +0 -0
  451. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/__init__.py +0 -0
  452. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_ai_lint_integration.py +0 -0
  453. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_cli_e2e.py +0 -0
  454. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_db_migrations.py +0 -0
  455. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_event_loops.py +0 -0
  456. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_examples.py +0 -0
  457. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_hooks_integration.py +0 -0
  458. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_masking_integration.py +0 -0
  459. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_otel_tracing.py +0 -0
  460. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_remote_config_integration.py +0 -0
  461. {chutils-3.4.0 → chutils-3.4.2}/tests/integration/test_setup_github_actions_integration.py +0 -0
  462. {chutils-3.4.0 → chutils-3.4.2}/tests/manual/manual_test_cli_booster.py +0 -0
  463. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/conftest.py +0 -0
  464. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli.py +0 -0
  465. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_booster.py +0 -0
  466. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_config.py +0 -0
  467. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_config_cmd.py +0 -0
  468. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_config_schema.py +0 -0
  469. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_dev.py +0 -0
  470. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_dev_cmd.py +0 -0
  471. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_dev_tree.py +0 -0
  472. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_diagnostics.py +0 -0
  473. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_extras_suggestion.py +0 -0
  474. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_init.py +0 -0
  475. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_init_interactive.py +0 -0
  476. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_paths.py +0 -0
  477. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_pypi.py +0 -0
  478. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_rich.py +0 -0
  479. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_rich_width.py +0 -0
  480. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_secrets.py +0 -0
  481. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_setup_github_actions.py +0 -0
  482. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_template.py +0 -0
  483. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/cli/test_cli_validate.py +0 -0
  484. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config.py +0 -0
  485. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_ast_parser.py +0 -0
  486. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_dev.py +0 -0
  487. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_diagnostics.py +0 -0
  488. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_env.py +0 -0
  489. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_env_loading.py +0 -0
  490. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_generator.py +0 -0
  491. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_json.py +0 -0
  492. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_pydantic.py +0 -0
  493. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_required.py +0 -0
  494. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_schema.py +0 -0
  495. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_tracing.py +0 -0
  496. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_universal_env.py +0 -0
  497. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_utils.py +0 -0
  498. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_validation_group.py +0 -0
  499. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_config_watcher.py +0 -0
  500. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_custom_config_providers.py +0 -0
  501. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_priority_unification.py +0 -0
  502. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/config/test_remote_config.py +0 -0
  503. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_ast_indexer.py +0 -0
  504. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_ast_indexer_abstract.py +0 -0
  505. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_ast_indexer_graph.py +0 -0
  506. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_ast_indexer_layers.py +0 -0
  507. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_ast_indexer_metadata.py +0 -0
  508. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_cache.py +0 -0
  509. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_dev_models.py +0 -0
  510. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_exceptions.py +0 -0
  511. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_features.py +0 -0
  512. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_fs.py +0 -0
  513. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_thread_safety.py +0 -0
  514. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/core/test_time.py +0 -0
  515. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/decorators/test_decorator_circuit_breaker.py +0 -0
  516. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/decorators/test_decorator_retry.py +0 -0
  517. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/decorators/test_decorator_timeout.py +0 -0
  518. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/decorators/test_decorators.py +0 -0
  519. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/decorators/test_rate_limit.py +0 -0
  520. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_ai_lint.py +0 -0
  521. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_ai_lint_staged.py +0 -0
  522. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_chat_context.py +0 -0
  523. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_cleaner.py +0 -0
  524. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_env_parser.py +0 -0
  525. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_env_sync.py +0 -0
  526. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_generate_few_shot.py +0 -0
  527. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_linter_coverage_rule.py +0 -0
  528. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_mock_server.py +0 -0
  529. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_scaffold.py +0 -0
  530. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_setup_github_actions.py +0 -0
  531. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_upgrade_check_rule.py +0 -0
  532. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/dev/test_version_detector.py +0 -0
  533. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/di/test_di.py +0 -0
  534. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/events/test_event_bus.py +0 -0
  535. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/conftest.py +0 -0
  536. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_basics.py +0 -0
  537. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_compression.py +0 -0
  538. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_config_sections.py +0 -0
  539. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_configuration.py +0 -0
  540. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_context.py +0 -0
  541. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_env_control.py +0 -0
  542. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_files.py +0 -0
  543. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_json_format.py +0 -0
  544. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_logger_rich_width.py +0 -0
  545. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_performance_security.py +0 -0
  546. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_rich.py +0 -0
  547. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/logger/test_rotation.py +0 -0
  548. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/metrics/test_metrics.py +0 -0
  549. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/plugins/test_integration.py +0 -0
  550. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/plugins/test_interfaces.py +0 -0
  551. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/plugins/test_plugins.py +0 -0
  552. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/secret_manager/test_secret_manager.py +0 -0
  553. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/secret_manager/test_secret_manager_env.py +0 -0
  554. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/secret_manager/test_secret_manager_providers.py +0 -0
  555. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/secret_manager/test_secrets_required.py +0 -0
  556. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/tasks/test_scheduler.py +0 -0
  557. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_ai_lint_ignore.py +0 -0
  558. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_anticaptcha.py +0 -0
  559. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_antidetect.py +0 -0
  560. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_async_web_client.py +0 -0
  561. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_audit.py +0 -0
  562. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_audit_phase2.py +0 -0
  563. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_capmonster.py +0 -0
  564. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_captcha_base.py +0 -0
  565. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_captcha_imports.py +0 -0
  566. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_cli_db.py +0 -0
  567. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_crypto.py +0 -0
  568. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_crypto_dependencies.py +0 -0
  569. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_dashboard.py +0 -0
  570. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_db_init.py +0 -0
  571. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_decorators_bulkhead.py +0 -0
  572. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_diagnostics.py +0 -0
  573. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_env.py +0 -0
  574. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_events_exception_group.py +0 -0
  575. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_http_api.py +0 -0
  576. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_http_client.py +0 -0
  577. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_http_fallback.py +0 -0
  578. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_http_resilience.py +0 -0
  579. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_http_streaming.py +0 -0
  580. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_http_tracing.py +0 -0
  581. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_humanize_math.py +0 -0
  582. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_install_hooks.py +0 -0
  583. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_minimal_imports.py +0 -0
  584. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_nodriver_humanize.py +0 -0
  585. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_playwright_humanize.py +0 -0
  586. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_profile_imports.py +0 -0
  587. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_profile_warmer.py +0 -0
  588. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_proxy_pool.py +0 -0
  589. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_rucaptcha.py +0 -0
  590. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_scraping_imports.py +0 -0
  591. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_selenium_humanize.py +0 -0
  592. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_store_integrations.py +0 -0
  593. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_store_manager.py +0 -0
  594. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_store_memory.py +0 -0
  595. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_text.py +0 -0
  596. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_text_dependencies.py +0 -0
  597. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_user_agent.py +0 -0
  598. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_validation.py +0 -0
  599. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_web_client.py +0 -0
  600. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/test_web_imports.py +0 -0
  601. {chutils-3.4.0 → chutils-3.4.2}/tests/unit/testing/test_fixtures.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chutils
3
- Version: 3.4.0
3
+ Version: 3.4.2
4
4
  Summary: Набор простых и удобных утилит для Python, который избавляет от рутины при работе с конфигурацией и логированием в новых проектах.
5
5
  Author-email: Chu4hel <sergeiivanov636@gmail.com>
6
6
  License-Expression: MIT
@@ -1,9 +1,9 @@
1
1
  ---
2
- chutils_version: 3.3.2
3
- project_version: 3.3.2
4
- git_commit: 1056ddfc241c7c49c89d0e5ceb7c71b6a49fcb9e (dirty)
5
- generated_at: 2026-07-25T09:58:24.525089+00:00
6
- project_hash: c9fdfbcccbbcd7da26d504ea6a52c71ac54d3d6ac8ad3db65ab038e0112d8666
2
+ chutils_version: 3.4.1
3
+ project_version: 3.4.1
4
+ git_commit: 35b0abb02583ebebbd7a918dd74a5056d6b40c5c (dirty)
5
+ generated_at: 2026-07-30T21:04:30.356972+00:00
6
+ project_hash: 73c182750cd7e4d409a97fe4e3797cb39064637a44fe36638c5c113466639683
7
7
  ---
8
8
 
9
9
  # Public API Map: chutils
@@ -88,7 +88,7 @@ project_hash: c9fdfbcccbbcd7da26d504ea6a52c71ac54d3d6ac8ad3db65ab038e0112d8666
88
88
  | `Scaffolder` | class | `(self, module_name: 'str', output_dir: 'str \| None' = None, force: 'bool' = False) -> 'None'` | Генератор слоев Чистой Архитектуры для нового модуля. |
89
89
  | `SecretError` | class | `(self, message: str, hint: str \| None = None, **context: Any) -> None` | Общая ошибка менеджера секретов. |
90
90
  | `SecretManager` | class | `(self, service_name: 'str \| None' = None, prefix: 'str \| None' = None, auto_mask_logs: 'bool' = True, providers: 'list[SecretProvider] \| None' = None) -> 'None'` | Универсальный менеджер для управления секретами через цепочку провайдеров. |
91
- | `SecretMaskingFilter` | class | `(self, name='')` | Фильтр для автоматического маскирования секретов в сообщениях логов. |
91
+ | `SecretMaskingFilter` | class | `(self, name: 'str' = '', secrets: 'list[str] \| set[str] \| None' = None, patterns: 'list[str] \| set[str] \| None' = None) -> 'None'` | Фильтр для автоматического маскирования секретов в сообщениях логов. |
92
92
  | `SecretNotFoundError` | class | `(self, message: str, hint: str \| None = None, **context: Any) -> None` | Ошибка: секрет не найден. |
93
93
  | `SecretProviderError` | class | `(self, message: str, hint: str \| None = None, **context: Any) -> None` | Ошибка конкретного провайдера секретов (например, сбой keyring). |
94
94
  | `ServerSentEvent` | class | `(self, id: 'str \| None' = None, event: 'str \| None' = None, data: 'str' = '', retry: 'int \| None' = None, raw: 'str' = '') -> None` | Представляет собой отдельное событие Server-Sent Events (SSE). |
@@ -1,4 +1,4 @@
1
- # Track fallback_alias_20260707 Context
1
+ # Track ai_context_opt_20260728 Context
2
2
 
3
3
  - [Specification](./spec.md)
4
4
  - [Implementation Plan](./plan.md)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "ai_context_opt_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T21:09:22.614964",
6
+ "updated_at": "2026-07-28T21:09:22.614995",
7
+ "description": "Оптимизация AI-контекст генератора (.gitignore и инкрементальное обновление)"
8
+ }
@@ -0,0 +1,17 @@
1
+ # Implementation Plan - AI Context Generator Optimization (`ai_context_opt_20260728`)
2
+
3
+ Оптимизация утилиты `chutils dev generate-context` с помощью `.gitignore` парсера и инкрементального AST-обновления.
4
+
5
+ ## Phase 1: Gitignore Parser (`src/chutils/dev/context/gitignore.py`)
6
+ - [ ] Task: Добавить поддержку чтения и парсинга `.gitignore` файлов через `pathspec` или встроенный fnmatch-механизм в `src/chutils/dev/context/gitignore.py`.
7
+ - [ ] Task: Интегрировать опцию `--gitignore` в команду CLI `generate-context` (`src/chutils/commands/dev.py`).
8
+
9
+ ## Phase 2: Incremental AST Indexer (`src/chutils/dev/context/incremental.py`)
10
+ - [ ] Task: Реализовать получение списка измененных файлов через `git status` / `git diff` в `src/chutils/dev/context/incremental.py`.
11
+ - [ ] Task: Реализовать логику частичной замены узлов AST для измененных файлов в `project_index.json` и `api_map.md`.
12
+ - [ ] Task: Интегрировать флаги `--incremental` / `-i` в CLI утилиту `generate-context`.
13
+
14
+ ## Phase 3: Testing & Verification
15
+ - [ ] Task: Написать unit-тесты для парсера `.gitignore` и инкрементальной генерации в `tests/unit/dev/test_context_generator.py`.
16
+ - [ ] Task: Проверить работу команды через `uv run mypy src/chutils` и `uv run pytest tests/unit/dev/`.
17
+ - [ ] Task: Обновить документацию в `docs/api.md` и перегенерировать `api_map.md`.
@@ -0,0 +1,23 @@
1
+ # Specification: AI Context Generator Optimization (`ai_context_opt_20260728`)
2
+
3
+ ## 1. Overview
4
+ Расширение возможностей утилиты `chutils dev generate-context` флагами `--gitignore` (учет игнорируемых Git файлов) и `--incremental` / `-i` (инкрементальное обновление семантических индексов AST на основе `git diff` / `git status`).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Учет `.gitignore` (`--gitignore`)**:
8
+ - Чтение паттернов из файла `.gitignore` (а также корневых и вложенных `.gitignore` целевого проекта).
9
+ - Исключение подходящих под правила файлов и каталогов из сканирования наравне с `.chutilsignore`.
10
+ 2. **Инкрементальное обновление (`--incremental` / `-i`)**:
11
+ - Определение списка измененных или добавленных файлов с последнего Git-коммита (`git diff --name-only HEAD` / `git status`).
12
+ - Перепарсинг AST-дерева только для изменившихся файлов и частичное обновление структур `project_index.json` и `api_map.md` без полного перестроения индекса всей кодовой базы.
13
+ 3. **Безопасность и хэширование**:
14
+ - Автоматический пересчет хэша проекта после частичного обновления во избежание срабатывания `APIMapHashRule` в аудиторе.
15
+
16
+ ## 3. Non-Functional Requirements
17
+ - Сокращение времени генерации контекста на крупных проектах (500+ файлов) в режиме `--incremental` более чем на 80%.
18
+ - Полная совместимость со существующим CLI-интерфейсом `chutils dev generate-context`.
19
+
20
+ ## 4. Acceptance Criteria
21
+ - [ ] Флаг `--gitignore` отсеивает `build/`, `.venv/` и файлы, указанные в `.gitignore`.
22
+ - [ ] Флаг `--incremental` обновляет метаданные AST только для измененных файлов в `project_index.json` и `api_map.md`.
23
+ - [ ] Тесты в `tests/unit/dev/test_context_generator.py` подтверждают правильность отбора файлов.
@@ -1,4 +1,4 @@
1
- # Track config_remote_push_20260702 Context
1
+ # Track async_lifecycle_20260728 Context
2
2
 
3
3
  - [Specification](./spec.md)
4
4
  - [Implementation Plan](./plan.md)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "async_lifecycle_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T21:02:11.640486",
6
+ "updated_at": "2026-07-28T21:02:11.640546",
7
+ "description": "Асинхронный контекстный менеджер lifecycle()"
8
+ }
@@ -0,0 +1,16 @@
1
+ # Implementation Plan - Async Lifecycle Context Manager (`async_lifecycle_20260728`)
2
+
3
+ Реализация асинхронного контекстного менеджера `async_lifecycle` в `chutils.lifecycle`.
4
+
5
+ ## Phase 1: Lifecycle Context Implementation (`src/chutils/lifecycle.py`)
6
+ - [ ] Task: Создать класс/функцию `AsyncLifecycleContext` и публичную функцию `lifecycle()` в `src/chutils/lifecycle.py`.
7
+ - [ ] Task: Реализовать логику `__aenter__` (авто-подключение сигналов при `setup_signals=True`) и `__aexit__` (безопасный вызов `async_run_cleanup()`).
8
+ - [ ] Task: Добавить поддержку опционального автоклининга подсистем (`db`, `tasks`, `logger`) при `auto_cleanup_subsystems=True`.
9
+
10
+ ## Phase 2: Unit Testing & Integration Verification
11
+ - [ ] Task: Написать unit-тесты для `async with lifecycle()` с успешным завершением и сгенерированным исключением в `tests/unit/core/test_lifecycle.py`.
12
+ - [ ] Task: Написать тесты перехвата сигналов ОС в контекстном менеджере.
13
+
14
+ ## Phase 3: Verification & Documentation
15
+ - [ ] Task: Запустить `uv run mypy src/chutils` и `uv run pytest tests/unit/core/test_lifecycle.py`.
16
+ - [ ] Task: Добавить примеры использования `async with lifecycle()` в `docs/api.md` и обновить `api_map.md`.
@@ -0,0 +1,26 @@
1
+ # Specification: Async Lifecycle Context Manager (`async_lifecycle_20260728`)
2
+
3
+ ## 1. Overview
4
+ Добавление контекстного менеджера `lifecycle()` / `async_lifecycle()` в модуль `chutils.lifecycle` для удобного и надежного управления ресурсами приложения с поддержкой `async with` (и синхронного `with`).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Контекстный синтаксис**:
8
+ ```python
9
+ async with chutils.lifecycle(setup_signals=True, auto_cleanup_subsystems=True):
10
+ await app.run()
11
+ ```
12
+ 2. **Гибкие параметры управления**:
13
+ - `setup_signals: bool = True`: Автоматическое подключение перехвата сигналов `SIGINT`/`SIGTERM` при входе и сброс при выходе.
14
+ - `auto_cleanup_subsystems: bool = True`: Автоматический вызов функций очистки для связанных подсистем (`db`, `tasks`, `logger`).
15
+ 3. **Идемпотентность и поддержка Event Loop**:
16
+ - Безопасное выполнение в асинхронном контексте с ожиданием завершения всех коллбэков очистки в текущем петле событий (`asyncio.get_running_loop()`).
17
+ - Защита от повторного выполнения очистки, если она уже была запущена по сигналу ОС.
18
+
19
+ ## 3. Non-Functional Requirements
20
+ - Совместимость с FastAPI Lifespan, Litestar, qasync (PyQt6) и asyncio CLI.
21
+ - 100% строгая типизация (Zero-Any) и полная потокобезопасность.
22
+
23
+ ## 4. Acceptance Criteria
24
+ - [ ] `async with lifecycle()` корректно выполняет зарегистрированные коллбэки при выходе из блока или при вызове `Ctrl+C`.
25
+ - [ ] Параметры `setup_signals` и `auto_cleanup_subsystems` позволяют точно настраивать поведение контекста.
26
+ - [ ] Добавлены модульные тесты в `tests/unit/core/test_lifecycle.py`.
@@ -1,5 +1,5 @@
1
- # Track qt_integration_20260521 Context
2
-
3
- - [Specification](./spec.md)
4
- - [Implementation Plan](./plan.md)
5
- - [Metadata](./metadata.json)
1
+ # Track browser_profiles_20260728 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "browser_profiles_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T20:55:19.986167",
6
+ "updated_at": "2026-07-28T20:55:19.986187",
7
+ "description": "Поддержка родительских профилей браузеров (nodriver, playwright, selenium)"
8
+ }
@@ -0,0 +1,23 @@
1
+ # Implementation Plan - Browser Profiles Support (`browser_profiles_20260728`)
2
+
3
+ Модуль управления, экспорта, импорта и переноса авторизованных сессий и профилей браузеров между `nodriver`, `playwright` и `selenium`.
4
+
5
+ ## Phase 1: Core Data Models & Serialization (`chutils.scraping.profiles.models`)
6
+ - [ ] Task: Создать Pydantic-модели профилей `BrowserProfile`, `CookieData`, `StorageData`, `HeaderData` в `src/chutils/scraping/profiles/models.py`.
7
+ - [ ] Task: Реализовать методы упаковывания/распаковывания `.chprofile` архивов с поддержкой Fernet-шифрования (`chutils.crypto`) в `src/chutils/scraping/profiles/storage.py`.
8
+ - [ ] Task: Написать unit-тесты для сериализации, шифрования и распаковки `BrowserProfile` в `tests/unit/scraping/test_profile_storage.py`.
9
+
10
+ ## Phase 2: Engine Adapters (nodriver, playwright, selenium)
11
+ - [ ] Task: Реализовать адаптер экспорта/импорта для `playwright` (Async & Sync Contexts) в `src/chutils/scraping/profiles/adapters/playwright.py`.
12
+ - [ ] Task: Реализовать адаптер экспорта/импорта для `nodriver` через CDP в `src/chutils/scraping/profiles/adapters/nodriver.py`.
13
+ - [ ] Task: Реализовать адаптер экспорта/импорта для `selenium`/`undetected_chromedriver` в `src/chutils/scraping/profiles/adapters/selenium.py`.
14
+ - [ ] Task: Написать unit-тесты с моками для всех трех адаптеров движков в `tests/unit/scraping/test_profile_adapters.py`.
15
+
16
+ ## Phase 3: ProfileManager & Public API Integration
17
+ - [ ] Task: Создать единый интерфейс `ProfileManager` в `src/chutils/scraping/profiles/manager.py` с методами `export_profile()`, `import_profile()`, `convert_profile()`.
18
+ - [ ] Task: Экспортировать `BrowserProfile` и `ProfileManager` в `src/chutils/scraping/__init__.py` и `src/chutils/__init__.py` с поддержкой ленивой загрузки (PEP 562).
19
+ - [ ] Task: Добавить интеграционные тесты конвертации профилей между движками в `tests/unit/scraping/test_profile_manager.py`.
20
+
21
+ ## Phase 4: Verification & Documentation
22
+ - [ ] Task: Проверить проект через `uv run mypy src/chutils` и `uv run pytest`.
23
+ - [ ] Task: Обновить документацию в `docs/scraping.md` и сгенерировать контекст через `uv run chutils dev generate-context --force -o api_map.md`.
@@ -0,0 +1,33 @@
1
+ # Specification: Browser Profiles Export/Import (`chutils.scraping.profiles`)
2
+
3
+ ## 1. Overview
4
+ Модуль `chutils.scraping.profiles` предназначен для экспорта, сохранения, конвертации и импорта авторизованных сессий и профилей браузеров между различными движками скрейпинга (`nodriver`, `playwright`, `selenium`/`undetected-chromedriver`).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Поддержка сессионных данных**:
8
+ - Экспорт и импорт авторизационных Cookie (с привязкой к доменам, SameSite, Secure, Expiry).
9
+ - Экспорт и импорт `LocalStorage` и `SessionStorage` для каждого домена.
10
+ - Экспорт и импорт структурированных данных `IndexedDB`.
11
+ - Сохранение и автоматическое восстановление метаданных браузера и HTTP-заголовков (`User-Agent`, `Accept-Language`, `Sec-CH-UA`).
12
+ 2. **Универсальный формат хранения**:
13
+ - Портативный `.chprofile` файл (ZIP-архив с JSON-структурой сессии и бинарными дампами).
14
+ - Опциональная интеграция с `chutils.crypto` для парольного шифрования профилей (Fernet).
15
+ 3. **Бесшовный переход между движками**:
16
+ - Метод `ProfileManager.export_from_nodriver(tab)` для извлечения куков и хранилищ через CDP (Chrome DevTools Protocol).
17
+ - Метод `ProfileManager.import_to_nodriver(tab, profile)` для подгрузки сессии в активную вкладку `nodriver`.
18
+ - Метод `ProfileManager.export_from_playwright(page/context)` для извлечения `storage_state` и данных хранилищ `playwright`.
19
+ - Метод `ProfileManager.import_to_playwright(context/page, profile)` для установки куков и выполнения скриптов восстановления хранилищ.
20
+ - Базовая поддержка экспорта/импорта для `selenium` / `undetected-chromedriver`.
21
+ 4. **Безопасность и обработка ошибок**:
22
+ - При наличии несериализуемых данных в `IndexedDB` применяется Safe Fallback с журналированием предупреждения в лог без остановки работы.
23
+ - При отсутствии установленных библиотек (`playwright`, `nodriver`, `selenium`) выбрасываются понятные `OptionalDependencyError`.
24
+
25
+ ## 3. Non-Functional Requirements
26
+ - 100% покрытие аннотациями типов без использования `Any` в бизнес-логике.
27
+ - Потоко- и асинхронная безопасность (`asyncio.Lock` при операциях со Storage).
28
+ - Модульные тесты на замену и конвертацию формата между `nodriver` и `playwright`.
29
+
30
+ ## 4. Acceptance Criteria
31
+ - [ ] Профиль, экспортированный из `nodriver`, успешно восстанавливает авторизованную сессию и куки в `playwright` (и наоборот).
32
+ - [ ] Экспортированный профиль корректно сохраняется в шифрованный `.chprofile` и распаковывается по паролю.
33
+ - [ ] Ошибки несериализуемых значений Storage обрабатываются с вызовом `logger.warning()` без падения приложения.
@@ -0,0 +1,5 @@
1
+ # Track queue_monitoring_20260728 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "queue_monitoring_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T20:58:30.182743",
6
+ "updated_at": "2026-07-28T20:58:30.182776",
7
+ "description": "Мониторинг очередей задач и воркеров через Prometheus"
8
+ }
@@ -0,0 +1,16 @@
1
+ # Implementation Plan - Queue & Worker Prometheus Monitoring (`queue_monitoring_20260728`)
2
+
3
+ Внедрение мониторинга очередей задач и пула воркеров через `chutils.metrics`.
4
+
5
+ ## Phase 1: Queue Metrics Collector (`src/chutils/scraping/concurrency/metrics.py`)
6
+ - [ ] Task: Создать модуль `src/chutils/scraping/concurrency/metrics.py` с объявлением метрик `QueueMetricsCollector`.
7
+ - [ ] Task: Добавить поддержку параметра `enable_metrics: bool = True` в `BaseTaskQueue`, `InMemoryTaskQueue`, `PersistentTaskQueue` и `RedisTaskQueue`.
8
+ - [ ] Task: Написать unit-тесты сбора метрик очередей в `tests/unit/scraping/test_queue_metrics.py`.
9
+
10
+ ## Phase 2: WorkerPool Integration
11
+ - [ ] Task: Интегрировать измерение длительности выполнения задач `@timer` и подсчет статусов обработки в `WorkerPool` (`src/chutils/scraping/concurrency/worker.py`).
12
+ - [ ] Task: Написать unit-тесты для `WorkerPool` с проверкой метрик в `tests/unit/scraping/test_worker_metrics.py`.
13
+
14
+ ## Phase 3: Verification & Documentation
15
+ - [ ] Task: Запустить `uv run mypy src/chutils` и `uv run pytest tests/unit/scraping/`.
16
+ - [ ] Task: Обновить документацию `docs/scraping.md` и перегенерировать `api_map.md`.
@@ -0,0 +1,26 @@
1
+ # Specification: Queue & Worker Prometheus Monitoring (`queue_monitoring_20260728`)
2
+
3
+ ## 1. Overview
4
+ Интеграция подсистемы метрик `chutils.metrics` в очереди задач (`InMemoryTaskQueue`, `PersistentTaskQueue`, `RedisTaskQueue`) и пул воркеров `WorkerPool` для мониторинга в реальном времени с экспортом в формате Prometheus.
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Экспортируемые метрики**:
8
+ - `chutils_queue_pending_size` (Gauge): размер очереди ожидания с метками `queue_name` и `queue_type`.
9
+ - `chutils_task_execution_duration_seconds` (Histogram/Timer): время обработки задач с метками `queue_name`, `status`.
10
+ - `chutils_tasks_processed_total` (Counter): общее количество завершенных задач с метками `status` (`completed`, `failed`, `retried`).
11
+ - `chutils_worker_pool_active_workers` (Gauge): число активных воркеров в пуле.
12
+ 2. **Интеграция с очередями**:
13
+ - Автоматический трекинг размера при вызовах `push()`, `pop()`, `complete()`, `fail()`, `clear()`.
14
+ - Возможность включения/отключения экспорта метрик через опциональный параметр `enable_metrics=True` в конструкторе очередей и `WorkerPool`.
15
+ 3. **Совместимость с `chutils.metrics`**:
16
+ - Использование абстракции `chutils.metrics` с поддержкой No-Op fallback (если `prometheus_client` не установлен или метрики отключены).
17
+
18
+ ## 3. Non-Functional Requirements
19
+ - Нулевые накладные расходы при выключенном флаге метрик.
20
+ - Потоко- и асинхронная безопасность.
21
+ - Полное отсутствие `Any` в аннотациях типов.
22
+
23
+ ## 4. Acceptance Criteria
24
+ - [ ] Очереди `InMemoryTaskQueue`, `PersistentTaskQueue` и `RedisTaskQueue` обновляют Gauge размера очереди при выполнении операций.
25
+ - [ ] `WorkerPool` записывает длительность выполнения и число обработанных задач при работе с очередями.
26
+ - [ ] Тесты подтверждают корректный сбор метрик и работы без библиотеки `prometheus_client`.
@@ -1,4 +1,4 @@
1
- # Track dev_watch_20260702 Context
1
+ # Track stream_crypto_20260728 Context
2
2
 
3
3
  - [Specification](./spec.md)
4
4
  - [Implementation Plan](./plan.md)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "stream_crypto_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T21:06:58.057037",
6
+ "updated_at": "2026-07-28T21:06:58.057058",
7
+ "description": "Потоковое AES-GCM шифрование файлов гигантского объема"
8
+ }
@@ -0,0 +1,16 @@
1
+ # Implementation Plan - Streaming Encryption for Large Files (`stream_crypto_20260728`)
2
+
3
+ Реализация чанкового (потокового) шифрования файлов больших размеров в `chutils.crypto`.
4
+
5
+ ## Phase 1: Streaming Cipher Engine (`src/chutils/crypto/stream.py`)
6
+ - [ ] Task: Реализовать класс `StreamCipher` в `src/chutils/crypto/stream.py` для обработки файлов блоками AES-GCM с уникальными Nonce.
7
+ - [ ] Task: Обновить `encrypt_file` и `decrypt_file` в `src/chutils/crypto/core.py` с поддержкой `stream=True` и `chunk_size`.
8
+ - [ ] Task: Добавить обработку `OptionalDependencyError` при отсутствии библиотеки `cryptography`.
9
+
10
+ ## Phase 2: Testing & Memory Benchmark
11
+ - [ ] Task: Написать unit-тесты для потокового шифрования и расшифровки файлов в `tests/unit/test_crypto_stream.py`.
12
+ - [ ] Task: Добавить тесты обнаружения подмененных/поврежденных чанков (AES-GCM integrity failure).
13
+
14
+ ## Phase 3: Verification & Documentation
15
+ - [ ] Task: Запустить `uv run mypy src/chutils` и `uv run pytest tests/unit/test_crypto*.py`.
16
+ - [ ] Task: Обновить примеры использования шифрования больших файлов в `docs/api.md` и обновить `api_map.md`.
@@ -0,0 +1,22 @@
1
+ # Specification: Streaming Encryption for Large Files (`stream_crypto_20260728`)
2
+
3
+ ## 1. Overview
4
+ Добавление поддержки потокового чанкового шифрования и расшифрования файлов произвольного объема (включая десятки гигабайт) в модуле `chutils.crypto` с жестко ограниченным потреблением оперативной памяти (O(1) Memory).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Потоковая обработка**:
8
+ - Реализовать считывание, шифрование и запись файлов фиксированными блоками (по умолчанию `chunk_size = 64 МБ`).
9
+ - Расширить сигнатуру существующих функций `encrypt_file` и `decrypt_file` параметрами `stream: bool = True` и `chunk_size: int = 64 * 1024 * 1024`.
10
+ 2. **Криптографическая стойкость**:
11
+ - Использование симметричного шифрования AES-GCM (через `cryptography.hazmat.primitives.ciphers.aead.AESGCM`) с независимыми IV (Nonce) для каждого чанка и генерацией уникального заголовка (Header) со счетчиком чанков.
12
+ 3. **Безопасность и проверка целостности**:
13
+ - Валидация тега аутентификации для каждого блока при расшифровке. Если один из блоков поврежден или подменен, выбросить `InvalidSignature` / `DecryptionError` с точным указанием индекса сбойного чанка.
14
+
15
+ ## 3. Non-Functional Requirements
16
+ - Потребление RAM при шифровании многогигабайтных файлов не должно превышать `chunk_size * 2`.
17
+ - Graceful Fallback с прозрачным выводом требований к установке `chutils[crypto]` при отсутствии пакета `cryptography`.
18
+
19
+ ## 4. Acceptance Criteria
20
+ - [ ] `encrypt_file(..., stream=True)` шифрует файл 1+ ГБ с потреблением RAM менее 150 МБ.
21
+ - [ ] `decrypt_file` успешно восстанавливает исходный файл, проверяя целостность каждого чанка.
22
+ - [ ] Модульные тесты подтверждают обнаружение поврежденных чанков во время расшифровки.
@@ -0,0 +1,5 @@
1
+ # Track telegram_access_20260729 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "telegram_access_20260729",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-29T00:04:00Z",
6
+ "updated_at": "2026-07-29T00:04:00Z",
7
+ "description": "Безопасность и ограничение доступа для Telegram ботов: @admin_only, AdminFilter с fallback-ом на chutils config"
8
+ }
@@ -0,0 +1,18 @@
1
+ # Implementation Plan: Telegram Bot Access Control (`telegram_access_20260729`)
2
+
3
+ ## Phase 1: Core Access Control Logic & Exception Hierarchy
4
+ - [ ] Task: Create `chutils.exceptions.telegram` module with `TelegramAccessDeniedError`
5
+ - [ ] Task: Create core `chutils.telegram.access` module with `is_admin()` predicate logic and config fallback
6
+ - [ ] Task: Implement `@admin_only` decorator for sync/async handler functions with refusal handling options (`refusal_text`, `silent`, raise exception)
7
+ - [ ] Task: Unit tests for core `is_admin` and `@admin_only` decorator
8
+ - [ ] Task: Conductor - User Manual Verification 'Phase 1: Core Access Control' (Protocol in workflow.md)
9
+
10
+ ## Phase 2: Framework Integrations & Lazy Exports
11
+ - [ ] Task: Implement `AdminFilter` for `aiogram 3.x` with safe import handling if `aiogram` is not installed
12
+ - [ ] Task: Register lazy exports in `src/chutils/telegram/__init__.py` and root `src/chutils/__init__.py`
13
+ - [ ] Task: Unit tests for `aiogram` filter and framework compatibility
14
+ - [ ] Task: Conductor - User Manual Verification 'Phase 2: Framework Integrations' (Protocol in workflow.md)
15
+
16
+ ## Phase 3: Documentation & Indexing
17
+ - [ ] Task: Document `chutils.telegram` usage in `docs/` and update `api_map.md` / `project_index.json`
18
+ - [ ] Task: Conductor - User Manual Verification 'Phase 3: Documentation' (Protocol in workflow.md)
@@ -0,0 +1,24 @@
1
+ # Track Specification: Telegram Bot Access Control (`telegram_access_20260729`)
2
+
3
+ ## Overview
4
+ Добавление модуля `chutils.telegram` с универсальным механизмом проверки прав доступа и ограничения вызовов для Telegram-ботов (`@admin_only`, `AdminFilter`). Подсистема решает задачу безопасного разграничения доступа админов/пользователей с автоматическим фоллбэком на конфигурацию `chutils` и поддержкой популярнейших фреймворков (`aiogram 3.x`, `python-telegram-bot`, `telebot`).
5
+
6
+ ## Functional Requirements
7
+ - **Декоратор `@admin_only`**:
8
+ - Поддержка синхронных и асинхронных функций-хэндлеров.
9
+ - Поддержка явного списка `admin_ids` (int) и `admin_usernames` (str без/с `@`).
10
+ - Поддержка кастомной функции-предиката `is_admin_func(user_id, username) -> bool`.
11
+ - Автоматический fallback на конфигурацию `chutils`: чтение списка админов из `get_config_value("Telegram", "admin_ids")` / `admin_usernames` при отсутствии явных аргументов.
12
+ - **Отказ в доступе (Refusal Handling)**:
13
+ - Настройка кастомного ответа (`refusal_text="⛔ Доступ запрещен"`).
14
+ - Поддержка тихого режима (`silent=True`), когда неавторизованные запросы игнорируются без ответа.
15
+ - Поддержка выброса исключения `TelegramAccessDeniedError` для тонкой обработки в Middleware.
16
+ - **Интеграция с Telegram-фреймворками**:
17
+ - `AdminFilter` для `aiogram 3.x` (реализация `BaseFilter`).
18
+ - Универсальная функция-предикат `is_admin(user_id, username, ...)` для использования в `python-telegram-bot`, `telebot` и чистых Webhook/Polling обновлениях.
19
+ - **Типизация и Zero-Any**:
20
+ - Полная типизация через Python 3.10+ unions (`int | str`), отсутствие `Any` в бизнес-логике.
21
+
22
+ ## Out of Scope
23
+ - Хранение прав пользователей в БД (управление ролями).
24
+ - Пагинаторы и UI-клавиатуры (будут вынесены в отдельные треки).
@@ -0,0 +1,5 @@
1
+ # Track telegram_formatting_20260729 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "telegram_formatting_20260729",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-29T00:11:00Z",
6
+ "updated_at": "2026-07-29T00:11:00Z",
7
+ "description": "chutils.telegram.formatting: Экранирование MarkdownV2/HTML (escape_markdown, escape_html) и умное разбиение сообщений (smart_truncate)"
8
+ }
@@ -0,0 +1,17 @@
1
+ # Implementation Plan: Telegram Safe Formatting & Message Truncation (`telegram_formatting_20260729`)
2
+
3
+ ## Phase 1: Core Escaping Functions & Unit Tests
4
+ - [ ] Task: Create `chutils.telegram.formatting` module with `escape_markdown` and `escape_html`
5
+ - [ ] Task: Write comprehensive unit tests for `escape_markdown` (v1/v2) and `escape_html`
6
+ - [ ] Task: Conductor - User Manual Verification 'Phase 1: Escaping Functions' (Protocol in workflow.md)
7
+
8
+ ## Phase 2: Smart Truncation & Message Splitting
9
+ - [ ] Task: Implement `smart_truncate` with code block (```) and HTML tag closure
10
+ - [ ] Task: Implement `split_message` helper for splitting logs/long reports
11
+ - [ ] Task: Export functions in `src/chutils/telegram/__init__.py` and root `src/chutils/__init__.py`
12
+ - [ ] Task: Unit tests for `smart_truncate` and `split_message`
13
+ - [ ] Task: Conductor - User Manual Verification 'Phase 2: Smart Truncation & Splitting' (Protocol in workflow.md)
14
+
15
+ ## Phase 3: Documentation & Indexing
16
+ - [ ] Task: Add examples in `docs/` and update `api_map.md` / `project_index.json`
17
+ - [ ] Task: Conductor - User Manual Verification 'Phase 3: Documentation' (Protocol in workflow.md)
@@ -0,0 +1,14 @@
1
+ # Track Specification: Telegram Safe Formatting & Message Truncation (`telegram_formatting_20260729`)
2
+
3
+ ## Overview
4
+ Реализация модуля `chutils.telegram.formatting` для безопасной работы с разметкой сообщений Telegram. Модуль гарантирует защиту от ошибок `BadRequest: Can't parse entities` за счет надежного экранирования `MarkdownV2` / `HTML` и предотвращает вылеты по превышению 4096 символов благодаря умному сплиттингу сообщений с сохранением парности тегов и кодовых блоков.
5
+
6
+ ## Functional Requirements
7
+ - **Экранирование символов (`escape_markdown` / `escape_html`)**:
8
+ - `escape_markdown(text, version=2)`: Экранирование спецсимволов (`_`, `*`, `[`, `]`, `(`, `)`, `~`, `` ` ``, `>`, `#`, `+`, `-`, `=`, `|`, `{`, `}`, `.`, `!`). Поддержка v1 и v2.
9
+ - `escape_html(text)`: Экранирование `<`, `>`, `&`, `"`.
10
+ - **Умное разбиение сообщений (`smart_truncate` & `split_message`)**:
11
+ - `smart_truncate(text, max_length=4096)`: Обрезка текста до `max_length` с автоматическим закрытием незавершенных кодовых блоков (```) или HTML-тегов.
12
+ - `split_message(text, max_length=4096)`: Разбиение длинного текста/логов на список валидных чанков не превышающих `max_length` символов.
13
+ - **Типизация**:
14
+ - Строгие аннотации типов Python 3.10+.
@@ -0,0 +1,5 @@
1
+ # Track telegram_keyboard_20260729 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "telegram_keyboard_20260729",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-29T20:20:00Z",
6
+ "updated_at": "2026-07-29T20:20:00Z",
7
+ "description": "chutils.telegram.keyboard: build_inline_keyboard генератор сетки и PaginatorKeyboard для пагинации списков"
8
+ }
@@ -0,0 +1,18 @@
1
+ # Implementation Plan: Telegram Dynamic & Paginated Keyboards (`telegram_keyboard_20260729`)
2
+
3
+ ## Phase 1: Core Inline Keyboard Generator
4
+ - [ ] Task: Create `chutils.telegram.keyboard` module with `build_inline_keyboard` function
5
+ - [ ] Task: Support grid alignment (`buttons_per_row`), custom URLs, and dict/tuple inputs
6
+ - [ ] Task: Unit tests for `build_inline_keyboard` logic
7
+ - [ ] Task: Conductor - User Manual Verification 'Phase 1: Core Inline Keyboard' (Protocol in workflow.md)
8
+
9
+ ## Phase 2: PaginatorKeyboard & Framework Integrations
10
+ - [ ] Task: Implement `PaginatorKeyboard` class with page slicing, state labels, and navigation buttons
11
+ - [ ] Task: Support `footer_buttons` and `aiogram` `InlineKeyboardMarkup` conversion
12
+ - [ ] Task: Export symbols in `src/chutils/telegram/__init__.py` and root `src/chutils/__init__.py`
13
+ - [ ] Task: Unit tests for `PaginatorKeyboard` pagination and navigation
14
+ - [ ] Task: Conductor - User Manual Verification 'Phase 2: PaginatorKeyboard & Integration' (Protocol in workflow.md)
15
+
16
+ ## Phase 3: Documentation & Indexing
17
+ - [ ] Task: Add examples in `docs/` and update `api_map.md` / `project_index.json`
18
+ - [ ] Task: Conductor - User Manual Verification 'Phase 3: Documentation' (Protocol in workflow.md)
@@ -0,0 +1,15 @@
1
+ # Track Specification: Telegram Dynamic & Paginated Keyboards (`telegram_keyboard_20260729`)
2
+
3
+ ## Overview
4
+ Реализация модуля `chutils.telegram.keyboard` для конструирования динамических Inline-клавиатур и управления пагинацией списков. Подсистема исключает рутинное написание сетки кнопок, автоматизирует навигацию (`« Назад`, `1/5`, `Вперед »`) и поддерживает экспорт в формате чистых Python-словарей или готовых `InlineKeyboardMarkup` для `aiogram 3.x`.
5
+
6
+ ## Functional Requirements
7
+ - **Генератор сетки `build_inline_keyboard`**:
8
+ - Принимает список элементов `(text, callback_data)` или словарей `{"text": ..., "callback_data": ..., "url": ...}`.
9
+ - Автоматическое разбиение на ряды с помощью параметра `buttons_per_row` (по умолчанию 2).
10
+ - Опция `as_aiogram` для приведения к объекту `InlineKeyboardMarkup` при наличии `aiogram`.
11
+ - **Пагинатор `PaginatorKeyboard`**:
12
+ - Универсальный класс пагинации для списков любых объектов.
13
+ - Генерация строки состояния (например, `1/5`) и навигационных кнопок (`«`, `»`).
14
+ - Метод `get_page(page: int, per_page: int)` для сбора подмножества данных.
15
+ - Поддержка прикрепления дополнительных фиктивных или постоянных кнопок (`footer_buttons`, например "Закрыть").
@@ -0,0 +1,5 @@
1
+ # Track telegram_logging_20260729 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "telegram_logging_20260729",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-29T00:09:00Z",
6
+ "updated_at": "2026-07-29T00:09:00Z",
7
+ "description": "TelegramLogFilter / TelegramMiddleware: Автоматическое логирование команд, нажатий inline-кнопок и авто-проброс контекста в chutils.logger"
8
+ }
@@ -0,0 +1,17 @@
1
+ # Implementation Plan: Telegram Update Logging & Context Tracing (`telegram_logging_20260729`)
2
+
3
+ ## Phase 1: Core Context Tracing Engine & Decorator
4
+ - [ ] Task: Create `chutils.telegram.logging` module with context binding logic (`telegram_user_id`, `chat_id`, `update_id`)
5
+ - [ ] Task: Implement `trace_telegram_update` sync/async context manager and decorator with `execution_time_ms` calculation and PII masking
6
+ - [ ] Task: Unit tests for core `trace_telegram_update` and logger context binding
7
+ - [ ] Task: Conductor - User Manual Verification 'Phase 1: Core Context Tracing Engine' (Protocol in workflow.md)
8
+
9
+ ## Phase 2: aiogram Middleware & Lazy Exports
10
+ - [ ] Task: Implement `TelegramLoggingMiddleware` for `aiogram 3.x`
11
+ - [ ] Task: Register lazy exports in `src/chutils/telegram/__init__.py` and root `src/chutils/__init__.py`
12
+ - [ ] Task: Unit tests for `aiogram` logging middleware
13
+ - [ ] Task: Conductor - User Manual Verification 'Phase 2: aiogram Middleware' (Protocol in workflow.md)
14
+
15
+ ## Phase 3: Documentation & Indexing
16
+ - [ ] Task: Add examples in `docs/` and update `api_map.md` / `project_index.json`
17
+ - [ ] Task: Conductor - User Manual Verification 'Phase 3: Documentation' (Protocol in workflow.md)