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.
- pytagmanager-0.2.2/.github/ISSUE_TEMPLATE/bug_report.yml +65 -0
- pytagmanager-0.2.2/.github/ISSUE_TEMPLATE/feature_request.yml +46 -0
- pytagmanager-0.2.2/.github/dependabot.yml +19 -0
- pytagmanager-0.2.2/.github/pull_request_template.md +21 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/.github/workflows/ci.yml +31 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/.gitignore +2 -0
- pytagmanager-0.2.2/CHANGELOG.md +122 -0
- pytagmanager-0.2.2/CODE_OF_CONDUCT.md +64 -0
- pytagmanager-0.2.2/CONTRIBUTING.md +93 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/Cargo.lock +1 -1
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/Cargo.toml +1 -1
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/PKG-INFO +269 -20
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/README.md +268 -19
- pytagmanager-0.2.2/ROADMAP_HONEST.md +373 -0
- pytagmanager-0.2.2/SECURITY.md +63 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/docs/ARCHITECTURE.md +23 -29
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/docs/ROADMAP.md +549 -62
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/pyproject.toml +1 -1
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/__init__.py +1 -1
- pytagmanager-0.2.2/python/pytagmanager/cli.py +1015 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/correlation/journey.py +14 -3
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/diagnostics/rules.py +69 -0
- pytagmanager-0.2.2/python/pytagmanager/diagnostics/trace.py +169 -0
- pytagmanager-0.2.2/python/pytagmanager/dictionary/__init__.py +27 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/dictionary/build.py +79 -12
- pytagmanager-0.2.2/python/pytagmanager/dictionary/labels.py +69 -0
- pytagmanager-0.2.2/python/pytagmanager/dictionary/purpose.py +241 -0
- pytagmanager-0.2.2/python/pytagmanager/dictionary/report.py +117 -0
- pytagmanager-0.2.2/python/pytagmanager/dictionary/schema_drift.py +230 -0
- pytagmanager-0.2.2/python/pytagmanager/discovery/crawl.py +162 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/agent.js +74 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/events.py +1 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/session.py +32 -1
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/state.py +17 -2
- pytagmanager-0.2.2/python/pytagmanager/perf/__init__.py +70 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/dependency_graph.py +77 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/experiments.py +216 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/history.py +130 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/measure.py +205 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/perf_agent.js +118 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/report.py +107 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/scripts.py +199 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/tagging_join.py +78 -0
- pytagmanager-0.2.2/python/pytagmanager/perf/test_candidates.py +83 -0
- pytagmanager-0.2.2/python/pytagmanager/runtime/__init__.py +19 -0
- pytagmanager-0.2.2/python/pytagmanager/runtime/interactions.py +124 -0
- pytagmanager-0.2.2/python/pytagmanager/runtime/renderer.py +121 -0
- pytagmanager-0.2.2/python/pytagmanager/runtime/screenshots.py +96 -0
- pytagmanager-0.2.2/python/pytagmanager/runtime/sniffer.py +99 -0
- pytagmanager-0.2.2/python/pytagmanager/sitewide/event_map.py +70 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/report.py +34 -0
- pytagmanager-0.2.2/python/pytagmanager/tagexec/__init__.py +71 -0
- pytagmanager-0.2.2/python/pytagmanager/tagexec/duplicates.py +172 -0
- pytagmanager-0.2.2/python/pytagmanager/tagexec/graph.py +274 -0
- pytagmanager-0.2.2/python/pytagmanager/tagexec/report.py +127 -0
- pytagmanager-0.2.2/python/pytagmanager/tagexec/server_side.py +148 -0
- pytagmanager-0.2.2/python/pytagmanager/tagexec/static_scan.py +264 -0
- pytagmanager-0.2.2/python/pytagmanager/testintel/__init__.py +22 -0
- pytagmanager-0.2.2/python/pytagmanager/testintel/candidates.py +268 -0
- pytagmanager-0.2.2/python/pytagmanager/testintel/playwright_export.py +65 -0
- pytagmanager-0.2.2/python/pytagmanager/testintel/regression.py +69 -0
- pytagmanager-0.2.2/python/pytagmanager/testintel/report.py +50 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/fetcher.rs +2 -2
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/frontier.rs +31 -1
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/orchestrator.rs +6 -5
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/error.rs +7 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/lib.rs +3 -1
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/crawl_integration.rs +60 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/heavy_first_party.js +9 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/local_first_party.js +2 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/perf_heavy.html +23 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/perf_isolate.html +16 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/perf_scripts.html +17 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/runtime_state_regression.html +21 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/spa_client_rendered.html +20 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/spa_dedup_reset.html +21 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/tagexec_duplicate.html +29 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/tagexec_server_side.html +20 -0
- pytagmanager-0.2.2/tests/python/fixtures/observability/tagexec_static.html +26 -0
- pytagmanager-0.2.2/tests/python/test_cli_render.py +54 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_core_ffi.py +9 -10
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_correlation.py +19 -0
- pytagmanager-0.2.2/tests/python/test_diagnose_cli.py +130 -0
- pytagmanager-0.2.2/tests/python/test_diagnose_duplicate_tags_cli.py +64 -0
- pytagmanager-0.2.2/tests/python/test_diagnose_server_side_cli.py +66 -0
- pytagmanager-0.2.2/tests/python/test_diagnose_tag_graph_cli.py +86 -0
- pytagmanager-0.2.2/tests/python/test_diagnose_test_candidates_cli.py +67 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_diagnostics_rules.py +147 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_dictionary.py +55 -1
- pytagmanager-0.2.2/tests/python/test_dictionary_labels.py +53 -0
- pytagmanager-0.2.2/tests/python/test_dictionary_purpose.py +71 -0
- pytagmanager-0.2.2/tests/python/test_dictionary_schema_drift.py +135 -0
- pytagmanager-0.2.2/tests/python/test_dictionary_test_candidates_cli.py +81 -0
- pytagmanager-0.2.2/tests/python/test_discovery_crawl_rendered.py +58 -0
- pytagmanager-0.2.2/tests/python/test_event_map.py +100 -0
- pytagmanager-0.2.2/tests/python/test_interaction_trace.py +145 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_observability_extended_observers.py +64 -0
- pytagmanager-0.2.2/tests/python/test_perf_cli.py +120 -0
- pytagmanager-0.2.2/tests/python/test_perf_dependency_graph.py +150 -0
- pytagmanager-0.2.2/tests/python/test_perf_dependency_graph_e2e.py +27 -0
- pytagmanager-0.2.2/tests/python/test_perf_environment_config.py +45 -0
- pytagmanager-0.2.2/tests/python/test_perf_experiments_e2e.py +49 -0
- pytagmanager-0.2.2/tests/python/test_perf_experiments_unit.py +155 -0
- pytagmanager-0.2.2/tests/python/test_perf_history.py +98 -0
- pytagmanager-0.2.2/tests/python/test_perf_measure.py +101 -0
- pytagmanager-0.2.2/tests/python/test_perf_measure_e2e.py +57 -0
- pytagmanager-0.2.2/tests/python/test_perf_report.py +113 -0
- pytagmanager-0.2.2/tests/python/test_perf_scripts.py +48 -0
- pytagmanager-0.2.2/tests/python/test_perf_scripts_unit.py +37 -0
- pytagmanager-0.2.2/tests/python/test_perf_tagging_join.py +98 -0
- pytagmanager-0.2.2/tests/python/test_perf_test_candidates.py +84 -0
- pytagmanager-0.2.2/tests/python/test_runtime_interactions.py +40 -0
- pytagmanager-0.2.2/tests/python/test_runtime_renderer.py +45 -0
- pytagmanager-0.2.2/tests/python/test_runtime_screenshots.py +31 -0
- pytagmanager-0.2.2/tests/python/test_runtime_sniffer.py +24 -0
- pytagmanager-0.2.2/tests/python/test_scan_tags_cli.py +34 -0
- pytagmanager-0.2.2/tests/python/test_tagexec_duplicates.py +187 -0
- pytagmanager-0.2.2/tests/python/test_tagexec_graph.py +248 -0
- pytagmanager-0.2.2/tests/python/test_tagexec_server_side.py +171 -0
- pytagmanager-0.2.2/tests/python/test_tagexec_static_scan.py +128 -0
- pytagmanager-0.2.2/tests/python/test_tagexec_static_scan_e2e.py +43 -0
- pytagmanager-0.2.2/tests/python/test_testintel_candidates.py +197 -0
- pytagmanager-0.2.2/tests/python/test_testintel_playwright_export.py +90 -0
- pytagmanager-0.2.2/tests/python/test_testintel_regression.py +89 -0
- pytagmanager-0.2.0/ROADMAP_HONEST.md +0 -107
- pytagmanager-0.2.0/python/pytagmanager/cli.py +0 -469
- pytagmanager-0.2.0/python/pytagmanager/dictionary/__init__.py +0 -10
- pytagmanager-0.2.0/python/pytagmanager/dictionary/report.py +0 -69
- pytagmanager-0.2.0/python/pytagmanager/discovery/crawl.py +0 -34
- pytagmanager-0.2.0/tests/python/test_diagnose_cli.py +0 -54
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/.cargo/config.toml +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/LICENSE +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/docs/VISION.md +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/ga4_client.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/gtm_client.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/analytics_api/models.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/correlation/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/diagnostics/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/diagnostics/models.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/discovery/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/_taxonomy.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/adobe_tags.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/base.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/ga4.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/gtm.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/rudderstack.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/segment.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/snowplow.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/export/tealium.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/intent/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/intent/base.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/intent/ollama_classifier.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/observability/scenario.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/recommend/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/recommend/heuristics.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/recommend/models.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/json_report.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/summary.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/reporting/terminal.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/aggregation.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/anomalies.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/history.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/interaction_consistency.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/notify.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/page_type.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/sitewide/templates.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/version_control/__init__.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/version_control/diff.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/python/pytagmanager/version_control/snapshot.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/mod.rs +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/robots.rs +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/crawler/sitemap.rs +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/graph.rs +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/mod.rs +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/parser.rs +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/src/dom/selectors.rs +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/conftest.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/add_to_cart_variant_naming.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/api_and_console.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/duplicate_tracking.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/healthy_tracking.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/missing_datalayer.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/missing_ga4_request.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/runtime_state.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/observability/spa_tracking.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/fixtures/sample_page.html +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_analytics_api_clients.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_cli.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_diagnose_site_wide_cli.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_exporters.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_gtm_export.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_heuristics.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_intent_ollama.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_interaction_consistency.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_observability_pipeline.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_observability_state.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_aggregation.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_anomalies.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_history.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_notify.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_page_type.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_sitewide_templates.py +0 -0
- {pytagmanager-0.2.0 → pytagmanager-0.2.2}/tests/python/test_version_control.py +0 -0
- {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
|
|
@@ -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).
|