Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add yuritoledo/openspec-tdd --skill opsx-tddgit clone --depth 1 https://github.com/yuritoledo/openspec-tddWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/yuritoledo/openspec-tdd/opsx-tdd)<a href="https://agentmods.dev/skills/yuritoledo/openspec-tdd/opsx-tdd"><img src="https://agentmods.dev/badge/skills/yuritoledo/openspec-tdd/opsx-tdd/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/yuritoledo/openspec-tdd/opsx-tdd"><img src="https://agentmods.dev/badge/skills/yuritoledo/openspec-tdd/opsx-tdd.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00047 | $0.02503 |
| Opus 5 | $0.00023 | $0.01252 |
| Sonnet 5 | $0.00009 | $0.00501 |
| Haiku 4.5 | $0.00005 | $0.00250 |
Grade A, and why
opsx:tdd scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 9d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 196 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Write real failing test files from a change's specs/**/*.md and confirm a solid RED
— tests that exercise the true contract and fail only because the implementation is missing —
before implementation begins. Never expect.fail("TDD Red Phase") placeholders: those prove
nothing, get fully rewritten at green, and leave the feature with zero real coverage.
Reads directly from the canonical spec files. Re-run after a spec change and tests regenerate from source-of-truth automatically.
Input: Optionally specify a change name. If omitted, infer from conversation context or prompt.
Steps
-
Discover project conventions (do this first — never hardcode)
This plugin runs in any repo. Detect the host project's testing setup, in priority order:
.openspec-tdd.jsonat repo root, if present. Fields (all optional):{ "testRunner": "npx vitest run", // command to run a single test file "renderHelper": "@/test/render", // import path for the project's custom render() "canonicalTest": "src/example.test.tsx", // a file to mirror for imports/mocks "testIdQuery": "getByTestId", // how the project queries test ids "testFileGlob": "**/*.test.{ts,tsx}" }CLAUDE.md/AGENTS.md/.cursorrules— read for testing conventions, the canonical-reference test file, render-helper location, and selector rules.package.json— infer the runner fromscripts.test/devDependencies(vitest→npx vitest run;jest→npx jest;bun→bun test; otherwisenode --test). Infer React/Testing-Library presence from deps.- Fallback defaults — bare
vitest, plain testing-library render,getByTestId.
Announce what you detected: "Runner: · Render helper: <path|none> · Canonical ref: <file|none>". See
references/frameworks.mdfor per-runner commands andreferences/non-react.md/references/e2e.mdfor non-component scenarios. -
Select the change
If a name is provided, use it. Otherwise:
- Infer from conversation context
- Auto-select if only one active change exists
- If ambiguous, run
openspec list --jsonand use AskUserQuestion tool to let user select
Announce: "Using change: "
-
Parse scenarios from specs
find openspec/changes/<name>/specs -name "*.md" 2>/dev/nullIf no
specs/**/*.mdexist in the change, stop:"No spec files found in
openspec/changes/<name>/specs/. Runopsx:proposefirst to generate specs with#### Scenario:blocks, then re-run/opsx:tdd."Parse every
specs/**/*.mdfile. For each file:a. Extract scenarios — collect every
#### Scenario:block with its parent### Requirement:name and its WHEN / THEN lines.If a file has no
#### Scenario:blocks, skip it and note it in the report.b. Derive the test file path — in priority order:
- design.md Implementation Map: scan
openspec/changes/<name>/design.mdfor a markdown table with columnsCapability,File(or similar). Extract the row matching this capability's name.| `ability-card` | `features/combat/AbilityCard.tsx` | `AbilityCard` | - design.md file path mentions: scan design.md for any
.ts/.tsxpaths that mention the capability name or a related module. - Project search:
find . \( -name "*.ts" -o -name "*.tsx" \) | grep -v node_modules | grep -i <capability>— pick the best match (non-test file). - Prompt the user: use AskUserQuestion with the capability name and a list of candidate paths found. Never guess silently.
Test file = implementation file path with
.test.ts/.test.tsxextension, same directory. Example:features/combat/AbilityCard.tsx→features/combat/AbilityCard.test.tsx.c. Translate THEN clauses to assertion intent — for each scenario, capture the full THEN text. Step 4 uses this to write the real assertion body.
- design.md Implementation Map: scan
What ships with it
3 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 9d ago First seen · 196 lines · 47 tokens per session scan A 54cc6e6d4be3
opsx:tdd is a skill published in the GitHub repository yuritoledo/openspec-tdd (6 stars, last pushed 2mo ago), licensed MIT. It adds 47 tokens to every session and 2,503 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
Component Test Scaffold (Vue.js)
Generate Vue.js component test skeletons (Vue Test Utils) from specifications.
Route/Function Test Scaffold (Remix)
Generate Remix loader/action and route component test skeletons.
Unit Test Scaffold (TypeScript)
Generate TypeScript unit test skeletons (Jest/Vitest) from specifications.
dhpk-tdd-workflow
Framework-agnostic test-driven development guidance for behavior-first unit and integration tests, test scaffolds, and minimal RED-GREEN-REFACTOR changes. Use when building a feature or fixing a bug test-first, writing a test scaffold, or reviewing test seams and mocks. Not for: Playwright journey authoring, pure…
dhpk-swift-test-strategy
Skill "dhpk-swift-test-strategy" from hmj1026/dhpk, covering swift test strategy, core rules, critical — never, when not to use and output.
dhpk-pytest-async
Async pytest + pytest-asyncio testing: asynciomode=auto, SQLite fixtures, httpx.AsyncClient + ASGITransport, unit/integration split, coverage floor, live markers. Use when writing or reviewing async FastAPI/SQLAlchemy tests, or enforcing dhpk-tdd-workflow. Not for production code. Output: offline-green async tests.