[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G37ESM04MAFGHVVACCCCDJ":3,"skill-same:01M6G37ESM04MAFGHVVACCCCDJ":72},{"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":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":14,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6G37ESM04MAFGHVVACCCCDJ","n8n-code-python",null,"Write Python code in n8n Code nodes. Use when writing Python in n8n, using _input\u002F_json\u002F_node syntax, working with standard library, or need to understand Python limitations in n8n Code nodes.","reikiplanet\u002Fdaoskills","reikiplanet","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F96377599?v=4","01M6CVWCMD740YHQDK7E9QYBW4","Reiki Planet","01M6CVWCS4KXVA2CWFVJ43EAXK",0,"MIT","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdevelopment\u002Fn8n-code-python\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"python","code","n8n code python","n8n","syntax","with","understand","input","writing python","main","Nodes","use","write","writing","node","json","library","https","github","safe","2026-11-10 10:12:30",false,"---\nname: n8n-code-python\ndescription: \"Write Python code in n8n Code nodes. Use when writing Python in n8n, using _input\u002F_json\u002F_node syntax, working with standard library, or need to understand Python limitations in n8n Code nodes.\"\nsource: \"https:\u002F\u002Fgithub.com\u002Fczlonkowski\u002Fn8n-skills\u002Ftree\u002Fmain\u002Fskills\u002Fn8n-code-python\"\nrisk: safe\n---\n\n# Python Code Node (Beta)\n\nExpert guidance for writing Python code in n8n Code nodes.\n\n---\n\n## ⚠️ Important: JavaScript First\n\n**Recommendation**: Use **JavaScript for 95% of use cases**. Only use Python when:\n- You need specific Python standard library functions\n- You're significantly more comfortable with Python syntax\n- You're doing data transformations better suited to Python\n\n**Why JavaScript is preferred:**\n- Full n8n helper functions ($helpers.httpRequest, etc.)\n- Luxon DateTime library for advanced date\u002Ftime operations\n- No external library limitations\n- Better n8n documentation and community support\n\n---\n\n## Quick Start\n\n```python\n# Basic template for Python Code nodes\nitems = _input.all()\n\n# Process data\nprocessed = []\nfor item in items:\n    processed.append({\n        \"json\": {\n            **item[\"json\"],\n            \"processed\": True,\n            \"timestamp\": datetime.now().isoformat()\n        }\n    })\n\nreturn processed\n```\n\n### Essential Rules\n\n1. **Consider JavaScript first** - Use Python only when necessary\n2. **Access data**: `_input.all()`, `_input.first()`, or `_input.item`\n3. **CRITICAL**: Must return `[{\"json\": {...}}]` format\n4. **CRITICAL**: Webhook data is under `_json[\"body\"]` (not `_json` directly)\n5. **CRITICAL LIMITATION**: **No external libraries** (no requests, pandas, numpy)\n6. **Standard library only**: json, datetime, re, base64, hashlib, urllib.parse, math, random, statistics\n\n---\n\n## Mode Selection Guide\n\nSame as JavaScript - choose based on your use case:\n\n### Run Once for All Items (Recommended - Default)\n\n**Use this mode for:** 95% of use cases\n\n- **How it works**: Code executes **once** regardless of input count\n- **Data access**: `_input.all()` or `_items` array (Native mode)\n- **Best for**: Aggregation, filtering, batch processing, transformations\n- **Performance**: Faster for multiple items (single execution)\n\n```python\n# Example: Calculate total from all items\nall_items = _input.all()\ntotal = sum(item[\"json\"].get(\"amount\", 0) for item in all_items)\n\nreturn [{\n    \"json\": {\n        \"total\": total,\n        \"count\": len(all_items),\n        \"average\": total \u002F len(all_items) if all_items else 0\n    }\n}]\n```\n\n### Run Once for Each Item\n\n**Use this mode for:** Specialized cases only\n\n- **How it works**: Code executes **separately** for each input item\n- **Data access**: `_input.item` or `_item` (Native mode)\n- **Best for**: Item-specific logic, independent operations, per-item validation\n- **Performance**: Slower for large datasets (multiple executions)\n\n```python\n# Example: Add processing timestamp to each item\nitem = _input.item\n\nreturn [{\n    \"json\": {\n        **item[\"json\"],\n        \"processed\": True,\n        \"processed_at\": datetime.now().isoformat()\n    }\n}]\n```\n\n---\n\n## Python Modes: Beta vs Native\n\nn8n offers two Python execution modes:\n\n### Python (Beta) - Recommended\n- **Use**: `_input`, `_json`, `_node` helper syntax\n- **Best for**: Most Python use cases\n- **Helpers available**: `_now`, `_today`, `_jmespath()`\n- **Import**: `from datetime import datetime`\n\n```python\n# Python (Beta) example\nitems = _input.all()\nnow = _now  # Built-in datetime object\n\nreturn [{\n    \"json\": {\n        \"count\": len(items),\n        \"timestamp\": now.isoformat()\n    }\n}]\n```\n\n### Python (Native) (Beta)\n- **Use**: `_items`, `_item` variables only\n- **No helpers**: No `_input`, `_now`, etc.\n- **More limited**: Standard Python only\n- **Use when**: Need pure Python without n8n helpers\n\n```python\n# Python (Native) example\nprocessed = []\n\nfor item in _items:\n    processed.append({\n        \"json\": {\n            \"id\": item[\"json\"].get(\"id\"),\n            \"processed\": True\n        }\n    })\n\nreturn processed\n```\n\n**Recommendation**: Use **Python (Beta)** for better n8n integration.\n\n---\n\n## Data Access Patterns\n\n### Pattern 1: _input.all() - Most Common\n\n**Use when**: Processing arrays, batch operations, aggregations\n\n```python\n# Get all items from previous node\nall_items = _input.all()\n\n# Filter, transform as needed\nvalid = [item for item in all_items if item[\"json\"].get(\"status\") == \"active\"]\n\nprocessed = []\nfor item in valid:\n    processed.append({\n        \"json\": {\n            \"id\": item[\"json\"][\"id\"],\n            \"name\": item[\"json\"][\"name\"]\n        }\n    })\n\nreturn processed\n```\n\n### Pattern 2: _input.first() - Very Common\n\n**Use when**: Working with single objects, API responses\n\n```python\n# Get first item only\nfirst_item = _input.first()\ndata = first_item[\"json\"]\n\nreturn [{\n    \"json\": {\n        \"result\": process_data(data),\n        \"processed_at\": datetime.now().isoformat()\n    }\n}]\n```\n\n### Pattern 3: _input.item - Each Item Mode Only\n\n**Use when**: In \"Run Once for Each Item\" mode\n\n```python\n# Current item in loop (Each Item mode only)\ncurrent_item = _input.item\n\nreturn [{\n    \"json\": {\n        **current_item[\"json\"],\n        \"item_processed\": True\n    }\n}]\n```\n\n### Pattern 4: _node - Reference Other Nodes\n\n**Use when**: Need data from specific nodes in workflow\n\n```python\n# Get output from specific node\nwebhook_data = _node[\"Webhook\"][\"json\"]\nhttp_data = _node[\"HTTP Request\"][\"json\"]\n\nreturn [{\n    \"json\": {\n        \"combined\": {\n            \"webhook\": webhook_data,\n            \"api\": http_data\n        }\n    }\n}]\n```\n\n**See**: DATA_ACCESS.md for comprehensive guide\n\n---\n\n## Critical: Webhook Data Structure\n\n**MOST COMMON MISTAKE**: Webhook data is nested under `[\"body\"]`\n\n```python\n# ❌ WRONG - Will raise KeyError\nname = _json[\"name\"]\nemail = _json[\"email\"]\n\n# ✅ CORRECT - Webhook data is under [\"body\"]\nname = _json[\"body\"][\"name\"]\nemail = _json[\"body\"][\"email\"]\n\n# ✅ SAFER - Use .get() for safe access\nwebhook_data = _json.get(\"body\", {})\nname = webhook_data.get(\"name\")\n```\n\n**Why**: Webhook node wraps all request data under `body` property. This includes POST data, query parameters, and JSON payloads.\n\n**See**: DATA_ACCESS.md for full webhook structure details\n\n---\n\n## Return Format Requirements\n\n**CRITICAL RULE**: Always return list of dictionaries with `\"json\"` key\n\n### Correct Return Formats\n\n```python\n# ✅ Single result\nreturn [{\n    \"json\": {\n        \"field1\": value1,\n        \"field2\": value2\n    }\n}]\n\n# ✅ Multiple results\nreturn [\n    {\"json\": {\"id\": 1, \"data\": \"first\"}},\n    {\"json\": {\"id\": 2, \"data\": \"second\"}}\n]\n\n# ✅ List comprehension\ntransformed = [\n    {\"json\": {\"id\": item[\"json\"][\"id\"], \"processed\": True}}\n    for item in _input.all()\n    if item[\"json\"].get(\"valid\")\n]\nreturn transformed\n\n# ✅ Empty result (when no data to return)\nreturn []\n\n# ✅ Conditional return\nif should_process:\n    return [{\"json\": processed_data}]\nelse:\n    return []\n```\n\n### Incorrect Return Formats\n\n```python\n# ❌ WRONG: Dictionary without list wrapper\nreturn {\n    \"json\": {\"field\": value}\n}\n\n# ❌ WRONG: List without json wrapper\nreturn [{\"field\": value}]\n\n# ❌ WRONG: Plain string\nreturn \"processed\"\n\n# ❌ WRONG: Incomplete structure\nreturn [{\"data\": value}]  # Should be {\"json\": value}\n```\n\n**Why it matters**: Next nodes expect list format. Incorrect format causes workflow execution to fail.\n\n**See**: ERROR_PATTERNS.md #2 for detailed error solutions\n\n---\n\n## Critical Limitation: No External Libraries\n\n**MOST IMPORTANT PYTHON LIMITATION**: Cannot import external packages\n\n### What's NOT Available\n\n```python\n# ❌ NOT AVAILABLE - Will raise ModuleNotFoundError\nimport requests  # ❌ No\nimport pandas  # ❌ No\nimport numpy  # ❌ No\nimport scipy  # ❌ No\nfrom bs4 import BeautifulSoup  # ❌ No\nimport lxml  # ❌ No\n```\n\n### What IS Available (Standard Library)\n\n```python\n# ✅ AVAILABLE - Standard library only\nimport json  # ✅ JSON parsing\nimport datetime  # ✅ Date\u002Ftime operations\nimport re  # ✅ Regular expressions\nimport base64  # ✅ Base64 encoding\u002Fdecoding\nimport hashlib  # ✅ Hashing functions\nimport urllib.parse  # ✅ URL parsing\nimport math  # ✅ Math functions\nimport random  # ✅ Random numbers\nimport statistics  # ✅ Statistical functions\n```\n\n### Workarounds\n\n**Need HTTP requests?**\n- ✅ Use **HTTP Request node** before Code node\n- ✅ Or switch to **JavaScript** and use `$helpers.httpRequest()`\n\n**Need data analysis (pandas\u002Fnumpy)?**\n- ✅ Use Python **statistics** module for basic stats\n- ✅ Or switch to **JavaScript** for most operations\n- ✅ Manual calculations with lists and dictionaries\n\n**Need web scraping (BeautifulSoup)?**\n- ✅ Use **HTTP Request node** + **HTML Extract node**\n- ✅ Or switch to **JavaScript** with regex\u002Fstring methods\n\n**See**: STANDARD_LIBRARY.md for complete reference\n\n---\n\n## Common Patterns Overview\n\nBased on production workflows, here are the most useful Python patterns:\n\n### 1. Data Transformation\nTransform all items with list comprehensions\n\n```python\nitems = _input.all()\n\nreturn [\n    {\n        \"json\": {\n            \"id\": item[\"json\"].get(\"id\"),\n            \"name\": item[\"json\"].get(\"name\", \"Unknown\").upper(),\n            \"processed\": True\n        }\n    }\n    for item in items\n]\n```\n\n### 2. Filtering & Aggregation\nSum, filter, count with built-in functions\n\n```python\nitems = _input.all()\ntotal = sum(item[\"json\"].get(\"amount\", 0) for item in items)\nvalid_items = [item for item in items if item[\"json\"].get(\"amount\", 0) > 0]\n\nreturn [{\n    \"json\": {\n        \"total\": total,\n        \"count\": len(valid_items)\n    }\n}]\n```\n\n### 3. String Processing with Regex\nExtract patterns from text\n\n```python\nimport re\n\nitems = _input.all()\nemail_pattern = r'\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b'\n\nall_emails = []\nfor item in items:\n    text = item[\"json\"].get(\"text\", \"\")\n    emails = re.findall(email_pattern, text)\n    all_emails.extend(emails)\n\n# Remove duplicates\nunique_emails = list(set(all_emails))\n\nreturn [{\n    \"json\": {\n        \"emails\": unique_emails,\n        \"count\": len(unique_emails)\n    }\n}]\n```\n\n### 4. Data Validation\nValidate and clean data\n\n```python\nitems = _input.all()\nvalidated = []\n\nfor item in items:\n    data = item[\"json\"]\n    errors = []\n\n    # Validate fields\n    if not data.get(\"email\"):\n        errors.append(\"Email required\")\n    if not data.get(\"name\"):\n        errors.append(\"Name required\")\n\n    validated.append({\n        \"json\": {\n            **data,\n            \"valid\": len(errors) == 0,\n            \"errors\": errors if errors else None\n        }\n    })\n\nreturn validated\n```\n\n### 5. Statistical Analysis\nCalculate statistics with statistics module\n\n```python\nfrom statistics import mean, median, stdev\n\nitems = _input.all()\nvalues = [item[\"json\"].get(\"value\", 0) for item in items if \"value\" in item[\"json\"]]\n\nif values:\n    return [{\n        \"json\": {\n            \"mean\": mean(values),\n            \"median\": median(values),\n            \"stdev\": stdev(values) if len(values) > 1 else 0,\n            \"min\": min(values),\n            \"max\": max(values),\n            \"count\": len(values)\n        }\n    }]\nelse:\n    return [{\"json\": {\"error\": \"No values found\"}}]\n```\n\n**See**: COMMON_PATTERNS.md for 10 detailed Python patterns\n\n---\n\n## Error Prevention - Top 5 Mistakes\n\n### #1: Importing External Libraries (Python-Specific!)\n\n```python\n# ❌ WRONG: Trying to import external library\nimport requests  # ModuleNotFoundError!\n\n# ✅ CORRECT: Use HTTP Request node or JavaScript\n# Add HTTP Request node before Code node\n# OR switch to JavaScript and use $helpers.httpRequest()\n```\n\n### #2: Empty Code or Missing Return\n\n```python\n# ❌ WRONG: No return statement\nitems = _input.all()\n# Processing...\n# Forgot to return!\n\n# ✅ CORRECT: Always return data\nitems = _input.all()\n# Processing...\nreturn [{\"json\": item[\"json\"]} for item in items]\n```\n\n### #3: Incorrect Return Format\n\n```python\n# ❌ WRONG: Returning dict instead of list\nreturn {\"json\": {\"result\": \"success\"}}\n\n# ✅ CORRECT: List wrapper required\nreturn [{\"json\": {\"result\": \"success\"}}]\n```\n\n### #4: KeyError on Dictionary Access\n\n```python\n# ❌ WRONG: Direct access crashes if missing\nname = _json[\"user\"][\"name\"]  # KeyError!\n\n# ✅ CORRECT: Use .get() for safe access\nname = _json.get(\"user\", {}).get(\"name\", \"Unknown\")\n```\n\n### #5: Webhook Body Nesting\n\n```python\n# ❌ WRONG: Direct access to webhook data\nemail = _json[\"email\"]  # KeyError!\n\n# ✅ CORRECT: Webhook data under [\"body\"]\nemail = _json[\"body\"][\"email\"]\n\n# ✅ BETTER: Safe access with .get()\nemail = _json.get(\"body\", {}).get(\"email\", \"no-email\")\n```\n\n**See**: ERROR_PATTERNS.md for comprehensive error guide\n\n---\n\n## Standard Library Reference\n\n### Most Useful Modules\n\n```python\n# JSON operations\nimport json\ndata = json.loads(json_string)\njson_output = json.dumps({\"key\": \"value\"})\n\n# Date\u002Ftime\nfrom datetime import datetime, timedelta\nnow = datetime.now()\ntomorrow = now + timedelta(days=1)\nformatted = now.strftime(\"%Y-%m-%d\")\n\n# Regular expressions\nimport re\nmatches = re.findall(r'\\d+', text)\ncleaned = re.sub(r'[^\\w\\s]', '', text)\n\n# Base64 encoding\nimport base64\nencoded = base64.b64encode(data).decode()\ndecoded = base64.b64decode(encoded)\n\n# Hashing\nimport hashlib\nhash_value = hashlib.sha256(text.encode()).hexdigest()\n\n# URL parsing\nimport urllib.parse\nparams = urllib.parse.urlencode({\"key\": \"value\"})\nparsed = urllib.parse.urlparse(url)\n\n# Statistics\nfrom statistics import mean, median, stdev\naverage = mean([1, 2, 3, 4, 5])\n```\n\n**See**: STANDARD_LIBRARY.md for complete reference\n\n---\n\n## Best Practices\n\n### 1. Always Use .get() for Dictionary Access\n\n```python\n# ✅ SAFE: Won't crash if field missing\nvalue = item[\"json\"].get(\"field\", \"default\")\n\n# ❌ RISKY: Crashes if field doesn't exist\nvalue = item[\"json\"][\"field\"]\n```\n\n### 2. Handle None\u002FNull Values Explicitly\n\n```python\n# ✅ GOOD: Default to 0 if None\namount = item[\"json\"].get(\"amount\") or 0\n\n# ✅ GOOD: Check for None explicitly\ntext = item[\"json\"].get(\"text\")\nif text is None:\n    text = \"\"\n```\n\n### 3. Use List Comprehensions for Filtering\n\n```python\n# ✅ PYTHONIC: List comprehension\nvalid = [item for item in items if item[\"json\"].get(\"active\")]\n\n# ❌ VERBOSE: Manual loop\nvalid = []\nfor item in items:\n    if item[\"json\"].get(\"active\"):\n        valid.append(item)\n```\n\n### 4. Return Consistent Structure\n\n```python\n# ✅ CONSISTENT: Always list with \"json\" key\nreturn [{\"json\": result}]  # Single result\nreturn results  # Multiple results (already formatted)\nreturn []  # No results\n```\n\n### 5. Debug with print() Statements\n\n```python\n# Debug statements appear in browser console (F12)\nitems = _input.all()\nprint(f\"Processing {len(items)} items\")\nprint(f\"First item: {items[0] if items else 'None'}\")\n```\n\n---\n\n## When to Use Python vs JavaScript\n\n### Use Python When:\n- ✅ You need `statistics` module for statistical operations\n- ✅ You're significantly more comfortable with Python syntax\n- ✅ Your logic maps well to list comprehensions\n- ✅ You need specific standard library functions\n\n### Use JavaScript When:\n- ✅ You need HTTP requests ($helpers.httpRequest())\n- ✅ You need advanced date\u002Ftime (DateTime\u002FLuxon)\n- ✅ You want better n8n integration\n- ✅ **For 95% of use cases** (recommended)\n\n### Consider Other Nodes When:\n- ❌ Simple field mapping → Use **Set** node\n- ❌ Basic filtering → Use **Filter** node\n- ❌ Simple conditionals → Use **IF** or **Switch** node\n- ❌ HTTP requests only → Use **HTTP Request** node\n\n---\n\n## Integration with Other Skills\n\n### Works With:\n\n**n8n Expression Syntax**:\n- Expressions use `{{ }}` syntax in other nodes\n- Code nodes use Python directly (no `{{ }}`)\n- When to use expressions vs code\n\n**n8n MCP Tools Expert**:\n- How to find Code node: `search_nodes({query: \"code\"})`\n- Get configuration help: `get_node_essentials(\"nodes-base.code\")`\n- Validate code: `validate_node_operation()`\n\n**n8n Node Configuration**:\n- Mode selection (All Items vs Each Item)\n- Language selection (Python vs JavaScript)\n- Understanding property dependencies\n\n**n8n Workflow Patterns**:\n- Code nodes in transformation step\n- When to use Python vs JavaScript in patterns\n\n**n8n Validation Expert**:\n- Validate Code node configuration\n- Handle validation errors\n- Auto-fix common issues\n\n**n8n Code JavaScript**:\n- When to use JavaScript instead\n- Comparison of JavaScript vs Python features\n- Migration from Python to JavaScript\n\n---\n\n## Quick Reference Checklist\n\nBefore deploying Python Code nodes, verify:\n\n- [ ] **Considered JavaScript first** - Using Python only when necessary\n- [ ] **Code is not empty** - Must have meaningful logic\n- [ ] **Return statement exists** - Must return list of dictionaries\n- [ ] **Proper return format** - Each item: `{\"json\": {...}}`\n- [ ] **Data access correct** - Using `_input.all()`, `_input.first()`, or `_input.item`\n- [ ] **No external imports** - Only standard library (json, datetime, re, etc.)\n- [ ] **Safe dictionary access** - Using `.get()` to avoid KeyError\n- [ ] **Webhook data** - Access via `[\"body\"]` if from webhook\n- [ ] **Mode selection** - \"All Items\" for most cases\n- [ ] **Output consistent** - All code paths return same structure\n\n---\n\n## Additional Resources\n\n### Related Files\n- DATA_ACCESS.md - Comprehensive Python data access patterns\n- COMMON_PATTERNS.md - 10 Python patterns for n8n\n- ERROR_PATTERNS.md - Top 5 errors and solutions\n- STANDARD_LIBRARY.md - Complete standard library reference\n\n### n8n Documentation\n- Code Node Guide: https:\u002F\u002Fdocs.n8n.io\u002Fcode\u002Fcode-node\u002F\n- Python in n8n: https:\u002F\u002Fdocs.n8n.io\u002Fcode\u002Fbuiltin\u002Fpython-modules\u002F\n\n---\n\n**Ready to write Python in n8n Code nodes - but consider JavaScript first!** Use Python for specific needs, reference the error patterns guide to avoid common mistakes, and leverage the standard library effectively.\n","# Python Code Node (Beta)\n\nExpert guidance for writing Python code in n8n Code nodes.\n\n---\n\n## ⚠️ Important: JavaScript First\n\n**Recommendation**: Use **JavaScript for 95% of use cases**. Only use Python when:\n- You need specific Python standard library functions\n- You're significantly more comfortable with Python syntax\n- You're doing data transformations better suited to Python\n\n**Why JavaScript is preferred:**\n- Full n8n helper functions ($helpers.httpRequest, etc.)\n- Luxon DateTime library for advanced date\u002Ftime operations\n- No external library limitations\n- Better n8n documentation and community support\n\n---\n\n## Quick Start\n\n```python\n# Basic template for Python Code nodes\nitems = _input.all()\n\n# Process data\nprocessed = []\nfor item in items:\n    processed.append({\n        \"json\": {\n            **item[\"json\"],\n            \"processed\": True,\n            \"timestamp\": datetime.now().isoformat()\n        }\n    })\n\nreturn processed\n```\n\n### Essential Rules\n\n1. **Consider JavaScript first** - Use Python only when necessary\n2. **Access data**: `_input.all()`, `_input.first()`, or `_input.item`\n3. **CRITICAL**: Must return `[{\"json\": {...}}]` format\n4. **CRITICAL**: Webhook data is under `_json[\"body\"]` (not `_json` directly)\n5. **CRITICAL LIMITATION**: **No external libraries** (no requests, pandas, numpy)\n6. **Standard library only**: json, datetime, re, base64, hashlib, urllib.parse, math, random, statistics\n\n---\n\n## Mode Selection Guide\n\nSame as JavaScript - choose based on your use case:\n\n### Run Once for All Items (Recommended - Default)\n\n**Use this mode for:** 95% of use cases\n\n- **How it works**: Code executes **once** regardless of input count\n- **Data access**: `_input.all()` or `_items` array (Native mode)\n- **Best for**: Aggregation, filtering, batch processing, transformations\n- **Performance**: Faster for multiple items (single execution)\n\n```python\n# Example: Calculate total from all items\nall_items = _input.all()\ntotal = sum(item[\"json\"].get(\"amount\", 0) for item in all_items)\n\nreturn [{\n    \"json\": {\n        \"total\": total,\n        \"count\": len(all_items),\n        \"average\": total \u002F len(all_items) if all_items else 0\n    }\n}]\n```\n\n### Run Once for Each Item\n\n**Use this mode for:** Specialized cases only\n\n- **How it works**: Code executes **separately** for each input item\n- **Data access**: `_input.item` or `_item` (Native mode)\n- **Best for**: Item-specific logic, independent operations, per-item validation\n- **Performance**: Slower for large datasets (multiple executions)\n\n```python\n# Example: Add processing timestamp to each item\nitem = _input.item\n\nreturn [{\n    \"json\": {\n        **item[\"json\"],\n        \"processed\": True,\n        \"processed_at\": datetime.now().isoformat()\n    }\n}]\n```\n\n---\n\n## Python Modes: Beta vs Native\n\nn8n offers two Python execution modes:\n\n### Python (Beta) - Recommended\n- **Use**: `_input`, `_json`, `_node` helper syntax\n- **Best for**: Most Python use cases\n- **Helpers available**: `_now`, `_today`, `_jmespath()`\n- **Import**: `from datetime import datetime`\n\n```python\n# Python (Beta) example\nitems = _input.all()\nnow = _now  # Built-in datetime object\n\nreturn [{\n    \"json\": {\n        \"count\": len(items),\n        \"timestamp\": now.isoformat()\n    }\n}]\n```\n\n### Python (Native) (Beta)\n- **Use**: `_items`, `_item` variables only\n- **No helpers**: No `_input`, `_now`, etc.\n- **More limited**: Standard Python only\n- **Use when**: Need pure Python without n8n helpers\n\n```python\n# Python (Native) example\nprocessed = []\n\nfor item in _items:\n    processed.append({\n        \"json\": {\n            \"id\": item[\"json\"].get(\"id\"),\n            \"processed\": True\n        }\n    })\n\nreturn processed\n```\n\n**Recommendation**: Use **Python (Beta)** for better n8n integration.\n\n---\n\n## Data Access Patterns\n\n### Pattern 1: _input.all() - Most Common\n\n**Use when**: Processing arrays, batch operations, aggregations\n\n```python\n# Get all items from previous node\nall_items = _input.all()\n\n# Filter, transform as needed\nvalid = [item for item in all_items if item[\"json\"].get(\"status\") == \"active\"]\n\nprocessed = []\nfor item in valid:\n    processed.append({\n        \"json\": {\n            \"id\": item[\"json\"][\"id\"],\n            \"name\": item[\"json\"][\"name\"]\n        }\n    })\n\nreturn processed\n```\n\n### Pattern 2: _input.first() - Very Common\n\n**Use when**: Working with single objects, API responses\n\n```python\n# Get first item only\nfirst_item = _input.first()\ndata = first_item[\"json\"]\n\nreturn [{\n    \"json\": {\n        \"result\": process_data(data),\n        \"processed_at\": datetime.now().isoformat()\n    }\n}]\n```\n\n### Pattern 3: _input.item - Each Item Mode Only\n\n**Use when**: In \"Run Once for Each Item\" mode\n\n```python\n# Current item in loop (Each Item mode only)\ncurrent_item = _input.item\n\nreturn [{\n    \"json\": {\n        **current_item[\"json\"],\n        \"item_processed\": True\n    }\n}]\n```\n\n### Pattern 4: _node - Reference Other Nodes\n\n**Use when**: Need data from specific nodes in workflow\n\n```python\n# Get output from specific node\nwebhook_data = _node[\"Webhook\"][\"json\"]\nhttp_data = _node[\"HTTP Request\"][\"json\"]\n\nreturn [{\n    \"json\": {\n        \"combined\": {\n            \"webhook\": webhook_data,\n            \"api\": http_data\n        }\n    }\n}]\n```\n\n**See**: DATA_ACCESS.md for comprehensive guide\n\n---\n\n## Critical: Webhook Data Structure\n\n**MOST COMMON MISTAKE**: Webhook data is nested under `[\"body\"]`\n\n```python\n# ❌ WRONG - Will raise KeyError\nname = _json[\"name\"]\nemail = _json[\"email\"]\n\n# ✅ CORRECT - Webhook data is under [\"body\"]\nname = _json[\"body\"][\"name\"]\nemail = _json[\"body\"][\"email\"]\n\n# ✅ SAFER - Use .get() for safe access\nwebhook_data = _json.get(\"body\", {})\nname = webhook_data.get(\"name\")\n```\n\n**Why**: Webhook node wraps all request data under `body` property. This includes POST data, query parameters, and JSON payloads.\n\n**See**: DATA_ACCESS.md for full webhook structure details\n\n---\n\n## Return Format Requirements\n\n**CRITICAL RULE**: Always return list of dictionaries with `\"json\"` key\n\n### Correct Return Formats\n\n```python\n# ✅ Single result\nreturn [{\n    \"json\": {\n        \"field1\": value1,\n        \"field2\": value2\n    }\n}]\n\n# ✅ Multiple results\nreturn [\n    {\"json\": {\"id\": 1, \"data\": \"first\"}},\n    {\"json\": {\"id\": 2, \"data\": \"second\"}}\n]\n\n# ✅ List comprehension\ntransformed = [\n    {\"json\": {\"id\": item[\"json\"][\"id\"], \"processed\": True}}\n    for item in _input.all()\n    if item[\"json\"].get(\"valid\")\n]\nreturn transformed\n\n# ✅ Empty result (when no data to return)\nreturn []\n\n# ✅ Conditional return\nif should_process:\n    return [{\"json\": processed_data}]\nelse:\n    return []\n```\n\n### Incorrect Return Formats\n\n```python\n# ❌ WRONG: Dictionary without list wrapper\nreturn {\n    \"json\": {\"field\": value}\n}\n\n# ❌ WRONG: List without json wrapper\nreturn [{\"field\": value}]\n\n# ❌ WRONG: Plain string\nreturn \"processed\"\n\n# ❌ WRONG: Incomplete structure\nreturn [{\"data\": value}]  # Should be {\"json\": value}\n```\n\n**Why it matters**: Next nodes expect list format. Incorrect format causes workflow execution to fail.\n\n**See**: ERROR_PATTERNS.md #2 for detailed error solutions\n\n---\n\n## Critical Limitation: No External Libraries\n\n**MOST IMPORTANT PYTHON LIMITATION**: Cannot import external packages\n\n### What's NOT Available\n\n```python\n# ❌ NOT AVAILABLE - Will raise ModuleNotFoundError\nimport requests  # ❌ No\nimport pandas  # ❌ No\nimport numpy  # ❌ No\nimport scipy  # ❌ No\nfrom bs4 import BeautifulSoup  # ❌ No\nimport lxml  # ❌ No\n```\n\n### What IS Available (Standard Library)\n\n```python\n# ✅ AVAILABLE - Standard library only\nimport json  # ✅ JSON parsing\nimport datetime  # ✅ Date\u002Ftime operations\nimport re  # ✅ Regular expressions\nimport base64  # ✅ Base64 encoding\u002Fdecoding\nimport hashlib  # ✅ Hashing functions\nimport urllib.parse  # ✅ URL parsing\nimport math  # ✅ Math functions\nimport random  # ✅ Random numbers\nimport statistics  # ✅ Statistical functions\n```\n\n### Workarounds\n\n**Need HTTP requests?**\n- ✅ Use **HTTP Request node** before Code node\n- ✅ Or switch to **JavaScript** and use `$helpers.httpRequest()`\n\n**Need data analysis (pandas\u002Fnumpy)?**\n- ✅ Use Python **statistics** module for basic stats\n- ✅ Or switch to **JavaScript** for most operations\n- ✅ Manual calculations with lists and dictionaries\n\n**Need web scraping (BeautifulSoup)?**\n- ✅ Use **HTTP Request node** + **HTML Extract node**\n- ✅ Or switch to **JavaScript** with regex\u002Fstring methods\n\n**See**: STANDARD_LIBRARY.md for complete reference\n\n---\n\n## Common Patterns Overview\n\nBased on production workflows, here are the most useful Python patterns:\n\n### 1. Data Transformation\nTransform all items with list comprehensions\n\n```python\nitems = _input.all()\n\nreturn [\n    {\n        \"json\": {\n            \"id\": item[\"json\"].get(\"id\"),\n            \"name\": item[\"json\"].get(\"name\", \"Unknown\").upper(),\n            \"processed\": True\n        }\n    }\n    for item in items\n]\n```\n\n### 2. Filtering & Aggregation\nSum, filter, count with built-in functions\n\n```python\nitems = _input.all()\ntotal = sum(item[\"json\"].get(\"amount\", 0) for item in items)\nvalid_items = [item for item in items if item[\"json\"].get(\"amount\", 0) > 0]\n\nreturn [{\n    \"json\": {\n        \"total\": total,\n        \"count\": len(valid_items)\n    }\n}]\n```\n\n### 3. String Processing with Regex\nExtract patterns from text\n\n```python\nimport re\n\nitems = _input.all()\nemail_pattern = r'\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b'\n\nall_emails = []\nfor item in items:\n    text = item[\"json\"].get(\"text\", \"\")\n    emails = re.findall(email_pattern, text)\n    all_emails.extend(emails)\n\n# Remove duplicates\nunique_emails = list(set(all_emails))\n\nreturn [{\n    \"json\": {\n        \"emails\": unique_emails,\n        \"count\": len(unique_emails)\n    }\n}]\n```\n\n### 4. Data Validation\nValidate and clean data\n\n```python\nitems = _input.all()\nvalidated = []\n\nfor item in items:\n    data = item[\"json\"]\n    errors = []\n\n    # Validate fields\n    if not data.get(\"email\"):\n        errors.append(\"Email required\")\n    if not data.get(\"name\"):\n        errors.append(\"Name required\")\n\n    validated.append({\n        \"json\": {\n            **data,\n            \"valid\": len(errors) == 0,\n            \"errors\": errors if errors else None\n        }\n    })\n\nreturn validated\n```\n\n### 5. Statistical Analysis\nCalculate statistics with statistics module\n\n```python\nfrom statistics import mean, median, stdev\n\nitems = _input.all()\nvalues = [item[\"json\"].get(\"value\", 0) for item in items if \"value\" in item[\"json\"]]\n\nif values:\n    return [{\n        \"json\": {\n            \"mean\": mean(values),\n            \"median\": median(values),\n            \"stdev\": stdev(values) if len(values) > 1 else 0,\n            \"min\": min(values),\n            \"max\": max(values),\n            \"count\": len(values)\n        }\n    }]\nelse:\n    return [{\"json\": {\"error\": \"No values found\"}}]\n```\n\n**See**: COMMON_PATTERNS.md for 10 detailed Python patterns\n\n---\n\n## Error Prevention - Top 5 Mistakes\n\n### #1: Importing External Libraries (Python-Specific!)\n\n```python\n# ❌ WRONG: Trying to import external library\nimport requests  # ModuleNotFoundError!\n\n# ✅ CORRECT: Use HTTP Request node or JavaScript\n# Add HTTP Request node before Code node\n# OR switch to JavaScript and use $helpers.httpRequest()\n```\n\n### #2: Empty Code or Missing Return\n\n```python\n# ❌ WRONG: No return statement\nitems = _input.all()\n# Processing...\n# Forgot to return!\n\n# ✅ CORRECT: Always return data\nitems = _input.all()\n# Processing...\nreturn [{\"json\": item[\"json\"]} for item in items]\n```\n\n### #3: Incorrect Return Format\n\n```python\n# ❌ WRONG: Returning dict instead of list\nreturn {\"json\": {\"result\": \"success\"}}\n\n# ✅ CORRECT: List wrapper required\nreturn [{\"json\": {\"result\": \"success\"}}]\n```\n\n### #4: KeyError on Dictionary Access\n\n```python\n# ❌ WRONG: Direct access crashes if missing\nname = _json[\"user\"][\"name\"]  # KeyError!\n\n# ✅ CORRECT: Use .get() for safe access\nname = _json.get(\"user\", {}).get(\"name\", \"Unknown\")\n```\n\n### #5: Webhook Body Nesting\n\n```python\n# ❌ WRONG: Direct access to webhook data\nemail = _json[\"email\"]  # KeyError!\n\n# ✅ CORRECT: Webhook data under [\"body\"]\nemail = _json[\"body\"][\"email\"]\n\n# ✅ BETTER: Safe access with .get()\nemail = _json.get(\"body\", {}).get(\"email\", \"no-email\")\n```\n\n**See**: ERROR_PATTERNS.md for comprehensive error guide\n\n---\n\n## Standard Library Reference\n\n### Most Useful Modules\n\n```python\n# JSON operations\nimport json\ndata = json.loads(json_string)\njson_output = json.dumps({\"key\": \"value\"})\n\n# Date\u002Ftime\nfrom datetime import datetime, timedelta\nnow = datetime.now()\ntomorrow = now + timedelta(days=1)\nformatted = now.strftime(\"%Y-%m-%d\")\n\n# Regular expressions\nimport re\nmatches = re.findall(r'\\d+', text)\ncleaned = re.sub(r'[^\\w\\s]', '', text)\n\n# Base64 encoding\nimport base64\nencoded = base64.b64encode(data).decode()\ndecoded = base64.b64decode(encoded)\n\n# Hashing\nimport hashlib\nhash_value = hashlib.sha256(text.encode()).hexdigest()\n\n# URL parsing\nimport urllib.parse\nparams = urllib.parse.urlencode({\"key\": \"value\"})\nparsed = urllib.parse.urlparse(url)\n\n# Statistics\nfrom statistics import mean, median, stdev\naverage = mean([1, 2, 3, 4, 5])\n```\n\n**See**: STANDARD_LIBRARY.md for complete reference\n\n---\n\n## Best Practices\n\n### 1. Always Use .get() for Dictionary Access\n\n```python\n# ✅ SAFE: Won't crash if field missing\nvalue = item[\"json\"].get(\"field\", \"default\")\n\n# ❌ RISKY: Crashes if field doesn't exist\nvalue = item[\"json\"][\"field\"]\n```\n\n### 2. Handle None\u002FNull Values Explicitly\n\n```python\n# ✅ GOOD: Default to 0 if None\namount = item[\"json\"].get(\"amount\") or 0\n\n# ✅ GOOD: Check for None explicitly\ntext = item[\"json\"].get(\"text\")\nif text is None:\n    text = \"\"\n```\n\n### 3. Use List Comprehensions for Filtering\n\n```python\n# ✅ PYTHONIC: List comprehension\nvalid = [item for item in items if item[\"json\"].get(\"active\")]\n\n# ❌ VERBOSE: Manual loop\nvalid = []\nfor item in items:\n    if item[\"json\"].get(\"active\"):\n        valid.append(item)\n```\n\n### 4. Return Consistent Structure\n\n```python\n# ✅ CONSISTENT: Always list with \"json\" key\nreturn [{\"json\": result}]  # Single result\nreturn results  # Multiple results (already formatted)\nreturn []  # No results\n```\n\n### 5. Debug with print() Statements\n\n```python\n# Debug statements appear in browser console (F12)\nitems = _input.all()\nprint(f\"Processing {len(items)} items\")\nprint(f\"First item: {items[0] if items else 'None'}\")\n```\n\n---\n\n## When to Use Python vs JavaScript\n\n### Use Python When:\n- ✅ You need `statistics` module for statistical operations\n- ✅ You're significantly more comfortable with Python syntax\n- ✅ Your logic maps well to list comprehensions\n- ✅ You need specific standard library functions\n\n### Use JavaScript When:\n- ✅ You need HTTP requests ($helpers.httpRequest())\n- ✅ You need advanced date\u002Ftime (DateTime\u002FLuxon)\n- ✅ You want better n8n integration\n- ✅ **For 95% of use cases** (recommended)\n\n### Consider Other Nodes When:\n- ❌ Simple field mapping → Use **Set** node\n- ❌ Basic filtering → Use **Filter** node\n- ❌ Simple conditionals → Use **IF** or **Switch** node\n- ❌ HTTP requests only → Use **HTTP Request** node\n\n---\n\n## Integration with Other Skills\n\n### Works With:\n\n**n8n Expression Syntax**:\n- Expressions use `{{ }}` syntax in other nodes\n- Code nodes use Python directly (no `{{ }}`)\n- When to use expressions vs code\n\n**n8n MCP Tools Expert**:\n- How to find Code node: `search_nodes({query: \"code\"})`\n- Get configuration help: `get_node_essentials(\"nodes-base.code\")`\n- Validate code: `validate_node_operation()`\n\n**n8n Node Configuration**:\n- Mode selection (All Items vs Each Item)\n- Language selection (Python vs JavaScript)\n- Understanding property dependencies\n\n**n8n Workflow Patterns**:\n- Code nodes in transformation step\n- When to use Python vs JavaScript in patterns\n\n**n8n Validation Expert**:\n- Validate Code node configuration\n- Handle validation errors\n- Auto-fix common issues\n\n**n8n Code JavaScript**:\n- When to use JavaScript instead\n- Comparison of JavaScript vs Python features\n- Migration from Python to JavaScript\n\n---\n\n## Quick Reference Checklist\n\nBefore deploying Python Code nodes, verify:\n\n- [ ] **Considered JavaScript first** - Using Python only when necessary\n- [ ] **Code is not empty** - Must have meaningful logic\n- [ ] **Return statement exists** - Must return list of dictionaries\n- [ ] **Proper return format** - Each item: `{\"json\": {...}}`\n- [ ] **Data access correct** - Using `_input.all()`, `_input.first()`, or `_input.item`\n- [ ] **No external imports** - Only standard library (json, datetime, re, etc.)\n- [ ] **Safe dictionary access** - Using `.get()` to avoid KeyError\n- [ ] **Webhook data** - Access via `[\"body\"]` if from webhook\n- [ ] **Mode selection** - \"All Items\" for most cases\n- [ ] **Output consistent** - All code paths return same structure\n\n---\n\n## Additional Resources\n\n### Related Files\n- DATA_ACCESS.md - Comprehensive Python data access patterns\n- COMMON_PATTERNS.md - 10 Python patterns for n8n\n- ERROR_PATTERNS.md - Top 5 errors and solutions\n- STANDARD_LIBRARY.md - Complete standard library reference\n\n### n8n Documentation\n- Code Node Guide: https:\u002F\u002Fdocs.n8n.io\u002Fcode\u002Fcode-node\u002F\n- Python in n8n: https:\u002F\u002Fdocs.n8n.io\u002Fcode\u002Fbuiltin\u002Fpython-modules\u002F\n\n---\n\n**Ready to write Python in n8n Code nodes - but consider JavaScript first!** Use Python for specific needs, reference the error patterns guide to avoid common mistakes, and leverage the standard library effectively.\n",{"name":5,"risk":43,"source":49,"description":7},"https:\u002F\u002Fgithub.com\u002Fczlonkowski\u002Fn8n-skills\u002Ftree\u002Fmain\u002Fskills\u002Fn8n-code-python","master","dff58085da947e81e8418c922055644bf0082b1b","skills\u002Fdevelopment\u002Fn8n-code-python","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills","https:\u002F\u002Fgithub.com\u002Freikiplanet","https:\u002F\u002Fwww.reiki-planet.com","Reiki Planet Game","2026-03-29 06:02:29",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add reikiplanet\u002Fdaoskills --skill n8n-code-python",{"tool":64,"command":65},"bunx","bunx skills add reikiplanet\u002Fdaoskills --skill n8n-code-python",{"tool":67,"command":68},"pnpm","pnpm dlx skills add reikiplanet\u002Fdaoskills --skill n8n-code-python","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdevelopment\u002Fn8n-code-python\u002FSKILL.md",true,[],[73,99,111,125,144,167],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":44},"01M6G614JTEQJHPT8AKK3YQ18S","web-games","Web browser game development principles. Framework selection, WebGPU, optimization, PWA.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fweb-games\u002FSKILL.md",[],[80,81,82,83,84,85,86,87,88,36,89,90,91,92,93,94,95,96,97,98],"games","web games","web","grep","principles","selection","community","framework selection","edit","read","pwa","game","web browser","game development","Optimization","framework","browser","development","webgpu",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":44},"01M6G611H2YGV0GZFP90D38ZMJ","vr-ar","VR\u002FAR development principles. Comfort, interaction, performance requirements.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fvr-ar\u002FSKILL.md",[],[106,107,97,108,109,86,88,36,89,83,110,84],"ar","vr ar","interaction","requirements","performance",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":44},"01M6G60XNMHAMV1SV0EJ1CX0AY","templates","Project scaffolding templates for new applications. Use when creating new projects from scratch. Contains 12 templates for various tech stacks.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Ftemplates\u002FSKILL.md",[],[113,118,119,120,121,122,86,35,89,123,124,83],"project scaffolding","From Scratch","tech","project","scaffolding","projects","applications",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":44},"01M6G60T0GATMK3Q5H8GDC1Z8S","wcag-audit-patterns","Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance. Use when auditing websites for accessibility, fixing WCAG violations, or implementing ac...","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fwcag-audit-patterns\u002FSKILL.md",[],[132,133,134,135,136,86,137,29,138,139,35,140,141,142,143],"wcag audit patterns","wcag audit","patterns","WCAG","audit","manual","automated testing","guidance","remediation","verification","accessibility","testing",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":44},"01M6G60PMCHW1FRZ63F931QK3R","vulnerability-scanner","Advanced vulnerability analysis principles. OWASP 2025, Supply Chain Security, attack surface mapping, risk prioritization.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fvulnerability-scanner\u002FSKILL.md",[],[151,152,153,154,155,156,157,158,86,89,83,159,84,160,161,162,163,164,165,166],"scanner","vulnerability scanner","vulnerability","prioritization","2025","mapping","chain","supply chain","Bash","analysis","risk","owasp","supply chain security","security","supply","advanced",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":44},"01M6G60JZBB8DK0W3DSG1WNMZK","threat-modeling-expert","Expert in threat modeling methodologies, security architecture review, and risk assessment. Masters STRIDE, PASTA, attack trees, and security requirement extraction. Use for security architecture r...","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fthreat-modeling-expert\u002FSKILL.md",[],[174,175,176,177,178,179,180,181,164,35,182,183,184,86,185,186,187,161,188,189],"modeling","threat modeling expert","threat modeling","expert","threat","risk assessment","architecture review","architecture","security architecture review","trees","security architecture","security requirement extraction","assessment","extraction","review","stride"]