tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__py3-none-any.whl
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.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
|
@@ -1,455 +1,455 @@
|
|
|
1
|
-
# MQTT Patterns
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
MQTT (Message Queuing Telemetry Transport) is a lightweight publish-subscribe messaging protocol ideal for IoT applications. This guide covers MQTT patterns for HomeIQ and similar home automation systems.
|
|
6
|
-
|
|
7
|
-
## MQTT Basics
|
|
8
|
-
|
|
9
|
-
### Core Concepts
|
|
10
|
-
|
|
11
|
-
- **Broker:** Central message server
|
|
12
|
-
- **Client:** Publisher or subscriber
|
|
13
|
-
- **Topic:** Message routing path (e.g., `home/sensor/temperature`)
|
|
14
|
-
- **QoS (Quality of Service):** Message delivery guarantee
|
|
15
|
-
- QoS 0: At most once (fire and forget)
|
|
16
|
-
- QoS 1: At least once (acknowledged)
|
|
17
|
-
- QoS 2: Exactly once (guaranteed)
|
|
18
|
-
- **Retain:** Keep last message on topic
|
|
19
|
-
- **Will:** Last message sent on disconnect
|
|
20
|
-
|
|
21
|
-
### Use Cases
|
|
22
|
-
|
|
23
|
-
- IoT sensor data publishing
|
|
24
|
-
- Device control commands
|
|
25
|
-
- Real-time monitoring
|
|
26
|
-
- Low-bandwidth environments
|
|
27
|
-
|
|
28
|
-
## Python MQTT Patterns
|
|
29
|
-
|
|
30
|
-
### Pattern 1: Basic MQTT Client (paho-mqtt)
|
|
31
|
-
|
|
32
|
-
```python
|
|
33
|
-
import paho.mqtt.client as mqtt
|
|
34
|
-
import json
|
|
35
|
-
|
|
36
|
-
class MQTTClient:
|
|
37
|
-
def __init__(self, broker: str, port: int = 1883):
|
|
38
|
-
self.broker = broker
|
|
39
|
-
self.port = port
|
|
40
|
-
self.client = mqtt.Client()
|
|
41
|
-
self.client.on_connect = self.on_connect
|
|
42
|
-
self.client.on_message = self.on_message
|
|
43
|
-
|
|
44
|
-
def on_connect(self, client, userdata, flags, rc):
|
|
45
|
-
"""Callback when connected to broker."""
|
|
46
|
-
if rc == 0:
|
|
47
|
-
print("Connected to MQTT broker")
|
|
48
|
-
# Subscribe to topics
|
|
49
|
-
client.subscribe("home/sensor/#")
|
|
50
|
-
else:
|
|
51
|
-
print(f"Connection failed with code {rc}")
|
|
52
|
-
|
|
53
|
-
def on_message(self, client, userdata, msg):
|
|
54
|
-
"""Callback when message received."""
|
|
55
|
-
topic = msg.topic
|
|
56
|
-
payload = json.loads(msg.payload.decode())
|
|
57
|
-
print(f"Received on {topic}: {payload}")
|
|
58
|
-
|
|
59
|
-
def connect(self):
|
|
60
|
-
"""Connect to MQTT broker."""
|
|
61
|
-
self.client.connect(self.broker, self.port, 60)
|
|
62
|
-
self.client.loop_start()
|
|
63
|
-
|
|
64
|
-
def publish(self, topic: str, payload: dict, qos: int = 1):
|
|
65
|
-
"""Publish message to topic."""
|
|
66
|
-
self.client.publish(topic, json.dumps(payload), qos=qos)
|
|
67
|
-
|
|
68
|
-
def disconnect(self):
|
|
69
|
-
"""Disconnect from broker."""
|
|
70
|
-
self.client.loop_stop()
|
|
71
|
-
self.client.disconnect()
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Pattern 2: Async MQTT Client (asyncio-mqtt)
|
|
75
|
-
|
|
76
|
-
```python
|
|
77
|
-
import asyncio
|
|
78
|
-
from asyncio_mqtt import Client
|
|
79
|
-
import json
|
|
80
|
-
|
|
81
|
-
class AsyncMQTTClient:
|
|
82
|
-
def __init__(self, broker: str, port: int = 1883):
|
|
83
|
-
self.broker = broker
|
|
84
|
-
self.port = port
|
|
85
|
-
self.client = None
|
|
86
|
-
|
|
87
|
-
async def connect(self):
|
|
88
|
-
"""Connect to MQTT broker."""
|
|
89
|
-
self.client = Client(hostname=self.broker, port=self.port)
|
|
90
|
-
await self.client.connect()
|
|
91
|
-
|
|
92
|
-
async def subscribe(self, topic: str, qos: int = 1):
|
|
93
|
-
"""Subscribe to topic."""
|
|
94
|
-
await self.client.subscribe(topic, qos=qos)
|
|
95
|
-
|
|
96
|
-
async def publish(self, topic: str, payload: dict, qos: int = 1, retain: bool = False):
|
|
97
|
-
"""Publish message to topic."""
|
|
98
|
-
await self.client.publish(
|
|
99
|
-
topic,
|
|
100
|
-
json.dumps(payload).encode(),
|
|
101
|
-
qos=qos,
|
|
102
|
-
retain=retain
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
async def listen(self, callback):
|
|
106
|
-
"""Listen for messages."""
|
|
107
|
-
async with self.client.messages() as messages:
|
|
108
|
-
async for message in messages:
|
|
109
|
-
payload = json.loads(message.payload.decode())
|
|
110
|
-
await callback(message.topic, payload)
|
|
111
|
-
|
|
112
|
-
async def disconnect(self):
|
|
113
|
-
"""Disconnect from broker."""
|
|
114
|
-
await self.client.disconnect()
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Pattern 3: MQTT with Reconnection
|
|
118
|
-
|
|
119
|
-
```python
|
|
120
|
-
import paho.mqtt.client as mqtt
|
|
121
|
-
import time
|
|
122
|
-
import logging
|
|
123
|
-
|
|
124
|
-
class ResilientMQTTClient:
|
|
125
|
-
def __init__(self, broker: str, port: int = 1883):
|
|
126
|
-
self.broker = broker
|
|
127
|
-
self.port = port
|
|
128
|
-
self.client = mqtt.Client()
|
|
129
|
-
self.client.on_connect = self.on_connect
|
|
130
|
-
self.client.on_disconnect = self.on_disconnect
|
|
131
|
-
self.client.on_message = self.on_message
|
|
132
|
-
self.connected = False
|
|
133
|
-
self.reconnect_delay = 1
|
|
134
|
-
self.max_reconnect_delay = 60
|
|
135
|
-
|
|
136
|
-
def on_connect(self, client, userdata, flags, rc):
|
|
137
|
-
"""Callback when connected."""
|
|
138
|
-
if rc == 0:
|
|
139
|
-
self.connected = True
|
|
140
|
-
self.reconnect_delay = 1 # Reset delay
|
|
141
|
-
logger.info("Connected to MQTT broker")
|
|
142
|
-
# Resubscribe to topics
|
|
143
|
-
client.subscribe("home/sensor/#")
|
|
144
|
-
else:
|
|
145
|
-
logger.error(f"Connection failed with code {rc}")
|
|
146
|
-
|
|
147
|
-
def on_disconnect(self, client, userdata, rc):
|
|
148
|
-
"""Callback when disconnected."""
|
|
149
|
-
self.connected = False
|
|
150
|
-
logger.warning("Disconnected from MQTT broker")
|
|
151
|
-
|
|
152
|
-
def on_message(self, client, userdata, msg):
|
|
153
|
-
"""Callback when message received."""
|
|
154
|
-
# Handle message
|
|
155
|
-
pass
|
|
156
|
-
|
|
157
|
-
def connect_with_retry(self):
|
|
158
|
-
"""Connect with automatic retry."""
|
|
159
|
-
while not self.connected:
|
|
160
|
-
try:
|
|
161
|
-
self.client.connect(self.broker, self.port, 60)
|
|
162
|
-
self.client.loop_start()
|
|
163
|
-
break
|
|
164
|
-
except Exception as e:
|
|
165
|
-
logger.error(f"Connection failed: {e}")
|
|
166
|
-
time.sleep(self.reconnect_delay)
|
|
167
|
-
self.reconnect_delay = min(
|
|
168
|
-
self.reconnect_delay * 2,
|
|
169
|
-
self.max_reconnect_delay
|
|
170
|
-
)
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
## Topic Structure Patterns
|
|
174
|
-
|
|
175
|
-
### Pattern 1: Hierarchical Topics
|
|
176
|
-
|
|
177
|
-
```
|
|
178
|
-
home/
|
|
179
|
-
├── sensor/
|
|
180
|
-
│ ├── temperature/
|
|
181
|
-
│ │ ├── kitchen
|
|
182
|
-
│ │ └── bedroom
|
|
183
|
-
│ └── humidity/
|
|
184
|
-
│ ├── kitchen
|
|
185
|
-
│ └── bedroom
|
|
186
|
-
├── device/
|
|
187
|
-
│ ├── light/
|
|
188
|
-
│ │ └── living_room
|
|
189
|
-
│ └── switch/
|
|
190
|
-
│ └── kitchen
|
|
191
|
-
└── command/
|
|
192
|
-
├── light/
|
|
193
|
-
│ └── living_room
|
|
194
|
-
└── switch/
|
|
195
|
-
└── kitchen
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### Pattern 2: Topic Naming Conventions
|
|
199
|
-
|
|
200
|
-
**Format:** `{location}/{device_type}/{device_id}/{property}`
|
|
201
|
-
|
|
202
|
-
**Examples:**
|
|
203
|
-
- `home/kitchen/sensor/temperature` - Kitchen temperature sensor
|
|
204
|
-
- `home/bedroom/light/main/state` - Bedroom light state
|
|
205
|
-
- `home/kitchen/switch/appliance/command` - Kitchen switch command
|
|
206
|
-
|
|
207
|
-
**Best Practices:**
|
|
208
|
-
- Use forward slashes for hierarchy
|
|
209
|
-
- Keep topics short but descriptive
|
|
210
|
-
- Use consistent naming conventions
|
|
211
|
-
- Avoid special characters
|
|
212
|
-
|
|
213
|
-
### Pattern 3: Wildcard Subscriptions
|
|
214
|
-
|
|
215
|
-
```python
|
|
216
|
-
# Single-level wildcard (+)
|
|
217
|
-
client.subscribe("home/+/sensor/temperature")
|
|
218
|
-
|
|
219
|
-
# Multi-level wildcard (#)
|
|
220
|
-
client.subscribe("home/sensor/#")
|
|
221
|
-
|
|
222
|
-
# Specific device
|
|
223
|
-
client.subscribe("home/kitchen/sensor/temperature")
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
## QoS Patterns
|
|
227
|
-
|
|
228
|
-
### Pattern 1: Sensor Data (QoS 0)
|
|
229
|
-
|
|
230
|
-
```python
|
|
231
|
-
# High-frequency, low-criticality data
|
|
232
|
-
client.publish(
|
|
233
|
-
"home/sensor/temperature/kitchen",
|
|
234
|
-
{"value": 72.5, "unit": "fahrenheit"},
|
|
235
|
-
qos=0 # Fire and forget
|
|
236
|
-
)
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Pattern 2: Commands (QoS 1)
|
|
240
|
-
|
|
241
|
-
```python
|
|
242
|
-
# Important commands that must be delivered
|
|
243
|
-
client.publish(
|
|
244
|
-
"home/device/light/living_room/command",
|
|
245
|
-
{"action": "turn_on", "brightness": 80},
|
|
246
|
-
qos=1 # At least once
|
|
247
|
-
)
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
### Pattern 3: Critical Messages (QoS 2)
|
|
251
|
-
|
|
252
|
-
```python
|
|
253
|
-
# Critical messages requiring exactly-once delivery
|
|
254
|
-
client.publish(
|
|
255
|
-
"home/security/alarm/trigger",
|
|
256
|
-
{"alarm_type": "intrusion", "location": "front_door"},
|
|
257
|
-
qos=2 # Exactly once
|
|
258
|
-
)
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
## Retain and Will Patterns
|
|
262
|
-
|
|
263
|
-
### Pattern 1: Last Known Value (Retain)
|
|
264
|
-
|
|
265
|
-
```python
|
|
266
|
-
# Publish with retain to keep last value
|
|
267
|
-
client.publish(
|
|
268
|
-
"home/device/light/living_room/state",
|
|
269
|
-
{"state": "on", "brightness": 80},
|
|
270
|
-
qos=1,
|
|
271
|
-
retain=True # Broker keeps this message
|
|
272
|
-
)
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
### Pattern 2: Last Will and Testament
|
|
276
|
-
|
|
277
|
-
```python
|
|
278
|
-
# Set will message for unexpected disconnects
|
|
279
|
-
client.will_set(
|
|
280
|
-
"home/device/status",
|
|
281
|
-
json.dumps({"device": "sensor_001", "status": "offline"}),
|
|
282
|
-
qos=1,
|
|
283
|
-
retain=True
|
|
284
|
-
)
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
## HomeIQ-Specific Patterns
|
|
288
|
-
|
|
289
|
-
### Pattern 1: Sensor Data Publishing
|
|
290
|
-
|
|
291
|
-
```python
|
|
292
|
-
class SensorPublisher:
|
|
293
|
-
def __init__(self, mqtt_client, device_id: str, location: str):
|
|
294
|
-
self.client = mqtt_client
|
|
295
|
-
self.device_id = device_id
|
|
296
|
-
self.location = location
|
|
297
|
-
self.base_topic = f"home/{location}/sensor/{device_id}"
|
|
298
|
-
|
|
299
|
-
def publish_reading(self, sensor_type: str, value: float, unit: str):
|
|
300
|
-
"""Publish sensor reading."""
|
|
301
|
-
topic = f"{self.base_topic}/{sensor_type}"
|
|
302
|
-
payload = {
|
|
303
|
-
"value": value,
|
|
304
|
-
"unit": unit,
|
|
305
|
-
"timestamp": time.time(),
|
|
306
|
-
"device_id": self.device_id,
|
|
307
|
-
"location": self.location
|
|
308
|
-
}
|
|
309
|
-
self.client.publish(topic, payload, qos=0, retain=False)
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
### Pattern 2: Device Control
|
|
313
|
-
|
|
314
|
-
```python
|
|
315
|
-
class DeviceController:
|
|
316
|
-
def __init__(self, mqtt_client, device_id: str, location: str):
|
|
317
|
-
self.client = mqtt_client
|
|
318
|
-
self.device_id = device_id
|
|
319
|
-
self.location = location
|
|
320
|
-
self.command_topic = f"home/{location}/device/{device_id}/command"
|
|
321
|
-
self.state_topic = f"home/{location}/device/{device_id}/state"
|
|
322
|
-
|
|
323
|
-
def send_command(self, action: str, **kwargs):
|
|
324
|
-
"""Send command to device."""
|
|
325
|
-
payload = {"action": action, **kwargs}
|
|
326
|
-
self.client.publish(
|
|
327
|
-
self.command_topic,
|
|
328
|
-
payload,
|
|
329
|
-
qos=1,
|
|
330
|
-
retain=False
|
|
331
|
-
)
|
|
332
|
-
|
|
333
|
-
def update_state(self, state: dict):
|
|
334
|
-
"""Update device state."""
|
|
335
|
-
self.client.publish(
|
|
336
|
-
self.state_topic,
|
|
337
|
-
state,
|
|
338
|
-
qos=1,
|
|
339
|
-
retain=True # Retain state for new subscribers
|
|
340
|
-
)
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
## Error Handling Patterns
|
|
344
|
-
|
|
345
|
-
### Pattern 1: Connection Error Handling
|
|
346
|
-
|
|
347
|
-
```python
|
|
348
|
-
def on_connect(client, userdata, flags, rc):
|
|
349
|
-
if rc == 0:
|
|
350
|
-
logger.info("Connected successfully")
|
|
351
|
-
elif rc == 1:
|
|
352
|
-
logger.error("Connection refused - incorrect protocol version")
|
|
353
|
-
elif rc == 2:
|
|
354
|
-
logger.error("Connection refused - invalid client identifier")
|
|
355
|
-
elif rc == 3:
|
|
356
|
-
logger.error("Connection refused - server unavailable")
|
|
357
|
-
elif rc == 4:
|
|
358
|
-
logger.error("Connection refused - bad username or password")
|
|
359
|
-
elif rc == 5:
|
|
360
|
-
logger.error("Connection refused - not authorized")
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
### Pattern 2: Publish Error Handling
|
|
364
|
-
|
|
365
|
-
```python
|
|
366
|
-
def on_publish(client, userdata, mid):
|
|
367
|
-
"""Callback when message published."""
|
|
368
|
-
logger.debug(f"Message {mid} published successfully")
|
|
369
|
-
|
|
370
|
-
def publish_with_error_handling(client, topic, payload, qos=1):
|
|
371
|
-
"""Publish with error handling."""
|
|
372
|
-
try:
|
|
373
|
-
result = client.publish(topic, payload, qos=qos)
|
|
374
|
-
if result.rc != mqtt.MQTT_ERR_SUCCESS:
|
|
375
|
-
logger.error(f"Publish failed: {result.rc}")
|
|
376
|
-
return False
|
|
377
|
-
return True
|
|
378
|
-
except Exception as e:
|
|
379
|
-
logger.error(f"Publish error: {e}")
|
|
380
|
-
return False
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
## Testing Patterns
|
|
384
|
-
|
|
385
|
-
### Mock MQTT Broker
|
|
386
|
-
|
|
387
|
-
```python
|
|
388
|
-
from unittest.mock import Mock, MagicMock
|
|
389
|
-
|
|
390
|
-
class MockMQTTClient:
|
|
391
|
-
def __init__(self):
|
|
392
|
-
self.published_messages = []
|
|
393
|
-
self.subscribed_topics = []
|
|
394
|
-
self.connected = False
|
|
395
|
-
|
|
396
|
-
def connect(self, broker, port, keepalive):
|
|
397
|
-
self.connected = True
|
|
398
|
-
|
|
399
|
-
def publish(self, topic, payload, qos=0, retain=False):
|
|
400
|
-
self.published_messages.append({
|
|
401
|
-
"topic": topic,
|
|
402
|
-
"payload": payload,
|
|
403
|
-
"qos": qos,
|
|
404
|
-
"retain": retain
|
|
405
|
-
})
|
|
406
|
-
return Mock(rc=0)
|
|
407
|
-
|
|
408
|
-
def subscribe(self, topic, qos=0):
|
|
409
|
-
self.subscribed_topics.append({"topic": topic, "qos": qos})
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
## Best Practices
|
|
413
|
-
|
|
414
|
-
### 1. Use Appropriate QoS Levels
|
|
415
|
-
|
|
416
|
-
- **QoS 0:** High-frequency sensor data
|
|
417
|
-
- **QoS 1:** Commands and state updates
|
|
418
|
-
- **QoS 2:** Critical messages (use sparingly)
|
|
419
|
-
|
|
420
|
-
### 2. Implement Reconnection Logic
|
|
421
|
-
|
|
422
|
-
```python
|
|
423
|
-
client.reconnect_delay_set(min_delay=1, max_delay=60)
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
### 3. Use Retain for State
|
|
427
|
-
|
|
428
|
-
```python
|
|
429
|
-
# Retain last known state
|
|
430
|
-
client.publish("device/state", state, qos=1, retain=True)
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
### 4. Clean Session Management
|
|
434
|
-
|
|
435
|
-
```python
|
|
436
|
-
# Use clean_session=False for persistent sessions
|
|
437
|
-
client = mqtt.Client(clean_session=False)
|
|
438
|
-
```
|
|
439
|
-
|
|
440
|
-
### 5. Topic Security
|
|
441
|
-
|
|
442
|
-
```python
|
|
443
|
-
# Use authentication
|
|
444
|
-
client.username_pw_set(username, password)
|
|
445
|
-
|
|
446
|
-
# Use TLS for secure connections
|
|
447
|
-
client.tls_set(ca_certs="ca.crt")
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
## References
|
|
451
|
-
|
|
452
|
-
- [paho-mqtt Documentation](https://www.eclipse.org/paho/index.php?page=clients/python/docs/index.php)
|
|
453
|
-
- [asyncio-mqtt](https://github.com/sbtinstruments/asyncio-mqtt)
|
|
454
|
-
- [MQTT Specification](https://mqtt.org/mqtt-specification/)
|
|
455
|
-
|
|
1
|
+
# MQTT Patterns
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
MQTT (Message Queuing Telemetry Transport) is a lightweight publish-subscribe messaging protocol ideal for IoT applications. This guide covers MQTT patterns for HomeIQ and similar home automation systems.
|
|
6
|
+
|
|
7
|
+
## MQTT Basics
|
|
8
|
+
|
|
9
|
+
### Core Concepts
|
|
10
|
+
|
|
11
|
+
- **Broker:** Central message server
|
|
12
|
+
- **Client:** Publisher or subscriber
|
|
13
|
+
- **Topic:** Message routing path (e.g., `home/sensor/temperature`)
|
|
14
|
+
- **QoS (Quality of Service):** Message delivery guarantee
|
|
15
|
+
- QoS 0: At most once (fire and forget)
|
|
16
|
+
- QoS 1: At least once (acknowledged)
|
|
17
|
+
- QoS 2: Exactly once (guaranteed)
|
|
18
|
+
- **Retain:** Keep last message on topic
|
|
19
|
+
- **Will:** Last message sent on disconnect
|
|
20
|
+
|
|
21
|
+
### Use Cases
|
|
22
|
+
|
|
23
|
+
- IoT sensor data publishing
|
|
24
|
+
- Device control commands
|
|
25
|
+
- Real-time monitoring
|
|
26
|
+
- Low-bandwidth environments
|
|
27
|
+
|
|
28
|
+
## Python MQTT Patterns
|
|
29
|
+
|
|
30
|
+
### Pattern 1: Basic MQTT Client (paho-mqtt)
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
import paho.mqtt.client as mqtt
|
|
34
|
+
import json
|
|
35
|
+
|
|
36
|
+
class MQTTClient:
|
|
37
|
+
def __init__(self, broker: str, port: int = 1883):
|
|
38
|
+
self.broker = broker
|
|
39
|
+
self.port = port
|
|
40
|
+
self.client = mqtt.Client()
|
|
41
|
+
self.client.on_connect = self.on_connect
|
|
42
|
+
self.client.on_message = self.on_message
|
|
43
|
+
|
|
44
|
+
def on_connect(self, client, userdata, flags, rc):
|
|
45
|
+
"""Callback when connected to broker."""
|
|
46
|
+
if rc == 0:
|
|
47
|
+
print("Connected to MQTT broker")
|
|
48
|
+
# Subscribe to topics
|
|
49
|
+
client.subscribe("home/sensor/#")
|
|
50
|
+
else:
|
|
51
|
+
print(f"Connection failed with code {rc}")
|
|
52
|
+
|
|
53
|
+
def on_message(self, client, userdata, msg):
|
|
54
|
+
"""Callback when message received."""
|
|
55
|
+
topic = msg.topic
|
|
56
|
+
payload = json.loads(msg.payload.decode())
|
|
57
|
+
print(f"Received on {topic}: {payload}")
|
|
58
|
+
|
|
59
|
+
def connect(self):
|
|
60
|
+
"""Connect to MQTT broker."""
|
|
61
|
+
self.client.connect(self.broker, self.port, 60)
|
|
62
|
+
self.client.loop_start()
|
|
63
|
+
|
|
64
|
+
def publish(self, topic: str, payload: dict, qos: int = 1):
|
|
65
|
+
"""Publish message to topic."""
|
|
66
|
+
self.client.publish(topic, json.dumps(payload), qos=qos)
|
|
67
|
+
|
|
68
|
+
def disconnect(self):
|
|
69
|
+
"""Disconnect from broker."""
|
|
70
|
+
self.client.loop_stop()
|
|
71
|
+
self.client.disconnect()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Pattern 2: Async MQTT Client (asyncio-mqtt)
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
import asyncio
|
|
78
|
+
from asyncio_mqtt import Client
|
|
79
|
+
import json
|
|
80
|
+
|
|
81
|
+
class AsyncMQTTClient:
|
|
82
|
+
def __init__(self, broker: str, port: int = 1883):
|
|
83
|
+
self.broker = broker
|
|
84
|
+
self.port = port
|
|
85
|
+
self.client = None
|
|
86
|
+
|
|
87
|
+
async def connect(self):
|
|
88
|
+
"""Connect to MQTT broker."""
|
|
89
|
+
self.client = Client(hostname=self.broker, port=self.port)
|
|
90
|
+
await self.client.connect()
|
|
91
|
+
|
|
92
|
+
async def subscribe(self, topic: str, qos: int = 1):
|
|
93
|
+
"""Subscribe to topic."""
|
|
94
|
+
await self.client.subscribe(topic, qos=qos)
|
|
95
|
+
|
|
96
|
+
async def publish(self, topic: str, payload: dict, qos: int = 1, retain: bool = False):
|
|
97
|
+
"""Publish message to topic."""
|
|
98
|
+
await self.client.publish(
|
|
99
|
+
topic,
|
|
100
|
+
json.dumps(payload).encode(),
|
|
101
|
+
qos=qos,
|
|
102
|
+
retain=retain
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async def listen(self, callback):
|
|
106
|
+
"""Listen for messages."""
|
|
107
|
+
async with self.client.messages() as messages:
|
|
108
|
+
async for message in messages:
|
|
109
|
+
payload = json.loads(message.payload.decode())
|
|
110
|
+
await callback(message.topic, payload)
|
|
111
|
+
|
|
112
|
+
async def disconnect(self):
|
|
113
|
+
"""Disconnect from broker."""
|
|
114
|
+
await self.client.disconnect()
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Pattern 3: MQTT with Reconnection
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
import paho.mqtt.client as mqtt
|
|
121
|
+
import time
|
|
122
|
+
import logging
|
|
123
|
+
|
|
124
|
+
class ResilientMQTTClient:
|
|
125
|
+
def __init__(self, broker: str, port: int = 1883):
|
|
126
|
+
self.broker = broker
|
|
127
|
+
self.port = port
|
|
128
|
+
self.client = mqtt.Client()
|
|
129
|
+
self.client.on_connect = self.on_connect
|
|
130
|
+
self.client.on_disconnect = self.on_disconnect
|
|
131
|
+
self.client.on_message = self.on_message
|
|
132
|
+
self.connected = False
|
|
133
|
+
self.reconnect_delay = 1
|
|
134
|
+
self.max_reconnect_delay = 60
|
|
135
|
+
|
|
136
|
+
def on_connect(self, client, userdata, flags, rc):
|
|
137
|
+
"""Callback when connected."""
|
|
138
|
+
if rc == 0:
|
|
139
|
+
self.connected = True
|
|
140
|
+
self.reconnect_delay = 1 # Reset delay
|
|
141
|
+
logger.info("Connected to MQTT broker")
|
|
142
|
+
# Resubscribe to topics
|
|
143
|
+
client.subscribe("home/sensor/#")
|
|
144
|
+
else:
|
|
145
|
+
logger.error(f"Connection failed with code {rc}")
|
|
146
|
+
|
|
147
|
+
def on_disconnect(self, client, userdata, rc):
|
|
148
|
+
"""Callback when disconnected."""
|
|
149
|
+
self.connected = False
|
|
150
|
+
logger.warning("Disconnected from MQTT broker")
|
|
151
|
+
|
|
152
|
+
def on_message(self, client, userdata, msg):
|
|
153
|
+
"""Callback when message received."""
|
|
154
|
+
# Handle message
|
|
155
|
+
pass
|
|
156
|
+
|
|
157
|
+
def connect_with_retry(self):
|
|
158
|
+
"""Connect with automatic retry."""
|
|
159
|
+
while not self.connected:
|
|
160
|
+
try:
|
|
161
|
+
self.client.connect(self.broker, self.port, 60)
|
|
162
|
+
self.client.loop_start()
|
|
163
|
+
break
|
|
164
|
+
except Exception as e:
|
|
165
|
+
logger.error(f"Connection failed: {e}")
|
|
166
|
+
time.sleep(self.reconnect_delay)
|
|
167
|
+
self.reconnect_delay = min(
|
|
168
|
+
self.reconnect_delay * 2,
|
|
169
|
+
self.max_reconnect_delay
|
|
170
|
+
)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Topic Structure Patterns
|
|
174
|
+
|
|
175
|
+
### Pattern 1: Hierarchical Topics
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
home/
|
|
179
|
+
├── sensor/
|
|
180
|
+
│ ├── temperature/
|
|
181
|
+
│ │ ├── kitchen
|
|
182
|
+
│ │ └── bedroom
|
|
183
|
+
│ └── humidity/
|
|
184
|
+
│ ├── kitchen
|
|
185
|
+
│ └── bedroom
|
|
186
|
+
├── device/
|
|
187
|
+
│ ├── light/
|
|
188
|
+
│ │ └── living_room
|
|
189
|
+
│ └── switch/
|
|
190
|
+
│ └── kitchen
|
|
191
|
+
└── command/
|
|
192
|
+
├── light/
|
|
193
|
+
│ └── living_room
|
|
194
|
+
└── switch/
|
|
195
|
+
└── kitchen
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Pattern 2: Topic Naming Conventions
|
|
199
|
+
|
|
200
|
+
**Format:** `{location}/{device_type}/{device_id}/{property}`
|
|
201
|
+
|
|
202
|
+
**Examples:**
|
|
203
|
+
- `home/kitchen/sensor/temperature` - Kitchen temperature sensor
|
|
204
|
+
- `home/bedroom/light/main/state` - Bedroom light state
|
|
205
|
+
- `home/kitchen/switch/appliance/command` - Kitchen switch command
|
|
206
|
+
|
|
207
|
+
**Best Practices:**
|
|
208
|
+
- Use forward slashes for hierarchy
|
|
209
|
+
- Keep topics short but descriptive
|
|
210
|
+
- Use consistent naming conventions
|
|
211
|
+
- Avoid special characters
|
|
212
|
+
|
|
213
|
+
### Pattern 3: Wildcard Subscriptions
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
# Single-level wildcard (+)
|
|
217
|
+
client.subscribe("home/+/sensor/temperature")
|
|
218
|
+
|
|
219
|
+
# Multi-level wildcard (#)
|
|
220
|
+
client.subscribe("home/sensor/#")
|
|
221
|
+
|
|
222
|
+
# Specific device
|
|
223
|
+
client.subscribe("home/kitchen/sensor/temperature")
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## QoS Patterns
|
|
227
|
+
|
|
228
|
+
### Pattern 1: Sensor Data (QoS 0)
|
|
229
|
+
|
|
230
|
+
```python
|
|
231
|
+
# High-frequency, low-criticality data
|
|
232
|
+
client.publish(
|
|
233
|
+
"home/sensor/temperature/kitchen",
|
|
234
|
+
{"value": 72.5, "unit": "fahrenheit"},
|
|
235
|
+
qos=0 # Fire and forget
|
|
236
|
+
)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Pattern 2: Commands (QoS 1)
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
# Important commands that must be delivered
|
|
243
|
+
client.publish(
|
|
244
|
+
"home/device/light/living_room/command",
|
|
245
|
+
{"action": "turn_on", "brightness": 80},
|
|
246
|
+
qos=1 # At least once
|
|
247
|
+
)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Pattern 3: Critical Messages (QoS 2)
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
# Critical messages requiring exactly-once delivery
|
|
254
|
+
client.publish(
|
|
255
|
+
"home/security/alarm/trigger",
|
|
256
|
+
{"alarm_type": "intrusion", "location": "front_door"},
|
|
257
|
+
qos=2 # Exactly once
|
|
258
|
+
)
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Retain and Will Patterns
|
|
262
|
+
|
|
263
|
+
### Pattern 1: Last Known Value (Retain)
|
|
264
|
+
|
|
265
|
+
```python
|
|
266
|
+
# Publish with retain to keep last value
|
|
267
|
+
client.publish(
|
|
268
|
+
"home/device/light/living_room/state",
|
|
269
|
+
{"state": "on", "brightness": 80},
|
|
270
|
+
qos=1,
|
|
271
|
+
retain=True # Broker keeps this message
|
|
272
|
+
)
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Pattern 2: Last Will and Testament
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
# Set will message for unexpected disconnects
|
|
279
|
+
client.will_set(
|
|
280
|
+
"home/device/status",
|
|
281
|
+
json.dumps({"device": "sensor_001", "status": "offline"}),
|
|
282
|
+
qos=1,
|
|
283
|
+
retain=True
|
|
284
|
+
)
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## HomeIQ-Specific Patterns
|
|
288
|
+
|
|
289
|
+
### Pattern 1: Sensor Data Publishing
|
|
290
|
+
|
|
291
|
+
```python
|
|
292
|
+
class SensorPublisher:
|
|
293
|
+
def __init__(self, mqtt_client, device_id: str, location: str):
|
|
294
|
+
self.client = mqtt_client
|
|
295
|
+
self.device_id = device_id
|
|
296
|
+
self.location = location
|
|
297
|
+
self.base_topic = f"home/{location}/sensor/{device_id}"
|
|
298
|
+
|
|
299
|
+
def publish_reading(self, sensor_type: str, value: float, unit: str):
|
|
300
|
+
"""Publish sensor reading."""
|
|
301
|
+
topic = f"{self.base_topic}/{sensor_type}"
|
|
302
|
+
payload = {
|
|
303
|
+
"value": value,
|
|
304
|
+
"unit": unit,
|
|
305
|
+
"timestamp": time.time(),
|
|
306
|
+
"device_id": self.device_id,
|
|
307
|
+
"location": self.location
|
|
308
|
+
}
|
|
309
|
+
self.client.publish(topic, payload, qos=0, retain=False)
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Pattern 2: Device Control
|
|
313
|
+
|
|
314
|
+
```python
|
|
315
|
+
class DeviceController:
|
|
316
|
+
def __init__(self, mqtt_client, device_id: str, location: str):
|
|
317
|
+
self.client = mqtt_client
|
|
318
|
+
self.device_id = device_id
|
|
319
|
+
self.location = location
|
|
320
|
+
self.command_topic = f"home/{location}/device/{device_id}/command"
|
|
321
|
+
self.state_topic = f"home/{location}/device/{device_id}/state"
|
|
322
|
+
|
|
323
|
+
def send_command(self, action: str, **kwargs):
|
|
324
|
+
"""Send command to device."""
|
|
325
|
+
payload = {"action": action, **kwargs}
|
|
326
|
+
self.client.publish(
|
|
327
|
+
self.command_topic,
|
|
328
|
+
payload,
|
|
329
|
+
qos=1,
|
|
330
|
+
retain=False
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
def update_state(self, state: dict):
|
|
334
|
+
"""Update device state."""
|
|
335
|
+
self.client.publish(
|
|
336
|
+
self.state_topic,
|
|
337
|
+
state,
|
|
338
|
+
qos=1,
|
|
339
|
+
retain=True # Retain state for new subscribers
|
|
340
|
+
)
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## Error Handling Patterns
|
|
344
|
+
|
|
345
|
+
### Pattern 1: Connection Error Handling
|
|
346
|
+
|
|
347
|
+
```python
|
|
348
|
+
def on_connect(client, userdata, flags, rc):
|
|
349
|
+
if rc == 0:
|
|
350
|
+
logger.info("Connected successfully")
|
|
351
|
+
elif rc == 1:
|
|
352
|
+
logger.error("Connection refused - incorrect protocol version")
|
|
353
|
+
elif rc == 2:
|
|
354
|
+
logger.error("Connection refused - invalid client identifier")
|
|
355
|
+
elif rc == 3:
|
|
356
|
+
logger.error("Connection refused - server unavailable")
|
|
357
|
+
elif rc == 4:
|
|
358
|
+
logger.error("Connection refused - bad username or password")
|
|
359
|
+
elif rc == 5:
|
|
360
|
+
logger.error("Connection refused - not authorized")
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Pattern 2: Publish Error Handling
|
|
364
|
+
|
|
365
|
+
```python
|
|
366
|
+
def on_publish(client, userdata, mid):
|
|
367
|
+
"""Callback when message published."""
|
|
368
|
+
logger.debug(f"Message {mid} published successfully")
|
|
369
|
+
|
|
370
|
+
def publish_with_error_handling(client, topic, payload, qos=1):
|
|
371
|
+
"""Publish with error handling."""
|
|
372
|
+
try:
|
|
373
|
+
result = client.publish(topic, payload, qos=qos)
|
|
374
|
+
if result.rc != mqtt.MQTT_ERR_SUCCESS:
|
|
375
|
+
logger.error(f"Publish failed: {result.rc}")
|
|
376
|
+
return False
|
|
377
|
+
return True
|
|
378
|
+
except Exception as e:
|
|
379
|
+
logger.error(f"Publish error: {e}")
|
|
380
|
+
return False
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## Testing Patterns
|
|
384
|
+
|
|
385
|
+
### Mock MQTT Broker
|
|
386
|
+
|
|
387
|
+
```python
|
|
388
|
+
from unittest.mock import Mock, MagicMock
|
|
389
|
+
|
|
390
|
+
class MockMQTTClient:
|
|
391
|
+
def __init__(self):
|
|
392
|
+
self.published_messages = []
|
|
393
|
+
self.subscribed_topics = []
|
|
394
|
+
self.connected = False
|
|
395
|
+
|
|
396
|
+
def connect(self, broker, port, keepalive):
|
|
397
|
+
self.connected = True
|
|
398
|
+
|
|
399
|
+
def publish(self, topic, payload, qos=0, retain=False):
|
|
400
|
+
self.published_messages.append({
|
|
401
|
+
"topic": topic,
|
|
402
|
+
"payload": payload,
|
|
403
|
+
"qos": qos,
|
|
404
|
+
"retain": retain
|
|
405
|
+
})
|
|
406
|
+
return Mock(rc=0)
|
|
407
|
+
|
|
408
|
+
def subscribe(self, topic, qos=0):
|
|
409
|
+
self.subscribed_topics.append({"topic": topic, "qos": qos})
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
## Best Practices
|
|
413
|
+
|
|
414
|
+
### 1. Use Appropriate QoS Levels
|
|
415
|
+
|
|
416
|
+
- **QoS 0:** High-frequency sensor data
|
|
417
|
+
- **QoS 1:** Commands and state updates
|
|
418
|
+
- **QoS 2:** Critical messages (use sparingly)
|
|
419
|
+
|
|
420
|
+
### 2. Implement Reconnection Logic
|
|
421
|
+
|
|
422
|
+
```python
|
|
423
|
+
client.reconnect_delay_set(min_delay=1, max_delay=60)
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### 3. Use Retain for State
|
|
427
|
+
|
|
428
|
+
```python
|
|
429
|
+
# Retain last known state
|
|
430
|
+
client.publish("device/state", state, qos=1, retain=True)
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### 4. Clean Session Management
|
|
434
|
+
|
|
435
|
+
```python
|
|
436
|
+
# Use clean_session=False for persistent sessions
|
|
437
|
+
client = mqtt.Client(clean_session=False)
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### 5. Topic Security
|
|
441
|
+
|
|
442
|
+
```python
|
|
443
|
+
# Use authentication
|
|
444
|
+
client.username_pw_set(username, password)
|
|
445
|
+
|
|
446
|
+
# Use TLS for secure connections
|
|
447
|
+
client.tls_set(ca_certs="ca.crt")
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
## References
|
|
451
|
+
|
|
452
|
+
- [paho-mqtt Documentation](https://www.eclipse.org/paho/index.php?page=clients/python/docs/index.php)
|
|
453
|
+
- [asyncio-mqtt](https://github.com/sbtinstruments/asyncio-mqtt)
|
|
454
|
+
- [MQTT Specification](https://mqtt.org/mqtt-specification/)
|
|
455
|
+
|