grisuno/lazyown/lazyaddon-creator
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.
Create a working LazyOwn lazyaddon YAML from a GitHub URL in one shot. Knows the exact schema, placeholder allowlist, install/execute/C2 staging semantics and validation rules.
Install
npx vskill@latest install grisuno/lazyown/lazyaddon-creatorSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
/lazyaddon-creator
Given a GitHub URL, write lazyaddons/<name>.yaml that registers the tool as a first-class LazyOwn command on the first try. No iteration: fetch facts, pick the archetype, fill the template, run the self-check, write the file.
Usage
Step 1 — Fetch repo facts
You need: repo name, owner, primary language, root file list, README usage section (the PRIMARY command users run).
Step 2 — Pick the archetype
| # | Archetype | When | Reference addon | |
|---|---|---|---|---|
| A | Cloned tool, local execute | Scanner / analyzer run on operator host | rea.yaml, trivy.yaml | |
| B | Global binary, no build | npm install -g, pipx install, go install tool | gemini-cli.yaml | |
| C | C2 stager | Build implant/loader, stage to sessions/, deliver via lazycommand | beacon.yaml | |
| D | C2 remote ops | Push binary to victim, run it there, pull loot back | CGOblin.yaml | |
| E | No-clone wrapper | Pure execute_command, no repo_url/install_path (already-installed CLI) | opencode_agent.yaml |
Step 3 — Fill the template
Step 4 — Placeholders (the rule that breaks most addons)
- Single braces only: `{param}`.
{{param}}fails validation and survives substitution visibly. - YAML `default:` NEVER substitutes at runtime. The wrapper (
lazyown.pyvia
utils.replace_command_placeholders) substitutes exclusively from live shell params: payload.json ∪ params/*.yaml. A {token} missing there renders literally into the executed command; a required: true param missing there aborts with a warning before executing. Declaring a param with a default: does NOT make it resolve — the default is documentation only.
- Consequence: every
{token}inexecute_command,install_command,
remote_command, lazycommand, upload_file or download_file MUST resolve from one of three places:
- a builtin key (the documented list below),
- a shared parameter declared in the operator registry
(params/operator.yaml),
- a parameter declared in the addon YAML itself (
params:), which then
belongs to that addon only.
- Declare once, reuse everywhere. A knob more than one addon could use
does NOT go into the addon YAML and does NOT get a payload key of its own. Declare it in the shared registry and it becomes substitutable in every addon, alias and pipeline, and settable with assign, without touching a single source file:
``bash param create c2_profile --kind string --default "default" --desc "C2 profile name" # or: lazy_orchestrator -> Params tab -> a ``
The registry writes params/operator.yaml; core/payload_schema.py and the addon-creator validator pick the key up automatically. Never hand-edit core/payload_schema.py, lazyc2/addon_creator.py or the key list below for an operator parameter: the registry is the single source of truth.
- Generic names only — no branding. A token named after the tool that
first needed it (php2shell_url, commix_target, foo_profile) is a defect: it burns one payload key per addon and the repository ends up with thousands of single-consumer keys. Name the concept, not the tool: url, target, path, profile, exploit_profile, outputdir, data. When no generic name fits, create a generic one in the registry and let every addon share it.
- Builtin keys are the exception. A key that belongs to the framework
itself (routing, C2 wiring, session state) may still be hardcoded, but it is registered in all four places:
params/extended.yaml(runtime value + makesassign <key>work; never edit
payload.json by hand — use assign / lazyown_set_config),
core/payload_schema.pySCHEMA (type coercion + validation),lazyc2/addon_creator.pypayload_placeholders(validator + web creation form),- this list below (documentation).
- Placeholder vs free args — operator text after the command is appended verbatim
AFTER execute_command (cd <install_path> && <execute_command> <free-args>):
- Use a placeholder (+
assignflow) for stable scope/config reused across runs:
region, server URL, scan subcommand, output paths.
- Use free args for per-run input: targets, profiles, extra flags, repeatable
--resource/--namespace. Works with argparse-style optional flags in any position. Does NOT work for positional subcommands (embed them as placeholders, e.g. ./trivy {trivy_scan_type} … {trivy_target}), for ;-chained suite commands (args land on the LAST command only — document "takes no free args"), or for lazycommand-only addons (args append to execute_command, which they lack).
- Secrets are never placeholders (visible in
ps): tokens, secret keys and
passwords travel via env vars (AZURE_ARM_TOKEN, K8S_TOKEN, …) or free args, and the description must say so.
- The default command must be complete and useful with zero free args.
Known builtin payload.json keys (no declaration needed beyond the params entry). Operator parameters are declared at runtime in params/operator.yaml and are therefore not listed here.
Step 5 — Runtime order (design against this, not against wishes)
- Placeholders substitute from live shell params ONLY (
payload.json∪params/*.yaml); missing keys render literally, exceptrequired: trueparams missing from params abort with a warning. - If
install_pathmissing:git clone <repo_url> <install_path>, thencd <install_path> && <install_command>. Install runs only on fresh clone, never again. If the binary is missing later, the operator only gets a warning + hint. - Execute:
cd <install_path> && <execute_command> <free-args>. A missing first token only warns — it never installs. upload_file: comma-separated paths →upload_c2each (C2 must be live).remote_command: placeholders substituted →issue_command_to_c2.download_file: comma-separated victim paths →download_c2each.lazycommand: placeholders substituted, split by comma, each chunk runs as a LazyOwn shell command viaonecmd. Printed, not silent.
Consequences: no commas inside `lazycommand`/`upload_file`/`download_file` entries — a comma is a separator, not punctuation. install_command must leave the tool runnable without operator input. Stage delivery artefacts to sessions/ with stable names so the C2 file endpoint can serve them (../../../sessions/<file> from inside install_path).
Step 6 — install_command decision tree
Prefer the release-tarball pattern (see trivy.yaml/grype.yaml) over building from source when the repo publishes binaries: faster, deterministic, no toolchain dependency.
Step 7 — C2 staging fields (archetypes C and D)
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 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/lazyaddon-creator/SKILL.md
Popularity
- Repository stars
- 300
- Repository forks
- 63
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. 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/lazyaddon-creator)