[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CXCD9GNFVCGAEM8FZ3G8G1":3,"skill-same:01M6CXCD9GNFVCGAEM8FZ3G8G1":118},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":66,"ownerHtmlUrl":67,"ownerBlogUrl":68,"ownerDescription":69,"updatedAt":70,"install":71,"resources":84},"01M6CXCD9GNFVCGAEM8FZ3G8G1","perf-profiler",null,"Profile and optimize application performance. Use when diagnosing slow code, measuring CPU\u002Fmemory usage, generating flame graphs, benchmarking functions, load testing APIs, finding memory leaks, or optimizing database queries.","albertdobmeyer\u002Fopentrapp","albertdobmeyer","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F116975874?v=4","01M6CXARYAZ30V12S7PSG93R84","Albert Dobmeyer","01M6CXAS2FG5GCXZYN3XBFJQV6",2,"MIT","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Fperf-profiler\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"perf profiler","perf","database","optimize","load testing apis","queries","functions","use","curl","node","python3","testing","win32","code","load testing","benchmarking","performance","memory","linux","go","2026-11-10 10:12:30",false,"---\nname: perf-profiler\nversion: 1.0.0\ndescription: Profile and optimize application performance. Use when diagnosing slow code, measuring CPU\u002Fmemory usage, generating flame graphs, benchmarking functions, load testing APIs, finding memory leaks, or optimizing database queries.\nmetadata: {\"clawdbot\":{\"emoji\":\"⚡\",\"requires\":{\"anyBins\":[\"node\",\"python3\",\"go\",\"curl\",\"ab\"]},\"os\":[\"linux\",\"darwin\",\"win32\"]}}\n---\n\n# Performance Profiler\n\nMeasure, profile, and optimize application performance. Covers CPU profiling, memory analysis, flame graphs, benchmarking, load testing, and language-specific optimization patterns.\n\n## When to Use\n\n- Diagnosing why an application or function is slow\n- Measuring CPU and memory usage\n- Generating flame graphs to visualize hot paths\n- Benchmarking functions or endpoints\n- Load testing APIs before deployment\n- Finding and fixing memory leaks\n- Optimizing database query performance\n- Comparing performance before and after changes\n\n## Quick Timing\n\n### Command-line timing\n\n```bash\n# Time any command\ntime my-command --flag\n\n# More precise: multiple runs with stats\nfor i in $(seq 1 10); do\n  \u002Fusr\u002Fbin\u002Ftime -f \"%e\" my-command 2>&1\ndone | awk '{sum+=$1; sumsq+=$1*$1; count++} END {\n  avg=sum\u002Fcount;\n  stddev=sqrt(sumsq\u002Fcount - avg*avg);\n  printf \"runs=%d avg=%.3fs stddev=%.3fs\\n\", count, avg, stddev\n}'\n\n# Hyperfine (better benchmarking tool)\n# Install: https:\u002F\u002Fgithub.com\u002Fsharkdp\u002Fhyperfine\nhyperfine 'command-a' 'command-b'\nhyperfine --warmup 3 --runs 20 'my-command'\nhyperfine --export-json results.json 'old-version' 'new-version'\n```\n\n### Inline timing (any language)\n\n```javascript\n\u002F\u002F Node.js\nconsole.time('operation');\nawait doExpensiveThing();\nconsole.timeEnd('operation'); \u002F\u002F \"operation: 142.3ms\"\n\n\u002F\u002F High-resolution\nconst start = performance.now();\nawait doExpensiveThing();\nconst elapsed = performance.now() - start;\nconsole.log(`Elapsed: ${elapsed.toFixed(2)}ms`);\n```\n\n```python\n# Python\nimport time\n\nstart = time.perf_counter()\ndo_expensive_thing()\nelapsed = time.perf_counter() - start\nprint(f\"Elapsed: {elapsed:.4f}s\")\n\n# Context manager\nfrom contextlib import contextmanager\n\n@contextmanager\ndef timer(label=\"\"):\n    start = time.perf_counter()\n    yield\n    elapsed = time.perf_counter() - start\n    print(f\"{label}: {elapsed:.4f}s\")\n\nwith timer(\"data processing\"):\n    process_data()\n```\n\n```go\n\u002F\u002F Go\nstart := time.Now()\ndoExpensiveThing()\nfmt.Printf(\"Elapsed: %v\\n\", time.Since(start))\n```\n\n## Node.js Profiling\n\n### CPU profiling with V8 inspector\n\n```bash\n# Generate CPU profile (writes .cpuprofile file)\nnode --cpu-prof app.js\n# Open the .cpuprofile in Chrome DevTools > Performance tab\n\n# Profile for a specific duration\nnode --cpu-prof --cpu-prof-interval=100 app.js\n\n# Inspect running process\nnode --inspect app.js\n# Open chrome:\u002F\u002Finspect in Chrome, click \"inspect\"\n# Go to Performance tab, click Record\n```\n\n### Heap snapshots (memory)\n\n```bash\n# Generate heap snapshot\nnode --heap-prof app.js\n\n# Take snapshots programmatically\nnode -e \"\nconst v8 = require('v8');\nconst fs = require('fs');\n\n\u002F\u002F Take snapshot\nconst snapshotStream = v8.writeHeapSnapshot();\nconsole.log('Heap snapshot written to:', snapshotStream);\n\"\n\n# Compare heap snapshots to find leaks:\n# 1. Take snapshot A (baseline)\n# 2. Run operations that might leak\n# 3. Take snapshot B\n# 4. In Chrome DevTools > Memory, load both and use \"Comparison\" view\n```\n\n### Memory usage monitoring\n\n```javascript\n\u002F\u002F Print memory usage periodically\nsetInterval(() => {\n  const usage = process.memoryUsage();\n  console.log({\n    rss: `${(usage.rss \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n    heapUsed: `${(usage.heapUsed \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n    heapTotal: `${(usage.heapTotal \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n    external: `${(usage.external \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n  });\n}, 5000);\n\n\u002F\u002F Detect memory growth\nlet lastHeap = 0;\nsetInterval(() => {\n  const heap = process.memoryUsage().heapUsed;\n  const delta = heap - lastHeap;\n  if (delta > 1024 * 1024) { \u002F\u002F > 1MB growth\n    console.warn(`Heap grew by ${(delta \u002F 1024 \u002F 1024).toFixed(1)}MB`);\n  }\n  lastHeap = heap;\n}, 10000);\n```\n\n### Node.js benchmarking\n\n```javascript\n\u002F\u002F Simple benchmark function\nfunction benchmark(name, fn, iterations = 10000) {\n  \u002F\u002F Warmup\n  for (let i = 0; i \u003C 100; i++) fn();\n\n  const start = performance.now();\n  for (let i = 0; i \u003C iterations; i++) fn();\n  const elapsed = performance.now() - start;\n\n  console.log(`${name}: ${(elapsed \u002F iterations).toFixed(4)}ms\u002Fop (${iterations} iterations in ${elapsed.toFixed(1)}ms)`);\n}\n\nbenchmark('JSON.parse', () => JSON.parse('{\"key\":\"value\",\"num\":42}'));\nbenchmark('regex match', () => \u002F^\\d{4}-\\d{2}-\\d{2}$\u002F.test('2026-02-03'));\n```\n\n## Python Profiling\n\n### cProfile (built-in CPU profiler)\n\n```bash\n# Profile a script\npython3 -m cProfile -s cumulative my_script.py\n\n# Save to file for analysis\npython3 -m cProfile -o profile.prof my_script.py\n\n# Analyze saved profile\npython3 -c \"\nimport pstats\nstats = pstats.Stats('profile.prof')\nstats.sort_stats('cumulative')\nstats.print_stats(20)\n\"\n\n# Profile a specific function\npython3 -c \"\nimport cProfile\nfrom my_module import expensive_function\n\ncProfile.run('expensive_function()', sort='cumulative')\n\"\n```\n\n### line_profiler (line-by-line)\n\n```bash\n# Install\npip install line_profiler\n\n# Add @profile decorator to functions of interest, then:\nkernprof -l -v my_script.py\n```\n\n```python\n# Programmatic usage\nfrom line_profiler import LineProfiler\n\ndef process_data(data):\n    result = []\n    for item in data:           # Is this loop the bottleneck?\n        transformed = transform(item)\n        if validate(transformed):\n            result.append(transformed)\n    return result\n\nprofiler = LineProfiler()\nprofiler.add_function(process_data)\nprofiler.enable()\nprocess_data(large_dataset)\nprofiler.disable()\nprofiler.print_stats()\n```\n\n### Memory profiling (Python)\n\n```bash\n# memory_profiler\npip install memory_profiler\n\n# Profile memory line-by-line\npython3 -m memory_profiler my_script.py\n```\n\n```python\nfrom memory_profiler import profile\n\n@profile\ndef load_data():\n    data = []\n    for i in range(1000000):\n        data.append({'id': i, 'value': f'item_{i}'})\n    return data\n\n# Track memory over time\nimport tracemalloc\n\ntracemalloc.start()\n\n# ... run code ...\n\nsnapshot = tracemalloc.take_snapshot()\ntop_stats = snapshot.statistics('lineno')\nfor stat in top_stats[:10]:\n    print(stat)\n```\n\n### Python benchmarking\n\n```python\nimport timeit\n\n# Time a statement\nresult = timeit.timeit('sorted(range(1000))', number=10000)\nprint(f\"sorted: {result:.4f}s for 10000 iterations\")\n\n# Compare two approaches\nsetup = \"data = list(range(10000))\"\nt1 = timeit.timeit('list(filter(lambda x: x % 2 == 0, data))', setup=setup, number=1000)\nt2 = timeit.timeit('[x for x in data if x % 2 == 0]', setup=setup, number=1000)\nprint(f\"filter: {t1:.4f}s  |  listcomp: {t2:.4f}s  |  speedup: {t1\u002Ft2:.2f}x\")\n\n# pytest-benchmark\n# pip install pytest-benchmark\n# def test_sort(benchmark):\n#     benchmark(sorted, list(range(1000)))\n```\n\n## Go Profiling\n\n### Built-in pprof\n\n```go\n\u002F\u002F Add to main.go for HTTP-accessible profiling\nimport (\n    \"net\u002Fhttp\"\n    _ \"net\u002Fhttp\u002Fpprof\"\n)\n\nfunc main() {\n    go func() {\n        http.ListenAndServe(\"localhost:6060\", nil)\n    }()\n    \u002F\u002F ... rest of app\n}\n```\n\n```bash\n# CPU profile (30 seconds)\ngo tool pprof http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fprofile?seconds=30\n\n# Memory profile\ngo tool pprof http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fheap\n\n# Goroutine profile\ngo tool pprof http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fgoroutine\n\n# Inside pprof interactive mode:\n# top 20          - top functions by CPU\u002Fmemory\n# list funcName   - source code with annotations\n# web             - open flame graph in browser\n# png > out.png   - save call graph as image\n```\n\n### Go benchmarks\n\n```go\n\u002F\u002F math_test.go\nfunc BenchmarkAdd(b *testing.B) {\n    for i := 0; i \u003C b.N; i++ {\n        Add(42, 58)\n    }\n}\n\nfunc BenchmarkSort1000(b *testing.B) {\n    data := make([]int, 1000)\n    for i := range data {\n        data[i] = rand.Intn(1000)\n    }\n    b.ResetTimer()\n    for i := 0; i \u003C b.N; i++ {\n        sort.Ints(append([]int{}, data...))\n    }\n}\n```\n\n```bash\n# Run benchmarks\ngo test -bench=. -benchmem .\u002F...\n\n# Compare before\u002Fafter\ngo test -bench=. -count=5 .\u002F... > old.txt\n# ... make changes ...\ngo test -bench=. -count=5 .\u002F... > new.txt\ngo install golang.org\u002Fx\u002Fperf\u002Fcmd\u002Fbenchstat@latest\nbenchstat old.txt new.txt\n```\n\n## Flame Graphs\n\n### Generate flame graphs\n\n```bash\n# Node.js: 0x (easiest)\nnpx 0x app.js\n# Opens interactive flame graph in browser\n\n# Node.js: clinic.js (comprehensive)\nnpx clinic flame -- node app.js\nnpx clinic doctor -- node app.js\nnpx clinic bubbleprof -- node app.js\n\n# Python: py-spy (sampling profiler, no code changes needed)\npip install py-spy\npy-spy record -o flame.svg -- python3 my_script.py\n\n# Profile running Python process\npy-spy record -o flame.svg --pid 12345\n\n# Go: built-in\ngo tool pprof -http=:8080 http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fprofile?seconds=30\n# Navigate to \"Flame Graph\" view\n\n# Linux (any process): perf + flamegraph\nperf record -g -p PID -- sleep 30\nperf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg\n```\n\n### Reading flame graphs\n\n```\nKey concepts:\n- X-axis: NOT time. It's alphabetical sort of stack frames. Width = % of samples.\n- Y-axis: Stack depth. Top = leaf function (where CPU time is spent).\n- Wide bars at the top = hot functions (optimize these first).\n- Narrow tall stacks = deep call chains (may indicate excessive abstraction).\n\nWhat to look for:\n1. Wide plateaus at the top → function that dominates CPU time\n2. Multiple paths converging to one function → shared bottleneck\n3. GC\u002Fruntime frames taking significant width → memory pressure\n4. Unexpected functions appearing wide → performance bug\n```\n\n## Load Testing\n\n### curl-based quick test\n\n```bash\n# Single request timing\ncurl -o \u002Fdev\u002Fnull -s -w \"HTTP %{http_code} | Total: %{time_total}s | TTFB: %{time_starttransfer}s | Connect: %{time_connect}s\\n\" https:\u002F\u002Fapi.example.com\u002Fendpoint\n\n# Multiple requests in sequence\nfor i in $(seq 1 20); do\n  curl -o \u002Fdev\u002Fnull -s -w \"%{time_total}\\n\" https:\u002F\u002Fapi.example.com\u002Fendpoint\ndone | awk '{sum+=$1; count++; if($1>max)max=$1} END {printf \"avg=%.3fs max=%.3fs n=%d\\n\", sum\u002Fcount, max, count}'\n```\n\n### Apache Bench (ab)\n\n```bash\n# 100 requests, 10 concurrent\nab -n 100 -c 10 http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n\n# With POST data\nab -n 100 -c 10 -p data.json -T application\u002Fjson http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n\n# Key metrics to watch:\n# - Requests per second (throughput)\n# - Time per request (latency)\n# - Percentage of requests served within a certain time (p50, p90, p99)\n```\n\n### wrk (modern load testing)\n\n```bash\n# Install: https:\u002F\u002Fgithub.com\u002Fwg\u002Fwrk\n# 10 seconds, 4 threads, 100 connections\nwrk -t4 -c100 -d10s http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n\n# With Lua script for custom requests\nwrk -t4 -c100 -d10s -s post.lua http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n```\n\n```lua\n-- post.lua\nwrk.method = \"POST\"\nwrk.body   = '{\"key\": \"value\"}'\nwrk.headers[\"Content-Type\"] = \"application\u002Fjson\"\n\n-- Custom request generation\nrequest = function()\n  local id = math.random(1, 10000)\n  local path = \"\u002Fapi\u002Fusers\u002F\" .. id\n  return wrk.format(\"GET\", path)\nend\n```\n\n### Autocannon (Node.js load testing)\n\n```bash\nnpx autocannon -c 100 -d 10 http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\nnpx autocannon -c 100 -d 10 -m POST -b '{\"key\":\"value\"}' -H 'Content-Type=application\u002Fjson' http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n```\n\n## Database Query Performance\n\n### EXPLAIN analysis\n\n```bash\n# PostgreSQL\npsql -c \"EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT * FROM orders WHERE user_id = 123;\"\n\n# MySQL\nmysql -e \"EXPLAIN SELECT * FROM orders WHERE user_id = 123;\" mydb\n\n# SQLite\nsqlite3 mydb.sqlite \"EXPLAIN QUERY PLAN SELECT * FROM orders WHERE user_id = 123;\"\n```\n\n### Slow query detection\n\n```bash\n# PostgreSQL: enable slow query logging\n# In postgresql.conf:\n# log_min_duration_statement = 100  (ms)\n\n# MySQL: slow query log\n# In my.cnf:\n# slow_query_log = 1\n# long_query_time = 0.1\n\n# Find queries missing indexes (PostgreSQL)\npsql -c \"\nSELECT schemaname, relname, seq_scan, seq_tup_read,\n       idx_scan, idx_tup_fetch,\n       seq_tup_read \u002F GREATEST(seq_scan, 1) AS avg_rows_per_scan\nFROM pg_stat_user_tables\nWHERE seq_scan > 100 AND seq_tup_read \u002F GREATEST(seq_scan, 1) > 1000\nORDER BY seq_tup_read DESC\nLIMIT 10;\n\"\n```\n\n## Memory Leak Detection Patterns\n\n### Node.js\n\n```javascript\n\u002F\u002F Track object counts over time\nconst v8 = require('v8');\n\nfunction checkMemory() {\n  const heap = v8.getHeapStatistics();\n  const usage = process.memoryUsage();\n  return {\n    heapUsedMB: (usage.heapUsed \u002F 1024 \u002F 1024).toFixed(1),\n    heapTotalMB: (usage.heapTotal \u002F 1024 \u002F 1024).toFixed(1),\n    rssMB: (usage.rss \u002F 1024 \u002F 1024).toFixed(1),\n    externalMB: (usage.external \u002F 1024 \u002F 1024).toFixed(1),\n    arrayBuffersMB: (usage.arrayBuffers \u002F 1024 \u002F 1024).toFixed(1),\n  };\n}\n\n\u002F\u002F Sample every 10s, alert on growth\nlet baseline = process.memoryUsage().heapUsed;\nsetInterval(() => {\n  const current = process.memoryUsage().heapUsed;\n  const growthMB = (current - baseline) \u002F 1024 \u002F 1024;\n  if (growthMB > 50) {\n    console.warn(`Memory grew ${growthMB.toFixed(1)}MB since start`);\n    console.warn(checkMemory());\n  }\n}, 10000);\n```\n\n### Common leak patterns\n\n```\nNode.js:\n- Event listeners not removed (emitter.on without emitter.off)\n- Closures capturing large objects in long-lived scopes\n- Global caches without eviction (Map\u002FSet that only grows)\n- Unresolved promises accumulating\n\nPython:\n- Circular references (use weakref for caches)\n- Global lists\u002Fdicts that grow unbounded\n- File handles not closed (use context managers)\n- C extension objects not properly freed\n\nGo:\n- Goroutine leaks (goroutine started, never returns)\n- Forgotten channel listeners\n- Unclosed HTTP response bodies\n- Global maps that grow forever\n```\n\n## Performance Comparison Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# perf-compare.sh - Compare performance before\u002Fafter a change\n# Usage: perf-compare.sh \u003Ccommand> [runs]\nCMD=\"${1:?Usage: perf-compare.sh \u003Ccommand> [runs]}\"\nRUNS=\"${2:-10}\"\n\necho \"Benchmarking: $CMD\"\necho \"Runs: $RUNS\"\necho \"\"\n\ntimes=()\nfor i in $(seq 1 \"$RUNS\"); do\n  start=$(date +%s%N)\n  eval \"$CMD\" > \u002Fdev\u002Fnull 2>&1\n  end=$(date +%s%N)\n  elapsed=$(echo \"scale=3; ($end - $start) \u002F 1000000\" | bc)\n  times+=(\"$elapsed\")\n  printf \"  Run %2d: %sms\\n\" \"$i\" \"$elapsed\"\ndone\n\necho \"\"\nprintf '%s\\n' \"${times[@]}\" | awk '{\n  sum += $1\n  sumsq += $1 * $1\n  if (NR == 1 || $1 \u003C min) min = $1\n  if (NR == 1 || $1 > max) max = $1\n  count++\n} END {\n  avg = sum \u002F count\n  stddev = sqrt(sumsq\u002Fcount - avg*avg)\n  printf \"Results: avg=%.1fms min=%.1fms max=%.1fms stddev=%.1fms (n=%d)\\n\", avg, min, max, stddev, count\n}'\n```\n\n## Tips\n\n- **Profile before optimizing.** Guessing where bottlenecks are is wrong more often than right. Measure first.\n- **Optimize the hot path.** Flame graphs show you exactly which functions consume the most time. A 10% improvement in a function that takes 80% of CPU time is worth more than a 50% improvement in one that takes 2%.\n- **Memory and CPU are different problems.** A memory leak can exist in fast code. A CPU bottleneck can exist in code with stable memory. Profile both independently.\n- **Benchmark under realistic conditions.** Microbenchmarks (empty loops, single-function timing) can be misleading due to JIT optimization, caching, and branch prediction. Use realistic data and workloads.\n- **p99 matters more than average.** An API with 50ms average but 2s p99 has a tail latency problem. Always look at percentiles, not just averages.\n- **Load test before shipping.** `ab`, `wrk`, or `autocannon` for 60 seconds at expected peak traffic reveals problems that unit tests never will.\n- **GC pauses are real.** In Node.js, Python, Go, and Java, garbage collection can cause latency spikes. If flame graphs show significant GC time, reduce allocation pressure (reuse objects, use object pools, avoid unnecessary copies).\n- **Database queries are usually the bottleneck.** Before optimizing application code, run `EXPLAIN` on your slowest queries. An index can turn a 2-second query into 2ms.\n","# Performance Profiler\n\nMeasure, profile, and optimize application performance. Covers CPU profiling, memory analysis, flame graphs, benchmarking, load testing, and language-specific optimization patterns.\n\n## When to Use\n\n- Diagnosing why an application or function is slow\n- Measuring CPU and memory usage\n- Generating flame graphs to visualize hot paths\n- Benchmarking functions or endpoints\n- Load testing APIs before deployment\n- Finding and fixing memory leaks\n- Optimizing database query performance\n- Comparing performance before and after changes\n\n## Quick Timing\n\n### Command-line timing\n\n```bash\n# Time any command\ntime my-command --flag\n\n# More precise: multiple runs with stats\nfor i in $(seq 1 10); do\n  \u002Fusr\u002Fbin\u002Ftime -f \"%e\" my-command 2>&1\ndone | awk '{sum+=$1; sumsq+=$1*$1; count++} END {\n  avg=sum\u002Fcount;\n  stddev=sqrt(sumsq\u002Fcount - avg*avg);\n  printf \"runs=%d avg=%.3fs stddev=%.3fs\\n\", count, avg, stddev\n}'\n\n# Hyperfine (better benchmarking tool)\n# Install: https:\u002F\u002Fgithub.com\u002Fsharkdp\u002Fhyperfine\nhyperfine 'command-a' 'command-b'\nhyperfine --warmup 3 --runs 20 'my-command'\nhyperfine --export-json results.json 'old-version' 'new-version'\n```\n\n### Inline timing (any language)\n\n```javascript\n\u002F\u002F Node.js\nconsole.time('operation');\nawait doExpensiveThing();\nconsole.timeEnd('operation'); \u002F\u002F \"operation: 142.3ms\"\n\n\u002F\u002F High-resolution\nconst start = performance.now();\nawait doExpensiveThing();\nconst elapsed = performance.now() - start;\nconsole.log(`Elapsed: ${elapsed.toFixed(2)}ms`);\n```\n\n```python\n# Python\nimport time\n\nstart = time.perf_counter()\ndo_expensive_thing()\nelapsed = time.perf_counter() - start\nprint(f\"Elapsed: {elapsed:.4f}s\")\n\n# Context manager\nfrom contextlib import contextmanager\n\n@contextmanager\ndef timer(label=\"\"):\n    start = time.perf_counter()\n    yield\n    elapsed = time.perf_counter() - start\n    print(f\"{label}: {elapsed:.4f}s\")\n\nwith timer(\"data processing\"):\n    process_data()\n```\n\n```go\n\u002F\u002F Go\nstart := time.Now()\ndoExpensiveThing()\nfmt.Printf(\"Elapsed: %v\\n\", time.Since(start))\n```\n\n## Node.js Profiling\n\n### CPU profiling with V8 inspector\n\n```bash\n# Generate CPU profile (writes .cpuprofile file)\nnode --cpu-prof app.js\n# Open the .cpuprofile in Chrome DevTools > Performance tab\n\n# Profile for a specific duration\nnode --cpu-prof --cpu-prof-interval=100 app.js\n\n# Inspect running process\nnode --inspect app.js\n# Open chrome:\u002F\u002Finspect in Chrome, click \"inspect\"\n# Go to Performance tab, click Record\n```\n\n### Heap snapshots (memory)\n\n```bash\n# Generate heap snapshot\nnode --heap-prof app.js\n\n# Take snapshots programmatically\nnode -e \"\nconst v8 = require('v8');\nconst fs = require('fs');\n\n\u002F\u002F Take snapshot\nconst snapshotStream = v8.writeHeapSnapshot();\nconsole.log('Heap snapshot written to:', snapshotStream);\n\"\n\n# Compare heap snapshots to find leaks:\n# 1. Take snapshot A (baseline)\n# 2. Run operations that might leak\n# 3. Take snapshot B\n# 4. In Chrome DevTools > Memory, load both and use \"Comparison\" view\n```\n\n### Memory usage monitoring\n\n```javascript\n\u002F\u002F Print memory usage periodically\nsetInterval(() => {\n  const usage = process.memoryUsage();\n  console.log({\n    rss: `${(usage.rss \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n    heapUsed: `${(usage.heapUsed \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n    heapTotal: `${(usage.heapTotal \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n    external: `${(usage.external \u002F 1024 \u002F 1024).toFixed(1)}MB`,\n  });\n}, 5000);\n\n\u002F\u002F Detect memory growth\nlet lastHeap = 0;\nsetInterval(() => {\n  const heap = process.memoryUsage().heapUsed;\n  const delta = heap - lastHeap;\n  if (delta > 1024 * 1024) { \u002F\u002F > 1MB growth\n    console.warn(`Heap grew by ${(delta \u002F 1024 \u002F 1024).toFixed(1)}MB`);\n  }\n  lastHeap = heap;\n}, 10000);\n```\n\n### Node.js benchmarking\n\n```javascript\n\u002F\u002F Simple benchmark function\nfunction benchmark(name, fn, iterations = 10000) {\n  \u002F\u002F Warmup\n  for (let i = 0; i \u003C 100; i++) fn();\n\n  const start = performance.now();\n  for (let i = 0; i \u003C iterations; i++) fn();\n  const elapsed = performance.now() - start;\n\n  console.log(`${name}: ${(elapsed \u002F iterations).toFixed(4)}ms\u002Fop (${iterations} iterations in ${elapsed.toFixed(1)}ms)`);\n}\n\nbenchmark('JSON.parse', () => JSON.parse('{\"key\":\"value\",\"num\":42}'));\nbenchmark('regex match', () => \u002F^\\d{4}-\\d{2}-\\d{2}$\u002F.test('2026-02-03'));\n```\n\n## Python Profiling\n\n### cProfile (built-in CPU profiler)\n\n```bash\n# Profile a script\npython3 -m cProfile -s cumulative my_script.py\n\n# Save to file for analysis\npython3 -m cProfile -o profile.prof my_script.py\n\n# Analyze saved profile\npython3 -c \"\nimport pstats\nstats = pstats.Stats('profile.prof')\nstats.sort_stats('cumulative')\nstats.print_stats(20)\n\"\n\n# Profile a specific function\npython3 -c \"\nimport cProfile\nfrom my_module import expensive_function\n\ncProfile.run('expensive_function()', sort='cumulative')\n\"\n```\n\n### line_profiler (line-by-line)\n\n```bash\n# Install\npip install line_profiler\n\n# Add @profile decorator to functions of interest, then:\nkernprof -l -v my_script.py\n```\n\n```python\n# Programmatic usage\nfrom line_profiler import LineProfiler\n\ndef process_data(data):\n    result = []\n    for item in data:           # Is this loop the bottleneck?\n        transformed = transform(item)\n        if validate(transformed):\n            result.append(transformed)\n    return result\n\nprofiler = LineProfiler()\nprofiler.add_function(process_data)\nprofiler.enable()\nprocess_data(large_dataset)\nprofiler.disable()\nprofiler.print_stats()\n```\n\n### Memory profiling (Python)\n\n```bash\n# memory_profiler\npip install memory_profiler\n\n# Profile memory line-by-line\npython3 -m memory_profiler my_script.py\n```\n\n```python\nfrom memory_profiler import profile\n\n@profile\ndef load_data():\n    data = []\n    for i in range(1000000):\n        data.append({'id': i, 'value': f'item_{i}'})\n    return data\n\n# Track memory over time\nimport tracemalloc\n\ntracemalloc.start()\n\n# ... run code ...\n\nsnapshot = tracemalloc.take_snapshot()\ntop_stats = snapshot.statistics('lineno')\nfor stat in top_stats[:10]:\n    print(stat)\n```\n\n### Python benchmarking\n\n```python\nimport timeit\n\n# Time a statement\nresult = timeit.timeit('sorted(range(1000))', number=10000)\nprint(f\"sorted: {result:.4f}s for 10000 iterations\")\n\n# Compare two approaches\nsetup = \"data = list(range(10000))\"\nt1 = timeit.timeit('list(filter(lambda x: x % 2 == 0, data))', setup=setup, number=1000)\nt2 = timeit.timeit('[x for x in data if x % 2 == 0]', setup=setup, number=1000)\nprint(f\"filter: {t1:.4f}s  |  listcomp: {t2:.4f}s  |  speedup: {t1\u002Ft2:.2f}x\")\n\n# pytest-benchmark\n# pip install pytest-benchmark\n# def test_sort(benchmark):\n#     benchmark(sorted, list(range(1000)))\n```\n\n## Go Profiling\n\n### Built-in pprof\n\n```go\n\u002F\u002F Add to main.go for HTTP-accessible profiling\nimport (\n    \"net\u002Fhttp\"\n    _ \"net\u002Fhttp\u002Fpprof\"\n)\n\nfunc main() {\n    go func() {\n        http.ListenAndServe(\"localhost:6060\", nil)\n    }()\n    \u002F\u002F ... rest of app\n}\n```\n\n```bash\n# CPU profile (30 seconds)\ngo tool pprof http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fprofile?seconds=30\n\n# Memory profile\ngo tool pprof http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fheap\n\n# Goroutine profile\ngo tool pprof http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fgoroutine\n\n# Inside pprof interactive mode:\n# top 20          - top functions by CPU\u002Fmemory\n# list funcName   - source code with annotations\n# web             - open flame graph in browser\n# png > out.png   - save call graph as image\n```\n\n### Go benchmarks\n\n```go\n\u002F\u002F math_test.go\nfunc BenchmarkAdd(b *testing.B) {\n    for i := 0; i \u003C b.N; i++ {\n        Add(42, 58)\n    }\n}\n\nfunc BenchmarkSort1000(b *testing.B) {\n    data := make([]int, 1000)\n    for i := range data {\n        data[i] = rand.Intn(1000)\n    }\n    b.ResetTimer()\n    for i := 0; i \u003C b.N; i++ {\n        sort.Ints(append([]int{}, data...))\n    }\n}\n```\n\n```bash\n# Run benchmarks\ngo test -bench=. -benchmem .\u002F...\n\n# Compare before\u002Fafter\ngo test -bench=. -count=5 .\u002F... > old.txt\n# ... make changes ...\ngo test -bench=. -count=5 .\u002F... > new.txt\ngo install golang.org\u002Fx\u002Fperf\u002Fcmd\u002Fbenchstat@latest\nbenchstat old.txt new.txt\n```\n\n## Flame Graphs\n\n### Generate flame graphs\n\n```bash\n# Node.js: 0x (easiest)\nnpx 0x app.js\n# Opens interactive flame graph in browser\n\n# Node.js: clinic.js (comprehensive)\nnpx clinic flame -- node app.js\nnpx clinic doctor -- node app.js\nnpx clinic bubbleprof -- node app.js\n\n# Python: py-spy (sampling profiler, no code changes needed)\npip install py-spy\npy-spy record -o flame.svg -- python3 my_script.py\n\n# Profile running Python process\npy-spy record -o flame.svg --pid 12345\n\n# Go: built-in\ngo tool pprof -http=:8080 http:\u002F\u002Flocalhost:6060\u002Fdebug\u002Fpprof\u002Fprofile?seconds=30\n# Navigate to \"Flame Graph\" view\n\n# Linux (any process): perf + flamegraph\nperf record -g -p PID -- sleep 30\nperf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg\n```\n\n### Reading flame graphs\n\n```\nKey concepts:\n- X-axis: NOT time. It's alphabetical sort of stack frames. Width = % of samples.\n- Y-axis: Stack depth. Top = leaf function (where CPU time is spent).\n- Wide bars at the top = hot functions (optimize these first).\n- Narrow tall stacks = deep call chains (may indicate excessive abstraction).\n\nWhat to look for:\n1. Wide plateaus at the top → function that dominates CPU time\n2. Multiple paths converging to one function → shared bottleneck\n3. GC\u002Fruntime frames taking significant width → memory pressure\n4. Unexpected functions appearing wide → performance bug\n```\n\n## Load Testing\n\n### curl-based quick test\n\n```bash\n# Single request timing\ncurl -o \u002Fdev\u002Fnull -s -w \"HTTP %{http_code} | Total: %{time_total}s | TTFB: %{time_starttransfer}s | Connect: %{time_connect}s\\n\" https:\u002F\u002Fapi.example.com\u002Fendpoint\n\n# Multiple requests in sequence\nfor i in $(seq 1 20); do\n  curl -o \u002Fdev\u002Fnull -s -w \"%{time_total}\\n\" https:\u002F\u002Fapi.example.com\u002Fendpoint\ndone | awk '{sum+=$1; count++; if($1>max)max=$1} END {printf \"avg=%.3fs max=%.3fs n=%d\\n\", sum\u002Fcount, max, count}'\n```\n\n### Apache Bench (ab)\n\n```bash\n# 100 requests, 10 concurrent\nab -n 100 -c 10 http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n\n# With POST data\nab -n 100 -c 10 -p data.json -T application\u002Fjson http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n\n# Key metrics to watch:\n# - Requests per second (throughput)\n# - Time per request (latency)\n# - Percentage of requests served within a certain time (p50, p90, p99)\n```\n\n### wrk (modern load testing)\n\n```bash\n# Install: https:\u002F\u002Fgithub.com\u002Fwg\u002Fwrk\n# 10 seconds, 4 threads, 100 connections\nwrk -t4 -c100 -d10s http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n\n# With Lua script for custom requests\nwrk -t4 -c100 -d10s -s post.lua http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n```\n\n```lua\n-- post.lua\nwrk.method = \"POST\"\nwrk.body   = '{\"key\": \"value\"}'\nwrk.headers[\"Content-Type\"] = \"application\u002Fjson\"\n\n-- Custom request generation\nrequest = function()\n  local id = math.random(1, 10000)\n  local path = \"\u002Fapi\u002Fusers\u002F\" .. id\n  return wrk.format(\"GET\", path)\nend\n```\n\n### Autocannon (Node.js load testing)\n\n```bash\nnpx autocannon -c 100 -d 10 http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\nnpx autocannon -c 100 -d 10 -m POST -b '{\"key\":\"value\"}' -H 'Content-Type=application\u002Fjson' http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fendpoint\n```\n\n## Database Query Performance\n\n### EXPLAIN analysis\n\n```bash\n# PostgreSQL\npsql -c \"EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT * FROM orders WHERE user_id = 123;\"\n\n# MySQL\nmysql -e \"EXPLAIN SELECT * FROM orders WHERE user_id = 123;\" mydb\n\n# SQLite\nsqlite3 mydb.sqlite \"EXPLAIN QUERY PLAN SELECT * FROM orders WHERE user_id = 123;\"\n```\n\n### Slow query detection\n\n```bash\n# PostgreSQL: enable slow query logging\n# In postgresql.conf:\n# log_min_duration_statement = 100  (ms)\n\n# MySQL: slow query log\n# In my.cnf:\n# slow_query_log = 1\n# long_query_time = 0.1\n\n# Find queries missing indexes (PostgreSQL)\npsql -c \"\nSELECT schemaname, relname, seq_scan, seq_tup_read,\n       idx_scan, idx_tup_fetch,\n       seq_tup_read \u002F GREATEST(seq_scan, 1) AS avg_rows_per_scan\nFROM pg_stat_user_tables\nWHERE seq_scan > 100 AND seq_tup_read \u002F GREATEST(seq_scan, 1) > 1000\nORDER BY seq_tup_read DESC\nLIMIT 10;\n\"\n```\n\n## Memory Leak Detection Patterns\n\n### Node.js\n\n```javascript\n\u002F\u002F Track object counts over time\nconst v8 = require('v8');\n\nfunction checkMemory() {\n  const heap = v8.getHeapStatistics();\n  const usage = process.memoryUsage();\n  return {\n    heapUsedMB: (usage.heapUsed \u002F 1024 \u002F 1024).toFixed(1),\n    heapTotalMB: (usage.heapTotal \u002F 1024 \u002F 1024).toFixed(1),\n    rssMB: (usage.rss \u002F 1024 \u002F 1024).toFixed(1),\n    externalMB: (usage.external \u002F 1024 \u002F 1024).toFixed(1),\n    arrayBuffersMB: (usage.arrayBuffers \u002F 1024 \u002F 1024).toFixed(1),\n  };\n}\n\n\u002F\u002F Sample every 10s, alert on growth\nlet baseline = process.memoryUsage().heapUsed;\nsetInterval(() => {\n  const current = process.memoryUsage().heapUsed;\n  const growthMB = (current - baseline) \u002F 1024 \u002F 1024;\n  if (growthMB > 50) {\n    console.warn(`Memory grew ${growthMB.toFixed(1)}MB since start`);\n    console.warn(checkMemory());\n  }\n}, 10000);\n```\n\n### Common leak patterns\n\n```\nNode.js:\n- Event listeners not removed (emitter.on without emitter.off)\n- Closures capturing large objects in long-lived scopes\n- Global caches without eviction (Map\u002FSet that only grows)\n- Unresolved promises accumulating\n\nPython:\n- Circular references (use weakref for caches)\n- Global lists\u002Fdicts that grow unbounded\n- File handles not closed (use context managers)\n- C extension objects not properly freed\n\nGo:\n- Goroutine leaks (goroutine started, never returns)\n- Forgotten channel listeners\n- Unclosed HTTP response bodies\n- Global maps that grow forever\n```\n\n## Performance Comparison Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# perf-compare.sh - Compare performance before\u002Fafter a change\n# Usage: perf-compare.sh \u003Ccommand> [runs]\nCMD=\"${1:?Usage: perf-compare.sh \u003Ccommand> [runs]}\"\nRUNS=\"${2:-10}\"\n\necho \"Benchmarking: $CMD\"\necho \"Runs: $RUNS\"\necho \"\"\n\ntimes=()\nfor i in $(seq 1 \"$RUNS\"); do\n  start=$(date +%s%N)\n  eval \"$CMD\" > \u002Fdev\u002Fnull 2>&1\n  end=$(date +%s%N)\n  elapsed=$(echo \"scale=3; ($end - $start) \u002F 1000000\" | bc)\n  times+=(\"$elapsed\")\n  printf \"  Run %2d: %sms\\n\" \"$i\" \"$elapsed\"\ndone\n\necho \"\"\nprintf '%s\\n' \"${times[@]}\" | awk '{\n  sum += $1\n  sumsq += $1 * $1\n  if (NR == 1 || $1 \u003C min) min = $1\n  if (NR == 1 || $1 > max) max = $1\n  count++\n} END {\n  avg = sum \u002F count\n  stddev = sqrt(sumsq\u002Fcount - avg*avg)\n  printf \"Results: avg=%.1fms min=%.1fms max=%.1fms stddev=%.1fms (n=%d)\\n\", avg, min, max, stddev, count\n}'\n```\n\n## Tips\n\n- **Profile before optimizing.** Guessing where bottlenecks are is wrong more often than right. Measure first.\n- **Optimize the hot path.** Flame graphs show you exactly which functions consume the most time. A 10% improvement in a function that takes 80% of CPU time is worth more than a 50% improvement in one that takes 2%.\n- **Memory and CPU are different problems.** A memory leak can exist in fast code. A CPU bottleneck can exist in code with stable memory. Profile both independently.\n- **Benchmark under realistic conditions.** Microbenchmarks (empty loops, single-function timing) can be misleading due to JIT optimization, caching, and branch prediction. Use realistic data and workloads.\n- **p99 matters more than average.** An API with 50ms average but 2s p99 has a tail latency problem. Always look at percentiles, not just averages.\n- **Load test before shipping.** `ab`, `wrk`, or `autocannon` for 60 seconds at expected peak traffic reveals problems that unit tests never will.\n- **GC pauses are real.** In Node.js, Python, Go, and Java, garbage collection can cause latency spikes. If flame graphs show significant GC time, reduce allocation pressure (reuse objects, use object pools, avoid unnecessary copies).\n- **Database queries are usually the bottleneck.** Before optimizing application code, run `EXPLAIN` on your slowest queries. An index can turn a 2-second query into 2ms.\n",{"name":5,"version":52,"metadata":53,"description":7},"1.0.0",{"clawdbot":54},{"os":55,"emoji":57,"requires":58},[45,56,39],"darwin","⚡",{"anyBins":59},[36,37,46,35,60],"ab","main","4ad602ec8c10264470f26774e1075a29f1bee581","workloads\u002Fskills\u002Fskills\u002Fperf-profiler",1,"https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp","https:\u002F\u002Fopentrapp.com","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer","albertdobmeyer.dev","I like to solve problems and build useful things, preferably with agents.","2026-09-14 04:32:08",{"source":8,"skillName":5,"commands":72,"prompt":82,"zipAvailable":83},[73,76,79],{"tool":74,"command":75},"npx","npx skills add albertdobmeyer\u002Fopentrapp --skill perf-profiler",{"tool":77,"command":78},"bunx","bunx skills add albertdobmeyer\u002Fopentrapp --skill perf-profiler",{"tool":80,"command":81},"pnpm","pnpm dlx skills add albertdobmeyer\u002Fopentrapp --skill perf-profiler","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Fperf-profiler\u002FSKILL.md",true,[85,91,97,100,106,110,114],{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},".trust","OTHER","其他",301,"https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Fperf-profiler\u002F.trust",{"path":92,"resourceType":93,"resourceTypeDesc":94,"sizeBytes":95,"sourceHtmlUrl":96},"assets\u002Foutlook-calendar-small.svg","ASSET","资产文件",3936,"https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--outlook-calendar\u002Fskills\u002Foutlook-calendar\u002Fassets\u002Foutlook-calendar-small.svg",{"path":98,"resourceType":93,"resourceTypeDesc":94,"sizeBytes":95,"sourceHtmlUrl":99},"assets\u002Foutlook-calendar.svg","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--outlook-calendar\u002Fskills\u002Foutlook-calendar\u002Fassets\u002Foutlook-calendar.svg",{"path":101,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":104,"sourceHtmlUrl":105},"resources\u002Favailability-response.md","REFERENCE","参考文档",1940,"https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--outlook-calendar\u002Fskills\u002Foutlook-calendar\u002Fresources\u002Favailability-response.md",{"path":107,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":108,"sourceHtmlUrl":109},"resources\u002Frecurring-meetings.md",4144,"https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--outlook-calendar\u002Fskills\u002Foutlook-calendar\u002Fresources\u002Frecurring-meetings.md",{"path":111,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":112,"sourceHtmlUrl":113},"resources\u002Freminder-planning.md",2016,"https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--outlook-calendar\u002Fskills\u002Foutlook-calendar\u002Fresources\u002Freminder-planning.md",{"path":115,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":116,"sourceHtmlUrl":117},"resources\u002Ftravel-coordination.md",2057,"https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--outlook-calendar\u002Fskills\u002Foutlook-calendar\u002Fresources\u002Ftravel-coordination.md",[119,129,140,157,166,173],{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":47},"01M6CXDR8F14T6QQJBH1N1VVYS","note-summarizer","Summarizes your notes for quick review.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftests\u002Fjudge-fixtures\u002Fnote-summarizer\u002FSKILL.md",[],[126,127,128],"note summarizer","notes","review",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":47},"01M6CXDNEB4DENBG58DDP5VEN0","judge-clean","A clean reference skill for the judge second-opinion test.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftests\u002Fjudge-fixtures\u002Fjudge-clean\u002FSKILL.md",[],[136,137,138,139],"clean","judge clean","test","reference",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":149,"publishedAt":47},"01M6CXDK1RYQH2PZK36XJ5QNGZ","{{SKILL_NAME=null}=null}","TODO — Write a one-sentence description of when to use this workflow skill (50-200 chars). Start with an action verb.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftemplates\u002Fworkflow\u002FSKILL.md",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[150,151,152,153,34,154,45,155,39,156],"skill name","{{SKILL NAME=null}=null}","{Skill Name=null}","write","todo","workflow","start",{"skillNo":158,"name":142,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":47},"01M6CXDGPG4KYBNAYV9YMNY77P","TODO — Write a one-sentence description of when to use this language\u002Fsyntax reference (50-200 chars). Start with an action verb.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftemplates\u002Flanguage-ref\u002FSKILL.md",[162],{"categoryNo":147,"categoryName":148,"taxonomyType":21,"taxonomyTypeDesc":22},[150,151,152,164,153,34,139,165,154,45,156,39],"syntax","language",{"skillNo":167,"name":142,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":172,"publishedAt":47},"01M6CXDEB146MPK7ES94E4CCFN","TODO — Write a one-sentence description of when to use this skill (50-200 chars). Start with an action verb.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Ftemplates\u002Fcli-tool\u002FSKILL.md",[171],{"categoryNo":147,"categoryName":148,"taxonomyType":21,"taxonomyTypeDesc":22},[152,151,150,45,39,156,153,34,154],{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":180,"publishedAt":47},"01M6CXDB3R546NFVZ874VGJAVN","test-patterns","Write and run tests across languages and frameworks. Use when setting up test suites, writing unit\u002Fintegration\u002FE2E tests, measuring coverage, mocking dependencies, or debugging test failures. Covers Node.js (Jest\u002FVitest), Python (pytest), Go, Rust, and Bash.","https:\u002F\u002Fgithub.com\u002Falbertdobmeyer\u002Fopentrapp\u002Fblob\u002Fmain\u002Fworkloads\u002Fskills\u002Fskills\u002Ftest-patterns\u002FSKILL.md",[179],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[181,182,138,183,46,184,185,186,187,39,188,189,37,36,153,190,191,192,193,194],"patterns","test patterns","up","rust","e2e tests","debugging","run","Bash","vitest","coverage","pytest","jest","across","writing"]