Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when testing a bundle-plugin locally before release — generating dev-marketplace environments, verifying component discovery, running hook smoke tests, and validating cross-platform readiness
.claude/skills/odradekai-testing/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 145% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 42% | 0% |
Dynamic verification of a bundle-plugin project: install it locally, confirm components are discoverable, validate hooks fire correctly, and run cross-platform smoke tests. Complements bundles-forge:auditing (static analysis) with runtime validation.
Core principle: Audit tells you if the structure is correct; testing tells you if it actually works.
Skill type: Flexible — adapt the test scope based on target platforms and project maturity.
Announce at start: "I'm using the testing skill to verify this plugin works correctly."
The target must be a local bundle-plugin project (has package.json + skills/). Remote URLs and archives are not supported — testing requires a local working directory.
| Target | Mode | |--------|------| | Project root with multiple platforms | Full testing — all 5 test phases | | Project root with single platform | Platform testing — phases 1-4 for the target platform | | Single skill directory | Skill-only testing — phase 3 (component discovery) only |
Generate a temporary dev-marketplace for local installation testing.
../dev-marketplace/ adjacent to the project directory.claude-plugin/marketplace.json pointing to the project:json{ "name": "<project-name>-dev", "owner": { "name": "dev" }, "plugins": [ { "name": "<project-name>", "source": "../<project-directory-name>" } ] }
Dev marketplace created at ../dev-marketplace/
To install locally:
/plugin marketplace add ./dev-marketplace
/plugin install <project-name>@<project-name>-dev
To reload after changes:
/plugin marketplace update <project-name>-dev
To clean up when done:
/plugin marketplace remove <project-name>-devCursor plugins are installed from local paths directly:
To test locally in Cursor:
1. Open Cursor Settings → Extensions → Install from Path
2. Select the project root directory
3. Reload Cursor to pick up changesskills/ into ~/.agents/skills/ per INSTALL.md.opencode/plugins/See references/platform-test-guides.md for platform-specific setup instructions.
Verify hooks execute without errors by running them directly.
bashbash hooks/session-start
Expected: Exits 0, prints a one-line prompt containing the project name and available skills. No stderr output.
Verify output format:
CLAUDE_PLUGIN_ROOT is set: valid JSON with hookSpecificOutput.additionalContextCURSOR_PLUGIN_ROOT is set: valid JSON with additional_contextIf the project defines PreToolUse or PostToolUse hooks in hooks.json, run each referenced script directly and verify:
Verify hooks/openclaw-bootstrap/HOOK.md has valid YAML frontmatter with events declaration, and handler.js uses ESM export default.
Verify that all declared components can be found by the host platform.
For each directory under skills/:
SKILL.mdname and descriptionname matches directory namedescription starts with "Use when..."For each .md file under agents/:
For each target platform:
package.json versionGenerate a platform-specific test checklist based on references/platform-test-guides.md and known limitations from bundles-forge:scaffolding — references/platform-adapters.md.
| Platform | Limitation | Test | |----------|-----------|------| | Claude Code | Plugin caching breaks ../ paths | Verify no ../ in hook commands or manifest paths | | Cursor | Bootstrap lost after /clear | Verify session-start runs independently of prior context | | Codex | No hook bootstrap | Verify AGENTS.md or INSTALL.md has manual setup instructions | | OpenCode | Plugin JS must use ESM | Verify export default in .opencode/plugins/*.js | | Gemini CLI | Extension needs contextFileName | Verify gemini-extension.json has contextFileName field | | OpenClaw | Hook-pack wiring uncertain | Document as known risk in test report |
Generate a test report summarizing all findings.
markdown# Test Report: <project-name> **Date:** YYYY-MM-DD **Scope:** [Full / Platform / Skill-only] **Platforms tested:** [list] ## Results | Phase | Status | Details | |-------|--------|---------| | 1. Local Environment | PASS/FAIL/SKIP | ... | | 2. Hook Smoke Tests | PASS/FAIL/SKIP | ... | | 3. Component Discovery | PASS/FAIL/SKIP | N skills, K agents | | 4. Cross-Platform | PASS/FAIL/SKIP | ... | ## Issues Found ### Critical - (blocks release) ### Warnings - (should fix before release) ## Recommendations - ...
Report location: .bundles-forge/audits/<timestamp>-test-report.md
In the releasing pipeline, testing runs after auditing and before version bump:
audit → test → version bump → publishIf testing reveals critical issues, the release pipeline is blocked until they are resolved.
| Mistake | Fix | |---------|-----| | Skipping local install test | Always test with a real dev-marketplace — file discovery differs from file existence | | Testing only on one platform | Run cross-platform checklist for every target platform | | Ignoring hook exit codes | Hooks must exit 0 to avoid blocking the host; test all code paths | | Not cleaning up dev-marketplace | Always remove dev-marketplace after testing | | Testing after version bump | Test before bumping — avoid releasing a broken version |
project-directory (required) — bundle-plugin project roottest-report — comprehensive test results written to .bundles-forge/audits/dev-marketplace (temporary) — local marketplace directory for installation testingCalled by:
Calls:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | fail→fail | 3,763 | 4,985 | +32% | 1 | 1 | 0% | 538 | 2,396 | +345% | 0 | 0 | — |
case-01 | fail→fail | 27,812 | 11,872 | -57% | 1 | 1 | 0% | 6,134 | 2,171 | -65% | 0 | 0 | — |
case-02 | fail→fail | 30,698 | 1,965 | -94% | 1 | 1 | 0% | 4,133 | 2,021 | -51% | 0 | 0 | — |
case-03 | pass→fail | 5,673 | 3,145 | -45% | 1 | 1 | 0% | 1,033 | 2,208 | +114% | 0 | 0 | — |
case-04 | fail→pass | 5,237 | 2,619 | -50% | 1 | 1 | 0% | 898 | 2,204 | +145% | 0 | 0 | — |
case-05 | fail→pass | 10,194 | 4,166 | -59% | 1 | 1 | 0% | 1,922 | 2,589 | +35% | 0 | 0 | — |
case-06 | fail→pass | 17,200 | 3,354 | -81% | 1 | 1 | 0% | 1,622 | 2,350 | +45% | 0 | 0 | — |
case-07 | fail→pass | 9,428 | 3,198 | -66% | 1 | 1 | 0% | 1,767 | 2,328 | +32% | 0 | 0 | — |
case-08 | fail→pass | 8,194 | 2,487 | -70% | 1 | 1 | 0% | 1,539 | 2,190 | +42% | 0 | 0 | — |
case-09 | pass→pass | 11,531 | 1,599 | -86% | 1 | 1 | 0% | 2,087 | 1,989 | -5% | 0 | 0 | — |
case-10 | pass→pass | 17,353 | 1,591 | -91% | 1 | 1 | 0% | 1,561 | 1,972 | +26% | 0 | 0 | — |
case-11 | pass→pass | 8,111 | 2,281 | -72% | 1 | 1 | 0% | 1,569 | 2,153 | +37% | 0 | 0 | — |
case-12 | fail→pass | 8,196 | 1,697 | -79% | 1 | 1 | 0% | 1,390 | 2,016 | +45% | 0 | 0 | — |
case-13 | fail→pass | 10,479 | 1,432 | -86% | 1 | 1 | 0% | 1,799 | 1,966 | +9% | 0 | 0 | — |
case-14 | fail→pass | 10,282 | 1,267 | -88% | 1 | 1 | 0% | 1,748 | 1,949 | +11% | 0 | 0 | — |
case-15 | fail→pass | 9,724 | 2,695 | -72% | 1 | 1 | 0% | 1,745 | 2,240 | +28% | 0 | 0 | — |
case-16 | pass→pass | 6,714 | 1,542 | -77% | 1 | 1 | 0% | 1,021 | 1,998 | +96% | 0 | 0 | — |
case-17 | fail→fail | 11,625 | 2,062 | -82% | 1 | 1 | 0% | 1,898 | 2,158 | +14% | 0 | 0 | — |
case-18 | fail→pass | 6,975 | 1,893 | -73% | 1 | 1 | 0% | 1,085 | 2,059 | +90% | 0 | 0 | — |
case-19 | fail→pass | 8,892 | 1,343 | -85% | 1 | 1 | 0% | 1,529 | 1,978 | +29% | 0 | 0 | — |
case-20 | pass→pass | 9,339 | 5,133 | -45% | 1 | 1 | 0% | 1,606 | 2,618 | +63% | 0 | 0 | — |
case-21 | pass→pass | 15,407 | 5,728 | -63% | 1 | 1 | 0% | 2,276 | 2,645 | +16% | 0 | 0 | — |
case-23 | fail→fail | 26,729 | 13,945 | -48% | 1 | 1 | 0% | 1,031 | 4,462 | +333% | 0 | 0 | — |
case-24 | fail→fail | 5,011 | 9,002 | +80% | 1 | 1 | 0% | 856 | 3,202 | +274% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +42 percentage points is the difference between those two pass rates over the 23 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.