Agent skill

Spot Testing

by passsy in passsy/spot

Write and debug Flutter widget tests using package:spot selectors, assertions, interactions, screenshots, and timeline reports.

Apache-2.0Auto-check passedMobile

Install Spot Testing

skills CLI
$ npx skills add passsy/spot --skill spot-testing -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install passsy/spot spot-testing --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/passsy/spot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/spot-testing .claude/skills/spot-testing && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
spot-testing
GitHub stars
112
Token cost
~1.1k tokens
SKILL.md length
432 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
Apache-2.0

At a glance

Write and debug Flutter widget tests using package:spot selectors, assertions, interactions, screenshots, and timeline reports.

  • A project uses Spot
  • SKILL.md covers Select and assert, Interact and advance frames, Complete example and Screenshots and timeline reports
  • Calls flutter
  • The user asks to adopt it for widget tests

What it does

Spot Testing is an agent skill from passsy/spot. Write and debug Flutter widget tests using package:spot selectors, assertions, interactions, screenshots, and timeline reports. Use when a project uses Spot or the user asks to adopt it for widget tests.

Its SKILL.md is about 1.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Cross-platform mobile apps. It works with Flutter. The repository describes itself as: Flutter widget test toolkit - spot, act, validate. Better selectors, automatic screenshots, chainable. The licence is Apache-2.0.

When your agent uses it

  • A project uses Spot
  • The user asks to adopt it for widget tests

Example prompts

  • “/spot-testing”

What it can do on your machine

Read from SKILL.md and the folder at commit ca954e9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • flutter

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Spot Testing loads about 1.1k tokens when it runs. Until then it costs about 54 tokens; SKILL.md has 432 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~54
When it runs · the whole SKILL.md, loaded when a task matches
~1.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from passsy/spot at commit ca954e9, republished under its Apache-2.0 licence (© passsy). 432 words, ~1,147 tokens.

