pytagmanager 0.2.0__tar.gz → 0.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 (209) hide show
  1. pytagmanager-0.2.2/.github/ISSUE_TEMPLATE/bug_report.yml +65 -0
  2. pytagmanager-0.2.2/.github/ISSUE_TEMPLATE/feature_request.yml +46 -0
  3. pytagmanager-0.2.2/.github/dependabot.yml +19 -0
  4. pytagmanager-0.2.2/.github/pull_request_template.md +21 -0
  5. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/.github/workflows/ci.yml +31 -0
  6. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/.gitignore +2 -0
  7. pytagmanager-0.2.2/CHANGELOG.md +122 -0
  8. pytagmanager-0.2.2/CODE_OF_CONDUCT.md +64 -0
  9. pytagmanager-0.2.2/CONTRIBUTING.md +93 -0
  10. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/Cargo.lock +1 -1
  11. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/Cargo.toml +1 -1
  12. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/PKG-INFO +269 -20
  13. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/README.md +268 -19
  14. pytagmanager-0.2.2/ROADMAP_HONEST.md +373 -0
  15. pytagmanager-0.2.2/SECURITY.md +63 -0
  16. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/docs/ARCHITECTURE.md +23 -29
  17. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/docs/ROADMAP.md +549 -62
  18. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/pyproject.toml +1 -1
  19. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/__init__.py +1 -1
  20. pytagmanager-0.2.2/python/pytagmanager/cli.py +1015 -0
  21. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/correlation/journey.py +14 -3
  22. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/diagnostics/rules.py +69 -0
  23. pytagmanager-0.2.2/python/pytagmanager/diagnostics/trace.py +169 -0
  24. pytagmanager-0.2.2/python/pytagmanager/dictionary/__init__.py +27 -0
  25. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/dictionary/build.py +79 -12
  26. pytagmanager-0.2.2/python/pytagmanager/dictionary/labels.py +69 -0
  27. pytagmanager-0.2.2/python/pytagmanager/dictionary/purpose.py +241 -0
  28. pytagmanager-0.2.2/python/pytagmanager/dictionary/report.py +117 -0
  29. pytagmanager-0.2.2/python/pytagmanager/dictionary/schema_drift.py +230 -0
  30. pytagmanager-0.2.2/python/pytagmanager/discovery/crawl.py +162 -0
  31. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/agent.js +74 -0
  32. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/events.py +1 -0
  33. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/session.py +32 -1
  34. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/state.py +17 -2
  35. pytagmanager-0.2.2/python/pytagmanager/perf/__init__.py +70 -0
  36. pytagmanager-0.2.2/python/pytagmanager/perf/dependency_graph.py +77 -0
  37. pytagmanager-0.2.2/python/pytagmanager/perf/experiments.py +216 -0
  38. pytagmanager-0.2.2/python/pytagmanager/perf/history.py +130 -0
  39. pytagmanager-0.2.2/python/pytagmanager/perf/measure.py +205 -0
  40. pytagmanager-0.2.2/python/pytagmanager/perf/perf_agent.js +118 -0
  41. pytagmanager-0.2.2/python/pytagmanager/perf/report.py +107 -0
  42. pytagmanager-0.2.2/python/pytagmanager/perf/scripts.py +199 -0
  43. pytagmanager-0.2.2/python/pytagmanager/perf/tagging_join.py +78 -0
  44. pytagmanager-0.2.2/python/pytagmanager/perf/test_candidates.py +83 -0
  45. pytagmanager-0.2.2/python/pytagmanager/runtime/__init__.py +19 -0
  46. pytagmanager-0.2.2/python/pytagmanager/runtime/interactions.py +124 -0
  47. pytagmanager-0.2.2/python/pytagmanager/runtime/renderer.py +121 -0
  48. pytagmanager-0.2.2/python/pytagmanager/runtime/screenshots.py +96 -0
  49. pytagmanager-0.2.2/python/pytagmanager/runtime/sniffer.py +99 -0
  50. pytagmanager-0.2.2/python/pytagmanager/sitewide/event_map.py +70 -0
  51. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/report.py +34 -0
  52. pytagmanager-0.2.2/python/pytagmanager/tagexec/__init__.py +71 -0
  53. pytagmanager-0.2.2/python/pytagmanager/tagexec/duplicates.py +172 -0
  54. pytagmanager-0.2.2/python/pytagmanager/tagexec/graph.py +274 -0
  55. pytagmanager-0.2.2/python/pytagmanager/tagexec/report.py +127 -0
  56. pytagmanager-0.2.2/python/pytagmanager/tagexec/server_side.py +148 -0
  57. pytagmanager-0.2.2/python/pytagmanager/tagexec/static_scan.py +264 -0
  58. pytagmanager-0.2.2/python/pytagmanager/testintel/__init__.py +22 -0
  59. pytagmanager-0.2.2/python/pytagmanager/testintel/candidates.py +268 -0
  60. pytagmanager-0.2.2/python/pytagmanager/testintel/playwright_export.py +65 -0
  61. pytagmanager-0.2.2/python/pytagmanager/testintel/regression.py +69 -0
  62. pytagmanager-0.2.2/python/pytagmanager/testintel/report.py +50 -0
  63. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/fetcher.rs +2 -2
  64. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/frontier.rs +31 -1
  65. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/orchestrator.rs +6 -5
  66. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/error.rs +7 -0
  67. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/lib.rs +3 -1
  68. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/crawl_integration.rs +60 -0
  69. pytagmanager-0.2.2/tests/python/fixtures/observability/heavy_first_party.js +9 -0
  70. pytagmanager-0.2.2/tests/python/fixtures/observability/local_first_party.js +2 -0
  71. pytagmanager-0.2.2/tests/python/fixtures/observability/perf_heavy.html +23 -0
  72. pytagmanager-0.2.2/tests/python/fixtures/observability/perf_isolate.html +16 -0
  73. pytagmanager-0.2.2/tests/python/fixtures/observability/perf_scripts.html +17 -0
  74. pytagmanager-0.2.2/tests/python/fixtures/observability/runtime_state_regression.html +21 -0
  75. pytagmanager-0.2.2/tests/python/fixtures/observability/spa_client_rendered.html +20 -0
  76. pytagmanager-0.2.2/tests/python/fixtures/observability/spa_dedup_reset.html +21 -0
  77. pytagmanager-0.2.2/tests/python/fixtures/observability/tagexec_duplicate.html +29 -0
  78. pytagmanager-0.2.2/tests/python/fixtures/observability/tagexec_server_side.html +20 -0
  79. pytagmanager-0.2.2/tests/python/fixtures/observability/tagexec_static.html +26 -0
  80. pytagmanager-0.2.2/tests/python/test_cli_render.py +54 -0
  81. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_core_ffi.py +9 -10
  82. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_correlation.py +19 -0
  83. pytagmanager-0.2.2/tests/python/test_diagnose_cli.py +130 -0
  84. pytagmanager-0.2.2/tests/python/test_diagnose_duplicate_tags_cli.py +64 -0
  85. pytagmanager-0.2.2/tests/python/test_diagnose_server_side_cli.py +66 -0
  86. pytagmanager-0.2.2/tests/python/test_diagnose_tag_graph_cli.py +86 -0
  87. pytagmanager-0.2.2/tests/python/test_diagnose_test_candidates_cli.py +67 -0
  88. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_diagnostics_rules.py +147 -0
  89. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_dictionary.py +55 -1
  90. pytagmanager-0.2.2/tests/python/test_dictionary_labels.py +53 -0
  91. pytagmanager-0.2.2/tests/python/test_dictionary_purpose.py +71 -0
  92. pytagmanager-0.2.2/tests/python/test_dictionary_schema_drift.py +135 -0
  93. pytagmanager-0.2.2/tests/python/test_dictionary_test_candidates_cli.py +81 -0
  94. pytagmanager-0.2.2/tests/python/test_discovery_crawl_rendered.py +58 -0
  95. pytagmanager-0.2.2/tests/python/test_event_map.py +100 -0
  96. pytagmanager-0.2.2/tests/python/test_interaction_trace.py +145 -0
  97. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_observability_extended_observers.py +64 -0
  98. pytagmanager-0.2.2/tests/python/test_perf_cli.py +120 -0
  99. pytagmanager-0.2.2/tests/python/test_perf_dependency_graph.py +150 -0
  100. pytagmanager-0.2.2/tests/python/test_perf_dependency_graph_e2e.py +27 -0
  101. pytagmanager-0.2.2/tests/python/test_perf_environment_config.py +45 -0
  102. pytagmanager-0.2.2/tests/python/test_perf_experiments_e2e.py +49 -0
  103. pytagmanager-0.2.2/tests/python/test_perf_experiments_unit.py +155 -0
  104. pytagmanager-0.2.2/tests/python/test_perf_history.py +98 -0
  105. pytagmanager-0.2.2/tests/python/test_perf_measure.py +101 -0
  106. pytagmanager-0.2.2/tests/python/test_perf_measure_e2e.py +57 -0
  107. pytagmanager-0.2.2/tests/python/test_perf_report.py +113 -0
  108. pytagmanager-0.2.2/tests/python/test_perf_scripts.py +48 -0
  109. pytagmanager-0.2.2/tests/python/test_perf_scripts_unit.py +37 -0
  110. pytagmanager-0.2.2/tests/python/test_perf_tagging_join.py +98 -0
  111. pytagmanager-0.2.2/tests/python/test_perf_test_candidates.py +84 -0
  112. pytagmanager-0.2.2/tests/python/test_runtime_interactions.py +40 -0
  113. pytagmanager-0.2.2/tests/python/test_runtime_renderer.py +45 -0
  114. pytagmanager-0.2.2/tests/python/test_runtime_screenshots.py +31 -0
  115. pytagmanager-0.2.2/tests/python/test_runtime_sniffer.py +24 -0
  116. pytagmanager-0.2.2/tests/python/test_scan_tags_cli.py +34 -0
  117. pytagmanager-0.2.2/tests/python/test_tagexec_duplicates.py +187 -0
  118. pytagmanager-0.2.2/tests/python/test_tagexec_graph.py +248 -0
  119. pytagmanager-0.2.2/tests/python/test_tagexec_server_side.py +171 -0
  120. pytagmanager-0.2.2/tests/python/test_tagexec_static_scan.py +128 -0
  121. pytagmanager-0.2.2/tests/python/test_tagexec_static_scan_e2e.py +43 -0
  122. pytagmanager-0.2.2/tests/python/test_testintel_candidates.py +197 -0
  123. pytagmanager-0.2.2/tests/python/test_testintel_playwright_export.py +90 -0
  124. pytagmanager-0.2.2/tests/python/test_testintel_regression.py +89 -0
  125. pytagmanager-0.2.0/ROADMAP_HONEST.md +0 -107
  126. pytagmanager-0.2.0/python/pytagmanager/cli.py +0 -469
  127. pytagmanager-0.2.0/python/pytagmanager/dictionary/__init__.py +0 -10
  128. pytagmanager-0.2.0/python/pytagmanager/dictionary/report.py +0 -69
  129. pytagmanager-0.2.0/python/pytagmanager/discovery/crawl.py +0 -34
  130. pytagmanager-0.2.0/tests/python/test_diagnose_cli.py +0 -54
  131. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/.cargo/config.toml +0 -0
  132. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/LICENSE +0 -0
  133. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/docs/VISION.md +0 -0
  134. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/__init__.py +0 -0
  135. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/ga4_client.py +0 -0
  136. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/gtm_client.py +0 -0
  137. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/models.py +0 -0
  138. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/correlation/__init__.py +0 -0
  139. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/diagnostics/__init__.py +0 -0
  140. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/diagnostics/models.py +0 -0
  141. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/discovery/__init__.py +0 -0
  142. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/__init__.py +0 -0
  143. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/_taxonomy.py +0 -0
  144. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/adobe_tags.py +0 -0
  145. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/base.py +0 -0
  146. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/ga4.py +0 -0
  147. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/gtm.py +0 -0
  148. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/rudderstack.py +0 -0
  149. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/segment.py +0 -0
  150. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/snowplow.py +0 -0
  151. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/tealium.py +0 -0
  152. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/intent/__init__.py +0 -0
  153. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/intent/base.py +0 -0
  154. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/intent/ollama_classifier.py +0 -0
  155. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/__init__.py +0 -0
  156. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/scenario.py +0 -0
  157. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/recommend/__init__.py +0 -0
  158. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/recommend/heuristics.py +0 -0
  159. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/recommend/models.py +0 -0
  160. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/__init__.py +0 -0
  161. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/json_report.py +0 -0
  162. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/summary.py +0 -0
  163. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/terminal.py +0 -0
  164. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/__init__.py +0 -0
  165. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/aggregation.py +0 -0
  166. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/anomalies.py +0 -0
  167. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/history.py +0 -0
  168. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/interaction_consistency.py +0 -0
  169. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/notify.py +0 -0
  170. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/page_type.py +0 -0
  171. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/templates.py +0 -0
  172. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/version_control/__init__.py +0 -0
  173. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/version_control/diff.py +0 -0
  174. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/version_control/snapshot.py +0 -0
  175. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/mod.rs +0 -0
  176. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/robots.rs +0 -0
  177. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/sitemap.rs +0 -0
  178. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/graph.rs +0 -0
  179. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/mod.rs +0 -0
  180. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/parser.rs +0 -0
  181. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/selectors.rs +0 -0
  182. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/conftest.py +0 -0
  183. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/add_to_cart_variant_naming.html +0 -0
  184. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/api_and_console.html +0 -0
  185. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/duplicate_tracking.html +0 -0
  186. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/healthy_tracking.html +0 -0
  187. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/missing_datalayer.html +0 -0
  188. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/missing_ga4_request.html +0 -0
  189. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/runtime_state.html +0 -0
  190. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/spa_tracking.html +0 -0
  191. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/sample_page.html +0 -0
  192. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_analytics_api_clients.py +0 -0
  193. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_cli.py +0 -0
  194. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_diagnose_site_wide_cli.py +0 -0
  195. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_exporters.py +0 -0
  196. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_gtm_export.py +0 -0
  197. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_heuristics.py +0 -0
  198. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_intent_ollama.py +0 -0
  199. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_interaction_consistency.py +0 -0
  200. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_observability_pipeline.py +0 -0
  201. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_observability_state.py +0 -0
  202. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_aggregation.py +0 -0
  203. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_anomalies.py +0 -0
  204. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_history.py +0 -0
  205. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_notify.py +0 -0
  206. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_page_type.py +0 -0
  207. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_templates.py +0 -0
  208. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_version_control.py +0 -0
  209. {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/support/mod.rs +0 -0
@@ -0,0 +1,65 @@
1
+ name: Bug report
2
+ description: Report something that's broken or not working as documented
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Before filing: check `ROADMAP_HONEST.md` first — the behavior you're
9
+ seeing might be a documented, known gap rather than an undiscovered bug.
10
+
11
+ - type: input
12
+ id: version
13
+ attributes:
14
+ label: PyTagManager version
15
+ description: Output of `pip show pytagmanager` or the git commit you're on
16
+ placeholder: "0.2.0, or commit sha"
17
+ validations:
18
+ required: true
19
+
20
+ - type: input
21
+ id: python-version
22
+ attributes:
23
+ label: Python version
24
+ placeholder: "3.9 / 3.11 / ..."
25
+ validations:
26
+ required: true
27
+
28
+ - type: input
29
+ id: os
30
+ attributes:
31
+ label: Operating system
32
+ placeholder: "macOS 14, Ubuntu 22.04, ..."
33
+ validations:
34
+ required: true
35
+
36
+ - type: textarea
37
+ id: command
38
+ attributes:
39
+ label: Command run
40
+ description: The exact `pytagmanager ...` command (or Python snippet) that triggered the bug
41
+ render: shell
42
+ validations:
43
+ required: true
44
+
45
+ - type: textarea
46
+ id: expected
47
+ attributes:
48
+ label: Expected behavior
49
+ validations:
50
+ required: true
51
+
52
+ - type: textarea
53
+ id: actual
54
+ attributes:
55
+ label: Actual behavior
56
+ description: Include the full error/traceback if there is one
57
+ render: shell
58
+ validations:
59
+ required: true
60
+
61
+ - type: textarea
62
+ id: extras
63
+ attributes:
64
+ label: Was the `diagnostics` extra installed? Was Playwright's Chromium installed?
65
+ placeholder: "pip install 'pytagmanager[diagnostics]' && playwright install chromium"
@@ -0,0 +1,46 @@
1
+ name: Feature request
2
+ description: Propose a new capability or improvement
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Before filing: check `docs/VISION.md` and `docs/ROADMAP.md` — your
9
+ idea may already be a planned (or deliberately deferred, with a
10
+ stated reason) phase. If so, comment on that context instead of
11
+ opening a duplicate.
12
+
13
+ - type: textarea
14
+ id: problem
15
+ attributes:
16
+ label: What problem does this solve?
17
+ description: Describe the gap or friction you're hitting today, not just the feature itself
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: proposal
23
+ attributes:
24
+ label: Proposed solution
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: alternatives
30
+ attributes:
31
+ label: Alternatives considered
32
+ description: Including any existing PyTagManager flag/feature that gets partway there
33
+
34
+ - type: dropdown
35
+ id: north-star
36
+ attributes:
37
+ label: Which of the five north-star questions (docs/VISION.md) does this serve?
38
+ options:
39
+ - "What data exists?"
40
+ - "Where does it exist?"
41
+ - "When does it exist?"
42
+ - "Is it usable by the tagging layer?"
43
+ - "What is missing or broken?"
44
+ - "Not sure / none of these"
45
+ validations:
46
+ required: false
@@ -0,0 +1,19 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "cargo"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 10
8
+
9
+ - package-ecosystem: "pip"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "weekly"
13
+ open-pull-requests-limit: 10
14
+
15
+ - package-ecosystem: "github-actions"
16
+ directory: "/"
17
+ schedule:
18
+ interval: "weekly"
19
+ open-pull-requests-limit: 5
@@ -0,0 +1,21 @@
1
+ ## What changed and why
2
+
3
+ <!-- Link the roadmap phase (docs/ROADMAP.md) or issue this relates to, if any. -->
4
+
5
+ ## Testing
6
+
7
+ <!-- What did you actually run? Paste real command + output/pass-fail, not "tests pass". -->
8
+
9
+ - [ ] `cargo fmt --check` / `cargo clippy --all-targets -- -D warnings` (Rust changes only)
10
+ - [ ] `cargo test` (Rust changes only)
11
+ - [ ] `pytest tests/python -v` (Python changes only — note if you ran the full suite or a subset)
12
+
13
+ ## Documentation
14
+
15
+ - [ ] Updated `README.md` / `ROADMAP_HONEST.md` / `docs/` if this changes what's built, tested, or working
16
+ - [ ] Did not describe untested code as working, and did not soften a known limitation (see `CONTRIBUTING.md`'s documentation honesty policy)
17
+
18
+ ## Checklist
19
+
20
+ - [ ] No secrets/credentials committed
21
+ - [ ] No new `TODO`/`FIXME` left without an issue reference or explicit scope note
@@ -51,3 +51,34 @@ jobs:
51
51
 
52
52
  - name: pytest tests/python
53
53
  run: pytest tests/python -v
54
+
55
+ dependency-audit:
56
+ runs-on: ubuntu-latest
57
+ steps:
58
+ - uses: actions/checkout@v4
59
+
60
+ - name: Install Rust toolchain
61
+ uses: dtolnay/rust-toolchain@stable
62
+
63
+ - name: Cache cargo
64
+ uses: Swatinem/rust-cache@v2
65
+
66
+ - name: Install cargo-audit
67
+ run: cargo install cargo-audit --locked
68
+
69
+ - name: cargo audit (Rust dependency vulnerabilities)
70
+ run: cargo audit
71
+
72
+ - uses: actions/setup-python@v5
73
+ with:
74
+ python-version: "3.9"
75
+
76
+ - name: Install pip-audit and this project's declared dependencies
77
+ run: |
78
+ python -m pip install --upgrade pip pip-audit
79
+ python -m pip install 'click>=8.0' 'playwright>=1.40' 'pyyaml>=6.0' \
80
+ 'google-api-python-client>=2.100' 'google-auth>=2.23' \
81
+ 'google-auth-oauthlib>=1.1'
82
+
83
+ - name: pip-audit (Python dependency vulnerabilities)
84
+ run: pip-audit --strict
@@ -4,6 +4,8 @@ __pycache__/
4
4
  *.pyc
5
5
  *.egg-info/
6
6
  .pytest_cache/
7
+ .ruff_cache/
8
+ .mypy_cache/
7
9
  dist/
8
10
  *.so
9
11
  *.pyd
@@ -0,0 +1,122 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. Format loosely
4
+ follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this
5
+ project does not yet follow semantic versioning strictly (see
6
+ `ROADMAP_HONEST.md` for current version/PyPI status).
7
+
8
+ Entries below are derived from the actual git history and PyPI publish
9
+ notes, not reconstructed from memory — see `ROADMAP_HONEST.md` for the
10
+ authoritative, continuously-updated built-vs-not-built breakdown; this
11
+ file is a release-oriented complement to it, not a duplicate.
12
+
13
+ ## [Unreleased]
14
+
15
+ ## [0.2.2] - 2026-09-27
16
+
17
+ ### Fixed
18
+
19
+ - `src/crawler/frontier.rs`: `Frontier::has_capacity()` no longer also checks
20
+ `seen.len() < max_pages` -- that extra check caused the BFS loop to exit as
21
+ soon as `seen` (URLs *discovered*, not fetched) reached `max_pages`, even
22
+ while already-accepted URLs were still sitting unfetched in the queue.
23
+ Concretely, `crawl(url, max_pages=1)` returned zero pages instead of the
24
+ seed page it should always return. See `ROADMAP_HONEST.md` for full
25
+ verification detail and the regression tests added.
26
+
27
+ ## [0.2.1] - 2026-09-22
28
+
29
+ Everything shipped on `main` since the v0.2.0 version bump (2026-08-31),
30
+ published to PyPI as v0.2.1 on 2026-09-22 — see `ROADMAP_HONEST.md`'s CI/CD
31
+ section for the current PyPI status. Highlights, in shipped order:
32
+
33
+ - Tracking Observability & Diagnostics: Runtime State Capture (cookies/
34
+ storage/dataLayer snapshots + diffing), Website Data Dictionary (schema
35
+ drift, presence-vs-availability labeling, purpose classification),
36
+ broadened browser-behavior intelligence (scroll-depth interactions,
37
+ cross-implementation consistency checks, Runtime Event Map, formalized
38
+ Interaction Trace).
39
+ - GTM Client/Server Execution Intelligence & Tag Execution Graph:
40
+ static tag/vendor scanning (`scan-tags`), duplicate/conflicting
41
+ implementation detection, hedged server-side tagging indicators, and
42
+ the unified Tag Execution Graph (`diagnose --tag-graph`).
43
+ - Playwright Discovery & Test Intelligence: evidence-backed Test
44
+ Candidates generated from diagnosis/consistency/regression findings,
45
+ with Playwright draft-script export.
46
+ - Automated Script Impact & Web Performance Intelligence
47
+ (`pytagmanager perf`): real browser-native performance measurement,
48
+ script inventory + dependency graph, controlled isolation experiments,
49
+ tagging-vs-performance join, CPU throttling, and history/regression
50
+ tracking.
51
+ - Client-rendered crawling (`crawl --render`): rendered-DOM discovery,
52
+ per-page screenshot capture, analytics sniffing, and bounded
53
+ interaction simulation for sites whose content only exists after JS
54
+ runs.
55
+ - `OllamaIntentClassifier` wired directly into `crawl --intent ollama`
56
+ and the public `pytagmanager` API (previously implemented but not
57
+ reachable from the CLI).
58
+ - `Cargo.toml` version drift fix (was stuck at 0.1.3 while
59
+ `pyproject.toml`/`__init__.py` had already moved to 0.2.0).
60
+ - CI fix: `ci.yml` now installs the `pytagmanager[diagnostics]` extra and
61
+ a Playwright Chromium binary before running `pytest` — previously every
62
+ push since Tracking Observability landed failed pytest's collection
63
+ phase outright (`ModuleNotFoundError: No module named 'yaml'`).
64
+
65
+ ### Fixed
66
+
67
+ - `src/lib.rs`: the `crawl()` pyfunction no longer panics (via PyO3's
68
+ panic-to-`PanicException` conversion) if `tokio::runtime::Runtime::new()`
69
+ fails — the failure now propagates as a catchable Python `RuntimeError`
70
+ through a new `AppError::Internal` variant.
71
+ - `src/crawler/fetcher.rs`: `Fetcher::build()` no longer panics if
72
+ `reqwest::Client::builder().build()` fails — propagated through the
73
+ `Result<Self, AppError>` the function already returns, same as its other
74
+ failure modes.
75
+ - `src/crawler/orchestrator.rs`: corrected a stale doc comment on
76
+ `crawl_with_fetcher` claiming the real entry point calls `Fetcher::new()`
77
+ — it actually calls `Fetcher::build(true, ...)` directly.
78
+
79
+ See `ROADMAP_HONEST.md` for exactly which sub-items of the above are
80
+ fully shipped vs. disclosed-partial, and for known bugs/tech debt, plus
81
+ the now-verified (and currently red) `dependency-audit` CI job results.
82
+
83
+ ## [0.2.0] — version bumped in repo 2026-08-31, published to PyPI 2026-09-14
84
+
85
+ No git tag exists for this release in this repository as of this writing.
86
+
87
+ - Relicensed the project from a proprietary license to Apache-2.0.
88
+ - Added Tracking Observability & Diagnostics (real-browser interaction →
89
+ dataLayer → GTM → GA4 correlation, rule-based root-cause diagnosis) and
90
+ Site-Wide Tagging QA (cross-page template consistency, health scoring).
91
+ - **PyPI platform coverage note**: this release published only a macOS
92
+ arm64 wheel + sdist (no Docker/zig available locally for manylinux
93
+ cross-compilation at publish time), narrower than v0.1.3's release
94
+ (macOS x86_64 + arm64 + Linux x86_64 + aarch64 + sdist). See
95
+ `ROADMAP_HONEST.md` for detail.
96
+
97
+ ## [0.1.3] — 2026-08-26
98
+
99
+ - Added non-GTM exporters (GA4, Segment, Snowplow, Tealium, RudderStack,
100
+ Adobe Tags).
101
+ - Added crawl-to-crawl diffing (`pytagmanager diff`).
102
+ - Added `OllamaIntentClassifier` (local-LLM business-intent
103
+ classification via Ollama).
104
+ - Published a proprietary LICENSE for the initial public release (later
105
+ superseded by the Apache-2.0 relicense in 0.2.0).
106
+ - CI fix: create and activate a virtualenv before `maturin develop`.
107
+ - Added README metadata + `abi3-py39` PyO3 feature for broader wheel
108
+ compatibility.
109
+
110
+ ## [0.1.1] — 2026-08-12
111
+
112
+ - Added an SSRF guard to the Rust crawler (blocks loopback and cloud
113
+ metadata-service addresses).
114
+ - Added the Rust/Python integration test suite and initial CI workflow.
115
+
116
+ ## [0.1.0] — initial commit
117
+
118
+ - Rust crawler (BFS, sitemap.xml, robots.txt) + semantic DOM graph engine
119
+ (selectors, ARIA).
120
+ - Rule-based tracking recommendation engine.
121
+ - CLI (`pytagmanager crawl`) + GTM export.
122
+ - Initial product vision and roadmap documents.
@@ -0,0 +1,64 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in
6
+ our community a harassment-free experience for everyone, regardless of
7
+ age, body size, visible or invisible disability, ethnicity, sex
8
+ characteristics, gender identity and expression, level of experience,
9
+ education, socio-economic status, nationality, personal appearance, race,
10
+ caste, color, religion, or sexual identity and orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to a positive environment:
15
+
16
+ - Demonstrating empathy and kindness toward other people
17
+ - Being respectful of differing opinions, viewpoints, and experiences
18
+ - Giving and gracefully accepting constructive feedback
19
+ - Accepting responsibility and apologizing for mistakes, and learning
20
+ from the experience
21
+ - Focusing on what is best not just for us as individuals, but for the
22
+ overall community
23
+
24
+ Examples of unacceptable behavior:
25
+
26
+ - The use of sexualized language or imagery, and sexual attention or
27
+ advances of any kind
28
+ - Trolling, insulting or derogatory comments, and personal or political
29
+ attacks
30
+ - Public or private harassment
31
+ - Publishing others' private information, such as a physical or email
32
+ address, without their explicit permission
33
+ - Other conduct which could reasonably be considered inappropriate in a
34
+ professional setting
35
+
36
+ ## Enforcement Responsibilities
37
+
38
+ This project is currently maintained by a single person (see
39
+ [`SECURITY.md`](SECURITY.md) for the same disclosure re: response times).
40
+ The maintainer is responsible for clarifying and enforcing standards of
41
+ acceptable behavior and will take appropriate and fair corrective action
42
+ in response to any behavior deemed inappropriate, threatening, offensive,
43
+ or harmful — with no guaranteed response time, since there is no
44
+ dedicated moderation team.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies within all community spaces for this project
49
+ (GitHub issues, pull requests, discussions), and applies when an
50
+ individual is officially representing the project in public spaces.
51
+
52
+ ## Enforcement
53
+
54
+ Instances of abusive, harassing, or otherwise unacceptable behavior may
55
+ be reported to the maintainer via the contact method in
56
+ [`SECURITY.md`](SECURITY.md). All complaints will be reviewed and
57
+ investigated as promptly as a single maintainer can manage.
58
+
59
+ ## Attribution
60
+
61
+ This Code of Conduct is adapted from the
62
+ [Contributor Covenant](https://www.contributor-covenant.org), version 2.1,
63
+ available at
64
+ https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
@@ -0,0 +1,93 @@
1
+ # Contributing to PyTagManager
2
+
3
+ ## Before you start
4
+
5
+ Read [`README.md`](README.md) for what's actually built and working, and
6
+ [`docs/VISION.md`](docs/VISION.md) + [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)
7
+ for where the project is going and why. [`ROADMAP_HONEST.md`](ROADMAP_HONEST.md)
8
+ is the current source of truth on what's shipped vs. not — check it before
9
+ assuming a feature is missing or already exists.
10
+
11
+ This is a solo-maintained project (see [`SECURITY.md`](SECURITY.md) for
12
+ response-time expectations). There is no dedicated maintainer team, no SLA on
13
+ PR review, and no guarantee a given contribution will be merged.
14
+
15
+ ## Development setup
16
+
17
+ ```bash
18
+ python3 -m venv .venv
19
+ source .venv/bin/activate
20
+ pip install maturin pytest
21
+ maturin develop # builds the Rust extension, installs pytagmanager editable
22
+
23
+ # Tracking Observability / Diagnostics / Dictionary / Perf tests need the
24
+ # diagnostics extra + a Chromium binary:
25
+ pip install -e '.[diagnostics]'
26
+ playwright install chromium
27
+ ```
28
+
29
+ macOS note: raw `cargo build`/`cargo test` (outside `maturin`) need the
30
+ linker flags in `.cargo/config.toml` for PyO3 extension-module crates to
31
+ link. `maturin develop`/`maturin build` set these automatically; if you
32
+ invoke `cargo` directly and it fails to link, that's why.
33
+
34
+ ## Running the test suite
35
+
36
+ ```bash
37
+ cargo test # Rust: crawler, sitemap/robots parsing, DOM/selectors
38
+ pytest tests/python -v # Python: heuristics, exporters, diffing, observability, etc.
39
+ ```
40
+
41
+ Most of the Python suite drives a real headless Chromium instance (no
42
+ mocked browser behavior) — expect it to be slower than a typical unit-test
43
+ suite, and make sure `playwright install chromium` has been run once.
44
+
45
+ Before submitting a change to Rust code, also run:
46
+
47
+ ```bash
48
+ cargo fmt --check
49
+ cargo clippy --all-targets -- -D warnings
50
+ ```
51
+
52
+ CI runs all of the above; a PR that fails any of them won't pass CI.
53
+
54
+ ## Making a change
55
+
56
+ 1. Fork the repo and create a branch off `main`.
57
+ 2. Make your change with tests. A change with no test coverage for the
58
+ behavior it adds or fixes will generally not be merged — this project's
59
+ honesty policy (see below) depends on test coverage actually reflecting
60
+ what's claimed to work.
61
+ 3. Run the full validation above locally before opening a PR.
62
+ 4. Open a PR describing what changed and why. Reference the roadmap phase
63
+ or issue it relates to, if any.
64
+
65
+ ## Documentation honesty policy
66
+
67
+ This project's docs (`README.md`, `ROADMAP_HONEST.md`, `docs/`) are
68
+ maintained to a specific, deliberately blunt standard: no hedging on
69
+ project status. If something isn't built, the docs say "not built," not
70
+ "planned" or "may be added." If something is untested, the docs say so
71
+ explicitly rather than describing it as working. PRs that add a feature
72
+ should update the relevant doc section to match this standard — don't
73
+ describe a new feature as more complete or more tested than it actually is,
74
+ and don't soften a known limitation to make a PR look more finished.
75
+
76
+ ## Code style
77
+
78
+ - **Rust**: `cargo fmt` (default settings) + `cargo clippy` clean, no
79
+ suppressed lints without a comment explaining why.
80
+ - **Python**: no enforced formatter is wired into CI yet (see
81
+ `ROADMAP_HONEST.md` for other CI gaps); match the existing style in the
82
+ file you're editing. Type hints are used throughout `python/pytagmanager/`
83
+ — new code should include them.
84
+
85
+ ## Reporting bugs / requesting features
86
+
87
+ Use the issue templates under `.github/ISSUE_TEMPLATE/`. For security
88
+ issues, do not open a public issue — see [`SECURITY.md`](SECURITY.md).
89
+
90
+ ## License
91
+
92
+ By contributing, you agree your contributions are licensed under this
93
+ project's [Apache-2.0 license](LICENSE).
@@ -908,7 +908,7 @@ dependencies = [
908
908
 
909
909
  [[package]]
910
910
  name = "pytagmanager"
911
- version = "0.2.0"
911
+ version = "0.2.2"
912
912
  dependencies = [
913
913
  "futures",
914
914
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pytagmanager"
3
- version = "0.2.0"
3
+ version = "0.2.2"
4
4
  edition = "2021"
5
5
  description = "Rust core (crawler + semantic DOM graph engine) for PyTagManager"
6
6
  license = "Apache-2.0"