CtrlK
BlogDocsLog inGet started
Tessl Logo
PluginPublic

testland/chrome-extension-messaging-tests

Use when a Chrome extension's messages reach no listener, sendResponse never fires, a port disconnects mid-test, or a web page's access must be proven. Tests runtime.sendMessage, tabs.sendMessage, long-lived ports, externally_connectable and native messaging on a running extension.

Quality

88%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Passed

No findings from the security scan

Overview
Quality
Evals
Security
Files

Quality

Content

78%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

A well-engineered body: near-fully-executable code for the core shapes, a symptom-driven workflow with a final validation pass, and an exemplary split of deep material into two well-signaled companion references. The main costs are repetition of the toBeDefined guidance, long quoted passages from Chrome docs, and one test example that depends on an undefined helper. Payload/serialization constraints and version-gated behavior are handled with unusual rigor.

Suggestions

State the 'assert the full response object, not toBeDefined()' guidance once in Authoring and once in the Anti-patterns table, cutting the repetitions in 'How to use' step 4 and the prose after the test snippet.

Define or inline the sendFromContentScript helper (or replace it with a direct chrome.runtime.sendMessage call) so the flagship test example is copy-paste runnable.

Turn 'How to use' step 6 into an explicit feedback loop, e.g. 'if the draft matches any anti-pattern, fix it and re-run the check before committing', to make the validation cycle recoverable rather than a single final pass.

DimensionReasoningScore

Conciseness

The body is dense with non-obvious, Chrome-specific behavior ("a literal `true` (not just a truthy value)", the JSON-vs-structured-clone serialization table, first-listener-wins, the 30-second idle window) and does not re-explain broadly known concepts. It is not a 5 because the "assert the full object, not toBeDefined()" point is repeated four times (step 4, code comment, following prose, anti-patterns table) and long verbatim doc quotes pad sections.

4 / 5

Actionability

Concrete executable sender/listener code for both one-shot shapes, real matcher assertions ("expect(response).toEqual({ statusCode: 200 })"), test-target lists, and an anti-patterns table with concrete fixes. It misses anchor 5 because the test snippet calls an undefined helper "sendFromContentScript({ greeting: 'hello' })", so the primary test example is not copy-paste runnable without it.

4 / 5

Workflow Clarity

"How to use" provides a clear 6-step sequence (identify shape, confirm running, write pair, assert full response, apply guardrails, re-check) ending in an explicit validation step ("Re-check the draft against the Anti-patterns table before committing"), and the worked example acts as a checklist. It falls short of anchor 5 because there is no explicit error-recovery loop spelling out what to do when the check fails, though it clearly exceeds anchor 3's implicit checkpoints.

4 / 5

Progressive Disclosure

The two one-shot shapes stay inline in SKILL.md while the deeper topics are split into two real, verified reference files (references/long-lived-ports.md, references/cross-boundary-messaging.md), each introduced with a description of its contents, listed in References, and one level deep (they link only to external Chrome docs, not further bundle files). This matches anchor 5's clear overview with well-signaled one-level-deep references.

5 / 5

Total

17

/

20

Passed

Description

92%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

A strong description: it pairs an explicit 'Use when' clause of four concrete debugging symptoms with a capability sentence naming all five messaging surfaces it tests. Trigger vocabulary matches real user phrasing well, with only minor gaps in synonymous phrasing. It is in third person throughout with no vague filler.

DimensionReasoningScore

Specificity

"Tests runtime.sendMessage, tabs.sendMessage, long-lived ports, externally_connectable and native messaging on a running extension" lists five concrete, named API surfaces with comprehensive coverage of the extension-messaging niche. It exceeds anchor 4 because no messaging shape is left out, not even minor ones like one-shot tabs messages.

5 / 5

Completeness

Both halves are explicit: "Use when a Chrome extension's messages reach no listener, sendResponse never fires, a port disconnects mid-test, or a web page's access must be proven" gives concrete trigger scenarios, and "Tests runtime.sendMessage, tabs.sendMessage..." states what the skill does. This matches anchor 5's requirement of a clear what and when with concrete triggers, beyond anchor 4's looser when-clause.

5 / 5

Trigger Term Quality

Phrases like "messages reach no listener", "sendResponse never fires", "port disconnects mid-test", and "externally_connectable" closely match what a user debugging this problem would say. It falls short of anchor 5 because common natural phrasings such as "onMessage listener", "content script not receiving", or "service worker" are absent.

4 / 5

Distinctiveness Conflict Risk

Terms like "Chrome extension's messages", "sendResponse", "port", and "externally_connectable" carve a clear niche with distinct triggers, unlikely to fire for unrelated skills. Conflict risk with adjacent skills (e.g., extension loading/installing) is minimal because the triggers are symptom-specific.

5 / 5

Total

19

/

20

Passed

Validation

100%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 16 / 16 Passed

Validation for skill structure

No warnings or errors.

Reviewed

On this page