ha-mcp-dev 7.9.0.dev752__tar.gz → 7.9.0.dev754__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. {ha_mcp_dev-7.9.0.dev752/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.9.0.dev754}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/config.py +13 -0
  4. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +1 -1
  5. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/AGENTS.md +2 -0
  6. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +2 -0
  7. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/README.md +3 -1
  8. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +24 -17
  9. ha_mcp_dev-7.9.0.dev754/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +537 -0
  10. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +358 -9
  11. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +182 -15
  12. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +120 -7
  13. ha_mcp_dev-7.9.0.dev754/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +92 -0
  14. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +7 -6
  15. ha_mcp_dev-7.9.0.dev754/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +28 -0
  16. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/server.py +3 -1
  17. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/settings_ui/settings.js +14 -7
  18. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/auto_backup.py +12 -0
  19. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_filesystem.py +7 -1
  20. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_yaml_config.py +77 -1
  21. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  22. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp_dev.egg-info/SOURCES.txt +2 -0
  23. ha_mcp_dev-7.9.0.dev752/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -21
  24. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/LICENSE +0 -0
  25. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/MANIFEST.in +0 -0
  26. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/README.md +0 -0
  27. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/setup.cfg +0 -0
  28. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/__init__.py +0 -0
  29. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/__main__.py +0 -0
  30. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/_pypi_marker +0 -0
  31. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/_version.py +0 -0
  32. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/auth/__init__.py +0 -0
  33. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/auth/consent_form.py +0 -0
  34. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/auth/provider.py +0 -0
  35. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/backup_manager.py +0 -0
  36. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/client/__init__.py +0 -0
  37. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/client/rest_client.py +0 -0
  38. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/client/supervisor_client.py +0 -0
  39. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/client/websocket_client.py +0 -0
  40. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/client/websocket_listener.py +0 -0
  41. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  42. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  43. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  44. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/errors.py +0 -0
  45. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/__init__.py +0 -0
  46. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/approval_queue.py +0 -0
  47. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/evaluator.py +0 -0
  48. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/handlers.py +0 -0
  49. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/middleware.py +0 -0
  50. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/model.py +0 -0
  51. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/persistence.py +0 -0
  52. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/policy/value_sources.py +0 -0
  53. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/py.typed +0 -0
  54. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/read_only.py +0 -0
  55. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  56. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  57. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  58. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  59. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  60. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  61. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  62. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  63. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  64. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  65. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  66. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  67. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/settings_ui/__init__.py +0 -0
  68. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/settings_ui/settings.css +0 -0
  69. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/settings_ui/settings.html +0 -0
  70. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/smoke_test.py +0 -0
  71. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  72. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/__init__.py +0 -0
  73. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/backup.py +0 -0
  74. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  75. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  76. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/device_control.py +0 -0
  77. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/enhanced.py +0 -0
  78. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/helpers.py +0 -0
  79. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/radio/__init__.py +0 -0
  80. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/radio/base.py +0 -0
  81. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/radio/matter.py +0 -0
  82. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/radio/thread.py +0 -0
  83. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  84. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/radio/zwave.py +0 -0
  85. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/reference_validator.py +0 -0
  86. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/registry.py +0 -0
  87. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  88. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  89. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  90. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  91. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  92. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  93. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  94. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  95. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  96. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  97. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_addons.py +0 -0
  98. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_areas.py +0 -0
  99. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  100. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  101. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_calendar.py +0 -0
  102. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_camera.py +0 -0
  103. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_categories.py +0 -0
  104. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_code.py +0 -0
  105. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  106. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  107. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  108. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  109. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  110. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  111. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_energy.py +0 -0
  112. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_entities.py +0 -0
  113. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_groups.py +0 -0
  114. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_hacs.py +0 -0
  115. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_history.py +0 -0
  116. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_integrations.py +0 -0
  117. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_labels.py +0 -0
  118. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  119. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_radio.py +0 -0
  120. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_registry.py +0 -0
  121. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_resources.py +0 -0
  122. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_search.py +0 -0
  123. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_service.py +0 -0
  124. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_services.py +0 -0
  125. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_system.py +0 -0
  126. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_themes.py +0 -0
  127. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_todo.py +0 -0
  128. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_traces.py +0 -0
  129. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_updates.py +0 -0
  130. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_utility.py +0 -0
  131. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  132. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/tools_zones.py +0 -0
  133. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/util_helpers.py +0 -0
  134. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/tools/validation_middleware.py +0 -0
  135. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/transforms/__init__.py +0 -0
  136. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/transforms/categorized_search.py +0 -0
  137. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  138. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/update_check.py +0 -0
  139. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/__init__.py +0 -0
  140. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/config_hash.py +0 -0
  141. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/data_paths.py +0 -0
  142. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/domain_handlers.py +0 -0
  143. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  144. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  145. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/operation_manager.py +0 -0
  146. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/python_sandbox.py +0 -0
  147. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/skill_loader.py +0 -0
  148. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp/utils/usage_logger.py +0 -0
  149. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  150. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  151. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  152. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  153. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/tests/__init__.py +0 -0
  154. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/tests/test_constants.py +0 -0
  155. {ha_mcp_dev-7.9.0.dev752 → ha_mcp_dev-7.9.0.dev754}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.9.0.dev752