Download SKILL.mdSave it as .claude/skills/spot-testing/SKILL.md (or your agent's skills folder).
name
spot-testing
description
Write and debug Flutter widget tests using package:spot selectors, assertions, interactions, screenshots, and timeline reports. Use when a project uses Spot or the user asks to adopt it for widget tests.

Widget testing with Spot

Use package:spot/spot.dart alongside package:flutter_test/flutter_test.dart in ordinary testWidgets tests. Spot is a development dependency; it does not require a custom test runner. Keep the project's existing test setup and migrate only the tests relevant to the request.

Select and assert

  • Use spot<W>() for an exact widget type, spotText('Save') for text, spotIcon(Icons.add) for an icon, and spotKey(key) for a key.
  • Narrow duplicate matches by their meaningful parent or child: spot<AppBar>().spot<IconButton>() or spot<ElevatedButton>(children: [spotText('Save')]). Do not hide unintended duplicates with .first().
  • A selector describes a query; constructing it alone does not assert anything. Finish with existsOnce(), doesNotExist(), or existsExactlyNTimes(n) according to the expected count.
  • Once the intended widget is identified, assert its properties with has... matchers instead of adding more with... filters. For example, spot<Tooltip>().existsOnce().hasMessage('Save') reports the actual message when it differs.
  • Selectors can be reused across frames; a snapshot() is a result from one point in time. Query again after a state change instead of reusing a snapshot as current state.
  • Selectors search onstage widgets by default. Use spotOffstage() or spotAllWidgets() only when the test intentionally checks offstage or combined content.
  • For custom text matching, use the checks callback: spotTextWhere((text) => text.startsWith('Saved')). This callback receives a Subject<String>, not a string predicate returning a boolean.

Interact and advance frames

Await act.tap(selector) and act.enterText(selector, text). These interactions pump frames, but do not wait for every animation or asynchronous operation to finish. Use the existing test's controlled pumps to reach the state being asserted; use pumpAndSettle() only when the UI is expected to settle.

act.tap checks that the target can receive the tap. When it fails, inspect the selector, layout, overlays, and current frame before changing the interaction. act.inspectTap(selector) provides diagnostics without sending pointer events or pumping a frame. Read the inspection before another pump, or inspect again afterward.

Show full SKILL.md (135 more words)Show less

Complete example

dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:spot/spot.dart';

void main() {
  testWidgets('save updates the status', (tester) async {
    var saved = false;
    await tester.pumpWidget(
      MaterialApp(
        home: StatefulBuilder(
          builder: (context, setState) => Scaffold(
            body: Column(
              children: [
                Text(saved ? 'Saved' : 'Unsaved'),
                ElevatedButton(
                  onPressed: () {
                    setState(() {
                      saved = true;
                    });
                  },
                  child: const Text('Save'),
                ),
              ],
            ),
          ),
        ),
      ),
    );

    spotText('Unsaved').existsOnce();
    final save = spot<ElevatedButton>(children: [spotText('Save')]);
    await act.tap(save);
    spotText('Saved').existsOnce();
    spotText('Unsaved').doesNotExist();
  });
}

Screenshots and timeline reports

Spot records assertions and interactions for its timeline and generates an HTML report on test failure by default. Use the report path printed by the test run when debugging. To generate a report for a passing test, set timeline.mode = TimelineMode.always inside that test, or run:

bash
flutter test --dart-define=SPOT_TIMELINE_MODE=always test/example_test.dart

Await loadAppFonts() inside the widget test before pumping the UI when readable screenshot text matters. Capture the state of interest before later pumps or teardown with await takeScreenshot() or await takeScreenshot(selector: spot<Scaffold>()). A report is built from recorded events, not a screenshot of every pumped frame; add assertions at meaningful intermediate states. The timeline is for widget tests and is not supported with integration_test.

For APIs beyond these patterns, consult the installed version's public API or its package documentation instead of guessing matcher names.

© passsy, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/spot-testing of passsy/spot.

Open the folder on GitHubat commit ca954e9

Compare with similar skills

Spot Testing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Spot Testing compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Spot Testing this skillpasssy/spot112—~1.1kAutomated safety check: PassApache-2.0
Add Flutter Docusaurus Localematthiasn/lotti1.2k—~1.2kAutomated safety check: PassGPL-3.0
Tm Launcher DesignFar-Se/tabame372—~3.1kAutomated safety check: PassMIT
Flutter Initbear2u/my-skills933—~2.5kAutomated safety check: PassNone
Mobile App UI Designceorkm/mobile-app-ui-design403—~2kAutomated safety check: PassNone
Marionette Flutter Drive Appleancodepl/marionette_mcp482—~11kAutomated safety check: PassApache-2.0

Similar skills

  • Add, complete, or audit a locale across a Flutter application's ARB catalogs and a localized Docusaurus manual, including generated localization code, locale selectors, native platform declarations…

    1.2k GitHub stars~1.2k tokensUpdated today
    MobileAuto-check passed
  • Tm Launcher Design

    Far-Se/tabame

    Create or revise Tabame's Flutter launcher designs: frames, search bars, result rows, palettes, typography, and action dialogs.

    372 GitHub stars~3.1k tokensUpdated 2 days ago
    MobileAuto-check passed
  • Flutter Init

    bear2u/my-skills

    A skill your agent uses when user wants to create a new Flutter project (Todo/Habit/Note/Expense/Custom domain) with Clean Architecture, Riverpod 3.0, Drift, and modern Flutter stack

    933 GitHub stars~2.5k tokensUpdated 3 mo ago
    MobileAuto-check passed
  • Mobile App UI Design

    ceorkm/mobile-app-ui-design

    Design high-quality mobile app UI/UX screens, flows, and components.

    403 GitHub stars~2k tokensUpdated 3 mo ago
    MobileAuto-check passed
  • Marionette Flutter Drive App

    leancodepl/marionette_mcp

    Set up and drive a running Flutter app (debug or profile) with Marionette — an AI agent's hands and eyes for the app.

    482 GitHub stars~11k tokensUpdated 3 days ago
    MobileAuto-check passed
  • Flutter Screenshot

    JustLookAtNow/pt_mate

    Capture and show two Flutter UI screenshots for this project: one landscape/large-screen preview and one portrait/mobile preview, without using Flutter Web.

    503 GitHub stars~511 tokensUpdated 4 days ago
    MobileAuto-check passed

Works with

Categories

Questions about Spot Testing

What does Spot Testing do?

Write and debug Flutter widget tests using package:spot selectors, assertions, interactions, screenshots, and timeline reports. Spot Testing is an agent skill from passsy/spot. Write and debug Flutter widget tests using package:spot selectors, assertions, interactions, screenshots, and timeline reports.

When should I use Spot Testing?

Spot Testing fits situations like: A project uses Spot; the user asks to adopt it for widget tests.

How do I install Spot Testing in Claude Code?

Run `npx skills add passsy/spot --skill spot-testing -a claude-code`. Or copy the skill folder (skills/spot-testing in passsy/spot) into .claude/skills/spot-testing in your project. Claude Code loads it when a task matches its description.

How do I install Spot Testing in Codex?

Run `npx skills add passsy/spot --skill spot-testing -a codex`. Or copy the skill folder (skills/spot-testing in passsy/spot) into .agents/skills/spot-testing in your project. Codex loads it when a task matches its description.

Can I use Spot Testing in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add passsy/spot --skill spot-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/spot-testing, .gemini/skills/spot-testing, .github/skills/spot-testing and .opencode/skills/spot-testing in your project.

What does Spot Testing need to run?

Going by SKILL.md and its folder, Spot Testing needs the command-line tools its instructions call (flutter).

Does Spot Testing access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Spot Testing safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Spot Testing use?

Spot Testing is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Spot Testing use?

About 1.1k tokens (SKILL.md is roughly 4.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Spot Testing?

Skills that share tags, products or a category with Spot Testing: Add Flutter Docusaurus Locale (matthiasn/lotti, 1.2k stars), Tm Launcher Design (Far-Se/tabame, 372 stars), Flutter Init (bear2u/my-skills, 933 stars) and Mobile App UI Design (ceorkm/mobile-app-ui-design, 403 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Spot Testing?

passsy (a GitHub user) maintains it in passsy/spot, which has 112 GitHub stars. The repository was last updated on October 7, 2026.

Source: passsy/spot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.