{"id":"b7fb1406-898b-4b0d-b953-df3d710af754","shortId":"tjsMEc","kind":"skill","title":"testing","tagline":"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","description":"# Testing Bundle-Plugins\n\n## Overview\n\nDynamic 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.\n\n**Core principle:** Audit tells you if the structure is correct; testing tells you if it actually works.\n\n**Skill type:** Flexible — adapt the test scope based on target platforms and project maturity.\n\n**Announce at start:** \"I'm using the testing skill to verify this plugin works correctly.\"\n\n## Step 1: Resolve Input & Detect Scope\n\n### Input Normalization\n\nThe 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.\n\n### Scope Detection\n\n| Target | Mode |\n|--------|------|\n| Project root with multiple platforms | **Full testing** — all 5 test phases |\n| Project root with single platform | **Platform testing** — phases 1-4 for the target platform |\n| Single skill directory | **Skill-only testing** — phase 3 (component discovery) only |\n\n---\n\n## Phase 1: Local Test Environment\n\nGenerate a temporary dev-marketplace for local installation testing.\n\n### For Claude Code\n\n1. Create `../dev-marketplace/` adjacent to the project directory\n2. Generate `.claude-plugin/marketplace.json` pointing to the project:\n\n```json\n{\n  \"name\": \"<project-name>-dev\",\n  \"owner\": { \"name\": \"dev\" },\n  \"plugins\": [\n    {\n      \"name\": \"<project-name>\",\n      \"source\": \"../<project-directory-name>\"\n    }\n  ]\n}\n```\n\n3. Instruct the user:\n\n```\nDev marketplace created at ../dev-marketplace/\n\nTo install locally:\n  /plugin marketplace add ./dev-marketplace\n  /plugin install <project-name>@<project-name>-dev\n\nTo reload after changes:\n  /plugin marketplace update <project-name>-dev\n\nTo clean up when done:\n  /plugin marketplace remove <project-name>-dev\n```\n\n### For Cursor\n\nCursor plugins are installed from local paths directly:\n\n```\nTo test locally in Cursor:\n  1. Open Cursor Settings → Extensions → Install from Path\n  2. Select the project root directory\n  3. Reload Cursor to pick up changes\n```\n\n### For Other Platforms\n\n- **Codex:** Symlink `skills/` into `~/.agents/skills/` per INSTALL.md\n- **OpenCode:** Register the plugin path in `.opencode/plugins/`\n- **Gemini CLI:** Point the extension config to the local directory\n\nSee `references/platform-test-guides.md` for platform-specific setup instructions.\n\n---\n\n## Phase 2: Hook Smoke Tests\n\nVerify hooks execute without errors by running them directly.\n\n### SessionStart Hook\n\n```bash\nbash hooks/session-start\n```\n\n**Expected:** Exits 0, prints a one-line prompt containing the project name and available skills. No stderr output.\n\n**Verify output format:**\n- If `CLAUDE_PLUGIN_ROOT` is set: valid JSON with `hookSpecificOutput.additionalContext`\n- If `CURSOR_PLUGIN_ROOT` is set: valid JSON with `additional_context`\n- Neither: plain text\n\n### Custom Hooks (if configured)\n\nIf the project defines `PreToolUse` or `PostToolUse` hooks in `hooks.json`, run each referenced script directly and verify:\n- PreToolUse scripts: exit 0 on a valid project, exit 2 to block writes on critical issues\n- PostToolUse scripts: always exit 0, warnings go to stderr\n\n### OpenClaw Hook-Pack (if present)\n\nVerify `hooks/openclaw-bootstrap/HOOK.md` has valid YAML frontmatter with `events` declaration, and `handler.js` uses ESM `export default`.\n\n---\n\n## Phase 3: Component Discovery\n\nVerify that all declared components can be found by the host platform.\n\n### Skills\n\nFor each directory under `skills/`:\n- [ ] Contains `SKILL.md`\n- [ ] Frontmatter has `name` and `description`\n- [ ] `name` matches directory name\n- [ ] `description` starts with \"Use when...\"\n\n### Agents\n\nFor each `.md` file under `agents/`:\n- [ ] Has YAML frontmatter\n- [ ] Body has 5+ non-empty lines (self-contained protocol)\n\n### Platform Manifests\n\nFor each target platform:\n- [ ] Manifest file exists and is valid JSON\n- [ ] Paths in manifest resolve to existing files/directories\n- [ ] Version matches `package.json` version\n\n---\n\n## Phase 4: Cross-Platform Readiness\n\nGenerate a platform-specific test checklist based on `references/platform-test-guides.md` and known limitations from `bundles-forge:scaffolding` — `references/platform-adapters.md`.\n\n### Known Limitations to Verify\n\n| Platform | Limitation | Test |\n|----------|-----------|------|\n| Claude Code | Plugin caching breaks `../` paths | Verify no `../` in hook commands or manifest paths |\n| Cursor | Bootstrap lost after `/clear` | Verify session-start runs independently of prior context |\n| Codex | No hook bootstrap | Verify AGENTS.md or INSTALL.md has manual setup instructions |\n| OpenCode | Plugin JS must use ESM | Verify `export default` in `.opencode/plugins/*.js` |\n| Gemini CLI | Extension needs `contextFileName` | Verify `gemini-extension.json` has `contextFileName` field |\n| OpenClaw | Hook-pack wiring uncertain | Document as known risk in test report |\n\n---\n\n## Phase 5: Test Report\n\nGenerate a test report summarizing all findings.\n\n### Report Structure\n\n```markdown\n# Test Report: <project-name>\n\n**Date:** YYYY-MM-DD\n**Scope:** [Full / Platform / Skill-only]\n**Platforms tested:** [list]\n\n## Results\n\n| Phase | Status | Details |\n|-------|--------|---------|\n| 1. Local Environment | PASS/FAIL/SKIP | ... |\n| 2. Hook Smoke Tests | PASS/FAIL/SKIP | ... |\n| 3. Component Discovery | PASS/FAIL/SKIP | N skills, K agents |\n| 4. Cross-Platform | PASS/FAIL/SKIP | ... |\n\n## Issues Found\n\n### Critical\n- (blocks release)\n\n### Warnings\n- (should fix before release)\n\n## Recommendations\n\n- ...\n```\n\n**Report location:** `.bundles-forge/audits/<timestamp>-test-report.md`\n\n---\n\n## Integration with Releasing\n\nIn the releasing pipeline, testing runs after auditing and before version bump:\n\n```\naudit → test → version bump → publish\n```\n\nIf testing reveals critical issues, the release pipeline is blocked until they are resolved.\n\n---\n\n## Common Mistakes\n\n| Mistake | Fix |\n|---------|-----|\n| Skipping local install test | Always test with a real dev-marketplace — file discovery differs from file existence |\n| Testing only on one platform | Run cross-platform checklist for every target platform |\n| Ignoring hook exit codes | Hooks must exit 0 to avoid blocking the host; test all code paths |\n| Not cleaning up dev-marketplace | Always remove dev-marketplace after testing |\n| Testing after version bump | Test before bumping — avoid releasing a broken version |\n\n## Inputs\n\n- `project-directory` (required) — bundle-plugin project root\n\n## Outputs\n\n- `test-report` — comprehensive test results written to `.bundles-forge/audits/`\n- `dev-marketplace` (temporary) — local marketplace directory for installation testing\n\n## Integration\n\n**Called by:**\n- **bundles-forge:releasing** — pre-release dynamic verification (after audit, before version bump)\n- User directly — standalone local testing during development\n\n**Calls:**\n- (none — testing is a pure executor, does not dispatch other skills)","tags":["testing","bundles","forge","odradekai","agent-skills","bundle-plugin","claude-code","claude-plugin","claude-skills","cursor-plugin"],"capabilities":["skill","source-odradekai","skill-testing","topic-agent-skills","topic-bundle-plugin","topic-claude-code","topic-claude-plugin","topic-claude-skills","topic-cursor-plugin"],"categories":["bundles-forge"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/OdradekAI/bundles-forge/testing","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add OdradekAI/bundles-forge","source_repo":"https://github.com/OdradekAI/bundles-forge","install_from":"skills.sh"}},"qualityScore":"0.554","qualityRationale":"deterministic score 0.55 from registry signals: · indexed on github topic:agent-skills · 208 github stars · SKILL.md body (7,087 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:54:06.028Z","embedding":null,"createdAt":"2026-04-18T22:12:14.931Z","updatedAt":"2026-05-02T12:54:06.028Z","lastSeenAt":"2026-05-02T12:54:06.028Z","tsv":"'-4':175 '/.agents/skills':316 '/audits':738,874 '/clear':609 '/dev-marketplace':212,245,252 '/marketplace.json':223 '/plugin':249,253,260,269 '0':365,433,450,817 '1':118,174,193,210,288,700 '2':218,296,345,439,704 '3':188,237,302,477,709 '4':560,717 '5':163,526,667 'actual':86 'adapt':91 'add':251 'addit':404 'adjac':213 'agent':514,520,716 'agents.md':624 'alway':448,782,833 'analysi':67 'announc':102 'archiv':141 'audit':65,73,750,755,898 'avail':377 'avoid':819,847 'base':95,572 'bash':360,361 'block':441,725,769,820 'bodi':524 'bootstrap':606,622 'break':595 'broken':850 'bump':754,758,843,846,901 'bundl':7,32,40,63,132,580,736,858,872,889 'bundle-plugin':6,31,39,131,857 'bundles-forg':62,579,735,871,888 'cach':594 'call':886,909 'chang':259,308 'checklist':571,805 'claud':208,221,386,591 'claude-plugin':220 'clean':265,828 'cli':327,644 'code':209,592,813,825 'codex':312,619 'command':601 'common':774 'complement':61 'compon':18,47,189,478,484,710 'comprehens':866 'config':331 'configur':412 'confirm':46 'contain':372,498,533 'context':405,618 'contextfilenam':647,651 'core':71 'correct':53,80,116 'creat':211,243 'critic':444,724,763 'cross':27,57,562,719,803 'cross-platform':26,56,561,718,802 'cursor':274,275,287,290,304,396,605 'custom':409 'date':682 'dd':686 'declar':469,483 'default':475,639 'defin':416 'descript':504,509 'detail':699 'detect':121,152 'dev':14,201,230,233,241,255,263,272,788,831,836,876 'dev-marketplac':13,200,787,830,835,875 'develop':908 'differ':792 'direct':282,357,427,903 'directori':150,182,217,301,335,495,507,855,881 'discover':49 'discoveri':19,190,479,711,791 'dispatch':918 'document':659 'done':268 'dynam':35,895 'empti':529 'environ':16,196,702 'error':353 'esm':473,636 'event':468 'everi':807 'execut':351 'executor':915 'exist':543,553,795 'exit':364,432,438,449,812,816 'expect':363 'export':474,638 'extens':292,330,645 'field':652 'file':518,542,790,794 'files/directories':554 'find':676 'fire':52 'fix':729,777 'flexibl':90 'forg':64,581,737,873,890 'format':384 'found':487,723 'frontmatt':466,500,523 'full':160,688 'gemini':326,643 'gemini-extension.json':649 'generat':12,197,219,565,670 'go':452 'handler.js':471 'hook':21,51,346,350,359,410,420,457,600,621,655,705,811,814 'hook-pack':456,654 'hooks.json':422 'hooks/openclaw-bootstrap/hook.md':462 'hooks/session-start':362 'hookspecificoutput.additionalcontext':394 'host':490,822 'ignor':810 'independ':615 'input':120,123,852 'instal':43,205,247,254,278,293,780,883 'install.md':318,626 'instruct':238,343,630 'integr':740,885 'issu':445,722,764 'js':633,642 'json':228,392,402,547 'k':715 'known':576,584,661 'limit':577,585,589 'line':370,530 'list':695 'local':9,45,130,148,194,204,248,280,285,334,701,779,879,905 'locat':734 'lost':607 'm':106 'manifest':536,541,550,603 'manual':628 'markdown':679 'marketplac':15,202,242,250,261,270,789,832,837,877,880 'match':506,556 'matur':101 'md':517 'mistak':775,776 'mm':685 'mode':154 'multipl':158 'must':127,634,815 'n':713 'name':229,232,235,375,502,505,508 'need':646 'neither':406 'non':528 'non-empti':527 'none':910 'normal':124 'one':369,799 'one-lin':368 'open':289 'openclaw':455,653 'opencod':319,631 'opencode/plugins':325,641 'output':381,383,862 'overview':34 'owner':231 'pack':458,656 'package.json':136,557 'pass/fail/skip':703,708,712,721 'path':281,295,323,548,596,604,826 'per':317 'phase':165,173,187,192,344,476,559,666,697 'pick':306 'pipelin':746,767 'plain':407 'platform':28,58,98,159,170,171,179,311,340,491,535,540,563,568,588,689,693,720,800,804,809 'platform-specif':339,567 'plugin':8,33,41,114,133,222,234,276,322,387,397,593,632,859 'point':224,328 'posttoolus':419,446 'pre':893 'pre-releas':892 'present':460 'pretoolus':417,430 'principl':72 'print':366 'prior':617 'project':42,100,134,155,166,216,227,299,374,415,437,854,860 'project-directori':853 'prompt':371 'protocol':534 'publish':759 'pure':914 'readi':29,564 'real':786 'recommend':732 'referenc':425 'references/platform-adapters.md':583 'references/platform-test-guides.md':337,574 'regist':320 'releas':11,726,731,742,745,766,848,891,894 'reload':257,303 'remot':138 'remov':271,834 'report':665,669,673,677,681,733,865 'requir':146,856 'resolv':119,551,773 'result':696,868 'reveal':762 'risk':662 'root':156,167,300,388,398,861 'run':20,55,355,423,614,748,801 'runtim':69 'scaffold':582 'scope':94,122,151,687 'script':426,431,447 'see':336 'select':297 'self':532 'self-contain':531 'session':612 'session-start':611 'sessionstart':358 'set':291,390,400 'setup':342,629 'singl':169,180 'skill':88,110,137,181,184,314,378,492,497,691,714,920 'skill-on':183,690 'skill-testing' 'skill.md':499 'skip':778 'smoke':22,59,347,706 'sourc':236 'source-odradekai' 'specif':341,569 'standalon':904 'start':104,510,613 'static':66 'status':698 'stderr':380,454 'step':117 'structur':78,678 'summar':674 'support':144 'symlink':313 'target':97,126,153,178,539,808 'tell':74,82 'temporari':199,878 'test':1,4,23,30,60,81,93,109,145,161,164,172,186,195,206,284,348,570,590,664,668,672,680,694,707,747,756,761,781,783,796,823,839,840,844,864,867,884,906,911 'test-report':863 'test-report.md':739 'text':408 'topic-agent-skills' 'topic-bundle-plugin' 'topic-claude-code' 'topic-claude-plugin' 'topic-claude-skills' 'topic-cursor-plugin' 'type':89 'uncertain':658 'updat':262 'url':139 'use':2,107,472,512,635 'user':240,902 'valid':25,50,70,391,401,436,464,546 'verif':36,896 'verifi':17,112,349,382,429,461,480,587,597,610,623,637,648 'version':555,558,753,757,842,851,900 'warn':451,727 'wire':657 'without':352 'work':87,115,149 'write':442 'written':869 'yaml':465,522 'yyyi':684 'yyyy-mm-dd':683","prices":[{"id":"57aad225-daf7-49a6-b120-8d0c5aff810d","listingId":"b7fb1406-898b-4b0d-b953-df3d710af754","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"OdradekAI","category":"bundles-forge","install_from":"skills.sh"},"createdAt":"2026-04-18T22:12:14.931Z"}],"sources":[{"listingId":"b7fb1406-898b-4b0d-b953-df3d710af754","source":"github","sourceId":"OdradekAI/bundles-forge/testing","sourceUrl":"https://github.com/OdradekAI/bundles-forge/tree/main/skills/testing","isPrimary":false,"firstSeenAt":"2026-04-18T22:12:14.931Z","lastSeenAt":"2026-05-02T12:54:06.028Z"}],"details":{"listingId":"b7fb1406-898b-4b0d-b953-df3d710af754","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"OdradekAI","slug":"testing","github":{"repo":"OdradekAI/bundles-forge","stars":208,"topics":["agent-skills","bundle-plugin","claude-code","claude-plugin","claude-skills","cursor-plugin"],"license":"apache-2.0","html_url":"https://github.com/OdradekAI/bundles-forge","pushed_at":"2026-04-27T02:13:58Z","description":"An agentic skills framework & bundle-plugin engineering toolkit that works.","skill_md_sha":"9a34fd7a14738b98c22d36375bea47d11d76ca2c","skill_md_path":"skills/testing/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/OdradekAI/bundles-forge/tree/main/skills/testing"},"layout":"multi","source":"github","category":"bundles-forge","frontmatter":{"name":"testing","description":"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"},"skills_sh_url":"https://skills.sh/OdradekAI/bundles-forge/testing"},"updatedAt":"2026-05-02T12:54:06.028Z"}}