3
+ Version: 7.9.0.dev754
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.9.0.dev752"
7
+ version = "7.9.0.dev754"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -155,6 +155,17 @@ class Settings(BaseSettings):
155
155
  # files. Disabled by default; only for YAML-only features with no UI/API path.
156
156
  enable_yaml_config_editing: bool = Field(False, alias="ENABLE_YAML_CONFIG_EDITING")
157
157
 
158
+ # Two-step confirmation for ha_config_set_yaml (#1720). When on (the
159
+ # default), the first edit call returns a unified diff preview plus a
160
+ # confirm token and writes NOTHING; the edit lands only when repeated
161
+ # with that token. Sub-toggle of enable_yaml_config_editing (nested
162
+ # beneath it in the UI). Default ON deliberately: the diff preview is
163
+ # what lets the calling agent catch collateral changes before they
164
+ # reach disk. Listed in BETA_FEATURE_FIELDS purely for the addon-mode
165
+ # override path; the master-off cascade forcing it False is moot
166
+ # because the yaml tool itself is unregistered then.
167
+ enable_yaml_edit_confirm: bool = Field(True, alias="ENABLE_YAML_EDIT_CONFIRM")
168
+
158
169
  # Per-key gates for ``automation`` / ``script`` / ``scene`` under
159
170
  # ``packages/*.yaml``. The custom component accepts these three
160
171
  # PACKAGES_ONLY_YAML_KEYS unconditionally; ha-mcp's UI exposes a
