plugins/home-assistant-dev/skills/ha-hacs/SKILL.md
HACS metadata requirements for a Home Assistant integration — hacs.json, manifest.json fields, and repository structure. Use when preparing or validating HACS metadata files.
npx skillsauth add l3digitalnet/claude-code-plugins ha-hacsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
HACS (Home Assistant Community Store) is the standard distribution method for custom integrations.
my-integration/
├── custom_components/
│ └── {domain}/
│ ├── __init__.py
│ ├── manifest.json # HA manifest (required)
│ ├── config_flow.py
│ └── ...
├── hacs.json # HACS metadata (required)
├── README.md # Documentation (required)
├── LICENSE # License file (recommended)
└── .github/
└── workflows/
└── validate.yml # HACS validation workflow
HACS requires these fields in manifest.json:
{
"domain": "my_integration",
"name": "My Integration",
"version": "1.0.0",
"codeowners": ["@your-github-username"],
"documentation": "https://github.com/user/repo",
"issue_tracker": "https://github.com/user/repo/issues",
"config_flow": true,
"integration_type": "hub",
"iot_class": "local_polling",
"requirements": ["my-library==1.0.0"]
}
Required for HACS:
domain — Must match folder namename — Display nameversion — Valid semver (X.Y.Z)codeowners — At least one GitHub usernamedocumentation — URL to docsissue_tracker — URL for bug reportsCreate hacs.json in repository root:
{
"name": "My Integration",
"homeassistant": "2024.1.0"
}
| Key | Type | Required | Description |
|-----|------|----------|-------------|
| name | string | Yes | Display name in HACS |
| homeassistant | string | No | Minimum HA version (e.g., "2024.1.0") |
| hacs | string | No | Minimum HACS version |
| content_in_root | bool | No | Set true if files not in custom_components/ |
| zip_release | bool | No | Set true if using zipped releases |
| filename | string | No | Main file name (for zip_release) |
| country | string/array | No | ISO country codes (e.g., "US" or ["US", "CA"]) |
| hide_default_branch | bool | No | Hide default branch from version list |
| persistent_directory | string | No | Directory to preserve during updates |
Before submitting to HACS default repository:
manifest.json has all required fields including issue_trackerhacs.json exists with at least name fieldREADME.md exists with installation instructions"Invalid manifest" — Check JSON syntax; ensure all required fields present; version must be valid semver.
"Missing hacs.json" — File must be in repository root (not in custom_components).
"No release found" — Publish a GitHub Release (not just a tag); release tag should match manifest version.
ha-hacs-publishingha-integration-scaffolddevelopment
Use when you're stuck or missing current information mid-task - the same command/API/approach failed twice, an error looks like a changed or deprecated API, or you need the current version of something, a fact from after your training cutoff, or to verify something you cannot confirm from the code in context. Starts with a cheap inline lookup and only escalates to a full research sweep if that fails. Do not use for routine pre-emptive checks before ordinary library work - for deliberate research, use /qdev:research.
documentation
Update Outline wiki documentation with implementation-level details from the current session by dispatching the up-docs-propagate-wiki sub-agent. This skill should be used when the user runs /up-docs:wiki.
documentation
Update repository documentation (README.md, docs/, CLAUDE.md) based on session changes by dispatching the up-docs-propagate-repo sub-agent. This skill should be used when the user runs /up-docs:repo.
documentation
Update Notion pages with strategic and organizational context from the current session by dispatching the up-docs-propagate-notion sub-agent. This skill should be used when the user runs /up-docs:notion.