ha-mcp-dev 7.5.0.dev556__tar.gz → 7.5.0.dev558__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.
- {ha_mcp_dev-7.5.0.dev556/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev558}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/pyproject.toml +1 -1
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +2 -2
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +1 -1
- ha_mcp_dev-7.5.0.dev558/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +8 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/AGENTS.md +10 -4
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +10 -4
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +2 -1
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/README.md +10 -4
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +16 -7
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +48 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +245 -27
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +4 -3
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +20 -3
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +55 -33
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +12 -12
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +265 -13
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +72 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +16 -14
- ha_mcp_dev-7.5.0.dev558/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +21 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/server.py +3 -2
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_config_automations.py +18 -8
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_utility.py +20 -20
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_yaml_config.py +5 -3
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp_dev.egg-info/SOURCES.txt +2 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/README.md +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/setup.cfg +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/smart_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/tests/test_env_manager.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "7.5.0.
|
|
7
|
+
version = "7.5.0.dev558"
|
|
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"
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
"email": ""
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
|
-
"description": "Agent skills for Home Assistant: best practices for automations, helpers, templates,
|
|
8
|
+
"description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, device control, and dashboards",
|
|
9
9
|
"version": "0.1.0"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "home-assistant-skills",
|
|
14
|
-
"description": "Best practices for Home Assistant automations, helpers, scripts,
|
|
14
|
+
"description": "Best practices for Home Assistant automations, helpers, scripts, device controls, and dashboards",
|
|
15
15
|
"source": "./"
|
|
16
16
|
}
|
|
17
17
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "home-assistant-skills",
|
|
3
|
-
"description": "Agent skills for Home Assistant: best practices for automations, helpers, templates,
|
|
3
|
+
"description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, device control, and dashboards.",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"repository": "https://github.com/homeassistant-ai/skills",
|
|
6
6
|
"license": "MIT"
|
{ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
@@ -11,6 +11,9 @@ This is a community-contributed collection of **Agent Skills** for Home Assistan
|
|
|
11
11
|
- `skills/<skill-name>/SKILL.md` — each skill lives in its own folder with a `SKILL.md` file
|
|
12
12
|
- `CONTRIBUTING.md` — skill authoring guidelines and submission workflow
|
|
13
13
|
- `.claude-plugin/plugin.json` — Claude Code plugin metadata
|
|
14
|
+
- `.claude-plugin/marketplace.json` — marketplace metadata for plugin discovery
|
|
15
|
+
- `AGENTS.md` — symlink to `CLAUDE.md` (for agents that use `AGENTS.md` convention)
|
|
16
|
+
- `.github/ISSUE_TEMPLATE/skill-rca.md` — "Report Bad Skill Advice" issue template
|
|
14
17
|
|
|
15
18
|
## Skill Format
|
|
16
19
|
|
|
@@ -26,7 +29,7 @@ description: >
|
|
|
26
29
|
|
|
27
30
|
Constraints from CONTRIBUTING.md:
|
|
28
31
|
- Max **500 lines** per SKILL.md
|
|
29
|
-
- `metadata.version` must be `0` on new skills (
|
|
32
|
+
- `metadata.version` must be `0` on new skills (do not edit manually)
|
|
30
33
|
- Reference files must be **one level deep** only (e.g. `references/example.yaml`)
|
|
31
34
|
- Use **forward slashes** in all file paths
|
|
32
35
|
- Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
|
|
@@ -41,9 +44,12 @@ Constraints from CONTRIBUTING.md:
|
|
|
41
44
|
|
|
42
45
|
## Validation
|
|
43
46
|
|
|
44
|
-
CI runs
|
|
47
|
+
CI runs two workflows on PRs and pushes to `main`:
|
|
48
|
+
- **validate-skills** — runs `skills-ref validate` on every skill when `skills/**` changes
|
|
49
|
+
- **validate-plugin** — validates `.claude-plugin/` metadata
|
|
50
|
+
|
|
51
|
+
To validate locally:
|
|
45
52
|
|
|
46
53
|
```bash
|
|
47
|
-
|
|
48
|
-
python -m skills_ref.cli validate skills/<skill-name>
|
|
54
|
+
uvx skills-ref validate skills/<skill-name>
|
|
49
55
|
```
|
{ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
@@ -11,6 +11,9 @@ This is a community-contributed collection of **Agent Skills** for Home Assistan
|
|
|
11
11
|
- `skills/<skill-name>/SKILL.md` — each skill lives in its own folder with a `SKILL.md` file
|
|
12
12
|
- `CONTRIBUTING.md` — skill authoring guidelines and submission workflow
|
|
13
13
|
- `.claude-plugin/plugin.json` — Claude Code plugin metadata
|
|
14
|
+
- `.claude-plugin/marketplace.json` — marketplace metadata for plugin discovery
|
|
15
|
+
- `AGENTS.md` — symlink to `CLAUDE.md` (for agents that use `AGENTS.md` convention)
|
|
16
|
+
- `.github/ISSUE_TEMPLATE/skill-rca.md` — "Report Bad Skill Advice" issue template
|
|
14
17
|
|
|
15
18
|
## Skill Format
|
|
16
19
|
|
|
@@ -26,7 +29,7 @@ description: >
|
|
|
26
29
|
|
|
27
30
|
Constraints from CONTRIBUTING.md:
|
|
28
31
|
- Max **500 lines** per SKILL.md
|
|
29
|
-
- `metadata.version` must be `0` on new skills (
|
|
32
|
+
- `metadata.version` must be `0` on new skills (do not edit manually)
|
|
30
33
|
- Reference files must be **one level deep** only (e.g. `references/example.yaml`)
|
|
31
34
|
- Use **forward slashes** in all file paths
|
|
32
35
|
- Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
|
|
@@ -41,9 +44,12 @@ Constraints from CONTRIBUTING.md:
|
|
|
41
44
|
|
|
42
45
|
## Validation
|
|
43
46
|
|
|
44
|
-
CI runs
|
|
47
|
+
CI runs two workflows on PRs and pushes to `main`:
|
|
48
|
+
- **validate-skills** — runs `skills-ref validate` on every skill when `skills/**` changes
|
|
49
|
+
- **validate-plugin** — validates `.claude-plugin/` metadata
|
|
50
|
+
|
|
51
|
+
To validate locally:
|
|
45
52
|
|
|
46
53
|
```bash
|
|
47
|
-
|
|
48
|
-
python -m skills_ref.cli validate skills/<skill-name>
|
|
54
|
+
uvx skills-ref validate skills/<skill-name>
|
|
49
55
|
```
|
|
@@ -50,4 +50,5 @@ The template covers five sections: context, timeline, root cause, impact, and en
|
|
|
50
50
|
2. Create a folder under `skills/` with your skill name.
|
|
51
51
|
3. Write a `SKILL.md` following the format above.
|
|
52
52
|
4. Test your skill with real scenarios.
|
|
53
|
-
5.
|
|
53
|
+
5. If you added or removed reference files, update the **Skill Contents** table in `README.md`.
|
|
54
|
+
6. Submit a pull request describing what your skill teaches and what problems it solves.
|
{ha_mcp_dev-7.5.0.dev556 → ha_mcp_dev-7.5.0.dev558}/src/ha_mcp/resources/skills-vendor/README.md
RENAMED
|
@@ -9,7 +9,7 @@ This repository provides an Agent Skill for Home Assistant, following the open [
|
|
|
9
9
|
|
|
10
10
|
## Included Skill
|
|
11
11
|
|
|
12
|
-
**[home-assistant-best-practices](skills/home-assistant-best-practices/):** Native HA constructs over templates, helper selection, automation modes, Zigbee button patterns, device control best practices, and safe refactoring.
|
|
12
|
+
**[home-assistant-best-practices](skills/home-assistant-best-practices/):** Native HA constructs over templates, helper selection, automation modes, Zigbee button patterns, device control best practices, YAML-only integration management, dashboard configuration, and safe refactoring.
|
|
13
13
|
|
|
14
14
|
## Installation
|
|
15
15
|
|
|
@@ -34,13 +34,15 @@ Run each command separately inside Claude Code:
|
|
|
34
34
|
/plugin install home-assistant-skills@homeassistant-ai-skills
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
Run `/reload-plugins` or restart Claude Code for the skill to take effect.
|
|
38
38
|
|
|
39
39
|
### Claude Desktop / claude.ai
|
|
40
40
|
|
|
41
41
|
1. Download or clone this repository
|
|
42
42
|
2. Zip the skill folder: `cd skills && zip -r home-assistant-best-practices.zip home-assistant-best-practices/`
|
|
43
|
-
3.
|
|
43
|
+
3. Upload to:
|
|
44
|
+
- **Claude Desktop:** Customize (left sidebar) → Skills → + → Create skill
|
|
45
|
+
- **claude.ai:** [claude.ai/customize/skills](https://claude.ai/customize/skills) → Upload
|
|
44
46
|
|
|
45
47
|
## Skill Contents
|
|
46
48
|
|
|
@@ -52,8 +54,12 @@ The `home-assistant-best-practices` skill includes:
|
|
|
52
54
|
| `references/safe-refactoring.md` | Safe workflow for renaming entities, replacing helpers, restructuring automations |
|
|
53
55
|
| `references/automation-patterns.md` | Native conditions, triggers, waits, automation modes |
|
|
54
56
|
| `references/helper-selection.md` | Built-in helpers vs template sensors (with decision matrix) |
|
|
55
|
-
| `references/template-guidelines.md` | When templates
|
|
57
|
+
| `references/template-guidelines.md` | When to use templates, when to avoid them, and sensor best practices |
|
|
58
|
+
| `references/yaml-only-integrations.md` | YAML-only integration types, post-edit actions (reload vs restart) |
|
|
56
59
|
| `references/device-control.md` | Service calls, entity_id vs device_id, Zigbee buttons |
|
|
60
|
+
| `references/dashboard-guide.md` | Dashboard layout, view types, sections, custom cards, CSS styling |
|
|
61
|
+
| `references/dashboard-cards.md` | Card type lookup and card-specific documentation |
|
|
62
|
+
| `references/domain-docs.md` | Integration and domain documentation for service calls, entity attributes |
|
|
57
63
|
| `references/examples.yaml` | Compound examples combining multiple best practices |
|
|
58
64
|
|
|
59
65
|
## Contributing
|
|
@@ -18,10 +18,10 @@ description: >
|
|
|
18
18
|
- Agent modifies entity IDs without checking consumers
|
|
19
19
|
- Agent chooses wrong automation mode (e.g., single for motion lights)
|
|
20
20
|
- Agent hard-codes values or picks raw sensor over derived helper
|
|
21
|
-
- Agent
|
|
21
|
+
- Agent edits `.storage/` files, writes raw YAML, or generates YAML snippets
|
|
22
22
|
- Agent tells user to edit configuration.yaml for UI-configured integrations
|
|
23
23
|
metadata:
|
|
24
|
-
version:
|
|
24
|
+
version: 5
|
|
25
25
|
---
|
|
26
26
|
|
|
27
27
|
# Home Assistant Best Practices
|
|
@@ -93,13 +93,21 @@ See `references/device-control.md#zigbee-buttonremote-patterns`.
|
|
|
93
93
|
| `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
94
|
| `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` |
|
|
95
95
|
| `mode: single` for motion lights | `mode: restart` | Re-triggers must reset the timer | `references/automation-patterns.md#automation-modes` |
|
|
96
|
+
| `enabled: false` as a top-level key in `automations.yaml` | `automation.turn_off` (temporary) or entity registry disable (permanent) | Not a valid top-level key — rejected during schema validation; automation loads as `unavailable` | `references/automation-patterns.md#disabling-automations` |
|
|
96
97
|
| Template sensor for sum/mean | `min_max` helper | Declarative, handles unavailable states | `references/helper-selection.md#numeric-aggregation` |
|
|
97
98
|
| Template binary sensor with threshold | `threshold` helper | Built-in hysteresis support | `references/helper-selection.md#threshold` |
|
|
98
|
-
| Renaming entity IDs without impact analysis | Follow `references/safe-refactoring.md` workflow | Renames break dashboards, scripts, and
|
|
99
|
+
| Renaming entity IDs without impact analysis | Follow `references/safe-refactoring.md` workflow | Renames break dashboards, scripts, scenes, Config-Entry data, and storage dashboards silently | `references/safe-refactoring.md#entity-renames` |
|
|
100
|
+
| Renaming members of Config-Entry-based groups (UI groups) without updating membership | Update group membership via Options Flow after the registry rename | The entity registry rename does not update `options.entities` in the Config Entry — group silently breaks | `references/safe-refactoring.md#config-entry-groups` |
|
|
101
|
+
| Renaming entities used by Config-Entry integrations (Better/Generic Thermostat, Min/Max, Threshold) without patching Config-Entry data | Scan and patch `core.config_entries` `data`+`options` fields | These integrations store entity_ids in Config Entry — not updated by entity registry renames | `references/safe-refactoring.md#config-entry-data--blind-spots-for-entity-registry-renames` |
|
|
99
102
|
| `template:` sensor/binary sensor in YAML | Template Helper (UI or config flow API) | Requires file edit and config reload; harder to manage | `references/template-guidelines.md` |
|
|
100
|
-
|
|
|
103
|
+
| Editing `.storage/` files or other HA internal state directly | Use the HA REST/WebSocket API to manage state and config entries | `.storage/` files are HA's internal state database; direct edits bypass validation, risk corruption, and can be silently overwritten by HA | — |
|
|
104
|
+
| Writing raw YAML to `configuration.yaml` by hand for YAML-only integrations | Use managed YAML config editing with backup and validation | Unmanaged writes risk syntax errors, have no backup, and skip `check_config` — managed editing provides all three | `references/yaml-only-integrations.md` |
|
|
101
105
|
| Generating YAML snippets for automations/scripts/scenes | Use the HA config API to create automations/scripts programmatically | API calls validate config, avoid syntax errors, and don't require manual file edits or restarts | `references/automation-patterns.md`, `references/examples.yaml` |
|
|
102
106
|
| Telling user to edit `configuration.yaml` for integrations | Direct user to Settings > Devices & Services in the HA UI | Most integrations are UI-configured; YAML integration config is rare and integration-specific | — |
|
|
107
|
+
| Referring to HA "add-ons" | Use the term "Apps" | HA renamed add-ons to Apps in 2026.2 — "Apps are standalone applications that run alongside Home Assistant" | — |
|
|
108
|
+
| `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
|
+
| 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
|
+
| 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` |
|
|
103
111
|
|
|
104
112
|
---
|
|
105
113
|
|
|
@@ -109,10 +117,11 @@ Read these when you need detailed information:
|
|
|
109
117
|
|
|
110
118
|
| File | When to read | Key sections |
|
|
111
119
|
|------|--------------|--------------|
|
|
112
|
-
| `references/safe-refactoring.md` | Renaming entities, replacing helpers, restructuring automations, or any modification to existing config | `#universal-workflow`, `#entity-renames`, `#helper-replacements`, `#trigger-restructuring` |
|
|
113
|
-
| `references/automation-patterns.md` | Writing triggers, conditions, waits, or choosing automation modes | `#native-conditions`, `#trigger-types`, `#wait-actions`, `#automation-modes`, `#ifthen-vs-choose`, `#trigger-ids` |
|
|
114
|
-
| `references/helper-selection.md` | Deciding whether to use a built-in helper vs template sensor | `#numeric-aggregation`, `#rate-and-change`, `#time-based-tracking`, `#counting-and-timing`, `#scheduling`, `#entity-grouping`, `#decision-matrix` |
|
|
120
|
+
| `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` |
|
|
115
123
|
| `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
|
+
| `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` |
|
|
116
125
|
| `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` |
|
|
117
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` |
|
|
118
127
|
| `references/dashboard-cards.md` | Looking up available card types or fetching card-specific documentation | — |
|
|
@@ -48,6 +48,54 @@
|
|
|
48
48
|
"description": "Response does NOT recommend a template sensor (YAML or UI helper) as the primary solution"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": 4,
|
|
54
|
+
"eval_name": "arrive-home-automation",
|
|
55
|
+
"prompt": "create an automation that turns on the lights when I get home",
|
|
56
|
+
"expected_output": "Uses state trigger with to: home on a person entity. Does NOT use the removed entered_home device trigger type.",
|
|
57
|
+
"assertions": [
|
|
58
|
+
{
|
|
59
|
+
"id": "uses_state_trigger",
|
|
60
|
+
"description": "Response uses a state trigger (trigger: state) on a person or device_tracker entity, to: home"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "no_entered_home_trigger",
|
|
64
|
+
"description": "Response does NOT use the entered_home device trigger type (removed in 2026.5)"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": 5,
|
|
70
|
+
"eval_name": "timer-finished-automation",
|
|
71
|
+
"prompt": "make an automation that announces on my speaker when my kitchen timer finishes",
|
|
72
|
+
"expected_output": "Uses timer.finished event trigger. Does NOT use a polling template or state trigger workaround.",
|
|
73
|
+
"assertions": [
|
|
74
|
+
{
|
|
75
|
+
"id": "uses_timer_finished_event",
|
|
76
|
+
"description": "Response uses event trigger with event_type: timer.finished (or purpose-specific timer trigger)"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "no_polling_workaround",
|
|
80
|
+
"description": "Response does NOT suggest polling or a wait_template workaround for detecting timer completion"
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": 6,
|
|
86
|
+
"eval_name": "assist-shortcut-card",
|
|
87
|
+
"prompt": "add a card to my dashboard to quickly launch Assist",
|
|
88
|
+
"expected_output": "Recommends the shortcut card (new in 2026.5) for launching Assist from a dashboard.",
|
|
89
|
+
"assertions": [
|
|
90
|
+
{
|
|
91
|
+
"id": "recommends_shortcut_card",
|
|
92
|
+
"description": "Response recommends the shortcut card type for launching Assist"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "not_just_button_card",
|
|
96
|
+
"description": "Response does not exclusively recommend a button card with tap_action when shortcut is more appropriate"
|
|
97
|
+
}
|
|
98
|
+
]
|
|
51
99
|
}
|
|
52
100
|
]
|
|
53
101
|
}
|