Minimega
sandia-minimega/minimega
This skill should be used when the user asks how to configure, run, automate, integrate, or troubleshoot minimega (VMs, namespaces, VLANs, clusters, miniccc, miniweb, command socket or Python API…
Scaffold a new SkyWalking Python instrumentation plugin with all required files (plugin code, tests, docker-compose, expected data, services)
$ npx skills add apache/skywalking-python --skill new-plugin -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install apache/skywalking-python new-plugin --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/apache/skywalking-python.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/new-plugin .claude/skills/new-plugin && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "new-plugin" agent skill from https://github.com/apache/skywalking-python/tree/master/.claude/skills/new-plugin into .claude/skills/new-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-plugin", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/apache/skywalking-python/tree/master/.claude/skills/new-pluginType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add apache/skywalking-python --skill new-plugin -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install apache/skywalking-python new-plugin --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/skywalking-python.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/new-plugin .agents/skills/new-plugin && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "new-plugin" agent skill from https://github.com/apache/skywalking-python/tree/master/.claude/skills/new-plugin into .agents/skills/new-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-plugin", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add apache/skywalking-python --skill new-plugin -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install apache/skywalking-python new-plugin --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/skywalking-python.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/new-plugin .cursor/skills/new-plugin && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "new-plugin" agent skill from https://github.com/apache/skywalking-python/tree/master/.claude/skills/new-plugin into .cursor/skills/new-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-plugin", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/apache/skywalking-python.git --path .claude/skills/new-plugin--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add apache/skywalking-python --skill new-plugin -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install apache/skywalking-python new-plugin --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/skywalking-python.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/new-plugin .gemini/skills/new-plugin && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "new-plugin" agent skill from https://github.com/apache/skywalking-python/tree/master/.claude/skills/new-plugin into .gemini/skills/new-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-plugin", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install apache/skywalking-python new-pluginInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add apache/skywalking-python --skill new-plugin -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/apache/skywalking-python.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/new-plugin .github/skills/new-plugin && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "new-plugin" agent skill from https://github.com/apache/skywalking-python/tree/master/.claude/skills/new-plugin into .github/skills/new-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-plugin", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add apache/skywalking-python --skill new-plugin -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install apache/skywalking-python new-plugin --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/skywalking-python.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/new-plugin .opencode/skills/new-plugin && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "new-plugin" agent skill from https://github.com/apache/skywalking-python/tree/master/.claude/skills/new-plugin into .opencode/skills/new-plugin/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-plugin", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
new-pluginScaffold a new SkyWalking Python instrumentation plugin with all required files (plugin code, tests, docker-compose, expected data, services)
New Plugin is an agent skill from apache/skywalking-python. Scaffold a new SkyWalking Python instrumentation plugin with all required files (plugin code, tests, docker-compose, expected data, services)
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in DevOps & Cloud, covering Containers and Observability. It works with Python, Docker and Apache Kafka. The repository describes itself as: The Python agent for Apache SkyWalking. The licence is Apache-2.0.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 5666826. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
makepoetrypipFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
New Plugin loads about 3.3k tokens when it runs. Until then it costs about 38 tokens; SKILL.md has 524 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from apache/skywalking-python at commit 5666826, republished under its Apache-2.0 licence (© apache). 524 words, ~3,319 tokens.
.claude/skills/new-plugin/SKILL.md (or your agent's skills folder).Generate a complete instrumentation plugin for the SkyWalking Python agent. Ask the user for:
httpx, pymemcache, clickhouse-driver)['1.0', '2.0'])>=3.7)If the user provides a library name without details, research the library to determine the appropriate type and instrumentation points.
skywalking/plugins/sw_<name>.pyUse the Apache 2.0 license header (copy from any existing plugin file).
Follow these patterns based on plugin type:
For HTTP Exit plugins (like sw_requests.py):
from skywalking import Layer, Component, config
from skywalking.trace.context import get_context, NoopContext
from skywalking.trace.span import NoopSpan
from skywalking.trace.tags import TagHttpMethod, TagHttpURL, TagHttpStatusCode
link_vector = ['<documentation URL>']
support_matrix = {
'<pip-package-name>': {
'>=3.13': ['<major>.*'], # use .* wildcard for latest patch (e.g., '4.*')
'>=3.10': ['<older_minor>.*', '<major>.*'],
}
}
note = """"""
def install():
from <library> import <Class>
_original = <Class>.<method>
def _sw_method(this, *args, **kwargs):
# Parse URL/peer from args
span = NoopSpan(NoopContext()) if config.ignore_http_method_check(method) \
else get_context().new_exit_span(op=path, peer=netloc, component=Component.<Name>)
with span:
carrier = span.inject()
span.layer = Layer.Http
# Inject carrier into outgoing headers
for item in carrier:
headers[item.key] = item.val
span.tag(TagHttpMethod(method))
span.tag(TagHttpURL(url))
res = _original(this, *args, **kwargs)
span.tag(TagHttpStatusCode(res.status_code))
if res.status_code >= 400:
span.error_occurred = True
return res
<Class>.<method> = _sw_methodFor Web Entry plugins (like sw_flask.py):
from skywalking import Layer, Component, config
from skywalking.trace.carrier import Carrier
from skywalking.trace.context import get_context, NoopContext
from skywalking.trace.span import NoopSpan
from skywalking.trace.tags import TagHttpMethod, TagHttpURL, TagHttpStatusCode
def install():
from <framework> import <App>
_original = <App>.<handler_method>
def _sw_handler(this, *args, **kwargs):
req = <get_request>
carrier = Carrier()
for item in carrier:
if item.key.capitalize() in req.headers:
item.val = req.headers[item.key.capitalize()]
span = NoopSpan(NoopContext()) if config.ignore_http_method_check(req.method) \
else get_context().new_entry_span(op=req.path, carrier=carrier, inherit=Component.General)
with span:
span.layer = Layer.Http
span.component = Component.<Name>
span.peer = f"{remote_addr}:{remote_port}"
span.tag(TagHttpMethod(req.method))
span.tag(TagHttpURL(req.url))
resp = _original(this, *args, **kwargs)
span.tag(TagHttpStatusCode(resp.status_code))
if resp.status_code >= 400:
span.error_occurred = True
return resp
<App>.<handler_method> = _sw_handlerFor Database/Cache Exit plugins (like sw_redis.py):
from skywalking import Layer, Component
from skywalking.trace.context import get_context
from skywalking.trace.tags import TagDbType, TagDbInstance, TagDbStatement # or TagCacheType, TagCacheOp, etc.
def install():
from <library> import <Connection>
_original = <Connection>.<method>
def _sw_method(this, *args, **kwargs):
peer = f'{this.host}:{this.port}'
with get_context().new_exit_span(op='<DB>/<operation>', peer=peer, component=Component.<Name>) as span:
span.layer = Layer.Database # or Layer.Cache
span.tag(TagDbType('<DB type>'))
span.tag(TagDbStatement(query))
res = _original(this, *args, **kwargs)
return res
<Connection>.<method> = _sw_methodFor MQ plugins (producer Exit + consumer Entry):
For async plugins: Use async def wrappers, await the original call.
For C extension libraries: Use wrapt.ObjectProxy pattern (see sw_psycopg2.py).
skywalking/__init__.pyAdd a new entry to the Component enum. Check the last Python-specific ID (7000+) and increment. Example:
NewLib = 7020 # Next available IDIf the component already exists in the SkyWalking ecosystem (check existing enum), reuse that ID.
tests/plugin/{data|http|web}/sw_<name>/Choose the subdirectory:
web/ for web frameworkshttp/ for HTTP clientsdata/ for databases, caches, message queuesCreate these files:
__init__.pyEmpty file with license header.
test_<name>.pyfrom typing import Callable
import pytest
import requests
from skywalking.plugins.sw_<name> import support_matrix
from tests.orchestrator import get_test_vector
from tests.plugin.base import TestPluginBase
@pytest.fixture
def prepare():
return lambda *_: requests.get('http://0.0.0.0:9090/<endpoint>', timeout=5)
class TestPlugin(TestPluginBase):
@pytest.mark.parametrize('version', get_test_vector(lib_name='<name>', support_matrix=support_matrix))
def test_plugin(self, docker_compose, version):
self.validate()docker-compose.ymlversion: '2.1'
services:
collector:
extends:
service: collector
file: ../../docker-compose.base.yml
# Add external service if needed (database, cache, MQ broker)
# <service_name>:
# image: <image>
# ports: [<port>:<port>]
# healthcheck: ...
# networks: [beyond]
provider:
extends:
service: agent
file: ../../docker-compose.base.yml
ports:
- 9091:9091
volumes:
- .:/app
command: ['bash', '-c', 'pip install flask && pip install -r /app/requirements.txt && sw-python run python3 /app/services/provider.py']
depends_on:
collector:
condition: service_healthy
healthcheck:
test: ["CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/9091"]
interval: 5s
timeout: 60s
retries: 120
environment:
SW_AGENT_NAME: provider
SW_AGENT_LOGGING_LEVEL: DEBUG
consumer:
extends:
service: agent
file: ../../docker-compose.base.yml
ports:
- 9090:9090
volumes:
- .:/app
command: ['bash', '-c', 'pip install flask && pip install -r /app/requirements.txt && sw-python run python3 /app/services/consumer.py']
depends_on:
collector:
condition: service_healthy
provider:
condition: service_healthy
environment:
SW_AGENT_NAME: consumer
SW_AGENT_LOGGING_LEVEL: DEBUG
networks:
beyond:Key points:
sw-python run python3 to start with agent instrumentationprepare() fixture to hitpip install -r /app/requirements.txtservices/provider.pyFlask app on port 9091 that uses the target library. Example for a data plugin:
if __name__ == '__main__':
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/endpoint', methods=['POST', 'GET'])
def handler():
import <target_library>
# Make a call using the target library
# e.g., client = redis.StrictRedis(host='redis'); client.get('key')
return jsonify({'status': 'ok'})
app.run(host='0.0.0.0', port=9091)services/consumer.pyFlask app on port 9090 that calls the provider:
import requests
if __name__ == '__main__':
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/endpoint', methods=['POST', 'GET'])
def handler():
res = requests.post('http://provider:9091/endpoint', timeout=5)
return jsonify(res.json())
app.run(host='0.0.0.0', port=9090)services/__init__.pyEmpty file with license header.
expected.data.ymlDefine expected spans. Structure depends on plugin type:
For a data/cache Exit plugin (consumer -> provider -> external service):
segmentItems:
- serviceName: provider
segmentSize: 1
segments:
- segmentId: not null
spans:
- operationName: <DB>/<operation>
parentSpanId: 0
spanId: 1
spanLayer: Database # or Cache
startTime: gt 0
endTime: gt 0
componentId: <ID>
spanType: Exit
peer: <service>:<port>
skipAnalysis: false
tags:
- key: db.type
value: <type>
- key: db.statement
value: <query>
- operationName: /endpoint
parentSpanId: -1
spanId: 0
spanLayer: Http
startTime: gt 0
endTime: gt 0
componentId: 7001
spanType: Entry
peer: not null
skipAnalysis: false
tags:
- key: http.method
value: POST
- key: http.url
value: http://provider:9091/endpoint
- key: http.status_code
value: '200'
refs:
- parentEndpoint: /endpoint
networkAddress: 'provider:9091'
refType: CrossProcess
parentSpanId: 1
parentTraceSegmentId: not null
parentServiceInstance: not null
parentService: consumer
traceId: not null
- serviceName: consumer
segmentSize: 1
segments:
- segmentId: not null
spans:
- operationName: /endpoint
parentSpanId: 0
spanId: 1
spanLayer: Http
startTime: gt 0
endTime: gt 0
componentId: 7002
spanType: Exit
peer: provider:9091
skipAnalysis: false
tags:
- key: http.method
value: POST
- key: http.url
value: http://provider:9091/endpoint
- key: http.status_code
value: '200'
- operationName: /endpoint
parentSpanId: -1
spanId: 0
spanLayer: Http
startTime: gt 0
endTime: gt 0
componentId: 7001
spanType: Entry
peer: not null
skipAnalysis: false
tags:
- key: http.method
value: GET
- key: http.url
value: http://0.0.0.0:9090/endpoint
- key: http.status_code
value: '200'Important notes for expected data:
parentSpanId: -1componentId must match the Component enum value exactlyrequests.post()pyproject.tomlAdd the library to [tool.poetry.group.plugins.dependencies]:
poetry add <library> --group pluginsmake doc-genmake lintAfter generating all files, remind the user:
make doc-gen to regenerate Plugins.mdmake lint to verify code stylepoetry run pytest -v tests/plugin/<category>/sw_<name>/© apache, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/new-plugin of apache/skywalking-python.
Open the folder on GitHubat commit 5666826
New Plugin next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| New Plugin this skillapache/skywalking-python | 219 | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Minimegasandia-minimega/minimega | 160 | — | ~3.2k | Automated safety check: Pass | GPL-3.0-only | |
| Unraiddinglebear-ai/unraid | 135 | — | ~5.4k | Automated safety check: Notes | MIT | |
| Cosmos3 Env TroubleshootNVIDIA/cosmos-framework | 556 | — | ~1.3k | Automated safety check: Notes | Custom licence | |
| Generate Nemo Gym Envadithya-s-k/FineEnvs | 421 | — | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| Liveblog Devliveblog/liveblog | 118 | — | ~1.9k | Automated safety check: Pass | AGPL-3.0 |
sandia-minimega/minimega
This skill should be used when the user asks how to configure, run, automate, integrate, or troubleshoot minimega (VMs, namespaces, VLANs, clusters, miniccc, miniweb, command socket or Python API…
dinglebear-ai/unraid
This skill should be used when the user mentions Unraid, asks to check server health, monitor array or disk status, list or restart Docker containers, start or stop VMs, read system logs, check…
NVIDIA/cosmos-framework
Diagnose and fix Cosmos3 environment, installation, and runtime errors.
adithya-s-k/FineEnvs
Builds a NeMo Gym (NVIDIA) variant of an RL environment. An agent skill from adithya-s-k/FineEnvs.
liveblog/liveblog
Run a local Liveblog development environment. An agent skill from liveblog/liveblog.
NewFuture/DDNS
Maintains the DDNS project's GitHub Actions, Docker and Nuitka builds, packaging and release preparation without touching publishing credentials.
apache/skywalking-python
Build Docker test images and run SkyWalking Python plugin/unit/e2e tests locally, mirroring the CI pipeline
Works with
Categories
Scaffold a new SkyWalking Python instrumentation plugin with all required files (plugin code, tests, docker-compose, expected data, services). New Plugin is an agent skill from apache/skywalking-python.
New Plugin fits situations like: tasks that involve Containers; tasks that involve Observability.
Run `npx skills add apache/skywalking-python --skill new-plugin -a claude-code`. Or copy the skill folder (.claude/skills/new-plugin in apache/skywalking-python) into .claude/skills/new-plugin in your project. Claude Code loads it when a task matches its description.
Run `npx skills add apache/skywalking-python --skill new-plugin -a codex`. Or copy the skill folder (.claude/skills/new-plugin in apache/skywalking-python) into .agents/skills/new-plugin in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add apache/skywalking-python --skill new-plugin -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/new-plugin, .gemini/skills/new-plugin, .github/skills/new-plugin and .opencode/skills/new-plugin in your project.
Going by SKILL.md and its folder, New Plugin needs the command-line tools its instructions call (make, poetry and pip). Our summary lists: Python 3; Docker.
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
New Plugin is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with New Plugin: Minimega (sandia-minimega/minimega, 160 stars), Unraid (dinglebear-ai/unraid, 135 stars), Cosmos3 Env Troubleshoot (NVIDIA/cosmos-framework, 556 stars) and Generate Nemo Gym Env (adithya-s-k/FineEnvs, 421 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
apache (a GitHub organization) maintains it in apache/skywalking-python, which has 219 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on September 22, 2026.
Source: apache/skywalking-python on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.