grisuno/lazyown/marketplace-contributor
Claude Code and agent skill by grisuno/lazyown
- community
- ext:[{"type":"plugin","description":"Custom plugin integration"}]
Checking that the SKILL.md file is still in the repository.
Contribute YARA rules, Nuclei templates, and pwntomate tools to the LazyOwn marketplace from a GitHub URL in one shot. Knows the yara_rules/, nuclei-templates, and tools/*.tool layouts, naming rules, and validation.
Install
npx vskill@latest install grisuno/lazyown/marketplace-contributorSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
/marketplace-contributor
Given a GitHub URL, contribute detection content or tooling to the LazyOwn marketplace on the first try. No iteration: fetch facts, pick the contribution type, fill the template, run the self-check, write the file(s).
Related: /lazyaddon-creator (generic tool -> lazyaddons/*.yaml). This skill covers the three marketplace content types that are NOT plain lazyaddons. For a Nuclei wrapper that needs repo_url/install_path semantics, this skill reuses the lazyaddon schema — see Type N below.
Usage
--type is auto-detected when omitted (see Step 2). --name overrides the default file stem.
Step 1 — Fetch repo facts
You need: repo name, owner, primary language, root file list, README usage section. Then classify the content:
.yar/.yarafiles present -> Type Y.- Nuclei template markers (
id:,info:, plushttp:/requests:/
network: / dns: stanzas, severity: field) in *.yaml under dirs like http/, cves/, network/, ssl/ -> Type N.
- Executable scanner / enumerator with a CLI -> Type T.
- Ambiguous -> ask the operator with
/marketplace-contributorquestion tool.
Step 2 — Pick the contribution type
| # | Type | When | Output file(s) | Reference | |
|---|---|---|---|---|---|
| Y | YARA rule | Repo ships .yar/.yara detection rules (malware, webshell, C2, packer, privesc) | yara_rules/<name>.yar (one rule file per contribution) | yara_rules/cobalt_strike_beacon.yar, yara_rules/webshell_detection.yar | |
| N | Nuclei templates | Repo is a template collection (e.g. projectdiscovery/nuclei-templates) | lazyaddons/<name>.yaml wrapper (clone + nuclei -t) + optional tools/<name>-*.tool | tools/nuclei-ad.tool, lazyaddons/trivy.yaml (release-wrapper pattern) | |
| T | Pwntomate tool | Repo is a runnable scanner whose output maps to a service trigger | tools/<name>.tool JSON (+ optional /lazyaddon-creator addon) | tools/_example.tool, tools/nikto.tool |
Never vendor thousands of upstream files into the repo. Type N clones at runtime via repo_url; Type Y copies exactly ONE rule file; Type T writes exactly ONE .tool JSON.
Step 3 — Type Y: YARA rule file
Target: yara_rules/<name>.yar where <name> matches ^[A-Za-z0-9_]{1,64}$ (lowercase preferred, e.g. my_webshell.yar).
Rules:
- ONE file per contribution. Multi-rule repos: extract the single requested
rule, or the highest-signal rule family, into one file.
ruleidentifier matches^[A-Za-z_][A-Za-z0-9_]{0,127}$.metaMUST includedescription,author,reference(source repo URL).- No
includedirectives (breaksyara_rules/flat scanning). - No
privaterules without a consuming public rule in the same file. - Validate:
yara <file> /bin/lsmust exit 0 whenyarais installed;
otherwise assert balanced braces and the presence of rule, strings:, condition: literals.
- The rule is picked up automatically:
AddonRegistry.scan("yara")globs
yara_rules/*.yar|*.yara, and yara_scan runs against it. No registry edit needed.
Step 4 — Type N: Nuclei wrapper (lazyaddon + optional .tool)
Template collections are NEVER vendored. Write a wrapper addon following the /lazyaddon-creator schema (all of its Steps 4–9 apply verbatim: single braces, live-params-only placeholders, no secrets, enabled: true, ^[a-z][a-z0-9_]{0,63}$ name, digits-and-dots version, .git repo_url).
Template (archetype A — cloned data repo, local execute):
Rules specific to Type N:
install_commandis OMITTED (template repos need no build).execute_commandruns frominstall_path, so template paths are relative
(-t http/cves/). Output stages to ../../../sessions/ (three levels up from external/.exploit/<dir>), stable name nuclei_{target}.txt.
- Default template subset MUST be bounded (e.g.
http/cves/, severity
filter). Full-corpus scans (-t .) are free-args only — document them.
- Placeholders:
{target}(live inpayload.json). Severity/tag selection
travels via FREE ARGS (-severity critical -tags cve), never via new placeholders (new keys require the 4-place registration from /lazyaddon-creator Step 4).
- Requires the
nucleibinary — state this indescription, do not chain
installers with ; in execute_command.
- Optional companion:
tools/<name>-<profile>.toolpwntomate wrapper so
future scans auto-apply it on matching services (see Step 5 for schema). The .tool command uses PWNtomate placeholders ({ip}, {port}, {outputdir}), NOT shell placeholders — the two systems never mix.
- Register the collection in
modules/nuclei_templates_sync.pySOURCES
(see Step 4c) so download_nuclei_templates syncs it on every operator machine — the wrapper alone only helps fresh clones.
Step 4c — Type N: register the source in the sync script
Every new template collection MUST be added to the SOURCES registry in modules/nuclei_templates_sync.py, otherwise download_nuclei_templates never delivers it to operator machines:
Rules:
- One entry per collection:
repo(.gitURL),subdir(destination
dirname, no spaces, no ..), validate_subset (must exist in the repo).
- New sources sync immediately: `python3 modules/nuclei_templates_sync.py
--source <name> — same Step 4b guarantees (tmp staging, .git strip, count guard, find .git` == 0).
- Implants, binaries, and runnable scanners (archetypes B/C/D) are NEVER
registered here — they ship as plain lazyaddons only. This registry is exclusively for template/rule collections consumed from disk.
Step 4b — Type N: immediate ingestion (the skill DOES this now, not later)
The wrapper alone only clones on first use — the operator would still see the old templates. The skill MUST ingest immediately following this procedure (clone in tmp, copy the working tree, strip every .git trace to avoid mixed-repo contamination):
Rules:
- NEVER clone directly into
external/or the repo root — always stage in
/tmp/<name>-ingest first. A nested .git inside the LazyOwn checkout breaks git operations and submodule detection.
- NEVER copy the
.gitdirectory.rm -rfit in tmp BEFOREcp -a.
Verify with the find above (must be 0).
external/.exploitis gitignored — ingested content never pollutes
git status.
- If a first-priority candidate dir already exists as a clean clone of the
SAME remote (e.g. ~/nuclei-templates), refresh it with git pull --ff-only there instead of duplicating — but ONLY when git status -sb is clean and remote -v matches. Never force-push, never touch dirty trees.
- Verify after ingest: template count (
find "$DEST" -name '*.yaml' | wc -l),
AddonRegistry.scan("nuclei") non-empty, and nuclei -t "$DEST/<subset>" -validate -silent exits 0.
Step 5 — Type T: pwntomate .tool file
Target: tools/<name>.tool where <name> matches ^[a-z0-9][a-z0-9\-_]{0,63}$.
Rules:
- Placeholders are PWNtomate-only:
{ip},{port},{s}(s/s scheme
suffix), {outputdir}, {toolname}. NEVER shell placeholders ({target}, {rhost}, {lhost}) — pwntomate substitutes its own set.
trigger: lowercase nmap service names (http,smb,ldap), or
["all"] for service-agnostic tools. Max 40 entries.
active: trueto run on future scans;falsefor opt-in only.categoryMUST match^\d{2}\. [name]$(same table as lazyaddons).- Validate JSON parses and every
{token}is in the PWNtomate allowlist
{ip} {port} {s} {outputdir} {toolname}.
- If the tool also deserves an interactive shell command, run
/lazyaddon-creator for the same repo afterwards — the .tool and the .yaml coexist.
Step 6 — One-shot self-check (run before writing)
Type Y:
Type N (same gate as /lazyaddon-creator Step 9):
Plus manual assertions: enabled: true; name regex; version digits-and-dots; repo_url ends .git; no {{/}}; every {token} resolves from live shell params; execute_command bounded and complete with zero free args; no ;-chaining; description documents the nuclei binary requirement + free-args examples.
Type T:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/marketplace-contributor/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Extension points
pluginCustom plugin integration
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/grisuno/lazyown/marketplace-contributor)