@@ -604,6 +615,7 @@ FEATURE_FLAG_FIELDS: tuple[FeatureFlagField, ...] = (
604
615
  # are name-disjoint per _validate_registries()).
605
616
  FeatureFlagField("enable_mandatory_bps", "ENABLE_MANDATORY_BPS", bool),
606
617
  FeatureFlagField("enable_yaml_config_editing", "ENABLE_YAML_CONFIG_EDITING", bool),
618
+ FeatureFlagField("enable_yaml_edit_confirm", "ENABLE_YAML_EDIT_CONFIRM", bool),
607
619
  # Per-key sub-gates beneath enable_yaml_config_editing. Nested in
608
620
  # the UI, dimmed when the parent is off. Also listed in
609
621
  # BETA_FEATURE_FIELDS so they follow the same master-gate +
@@ -660,6 +672,7 @@ _FEATURE_FLAG_INT_BOUNDS: dict[str, tuple[int, int]] = {
660
672
  # gate, never by the per-field iteration.
661
673
  BETA_FEATURE_FIELDS: tuple[str, ...] = (
662
674
  "enable_yaml_config_editing",
675
+ "enable_yaml_edit_confirm", # Default-ON safety sub-toggle; see field comment.
663
676
  # Per-key sub-gates of enable_yaml_config_editing. Included here so
664
677
  # they ride the same master gate + addon-mode override path as the
665
678
  # other beta flags. Without this, the addon-mode short-circuit in
@@ -2,7 +2,7 @@
2
2
  "name": "home-assistant-skills",
3
3
  "owner": {
4
4
  "name": "homeassistant-ai",
5
- "email": ""
5
+ "email": "homeassistant-mcp@qc-h.net"
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, device control, and dashboards",
@@ -30,6 +30,8 @@ description: >
30
30
  Constraints from CONTRIBUTING.md:
31
31
  - Max **500 lines** per SKILL.md
32
32
  - `metadata.version` must be `0` on new skills (do not edit manually)
33
+ - `name` must match `[a-z0-9-]+` and be ≤64 characters
34
+ - `description` frontmatter must be **≤1024 characters** (CI enforces this via `skills-ref validate`)
33
35
  - Reference files must be **one level deep** only (e.g. `references/example.yaml`)
34
36
  - Use **forward slashes** in all file paths
35
37
  - Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
@@ -30,6 +30,8 @@ description: >
30
30
  Constraints from CONTRIBUTING.md:
31
31
  - Max **500 lines** per SKILL.md
32
32
  - `metadata.version` must be `0` on new skills (do not edit manually)
33
+ - `name` must match `[a-z0-9-]+` and be ≤64 characters
34
+ - `description` frontmatter must be **≤1024 characters** (CI enforces this via `skills-ref validate`)
33
35
  - Reference files must be **one level deep** only (e.g. `references/example.yaml`)
34
36
  - Use **forward slashes** in all file paths
35
37
  - Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
@@ -31,7 +31,7 @@ Run each command separately inside Claude Code:
31
31
  /plugin marketplace add homeassistant-ai/skills
32
32
  ```
33
33
  ```
34
- /plugin install home-assistant-skills@homeassistant-ai-skills
34
+ /plugin install home-assistant-skills@home-assistant-skills
35
35
  ```
36
36
 
37
37
  Run `/reload-plugins` or restart Claude Code for the skill to take effect.
@@ -57,10 +57,12 @@ The `home-assistant-best-practices` skill includes:
57
57
  | `references/template-guidelines.md` | When to use templates, when to avoid them, and sensor best practices |
58
58
  | `references/yaml-only-integrations.md` | YAML-only integration types, post-edit actions (reload vs restart) |
59
59
  | `references/device-control.md` | Service calls, entity_id vs device_id, Zigbee buttons |
60
+ | `references/scenes.md` | Scene authoring: config shape, snapshot/restore, snapshot-vs-script distinction |
60
61
  | `references/dashboard-guide.md` | Dashboard layout, view types, sections, custom cards, CSS styling |
61
62
  | `references/dashboard-cards.md` | Card type lookup and card-specific documentation |
62
63
  | `references/domain-docs.md` | Integration and domain documentation for service calls, entity attributes |
63
64
  | `references/examples.yaml` | Compound examples combining multiple best practices |
65
+ | `references/appdaemon.md` | AppDaemon apps: when to use vs. native HA, app structure, service calls, scheduling, error handling, safe refactoring impact |
64
66
 
65
67
  ## Contributing
66
68
 
@@ -1,27 +1,28 @@
1
1
  ---
2
2
  name: home-assistant-best-practices
3
3
  description: >
4
- Best practices for HA automations, helpers, scripts, device controls, and dashboards.
4
+ Best practices for HA automations, helpers, scripts, controls, and dashboards.
5
5
 
6
6
  TRIGGER THIS SKILL WHEN:
7
- - Creating/editing automations, scripts, scenes, or dashboards
7
+ - Creating or editing automations, scripts, scenes, or dashboards
8
8
  - Choosing between template sensors and built-in helpers
9
- - Writing or restructuring triggers, conditions, or automation modes
10
- - Setting up Zigbee button/remote automations (ZHA or Zigbee2MQTT)
9
+ - Restructuring triggers, conditions, or automation modes
10
+ - Setting up Zigbee button/remote automations
11
11
  - Renaming entities or migrating device_id to entity_id
12
- - Configuring dashboard cards or picking helpers to feed them
13
- - Looking up card types or domain-specific documentation
12
+ - Configuring dashboard cards or selecting helpers
13
+ - Looking up card types or domain docs
14
+ - Writing or reviewing AppDaemon apps
14
15
 
15
16
  SYMPTOMS:
16
- - Agent uses Jinja2 templates where native conditions/triggers/helpers exist
17
+ - Agent uses Jinja2 templates where native options exist
17
18
  - Agent uses device_id instead of entity_id
18
- - Agent modifies entity IDs without checking consumers
19
- - Agent chooses wrong automation mode (e.g., single for motion lights)
20
- - Agent hard-codes values or picks raw sensor over derived helper
21
- - Agent edits `.storage/` files, writes raw YAML, or generates YAML snippets
22
- - Agent tells user to edit configuration.yaml for UI-configured integrations
19
+ - Agent changes entity IDs without checking consumers
20
+ - Wrong automation mode
21
+ - Agent hard-codes values or uses raw sensor over helper
22
+ - Agent edits .storage, writes YAML, or generates YAML snippets
23
+ - Agent tells user to edit configuration.yaml for UI integrations
23
24
  metadata:
24
- version: 5
25
+ version: 12
25
26
  ---
26
27
 
27
28
  # Home Assistant Best Practices
@@ -88,7 +89,7 @@ See `references/device-control.md#zigbee-buttonremote-patterns`.
88
89
  ## Critical Anti-Patterns
89
90
 
90
91
  | Anti-pattern | Use instead | Why | Reference |
91
- |---|---|---|---|
92
+ |--------------|-------------|-----|-----------|
92
93
  | `condition: template` with `float > 25` | `condition: numeric_state` | Validated at load, not runtime | `references/automation-patterns.md#native-conditions` |
93
94
  | `wait_template: "{{ is_state(...) }}"` | `wait_for_trigger` with state trigger | Event-driven, not polling; waits for *change* (see `references/safe-refactoring.md#trigger-restructuring` for semantic differences) | `references/automation-patterns.md#wait-actions` |
94
95
  | `device_id` in triggers | `entity_id` (or `device_ieee` for ZHA) | device_id breaks on re-add | `references/device-control.md#entity-id-vs-device-id` |
@@ -108,6 +109,10 @@ See `references/device-control.md#zigbee-buttonremote-patterns`.
108
109
  | `vacuum.send_command` with vendor room IDs | `vacuum.clean_area` with HA `area_id` (if segments are mapped) | Uses native HA areas, works across integrations — but requires segment-to-area mapping in entity settings first | `references/device-control.md#vacuum-control` |
109
110
  | Using `color_temp` (mireds) in light service calls | Use `color_temp_kelvin` | The `color_temp` parameter was removed in 2026.3; only Kelvin is supported | `references/device-control.md#lights` |
110
111
  | Person/Device Tracker `entered_home`/`left_home` device triggers or `is_home`/`is_not_home` conditions | `state` trigger `to: home` / `to: not_home`, or `state` condition | These were removed in 2026.5 — state triggers and conditions are the correct replacements | `references/automation-patterns.md#presence-and-person-triggers-and-conditions-removed-in-20265` |
112
+ | Registering callbacks or calling `self.turn_on()`/`self.get_state()` in `__init__()` | Register everything in `initialize()` | Plugin connection not established during `__init__` — calls fail silently | `references/appdaemon.md#app-structure-and-lifecycle` |
113
+ | Calling `run_in` on repeated triggers without cancelling the previous handle | `cancel_timer(self._off_handle)` before each new `run_in` | Every trigger stacks an independent timer — devices toggle unpredictably | `references/appdaemon.md#scheduling-and-timers` |
114
+ | Storing persistent state in instance variables | Use HA `input_number`, `input_boolean`, or `input_text` helpers | Instance variables reset on app reload or daemon restart | `references/appdaemon.md#state-management-and-inter-app-communication` |
115
+ | Hardcoding entity IDs inside the class body | Pass entity IDs via `self.args` in `apps.yaml` | Hardcoded IDs prevent reuse and require code edits per installation | `references/appdaemon.md#appsyaml-configuration` |
111
116
 
112
117
  ---
113
118
 
@@ -118,12 +123,14 @@ Read these when you need detailed information:
118
123
  | File | When to read | Key sections |
119
124
  |------|--------------|--------------|
120
125
  | `references/safe-refactoring.md` | Renaming entities, replacing helpers, restructuring automations, or any modification to existing config | `#universal-workflow`, `#entity-renames`, `#helper-replacements`, `#trigger-restructuring`, `#config-entry-data--blind-spots-for-entity-registry-renames`, `#storage-mode-dashboards-storagelovelace` |
121
- | `references/automation-patterns.md` | Writing triggers, conditions, waits, or choosing automation modes; disabling automations | `#native-conditions`, `#trigger-types`, `#wait-actions`, `#automation-modes`, `#continue-on-error`, `#repeat-actions`, `#ifthen-vs-choose`, `#trigger-ids`, `#disabling-automations` |
122
- | `references/helper-selection.md` | Deciding whether to use a built-in helper vs template sensor | `#menu-based-helpers`, `#numeric-aggregation`, `#rate-and-change`, `#time-based-tracking`, `#counting-and-timing`, `#scheduling`, `#entity-grouping`, `#data-smoothing`, `#random-values`, `#climate-control`, `#domain-conversion`, `#template-helpers`, `#decision-matrix` |
126
+ | `references/automation-patterns.md` | Writing triggers, conditions, waits, variables, or choosing automation modes; capturing action responses; documenting/annotating steps; disabling automations | `#native-conditions`, `#trigger-types`, `#wait-actions`, `#automation-modes`, `#continue-on-error`, `#stopping-a-sequence`, `#variables`, `#capturing-action-responses`, `#repeat-actions`, `#ifthen-vs-choose`, `#parallel-actions`, `#trigger-ids`, `#documenting-automations--scripts`, `#disabling-automations` |
127
+ | `references/helper-selection.md` | Deciding whether to use a built-in helper vs template sensor | `#how-helpers-are-created`, `#menu-based-helpers`, `#numeric-aggregation`, `#rate-and-change`, `#time-based-tracking`, `#counting-and-timing`, `#scheduling`, `#entity-grouping`, `#probabilistic-inference`, `#data-smoothing`, `#random-values`, `#climate-control`, `#domain-conversion`, `#template-helpers`, `#decision-matrix` |
123
128
  | `references/template-guidelines.md` | Confirming templates ARE appropriate for a use case | `#when-templates-are-appropriate`, `#when-to-avoid-templates`, `#template-sensor-best-practices`, `#common-patterns`, `#error-handling` |
124
129
  | `references/yaml-only-integrations.md` | Creating or editing YAML-only integrations that have no config flow (e.g. `command_line`, platform-based `mqtt`, `rest`) | `#yaml-only-integration-types`, `#post-edit-actions` |
125
130
  | `references/device-control.md` | Writing service calls, Zigbee button automations, or using target: | `#entity-id-vs-device-id`, `#service-calls-best-practices`, `#zigbee-buttonremote-patterns`, `#domain-specific-patterns` |
126
- | `references/dashboard-guide.md` | Designing or modifying Lovelace dashboards layout, view types, sections, custom cards, CSS styling, HACS | `#dashboard-structure`, `#view-types`, `#built-in-cards`, `#features`, `#custom-cards`, `#css-styling`, `#common-pitfalls` |
131
+ | `references/scenes.md` | Authoring or activating scenes; snapshot/restore patterns; snapshot-vs-script distinction | `#scene-config-shape`, `#activating-a-scene`, `#snapshot--restore-scenecreate`, `#apply-states-without-storing-sceneapply` |
132
+ | `references/dashboard-guide.md` | Designing or modifying Lovelace dashboards — layout, view types, strategies, sections, cards, badges, CSS styling, HACS | `#dashboard-structure`, `#view-types`, `#dashboard-strategies`, `#built-in-cards`, `#features`, `#badges`, `#custom-cards`, `#css-styling`, `#common-pitfalls` |
127
133
  | `references/dashboard-cards.md` | Looking up available card types or fetching card-specific documentation | — |
128
134
  | `references/domain-docs.md` | Looking up integration or domain documentation for service calls, entity attributes, or configuration | — |
129
135
  | `references/examples.yaml` | Need compound examples combining multiple best practices | — |
136
+ | `references/appdaemon.md` | AppDaemon apps: when to use vs. native HA, app structure, service calls, scheduling, error handling, safe refactoring impact | — |