bat-adhoc
Run bot acceptance tests to validate MCP tools work correctly from a real AI agent's perspective. Use when testing PRs, detecting…
Compare MCP tool behavior between target and baseline versions using pre-built and custom stories with diff-based triage.
Claude Code
$ npx -y skills add homeassistant-ai/ha-mcp --skill bat-story-eval --agent claude-code
Codex
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a codex -y
Cursor
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a cursor -y
Gemini CLI
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a gemini-cli -y
GitHub Copilot
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a github-copilot -y
OpenCode
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a opencode -y
Windsurf
$ npx skills add homeassistant-ai/ha-mcp --skill bat-story-eval -a windsurf -y
name: bat-story-eval description: Compare MCP tool behavior between target and baseline versions using pre-built and custom stories with diff-based triage. disable-model-invocation: true argument-hint: --baseline v6.6.1 [--agents gemini] [--stories s01,s02] allowed-tools: Bash, Read, Write, Glob, Grep, Task
You are the evaluator. Run the steps in order; each one uses the output of the step before it.
From `$ARGUMENTS`, extract:
If `$ARGUMENTS` is `--help` or missing `--baseline`, show usage and stop:
/bat-story-eval --baseline v6.6.1 /bat-story-eval --baseline v6.6.1 --agents gemini,claude /bat-story-eval --baseline v6.6.1 --stories s01,s02 /bat-story-eval --baseline v6.6.1 --all-stories --agents claude --model haiku
cd "$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")/worktree/uat-stories" git diff <baseline>..HEAD -- src/ha_mcp/ --stat git diff <baseline>..HEAD -- src/ha_mcp/ --name-only
Classify changed files:
Skip if `--stories` or `--all-stories` was passed.
1. Read the diff from 0a 2. Read all story YAMLs in `tests/uat/stories/catalog/s*.yaml` (title, description, prompt, setup) 3. For each story, reason about whether the diff could affect its outcome:
4. Rules:
5. Report which stories were selected and why (one sentence per story)
Read the diff carefully. Your job is to catch regressions. For each changed code path NOT covered by selected pre-built stories, ask: "could this break something a user would notice?" If yes, design a custom story to test that hypothesis.
**Guidelines**: Always create at least 1 custom story. Each must test a distinct regression hypothesis — don't create stories that overlap. Stop when you've covered the risky gaps.
Write each as `/tmp/custom_c<NN>.yaml` using the standard story format:
id: c01
title: "Short description of what is being tested"
category: custom
weight: 5
description: >
Rationale: [what changed in the diff and why this scenario tests it]
setup:
- tool: ha_config_set_helper
args:
helper_type: "input_boolean"
name: "Test Entity Name"
prompt: >
[Natural language request a real user would make that exercises the changed code]
teardown: []
verify:
questions:
- "Did the agent achieve the expected outcome?"
- "Did it use the expected tools?"
expected:
tools_should_use:
- ha_search
description: >
[What a correct agent should do]**Design principles:**
For EACH agent, run all stories against the **baseline** version. One container per agent, reused across all stories.
cd "$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")/worktree/uat-stories" uv run python tests/uat/stories/run_story.py \ tests/uat/stories/catalog/<first_story>.yaml \ --agents <agent> --keep-container \ --branch <baseline> \ --results-file local/uat-results.jsonl
**CAPTURE from stderr**: HA URL (e.g., `http://localhost:32771`), token, session file path.
After each story, verify via ha_query.py using the story's `verify.questions`:
uv run python tests/uat/stories/scripts/ha_query.py \ --ha-url http://localhost:PORT --ha-token TOKEN \ --agent <agent> \ "Does an automation with alias 'Sunset Porch Light' exist?"
Record each answer as **confirmed** / **denied** / **unclear**. A non-zero exit from `ha_query.py` means the query itself failed (the output carries an `[exit N]` marker; `[exit 124]` is a timeout) — that is not one of the three outcomes; re-run it, and if it keeps failing record the story as `unverified` (Step 5) rather than scoring it. See `references/evaluation-protocol.md`.
Run remaining pre-built stories on the same container:
uv run python tests/uat/stories/run_story.py \ tests/uat/stories/catalog/<next_story>.yaml \ --agents <agent> --ha-url http://localhost:PORT --ha-token TOKEN \ --branch <baseline> \ --results-file local/uat-results.jsonl
Verify each immediately after running.
uv run python tests/uat/stories/run_story.py \ /tmp/custom_c01.yaml \ --agents <agent> --ha-url http://localhost:PORT --ha-token TOKEN \ --branch <baseline> \ --results-file local/uat-results.jsonl
Verify each via ha_query.py using the custom story's `verify.questio
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with Home Assistant. Using natural language, control smart home devices, query states, execute services and manage your automations.
Run bot acceptance tests to validate MCP tools work correctly from a real AI agent's perspective. Use when testing PRs, detecting…
Review a contribution PR for safety, quality, and readiness. Checks for security concerns, test coverage, size appropriateness,…
Find merged PR authors missing from README and update the contributors list after approval
Deep analysis of a single GitHub issue with codebase exploration, implementation planning, and architectural assessment. Use when…
Implement a GitHub issue end-to-end — create a worktree branch, implement the feature with tests, create a draft PR, then…
Manage your own GitHub pull requests — check CI status, inline review comments, PR-level comments, resolve review threads, fix…
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…