Dbg
theodo-group/debug-that
Debug applications using the dbg CLI debugger. An agent skill from theodo-group/debug-that.
Static memory leak pattern scanner for Node.js, Python, Go, and Java.
$ npx skills add LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills phy-memory-leak-detector --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/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/phy-memory-leak-detector .claude/skills/phy-memory-leak-detector && 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 "phy-memory-leak-detector" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/phy-memory-leak-detector into .claude/skills/phy-memory-leak-detector/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "phy-memory-leak-detector", 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/LeoYeAI/openclaw-master-skills/tree/main/skills/phy-memory-leak-detectorType 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 LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills phy-memory-leak-detector --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/phy-memory-leak-detector .agents/skills/phy-memory-leak-detector && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "phy-memory-leak-detector" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/phy-memory-leak-detector into .agents/skills/phy-memory-leak-detector/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "phy-memory-leak-detector", 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 LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills phy-memory-leak-detector --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/phy-memory-leak-detector .cursor/skills/phy-memory-leak-detector && 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 "phy-memory-leak-detector" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/phy-memory-leak-detector into .cursor/skills/phy-memory-leak-detector/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "phy-memory-leak-detector", 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/LeoYeAI/openclaw-master-skills.git --path skills/phy-memory-leak-detector--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 LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills phy-memory-leak-detector --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/phy-memory-leak-detector .gemini/skills/phy-memory-leak-detector && 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 "phy-memory-leak-detector" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/phy-memory-leak-detector into .gemini/skills/phy-memory-leak-detector/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "phy-memory-leak-detector", 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 LeoYeAI/openclaw-master-skills phy-memory-leak-detectorInstalls 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 LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/phy-memory-leak-detector .github/skills/phy-memory-leak-detector && 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 "phy-memory-leak-detector" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/phy-memory-leak-detector into .github/skills/phy-memory-leak-detector/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "phy-memory-leak-detector", 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 LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills phy-memory-leak-detector --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/phy-memory-leak-detector .opencode/skills/phy-memory-leak-detector && 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 "phy-memory-leak-detector" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/phy-memory-leak-detector into .opencode/skills/phy-memory-leak-detector/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "phy-memory-leak-detector", 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.
phy-memory-leak-detectorStatic memory leak pattern scanner for Node.js, Python, Go, and Java.
Phy Memory Leak Detector is an agent skill from LeoYeAI/openclaw-master-skills. Static memory leak pattern scanner for Node.js, Python, Go, and Java. Analyzes source files to detect event listener leaks (addEventListener without corresponding removeEventListener), unbounded cache growth (Maps/objects grown in closures without eviction), setInterval/setTimeout references that prevent GC, large buffer allocations inside request handlers, global variable accumulation, circular reference patterns, and missing cleanup in class destructors/useEffect. For Node.js also runs --expose-gc heap snapshot…
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `_meta.json`).
It sits in Development, covering Performance optimization. It works with Node.js, Java and Python. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e5199b5. 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:
nodenpxgoFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
From 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.
Phy Memory Leak Detector loads about 4.3k tokens when it runs. Until then it costs about 205 tokens; SKILL.md has 284 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 LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its Apache-2.0 licence (© LeoYeAI). 284 words, ~4,251 tokens.
.claude/skills/phy-memory-leak-detector/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Your Node.js process uses 200MB on startup. After 4 hours, it's at 2GB. You restart it at 3am. The next day it happens again.
This skill scans your codebase for the 12 static patterns that cause 95% of memory leaks in production services — event listener accumulation, unbounded caches, closure-captured large objects, setInterval without clear. It also guides you through a heap snapshot diff to confirm the leak at runtime.
Supports Node.js, Python, Go, Java. Zero external API.
# Option 1: Scan entire project
/mem-leak
# Option 2: Scan specific directory
/mem-leak src/
# Option 3: Focus on specific pattern
/mem-leak --check listeners # event listener leaks
/mem-leak --check timers # setInterval/setTimeout leaks
/mem-leak --check caches # unbounded Map/object growth
/mem-leak --check closures # large objects captured in closures
/mem-leak --check globals # global variable accumulation
# Option 4: Node.js runtime heap snapshot diff
/mem-leak --heap-diff # takes snapshot, runs 100 requests, takes second snapshot
# Option 5: CI mode
/mem-leak --ci --max-critical 0import re
import glob
from pathlib import Path
from dataclasses import dataclass, field
@dataclass
class LeakFinding:
file: str
line: int
code: str
pattern: str # LISTENER_LEAK, TIMER_LEAK, UNBOUNDED_CACHE, etc.
severity: str # CRITICAL / HIGH / MEDIUM / LOW
message: str
fix: str# Language-specific memory leak patterns
SKIP_DIRS = {'node_modules', '.git', 'dist', 'build', '__pycache__',
'.next', 'vendor', 'venv', '.venv', 'test', 'spec', '__tests__'}
# ── Node.js / JavaScript / TypeScript ────────────────────────────────────────
JS_PATTERNS = [
# Event listener leak: addEventListener in a function without removeEventListener
{
'name': 'LISTENER_LEAK',
'pattern': re.compile(
r'\.addEventListener\s*\(\s*["\'](\w+)["\']',
re.I
),
'check': lambda line, context: 'removeEventListener' not in context,
'severity': 'HIGH',
'message': 'addEventListener without matching removeEventListener — leaks on every call',
'fix': (
"Store the listener reference and call removeEventListener in cleanup:\n"
" const handler = () => {...};\n"
" el.addEventListener('event', handler);\n"
" // In cleanup: el.removeEventListener('event', handler);"
),
},
# setInterval without clearInterval
{
'name': 'TIMER_LEAK',
'pattern': re.compile(r'\bsetInterval\s*\('),
'check': lambda line, context: 'clearInterval' not in context,
'severity': 'HIGH',
'message': 'setInterval without clearInterval — timer keeps running even after component unmounts',
'fix': (
"Store the interval ID and clear in cleanup:\n"
" const id = setInterval(fn, ms);\n"
" // In cleanup/useEffect return: clearInterval(id);"
),
},
# Node.js EventEmitter: on() without off() in request handler
{
'name': 'EMITTER_LEAK',
'pattern': re.compile(
r'(emitter|ee|bus|pubsub|EventEmitter)\.(on|once)\s*\(',
re.I
),
'check': lambda line, context: '.off(' not in context and '.removeListener(' not in context,
'severity': 'MEDIUM',
'message': 'EventEmitter.on() without corresponding .off() — listeners accumulate',
'fix': "Add emitter.off(event, handler) in cleanup, or use emitter.once() for one-time listeners",
},
# Global Map/Set growing inside a module (cache without size limit)
{
'name': 'UNBOUNDED_CACHE',
'pattern': re.compile(
r'^(const|let|var)\s+\w+\s*=\s*new\s+(Map|Set)\s*\(\s*\)',
re.M
),
'check': lambda line, context: '.delete(' not in context and '.clear(' not in context and 'size' not in context,
'severity': 'MEDIUM',
'message': 'Module-level Map/Set with no eviction — grows unbounded over time',
'fix': (
"Add size limit with LRU eviction:\n"
" if (cache.size >= MAX_SIZE) cache.delete(cache.keys().next().value);\n"
" cache.set(key, value);\n"
"Or use lru-cache: npm install lru-cache"
),
},
# Large buffer/array allocation per request
{
'name': 'REQUEST_ALLOCATION',
'pattern': re.compile(
r'Buffer\.alloc\s*\(\s*\d{6,}|new\s+Array\s*\(\s*\d{5,}',
re.I
),
'check': lambda line, context: True, # Always flag
'severity': 'MEDIUM',
'message': 'Large buffer/array allocated per request — check that it is released',
'fix': "Ensure large allocations go out of scope after request completes. Avoid module-level assignment.",
},
# require() inside a loop or hot path
{
'name': 'DYNAMIC_REQUIRE_IN_LOOP',
'pattern': re.compile(r'\brequire\s*\([^)]+\)'),
'check': lambda line, context: re.search(r'\b(for|while|forEach|map|reduce)\b', context[:200] or ''),
'severity': 'LOW',
'message': 'require() inside loop — repeated module loading holds references',
'fix': "Move require() to the top of the file outside any loop",
},
# Missing cleanup in React useEffect
{
'name': 'USEEFFECT_NO_CLEANUP',
'pattern': re.compile(r'useEffect\s*\(\s*\(\s*\)\s*=>'),
'check': lambda line, context: 'return' not in context[context.find('useEffect'):context.find('useEffect')+500 if 'useEffect' in context else 0:],
'severity': 'MEDIUM',
'message': 'useEffect with no cleanup return — subscriptions/timers inside will leak on unmount',
'fix': (
"Add cleanup:\n"
" useEffect(() => {\n"
" const sub = subscribe();\n"
" return () => sub.unsubscribe(); // cleanup\n"
" }, [deps]);"
),
},
]
# ── Python ────────────────────────────────────────────────────────────────────
PYTHON_PATTERNS = [
# Global list/dict that grows (common caching anti-pattern)
{
'name': 'GLOBAL_ACCUMULATOR',
'pattern': re.compile(
r'^(CACHE|RESULTS|HISTORY|LOG|BUFFER|DATA|QUEUE)\s*=\s*[\[\{]',
re.M
),
'check': lambda line, context: '.pop(' not in context and '.clear(' not in context and 'maxsize' not in context,
'severity': 'MEDIUM',
'message': 'Module-level mutable container without eviction — accumulates data for process lifetime',
'fix': "Use functools.lru_cache(maxsize=N) or limit size manually with CACHE[:MAX_SIZE]",
},
# Django/Flask: large queryset not using .iterator()
{
'name': 'ORM_FULL_QUERYSET',
'pattern': re.compile(r'\.all\(\)\s*$|\.filter\([^)]*\)\s*$', re.M),
'check': lambda line, context: '.iterator(' not in context and 'for ' in context,
'severity': 'MEDIUM',
'message': 'QuerySet.all()/filter() in loop without .iterator() — loads entire table into memory',
'fix': "Use Model.objects.filter(...).iterator() for large datasets to stream rows",
},
# Circular reference with __del__
{
'name': 'CIRCULAR_WITH_DEL',
'pattern': re.compile(r'def\s+__del__\s*\(self\)'),
'check': lambda line, context: True,
'severity': 'LOW',
'message': '__del__ method detected — objects with __del__ and circular refs are not collected by CPython GC',
'fix': "Use weakref.ref() to break circular references, or use contextlib.contextmanager instead of __del__",
},
]
# ── Go ────────────────────────────────────────────────────────────────────────
GO_PATTERNS = [
# Goroutine leak: go func() without context cancellation
{
'name': 'GOROUTINE_LEAK',
'pattern': re.compile(r'\bgo\s+func\s*\('),
'check': lambda line, context: 'context' not in context and 'done' not in context and 'cancel' not in context,
'severity': 'HIGH',
'message': 'goroutine started without context or done channel — may run forever on error paths',
'fix': (
"Pass context to goroutine and select on ctx.Done():\n"
" go func(ctx context.Context) {\n"
" select {\n"
" case <-ctx.Done(): return\n"
" case result := <-work: ...\n"
" }\n"
" }(ctx)"
),
},
# HTTP response body not closed
{
'name': 'RESP_BODY_NOT_CLOSED',
'pattern': re.compile(r'http\.(Get|Post|Do)\s*\('),
'check': lambda line, context: 'defer' not in context or 'Body.Close' not in context,
'severity': 'HIGH',
'message': 'HTTP response body not closed — leaks TCP connections and memory',
'fix': "Add: defer resp.Body.Close() immediately after checking err",
},
# Unbounded channel
{
'name': 'UNBOUNDED_CHANNEL',
'pattern': re.compile(r'make\s*\(\s*chan\s+\w+\s*\)'),
'check': lambda line, context: True,
'severity': 'MEDIUM',
'message': 'Unbounded channel (no buffer size) — sender blocks if receiver is slow, causing goroutine leak',
'fix': "Use make(chan T, N) with an appropriate buffer size, or ensure consumer keeps up with producer",
},
]
def find_leaks(src_dir: str = '.') -> list[LeakFinding]:
"""Scan source files for memory leak patterns."""
findings = []
EXT_PATTERNS = {
'.js': JS_PATTERNS, '.jsx': JS_PATTERNS,
'.ts': JS_PATTERNS, '.tsx': JS_PATTERNS, '.mjs': JS_PATTERNS,
'.py': PYTHON_PATTERNS,
'.go': GO_PATTERNS,
}
for ext, patterns in EXT_PATTERNS.items():
for fpath in glob.glob(f'{src_dir}/**/*{ext}', recursive=True):
if any(skip in fpath for skip in SKIP_DIRS):
continue
try:
content = Path(fpath).read_text(errors='replace')
lines = content.splitlines()
except Exception:
continue
for i, line in enumerate(lines, 1):
for p in patterns:
if p['pattern'].search(line):
# Context window (±10 lines)
ctx_start = max(0, i - 10)
ctx_end = min(len(lines), i + 10)
context = '\n'.join(lines[ctx_start:ctx_end])
if p['check'](line, context):
findings.append(LeakFinding(
file=fpath,
line=i,
code=line.strip()[:120],
pattern=p['name'],
severity=p['severity'],
message=p['message'],
fix=p['fix'],
))
return findings# Confirms whether a static finding is actually leaking at runtime
# Requires Node.js process to be running locally
# 1. Start your server with --expose-gc
node --expose-gc server.js &
SERVER_PID=$!
sleep 2
# 2. Take initial heap snapshot via clinic.js or heapdump
npx clinic heapprofiler -- node --expose-gc server.js &
# OR use the v8-profiler-next approach:
node -e "
const v8 = require('v8');
const fs = require('fs');
// Take snapshot before
global.gc();
const before = process.memoryUsage().heapUsed;
// Simulate 100 requests (adjust URL/count)
const http = require('http');
let done = 0;
for (let i = 0; i < 100; i++) {
http.get('http://localhost:3000/api/users', (res) => {
res.resume();
res.on('end', () => {
done++;
if (done === 100) {
global.gc();
const after = process.memoryUsage().heapUsed;
const diff = (after - before) / 1024 / 1024;
console.log('Heap diff after 100 requests: ' + diff.toFixed(2) + ' MB');
if (diff > 5) {
console.log('⚠️ CONFIRMED LEAK: heap grew ' + diff.toFixed(2) + 'MB');
process.exit(1);
} else {
console.log('✅ No significant leak detected');
}
}
});
});
}
"
# 3. Use clinic.js for visual flame graph
npx clinic flame -- node server.js
# Then run load test with autocannon:
npx autocannon -c 10 -d 30 http://localhost:3000/api/users## Memory Leak Analysis
Project: my-api | Files scanned: 89 | Patterns checked: 12
---
### Summary
| Pattern | Count | Severity |
|---------|-------|---------|
| 🔴 Goroutine Leak | 3 | HIGH |
| 🟠 EventEmitter without .off() | 5 | MEDIUM |
| 🟠 Unbounded Map/Set cache | 4 | MEDIUM |
| 🟡 useEffect without cleanup | 7 | MEDIUM |
| ⚪ Large allocation per request | 2 | LOW |
---
### 🔴 HIGH — Goroutine Leaks (3 found)
**handlers/stream.go:45**
```go
go func() {
for data := range ch {
conn.Write(data)
}
}()⚠️ Goroutine has no context — if conn is closed on client disconnect, goroutine blocks forever on ch.
Fix:
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
case data, ok := <-ch:
if !ok { return }
conn.Write(data)
}
}
}(req.Context())src/services/user.ts:12
const userCache = new Map<string, User>();
export function getUser(id: string): User {
if (!userCache.has(id)) {
userCache.set(id, fetchUser(id));
}
return userCache.get(id)!;
}⚠️ userCache grows forever — one entry per unique user ID seen. With 100K users, this holds ~100K objects in memory indefinitely.
Fix:
import LRU from 'lru-cache';
const userCache = new LRU<string, User>({ max: 1000, ttl: 1000 * 60 * 5 });src/components/LiveFeed.tsx:34
useEffect(() => {
const ws = new WebSocket(WS_URL);
ws.onmessage = (e) => setMessages(prev => [...prev, e.data]);
}, []);⚠️ WebSocket not closed on unmount — connection persists after component unmounts. Message handler references setMessages → prevents component GC.
Fix:
useEffect(() => {
const ws = new WebSocket(WS_URL);
ws.onmessage = (e) => setMessages(prev => [...prev, e.data]);
return () => ws.close(); // cleanup
}, []);# Confirm the goroutine leak:
go tool pprof http://localhost:6060/debug/pprof/goroutine
# Look for: growing count of goroutines in stream.go:45
# Confirm the Map leak:
node --expose-gc -e "require('./heap-diff.js')"
# Expected output if leaking: "Heap diff after 100 requests: 18.4 MB ⚠️ CONFIRMED LEAK"
---
## Quick Mode Output
Memory Leak Scan: my-api (89 files)
🔴 3 goroutine leaks — go func() without ctx.Done() (handlers/stream.go:45, :89, :112) 🟠 5 EventEmitter.on() without .off() — listeners accumulate per request 🟠 4 unbounded Maps — userCache, sessionCache, configCache, tokenCache (no eviction) 🟡 7 useEffect without cleanup return
Worst offender: userCache (Map with no size limit, user.ts:12) Quick fix: npm install lru-cache → replace new Map() with new LRU({ max: 1000 }) Runtime confirm: node --expose-gc + 100 req test → should show heap growth
© LeoYeAI, 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
SKILL.md and 1 other file in skills/phy-memory-leak-detector of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
Phy Memory Leak Detector 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 |
|---|---|---|---|---|---|---|
| Phy Memory Leak Detector this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| Dbgtheodo-group/debug-that | 158 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Climber Step Minimizationben-manes/caffeine | 18k | — | ~3k | Automated safety check: Notes | Apache-2.0 | |
| Performance Profileralirezarezvani/claude-skills | 28k | — | ~684 | Automated safety check: Pass | MIT | |
| Release Coherencemacalbert/envilder | 138 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Profiling Application Performancejeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~894 | Automated safety check: Pass | MIT |
theodo-group/debug-that
Debug applications using the dbg CLI debugger. An agent skill from theodo-group/debug-that.
ben-manes/caffeine
Prices each step of the window climber algorithm by disabling it in turn, to find steps that no longer earn their keep and branches that no longer fire.
alirezarezvani/claude-skills
Systematic performance profiling for Node.js, Python, and Go applications.
macalbert/envilder
Unified release coherence workflow for any component (CLI, GHA, or SDK).
jeremylongshore/tons-of-skills-marketplace
Execute this skill enables AI assistant to profile application performance, analyzing cpu usage, memory consumption, and execution time.
PrepLabsAI/InterviewMentor
A performance engineer interviewer who profiles production systems for memory leaks.
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Categories
Static memory leak pattern scanner for Node.js, Python, Go, and Java. Phy Memory Leak Detector is an agent skill from LeoYeAI/openclaw-master-skills.js, Python, Go, and Java.
Phy Memory Leak Detector fits situations like: OOM in production; event listener leak; setInterval not cleared.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a claude-code`. Or copy the skill folder (skills/phy-memory-leak-detector in LeoYeAI/openclaw-master-skills) into .claude/skills/phy-memory-leak-detector in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a codex`. Or copy the skill folder (skills/phy-memory-leak-detector in LeoYeAI/openclaw-master-skills) into .agents/skills/phy-memory-leak-detector 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 LeoYeAI/openclaw-master-skills --skill phy-memory-leak-detector -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/phy-memory-leak-detector, .gemini/skills/phy-memory-leak-detector, .github/skills/phy-memory-leak-detector and .opencode/skills/phy-memory-leak-detector in your project.
Going by SKILL.md and its folder, Phy Memory Leak Detector needs the command-line tools its instructions call (node, npx and go). Our summary lists: Python 3; Node.js.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. 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.
Phy Memory Leak Detector is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k 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 Phy Memory Leak Detector: Dbg (theodo-group/debug-that, 158 stars), Climber Step Minimization (ben-manes/caffeine, 18k stars), Performance Profiler (alirezarezvani/claude-skills, 28k stars) and Release Coherence (macalbert/envilder, 138 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,160 GitHub stars. The repository holds 1,235 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.