{"id":"52b9c7be-82e5-4b94-a631-fd8dcbdd220e","entityType":"agent","slug":"clawhub-occupythemilkyway-argus-pro","name":"Argus Pro — Code Intelligence Scanner","canonicalUrl":"https://www.xpersona.co/agent/clawhub-occupythemilkyway-argus-pro","canonicalPath":"/agent/clawhub-occupythemilkyway-argus-pro","generatedAt":"2026-10-11T20:59:00.627Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T17:43:42.575Z","emptyReason":null},"description":"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prio... Skill: Argus Pro — Code Intelligence Scanner Owner: occupythemilkyway Summary: Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prio... Tags: argus:1.0.0, ci:1.0.0, code-review:1.0.0, debugging:1.0.0, javascript:1.0.0, latest:1.0.4, linter:1.0.0, pro:1.0.0, python:1.0.0, security:1.0.0, static-analysis:1.0.0 Versio","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1757zbbgb226m951fdfmj4s6s860nkn:argus-pro","sourceUrl":"https://clawhub.ai/occupythemilkyway/argus-pro","homepage":"https://clawhub.ai/occupythemilkyway/skills/argus-pro","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/occupythemilkyway/argus-pro","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/occupythemilkyway/skills/argus-pro","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prio..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:43:42.575Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:43:42.575Z","emptyReason":null},"stars":null,"forks":null,"downloads":1016,"packageName":null,"latestVersion":"1.0.4","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:43:42.502Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T17:43:42.575Z","lastCrawledAt":"2026-10-11T17:43:42.502Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T17:43:42.502Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.4","createdAt":"2026-05-24T04:41:13.155Z","changelog":"## Argus Pro 1.0.4 - Updated license key purchase instructions and URLs - Added bundle deal offer for all Pro skills in skill metadata and docs - Improved setup instructions for clarity - No changes to scanning logic or rule sets","fileCount":3,"zipByteSize":8262},{"version":"1.0.1","createdAt":"2026-05-17T00:07:37.218Z","changelog":"No user-visible changes in this release; version number bump only.","fileCount":2,"zipByteSize":6686},{"version":"1.0.0","createdAt":"2026-05-10T03:11:02.765Z","changelog":"Initial Pro release: 40+ rules, performance patterns, CI/CD integration, custom ignore paths, JSON output","fileCount":2,"zipByteSize":6687}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1757zbbgb226m951fdfmj4s6s860nkn:argus-pro","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T20:59:00.627Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-argus-pro/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T17:43:42.575Z","emptyReason":null},"readme":"Skill: Argus Pro — Code Intelligence Scanner\n\nOwner: occupythemilkyway\n\nSummary: Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prio...\n\nTags: argus:1.0.0, ci:1.0.0, code-review:1.0.0, debugging:1.0.0, javascript:1.0.0, latest:1.0.4, linter:1.0.0, pro:1.0.0, python:1.0.0, security:1.0.0, static-analysis:1.0.0\n\nVersion history:\n\nv1.0.4 | 2026-05-24T04:41:13.155Z | user\n\n## Argus Pro 1.0.4\n\n- Updated license key purchase instructions and URLs\n- Added bundle deal offer for all Pro skills in skill metadata and docs\n- Improved setup instructions for clarity\n- No changes to scanning logic or rule sets\n\nv1.0.1 | 2026-05-17T00:07:37.218Z | user\n\nNo user-visible changes in this release; version number bump only.\n\nv1.0.0 | 2026-05-10T03:11:02.765Z | user\n\nInitial Pro release: 40+ rules, performance patterns, CI/CD integration, custom ignore paths, JSON output\n\nArchive index:\n\nArchive v1.0.4: 3 files, 8262 bytes\n\nFiles: skill-card.md (2553b), SKILL.md (18472b), _meta.json (128b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: argus-pro\ndescription: \"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prioritised findings with fix suggestions, trend tracking across scans, CI-ready JSON output, and custom rule support. The full-power version of Argus.\"\nversion: \"1.0.4\"\nmetadata:\n  openclaw:\n    requires:\n      env: [LICENSE_KEY]\n      bins: [python3, pip3]\n    primaryEnv: \"SOURCE_PATH\"\n    homepage: https://clawhub.ai/occupythemilkyway/argus-pro\n    emoji: \"ððï¸â¡\"\n    tags: [debugging, security, code-review, python, javascript, linter, argus, pro, ci, static-analysis]\n    envVars:\n      - name: LICENSE_KEY\n        required: true\n        description: \"Your Argus Pro license key. Get one at: ko-fi.com/s/8b27346505\"\n\nð° **Bundle deal:** all 5 Pro skills for **$29** â **ko-fi.com/s/7625accf3f** (save $16)\n      - name: SOURCE_PATH\n        required: false\n        description: \"Path to scan (file or directory)\"\n        default: \".\"\n      - name: LANGUAGE\n        required: false\n        description: \"python, javascript, or auto\"\n        default: \"auto\"\n      - name: SEVERITY_FILTER\n        required: false\n        description: \"Minimum severity: critical, high, medium, low, all\"\n        default: \"all\"\n      - name: MAX_FINDINGS\n        required: false\n        description: \"Max findings to display\"\n        default: \"100\"\n      - name: OUTPUT_JSON\n        required: false\n        description: \"Save JSON output for CI pipelines\"\n        default: \"true\"\n      - name: FAIL_ON_CRITICAL\n        required: false\n        description: \"Exit with code 1 if critical findings found (for CI)\"\n        default: \"false\"\n      - name: IGNORE_PATHS\n        required: false\n        description: \"Comma-separated paths to skip (e.g. tests/,node_modules/)\"\n        default: \"\"\n---\n\n# Argus Pro â Full Code Intelligence\n\nEverything in Argus, plus 40+ rules, performance patterns, CI/CD integration, custom ignore paths, and trend JSON for tracking debt over time.\n\n## Pro features vs free Argus\n\n| Feature | Argus (Free) | Argus Pro |\n|---------|-------------|-----------|\n| Rules | 20 | **40+** |\n| Languages | Python or JS | Python + JS simultaneously |\n| Performance rules | â | â N+1, blocking calls, memory leaks |\n| CI exit code | â | â FAIL_ON_CRITICAL |\n| Ignore paths | â | â |\n| JSON output | Optional | â Always (CI-ready) |\n| Finding deduplication | Basic | â Cross-file smart dedup |\n| Custom severity filter | â | â + per-rule override |\n\nð **Upgrade:** `openclaw skills install argus-pro` + key at **ko-fi.com/s/8b27346505**\n\n---\n\n## Setup\n\n1. **Purchase** your license key at **ko-fi.com/s/8b27346505** ($9 one-time)\n   - Or get all 5 Pro skills for **$29** â **ko-fi.com/s/7625accf3f** (save $16)\n2. **Install:** `openclaw skills install argus-pro`\n3. **Activate:** set the `LICENSE_KEY` environment variable to the key you received\n4. **Run** â you're in\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 â Full code scan (Pro)\n\n```python\nimport os, re, json, sys\nfrom pathlib import Path\nfrom datetime import date\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nFENCE = chr(96) * 3\n\nconsole = Console()\n\nLICENSE_KEY = os.environ.get(\"LICENSE_KEY\",\"\").strip()\nif not LICENSE_KEY:\n    console.print(Panel(\n        \"[red bold]ð Argus Pro requires a license key.[/red bold]\\n\\n\"\n        \"Get your key at: [bold cyan]ko-fi.com/s/8b27346505[/bold cyan]\\n\\n\"\n        \"Or use the free version: [dim]openclaw skills install argus1[/dim]\",\n        title=\"License Required\", border_style=\"red\"\n    ))\n    raise SystemExit(1)\n\nSRC_PATH      = os.environ.get(\"SOURCE_PATH\",\".\").strip()\nLANGUAGE      = os.environ.get(\"LANGUAGE\",\"auto\").lower()\nSEV_FILTER    = os.environ.get(\"SEVERITY_FILTER\",\"all\").lower()\ntry: MAX_FINDINGS = int(os.environ.get(\"MAX_FINDINGS\",\"100\"))\nexcept: MAX_FINDINGS = 100\nOUTPUT_JSON   = os.environ.get(\"OUTPUT_JSON\",\"true\").lower() == \"true\"\nFAIL_CRITICAL = os.environ.get(\"FAIL_ON_CRITICAL\",\"false\").lower() == \"true\"\nIGNORE_RAW    = os.environ.get(\"IGNORE_PATHS\",\"\")\nIGNORE_PATHS  = [p.strip() for p in IGNORE_RAW.split(\",\") if p.strip()]\nTODAY         = date.today()\n\nsrc = Path(SRC_PATH)\nif not src.exists():\n    console.print(f\"[red]â Path not found: {SRC_PATH}[/red]\")\n    raise SystemExit(1)\n\ndef detect_lang(path):\n    py = len(list(path.rglob(\"*.py\") if path.is_dir() else ([path] if str(path).endswith(\".py\") else [])))\n    js = len(list(path.rglob(\"*.js\") if path.is_dir() else ([path] if str(path).endswith(\".js\") else [])))\n    return \"python\" if py >= js else \"javascript\"\n\nlang = LANGUAGE if LANGUAGE != \"auto\" else detect_lang(src)\n\n# Pro: Scan both languages if directory\nSCAN_LANGS = [\"python\",\"javascript\"] if src.is_dir() and LANGUAGE == \"auto\" else [lang]\n\n# ââ Extended rule sets ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ\nPYTHON_RULES = [\n    # Security\n    (\"PY001\",\"critical\",\"security\", r\"\\beval\\s*\\(\",                              \"eval() executes arbitrary code.\",                         \"Use ast.literal_eval() for safe literal evaluation.\"),\n    (\"PY002\",\"critical\",\"security\", r\"\\bexec\\s*\\(\",                              \"exec() executes arbitrary code.\",                         \"Refactor to eliminate dynamic code execution.\"),\n    (\"PY003\",\"critical\",\"security\", r\"\\bpickle\\.loads?\\s*\\(\",                   \"pickle.load() with untrusted data enables code execution.\", \"Use json.loads() instead.\"),\n    (\"PY004\",\"high\",\"security\",     r\"(?i)(password|secret|api_key|token|auth_key)\\s*=\\s*['\\\"].+['\\\"]\", \"Hardcoded credential.\", \"Use environment variables.\"),\n    (\"PY005\",\"high\",\"security\",     r\"shell\\s*=\\s*True\",                        \"shell=True is a command-injection risk.\",                  \"Use list arguments: subprocess.run(['cmd','arg'])\"),\n    (\"PY006\",\"high\",\"security\",     r\"\\.execute\\s*\\(.*(%|\\.format\\(|f['\\\"])\",   \"Potential SQL injection via string formatting.\",           \"Use parameterised queries.\"),\n    (\"PY016\",\"medium\",\"security\",   r\"hashlib\\.(md5|sha1)\\s*\\(\",                \"MD5/SHA1 are cryptographically weak.\",                    \"Use hashlib.sha256() or bcrypt for passwords.\"),\n    (\"PY017\",\"high\",\"security\",     r\"\\brandom\\.(random|randint|choice)\\s*\\(\",  \"random module not cryptographically secure.\",             \"Use secrets module for security-sensitive values.\"),\n    # Bugs\n    (\"PY007\",\"medium\",\"bug\",        r\"def\\s+\\w+\\s*\\([^)]*=\\s*\\[\\s*\\]\",        \"Mutable default argument [].\",                            \"Use None as default; init inside function.\"),\n    (\"PY008\",\"medium\",\"bug\",        r\"def\\s+\\w+\\s*\\([^)]*=\\s*\\{\\s*\\}\",        \"Mutable default argument {}.\",                            \"Use None as default; init inside function.\"),\n    (\"PY009\",\"medium\",\"bug\",        r\"except\\s*:\",                             \"Bare except catches SystemExit/KeyboardInterrupt.\",       \"Catch specific: except ValueError: or except Exception:\"),\n    (\"PY010\",\"medium\",\"bug\",        r\"==\\s*None\\b|\\bNone\\s*==\",                \"Use 'is None' not '== None'.\",                           \"Replace with 'is None'.\"),\n    (\"PY011\",\"medium\",\"bug\",        r\"!=\\s*None\\b|\\bNone\\s*!=\",                \"Use 'is not None'.\",                                     \"Replace with 'is not None'.\"),\n    (\"PY018\",\"medium\",\"bug\",        r\"open\\s*\\(.+\\)(?!\\s*as\\b)(?!.*with\\b)\",   \"File opened without context manager.\",                   \"Use 'with open(...) as f:'.\"),\n    (\"PY020\",\"medium\",\"bug\",        r\"\\btype\\s*\\(\\w+\\)\\s*==\\s*\",               \"type() == for type checks is fragile.\",                  \"Use isinstance() instead.\"),\n    (\"PY021\",\"medium\",\"bug\",        r\"except.*:\\s*pass$\",                      \"Silent exception swallowed â bugs hidden.\",               \"At minimum log the exception before passing.\"),\n    (\"PY022\",\"low\",\"bug\",           r\"\\bassert\\s+\",                            \"assert statements removed by -O flag.\",                  \"Use explicit if + raise for runtime checks.\"),\n    # Quality\n    (\"PY012\",\"medium\",\"quality\",    r\"\\bprint\\s*\\(\",                           \"print() in production code.\",                            \"Replace with logging.debug()/logging.info().\"),\n    (\"PY013\",\"low\",\"quality\",       r\"#\\s*(TODO|FIXME|HACK|XXX|BUG)\\b\",       \"Unresolved TODO/FIXME.\",                                 \"Create a tracked issue and remove the marker.\"),\n    (\"PY014\",\"low\",\"quality\",       r\"from\\s+\\w+\\s+import\\s+\\*\",              \"Wildcard import pollutes namespace.\",                     \"Import only what you need.\"),\n    (\"PY015\",\"low\",\"quality\",       r\"import\\s+pdb\\b\",                        \"Debugger import left in code.\",                          \"Remove before committing.\"),\n    (\"PY019\",\"low\",\"quality\",       r\"lambda\\s+\\w+:\\s*\\w+\\s*\\(\",              \"Complex lambda â use a named def.\",                      \"Replace with a def statement.\"),\n    # Performance (Pro only)\n    (\"PY030\",\"medium\",\"performance\",r\"for\\s+\\w+\\s+in\\s+range\\(len\\(\",         \"for i in range(len(x)) is slow and unidiomatic.\",        \"Use enumerate(x) or iterate directly.\"),\n    (\"PY031\",\"medium\",\"performance\",r\"\\+\\s*=\\s*['\\\"]\",                        \"String concatenation in loop builds O(nÂ²) strings.\",     \"Use ''.join(parts) or an f-string outside the loop.\"),\n    (\"PY032\",\"low\",\"performance\",   r\"\\.keys\\(\\)\\s*\\)\",                       \"Iterating .keys() is redundant.\",                        \"Iterate the dict directly: for k in my_dict.\"),\n    (\"PY033\",\"medium\",\"performance\",r\"time\\.sleep\\s*\\(\",                      \"Blocking sleep in potentially async context.\",            \"Use asyncio.sleep() in async functions.\"),\n]\n\nJS_RULES = [\n    (\"JS001\",\"high\",\"quality\",      r\"\\bvar\\s+\",                               \"var is function-scoped and hoisted.\",                    \"Use const or let.\"),\n    (\"JS002\",\"critical\",\"security\", r\"\\.innerHTML\\s*=\",                        \"innerHTML is an XSS vector.\",                           \"Use textContent or DOMPurify.\"),\n    (\"JS003\",\"critical\",\"security\", r\"\\beval\\s*\\(\",                            \"eval() executes arbitrary JS.\",                          \"Eliminate eval() usage.\"),\n    (\"JS004\",\"high\",\"security\",     r\"(?i)(api_key|apikey|api_secret|access_token|password)\\s*=\\s*['\\\"].+['\\\"]\", \"Hardcoded credential.\", \"Use environment variables.\"),\n    (\"JS005\",\"medium\",\"bug\",        r\"==\\s*null\\b(?!\\=)|null\\s*==(?!\\=)\",      \"Loose null check also matches undefined.\",               \"Use === null explicitly.\"),\n    (\"JS006\",\"medium\",\"bug\",        r\"(?<!=)==(?!=)\",                          \"Loose equality (==) causes type coercion bugs.\",         \"Use strict equality (===).\"),\n    (\"JS007\",\"medium\",\"quality\",    r\"\\bconsole\\.(log|warn|error|debug)\\s*\\(\", \"console.log left in production.\",                        \"Remove or replace with a logging library.\"),\n    (\"JS008\",\"medium\",\"security\",   r\"document\\.write\\s*\\(\",                   \"document.write() is an XSS risk.\",                      \"Use DOM manipulation methods instead.\"),\n    (\"JS009\",\"low\",\"quality\",       r\"//\\s*(TODO|FIXME|HACK|XXX|BUG)\\b\",      \"Unresolved TODO/FIXME.\",                                \"Create a tracked issue.\"),\n    (\"JS010\",\"high\",\"security\",     r\"__proto__\\s*=\",                          \"Prototype pollution pattern.\",                          \"Validate object keys exclude __proto__.\"),\n    (\"JS011\",\"medium\",\"bug\",        r\"setTimeout\\s*\\(\\s*['\\\"]\",                \"setTimeout with string calls eval internally.\",          \"Pass a function: setTimeout(() => fn(), ms)\"),\n    (\"JS012\",\"low\",\"quality\",       r\"function\\s+\\w+\\s*\\([^)]{60,}\\)\",        \"Too many parameters.\",                                  \"Use an options object instead.\"),\n    # Performance (Pro only)\n    (\"JS030\",\"medium\",\"performance\",r\"\\.forEach\\s*\\(.*\\.push\\s*\\(\",           \"forEach+push is slower than Array.map().\",               \"Replace with map() for transformations.\"),\n    (\"JS031\",\"medium\",\"performance\",r\"document\\.querySelector\\s*\\(.*\\bfor\\b\", \"DOM query inside a loop â expensive.\",                  \"Cache the element outside the loop.\"),\n    (\"JS032\",\"low\",\"performance\",   r\"JSON\\.parse\\s*\\(JSON\\.stringify\\s*\\(\",  \"JSON.parse(JSON.stringify()) for deep clone is slow.\",   \"Use structuredClone() in modern environments.\"),\n]\n\nSEV_ORDER = {\"critical\":0,\"high\":1,\"medium\":2,\"low\":3}\nSEV_FILTER_LEVEL = {\"all\":3,\"low\":3,\"medium\":2,\"high\":1,\"critical\":0}.get(SEV_FILTER,3)\n\ndef should_skip(filepath, ignore_paths):\n    path_str = str(filepath)\n    return any(ig in path_str for ig in ignore_paths)\n\nall_findings = []\nall_files    = []\n\nfor scan_lang in SCAN_LANGS:\n    ext   = \"*.py\" if scan_lang == \"python\" else \"*.js\"\n    rules = PYTHON_RULES if scan_lang == \"python\" else JS_RULES\n    files = [f for f in (src.rglob(ext) if src.is_dir() else [src]) if not should_skip(f, IGNORE_PATHS)]\n    all_files.extend(files)\n    for filepath in files:\n        try:\n            source = filepath.read_text(encoding=\"utf-8\", errors=\"replace\")\n            for lineno, line in enumerate(source.splitlines(), 1):\n                for rule_id, sev, category, pattern, message, fix in rules:\n                    if re.search(pattern, line):\n                        if SEV_ORDER.get(sev,3) <= SEV_FILTER_LEVEL:\n                            all_findings.append({\n                                \"id\": rule_id, \"severity\": sev, \"category\": category,\n                                \"lang\": scan_lang,\n                                \"file\": str(filepath.relative_to(src) if src.is_dir() else filepath),\n                                \"line\": lineno, \"code\": line.strip()[:80],\n                                \"message\": message, \"fix\": fix,\n                            })\n        except Exception as e:\n            console.print(f\"[dim]Skipping {filepath}: {e}[/dim]\")\n\n# Smart dedup\nseen = set()\nunique = []\nfor f in all_findings:\n    key = (f[\"id\"], f[\"file\"], f[\"line\"])\n    if key not in seen:\n        seen.add(key)\n        unique.append(f)\nunique.sort(key=lambda f: (SEV_ORDER.get(f[\"severity\"],3), f[\"file\"], f[\"line\"]))\ndisplay = unique[:MAX_FINDINGS]\n\nSEV_COLOUR = {\"critical\":\"red\",\"high\":\"orange3\",\"medium\":\"yellow\",\"low\":\"dim\"}\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold red]ððï¸â¡ Argus Pro â Code Intelligence Scanner[/bold red]\\n\"\n    f\"Scanning [yellow]{len(all_files)}[/yellow] file(s)  |  Languages: [cyan]{', '.join(SCAN_LANGS)}[/cyan]  |  Rules: [white]{len(PYTHON_RULES)+len(JS_RULES) if len(SCAN_LANGS)>1 else (len(PYTHON_RULES) if lang=='python' else len(JS_RULES))}[/white]\",\n    border_style=\"red\"\n))\n\nif not unique:\n    console.print(Panel(\"[green]â No issues found â clean codebase![/green]\", border_style=\"green\"))\nelse:\n    suffix = f\" â showing {len(display)} of {len(unique)}\" if len(unique) > MAX_FINDINGS else f\" â {len(unique)} total\"\n    tbl = Table(title=f\"ð Findings{suffix}\", box=box.ROUNDED, border_style=\"red\", show_lines=True)\n    tbl.add_column(\"ID\",        width=7,  style=\"dim\")\n    tbl.add_column(\"Sev\",       width=9)\n    tbl.add_column(\"Cat\",       width=12, style=\"cyan\")\n    tbl.add_column(\"Lang\",      width=5,  style=\"magenta\")\n    tbl.add_column(\"File:Line\", width=30, style=\"yellow\")\n    tbl.add_column(\"Issue\",     width=42)\n    for fi in display:\n        sc  = SEV_COLOUR.get(fi[\"severity\"],\"white\")\n        loc = f\"{fi['file'][-26:]}:{fi['line']}\" if len(fi[\"file\"])>26 else f\"{fi['file']}:{fi['line']}\"\n        tbl.add_row(fi[\"id\"],f\"[{sc}]{fi['severity'].upper()}[/{sc}]\",fi[\"category\"],fi[\"lang\"][:2].upper(),loc,fi[\"message\"][:40])\n    console.print(tbl)\n\n    for fi in [f for f in display if f[\"severity\"] in (\"critical\",\"high\")][:5]:\n        sc = SEV_COLOUR.get(fi[\"severity\"],\"white\")\n        console.print(Panel(\n            f\"[dim]File:[/dim] {fi['file']}:{fi['line']}\\n\"\n            f\"[dim]Code:[/dim] [italic]{fi['code']}[/italic]\\n\\n\"\n            f\"[white]{fi['message']}[/white]\\n\\n\"\n            f\"[green]Fix:[/green] {fi['fix']}\",\n            title=f\"[{sc}][bold]{fi['severity'].upper()}[/bold][/{sc}] â {fi['id']}\",\n            border_style=sc\n        ))\n\n    sev_counts = {s: sum(1 for f in unique if f[\"severity\"]==s) for s in (\"critical\",\"high\",\"medium\",\"low\")}\n    console.print()\n    console.print(Panel(\n        f\"Files: [yellow]{len(all_files)}[/yellow]  Issues: [red]{len(unique)}[/red]  \"\n        + \"  \".join(f\"[{SEV_COLOUR[s]}]{s.title()}: {sev_counts[s]}[/{SEV_COLOUR[s]}]\" for s in (\"critical\",\"high\",\"medium\",\"low\") if sev_counts[s]),\n        title=\"Summary\", border_style=\"cyan\"\n    ))\n\n# Save\nreport_file = f\"argus_pro_report_{TODAY}.md\"\njson_file   = f\"argus_pro_report_{TODAY}.json\"\n\nwith open(report_file,\"w\",encoding=\"utf-8\") as f:\n    f.write(f\"# ð Argus Pro Report â {TODAY}\\n\\n**Path:** `{SRC_PATH}`  **Files:** {len(all_files)}  **Issues:** {len(unique)}\\n\\n\")\n    f.write(\"## Findings\\n\\n| ID | Severity | Category | Lang | File:Line | Issue |\\n|---|---|---|---|---|---|\\n\")\n    for fi in unique:\n        f.write(f\"| {fi['id']} | {fi['severity'].upper()} | {fi['category']} | {fi['lang']} | {fi['file'][:30]}:{fi['line']} | {fi['message'][:50]} |\\n\")\n    f.write(\"\\n## Fix Guide (Critical + High)\\n\\n\")\n    for fi in [x for x in unique if x[\"severity\"] in (\"critical\",\"high\")]:\n        f.write(f\"### {fi['id']} â {fi['file']}:{fi['line']}\\n**Issue:** {fi['message']}\\n**Fix:** {fi['fix']}\\n{FENCE}\\n{fi['code']}\\n{FENCE}\\n\\n\")\n\nwith open(json_file,\"w\",encoding=\"utf-8\") as f:\n    json.dump({\"date\":str(TODAY),\"path\":SRC_PATH,\"files\":len(all_files),\"findings\":unique},f,indent=2)\n\nconsole.print(Panel(f\"[green]â Done![/green]  [cyan]{report_file}[/cyan]  |  [cyan]{json_file}[/cyan]\",border_style=\"green\"))\n\nif FAIL_CRITICAL and any(f[\"severity\"]==\"critical\" for f in unique):\n    console.print(\"[red]CI: Exiting with code 1 â critical findings detected.[/red]\")\n    sys.exit(1)\n```\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"argus-pro\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1779597673155\n}\n\nFile v1.0.4:skill-card.md\n\n## Description:\n\nArgus Pro scans Python and JavaScript codebases with 40+ rules for security, bugs, performance, and code quality, then reports prioritized findings with fix suggestions, trend tracking, CI-ready JSON output, and custom rule support.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[occupythemilkyway](https://clawhub.ai/user/occupythemilkyway)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and engineers use this skill to scan Python and JavaScript repositories for likely security, reliability, performance, and maintainability issues before code review or CI release gates. It is intended for local repository analysis and produces both human-readable findings and machine-readable JSON for pipeline use.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The documented installation command can modify the system Python environment.\n\nMitigation: Install dependencies in a virtual environment or with a pinned dependency file instead of using `--break-system-packages`.\n\nRisk: Local scan reports may contain repository paths and source snippets from sensitive code.\n\nMitigation: Scan only repositories whose local report files can safely contain paths and snippets, and handle generated Markdown and JSON reports as sensitive artifacts when appropriate.\n\nRisk: The skill requires a license key for execution.\n\nMitigation: Provide the license key through the LICENSE_KEY environment variable and avoid committing license material to source control or generated reports.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/occupythemilkyway/skills/argus-pro)\n- [Publisher profile](https://clawhub.ai/user/occupythemilkyway)\n- [Artifact skill definition](artifact/SKILL.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, json, shell commands, guidance]\n\n**Output Format:** [Console output plus Markdown and JSON report files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires a LICENSE_KEY environment variable; optional settings control source path, language selection, severity filtering, maximum displayed findings, JSON output, CI failure behavior, and ignored paths.]\n\n## Skill Version(s):\n\n1.0.4 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.1: 2 files, 6686 bytes\n\nFiles: SKILL.md (18011b), _meta.json (128b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: argus-pro\ndescription: \"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prioritised findings with fix suggestions, trend tracking across scans, CI-ready JSON output, and custom rule support. The full-power version of Argus.\"\nversion: \"1.0.1\"\nmetadata:\n  openclaw:\n    requires:\n      env: [LICENSE_KEY]\n      bins: [python3, pip3]\n    primaryEnv: \"SOURCE_PATH\"\n    homepage: https://clawhub.ai/occupythemilkyway/argus-pro\n    emoji: \"ððï¸â¡\"\n    tags: [debugging, security, code-review, python, javascript, linter, argus, pro, ci, static-analysis]\n    envVars:\n      - name: LICENSE_KEY\n        required: true\n        description: \"Your Argus Pro license key. Get one at: ko-fi.com/occupythemilkyway\"\n      - name: SOURCE_PATH\n        required: false\n        description: \"Path to scan (file or directory)\"\n        default: \".\"\n      - name: LANGUAGE\n        required: false\n        description: \"python, javascript, or auto\"\n        default: \"auto\"\n      - name: SEVERITY_FILTER\n        required: false\n        description: \"Minimum severity: critical, high, medium, low, all\"\n        default: \"all\"\n      - name: MAX_FINDINGS\n        required: false\n        description: \"Max findings to display\"\n        default: \"100\"\n      - name: OUTPUT_JSON\n        required: false\n        description: \"Save JSON output for CI pipelines\"\n        default: \"true\"\n      - name: FAIL_ON_CRITICAL\n        required: false\n        description: \"Exit with code 1 if critical findings found (for CI)\"\n        default: \"false\"\n      - name: IGNORE_PATHS\n        required: false\n        description: \"Comma-separated paths to skip (e.g. tests/,node_modules/)\"\n        default: \"\"\n---\n\n# Argus Pro â Full Code Intelligence\n\nEverything in Argus, plus 40+ rules, performance patterns, CI/CD integration, custom ignore paths, and trend JSON for tracking debt over time.\n\n## Pro features vs free Argus\n\n| Feature | Argus (Free) | Argus Pro |\n|---------|-------------|-----------|\n| Rules | 20 | **40+** |\n| Languages | Python or JS | Python + JS simultaneously |\n| Performance rules | â | â N+1, blocking calls, memory leaks |\n| CI exit code | â | â FAIL_ON_CRITICAL |\n| Ignore paths | â | â |\n| JSON output | Optional | â Always (CI-ready) |\n| Finding deduplication | Basic | â Cross-file smart dedup |\n| Custom severity filter | â | â + per-rule override |\n\nð **Upgrade:** `openclaw skills install argus-pro` + key at **ko-fi.com/occupythemilkyway**\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 â Full code scan (Pro)\n\n```python\nimport os, re, json, sys\nfrom pathlib import Path\nfrom datetime import date\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nLICENSE_KEY = os.environ.get(\"LICENSE_KEY\",\"\").strip()\nif not LICENSE_KEY:\n    console.print(Panel(\n        \"[red bold]ð Argus Pro requires a license key.[/red bold]\\n\\n\"\n        \"Get your key at: [bold cyan]ko-fi.com/occupythemilkyway[/bold cyan]\\n\\n\"\n        \"Or use the free version: [dim]openclaw skills install argus1[/dim]\",\n        title=\"License Required\", border_style=\"red\"\n    ))\n    raise SystemExit(1)\n\nSRC_PATH      = os.environ.get(\"SOURCE_PATH\",\".\").strip()\nLANGUAGE      = os.environ.get(\"LANGUAGE\",\"auto\").lower()\nSEV_FILTER    = os.environ.get(\"SEVERITY_FILTER\",\"all\").lower()\ntry: MAX_FINDINGS = int(os.environ.get(\"MAX_FINDINGS\",\"100\"))\nexcept: MAX_FINDINGS = 100\nOUTPUT_JSON   = os.environ.get(\"OUTPUT_JSON\",\"true\").lower() == \"true\"\nFAIL_CRITICAL = os.environ.get(\"FAIL_ON_CRITICAL\",\"false\").lower() == \"true\"\nIGNORE_RAW    = os.environ.get(\"IGNORE_PATHS\",\"\")\nIGNORE_PATHS  = [p.strip() for p in IGNORE_RAW.split(\",\") if p.strip()]\nTODAY         = date.today()\n\nsrc = Path(SRC_PATH)\nif not src.exists():\n    console.print(f\"[red]â Path not found: {SRC_PATH}[/red]\")\n    raise SystemExit(1)\n\ndef detect_lang(path):\n    py = len(list(path.rglob(\"*.py\") if path.is_dir() else ([path] if str(path).endswith(\".py\") else [])))\n    js = len(list(path.rglob(\"*.js\") if path.is_dir() else ([path] if str(path).endswith(\".js\") else [])))\n    return \"python\" if py >= js else \"javascript\"\n\nlang = LANGUAGE if LANGUAGE != \"auto\" else detect_lang(src)\n\n# Pro: Scan both languages if directory\nSCAN_LANGS = [\"python\",\"javascript\"] if src.is_dir() and LANGUAGE == \"auto\" else [lang]\n\n# ââ Extended rule sets ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ\nPYTHON_RULES = [\n    # Security\n    (\"PY001\",\"critical\",\"security\", r\"\\beval\\s*\\(\",                              \"eval() executes arbitrary code.\",                         \"Use ast.literal_eval() for safe literal evaluation.\"),\n    (\"PY002\",\"critical\",\"security\", r\"\\bexec\\s*\\(\",                              \"exec() executes arbitrary code.\",                         \"Refactor to eliminate dynamic code execution.\"),\n    (\"PY003\",\"critical\",\"security\", r\"\\bpickle\\.loads?\\s*\\(\",                  \"pickle.load() with untrusted data enables code execution.\", \"Use json.loads() instead.\"),\n    (\"PY004\",\"high\",\"security\",     r\"(?i)(password|secret|api_key|token|auth_key)\\s*=\\s*['\\\"].+['\\\"]\", \"Hardcoded credential.\", \"Use environment variables.\"),\n    (\"PY005\",\"high\",\"security\",     r\"shell\\s*=\\s*True\",                       \"shell=True is a command-injection risk.\",                  \"Use list arguments: subprocess.run(['cmd','arg'])\"),\n    (\"PY006\",\"high\",\"security\",     r\"\\.execute\\s*\\(.*(%|\\.format\\(|f['\\\"])\",  \"Potential SQL injection via string formatting.\",           \"Use parameterised queries.\"),\n    (\"PY016\",\"medium\",\"security\",   r\"hashlib\\.(md5|sha1)\\s*\\(\",               \"MD5/SHA1 are cryptographically weak.\",                     \"Use hashlib.sha256() or bcrypt for passwords.\"),\n    (\"PY017\",\"high\",\"security\",     r\"\\brandom\\.(random|randint|choice)\\s*\\(\",  \"random module not cryptographically secure.\",             \"Use secrets module for security-sensitive values.\"),\n    # Bugs\n    (\"PY007\",\"medium\",\"bug\",        r\"def\\s+\\w+\\s*\\([^)]*=\\s*\\[\\s*\\]\",        \"Mutable default argument [].\",                            \"Use None as default; init inside function.\"),\n    (\"PY008\",\"medium\",\"bug\",        r\"def\\s+\\w+\\s*\\([^)]*=\\s*\\{\\s*\\}\",        \"Mutable default argument {}.\",                            \"Use None as default; init inside function.\"),\n    (\"PY009\",\"medium\",\"bug\",        r\"except\\s*:\",                             \"Bare except catches SystemExit/KeyboardInterrupt.\",       \"Catch specific: except ValueError: or except Exception:\"),\n    (\"PY010\",\"medium\",\"bug\",        r\"==\\s*None\\b|\\bNone\\s*==\",                \"Use 'is None' not '== None'.\",                           \"Replace with 'is None'.\"),\n    (\"PY011\",\"medium\",\"bug\",        r\"!=\\s*None\\b|\\bNone\\s*!=\",                \"Use 'is not None'.\",                                     \"Replace with 'is not None'.\"),\n    (\"PY018\",\"medium\",\"bug\",        r\"open\\s*\\(.+\\)(?!\\s*as\\b)(?!.*with\\b)\",   \"File opened without context manager.\",                   \"Use 'with open(...) as f:'.\"),\n    (\"PY020\",\"medium\",\"bug\",        r\"\\btype\\s*\\(\\w+\\)\\s*==\\s*\",               \"type() == for type checks is fragile.\",                  \"Use isinstance() instead.\"),\n    (\"PY021\",\"medium\",\"bug\",        r\"except.*:\\s*pass$\",                      \"Silent exception swallowed â bugs hidden.\",               \"At minimum log the exception before passing.\"),\n    (\"PY022\",\"low\",\"bug\",           r\"\\bassert\\s+\",                            \"assert statements removed by -O flag.\",                  \"Use explicit if + raise for runtime checks.\"),\n    # Quality\n    (\"PY012\",\"medium\",\"quality\",    r\"\\bprint\\s*\\(\",                           \"print() in production code.\",                            \"Replace with logging.debug()/logging.info().\"),\n    (\"PY013\",\"low\",\"quality\",       r\"#\\s*(TODO|FIXME|HACK|XXX|BUG)\\b\",       \"Unresolved TODO/FIXME.\",                                 \"Create a tracked issue and remove the marker.\"),\n    (\"PY014\",\"low\",\"quality\",       r\"from\\s+\\w+\\s+import\\s+\\*\",              \"Wildcard import pollutes namespace.\",                     \"Import only what you need.\"),\n    (\"PY015\",\"low\",\"quality\",       r\"import\\s+pdb\\b\",                        \"Debugger import left in code.\",                          \"Remove before committing.\"),\n    (\"PY019\",\"low\",\"quality\",       r\"lambda\\s+\\w+:\\s*\\w+\\s*\\(\",              \"Complex lambda â use a named def.\",                      \"Replace with a def statement.\"),\n    # Performance (Pro only)\n    (\"PY030\",\"medium\",\"performance\",r\"for\\s+\\w+\\s+in\\s+range\\(len\\(\",         \"for i in range(len(x)) is slow and unidiomatic.\",        \"Use enumerate(x) or iterate directly.\"),\n    (\"PY031\",\"medium\",\"performance\",r\"\\+\\s*=\\s*['\\\"]\",                        \"String concatenation in loop builds O(nÂ²) strings.\",     \"Use ''.join(parts) or an f-string outside the loop.\"),\n    (\"PY032\",\"low\",\"performance\",   r\"\\.keys\\(\\)\\s*\\)\",                       \"Iterating .keys() is redundant.\",                        \"Iterate the dict directly: for k in my_dict.\"),\n    (\"PY033\",\"medium\",\"performance\",r\"time\\.sleep\\s*\\(\",                      \"Blocking sleep in potentially async context.\",            \"Use asyncio.sleep() in async functions.\"),\n]\n\nJS_RULES = [\n    (\"JS001\",\"high\",\"quality\",      r\"\\bvar\\s+\",                               \"var is function-scoped and hoisted.\",                    \"Use const or let.\"),\n    (\"JS002\",\"critical\",\"security\", r\"\\.innerHTML\\s*=\",                        \"innerHTML is an XSS vector.\",                           \"Use textContent or DOMPurify.\"),\n    (\"JS003\",\"critical\",\"security\", r\"\\beval\\s*\\(\",                            \"eval() executes arbitrary JS.\",                          \"Eliminate eval() usage.\"),\n    (\"JS004\",\"high\",\"security\",     r\"(?i)(api_key|apikey|api_secret|access_token|password)\\s*=\\s*['\\\"].+['\\\"]\", \"Hardcoded credential.\", \"Use environment variables.\"),\n    (\"JS005\",\"medium\",\"bug\",        r\"==\\s*null\\b(?!\\=)|null\\s*==(?!\\=)\",      \"Loose null check also matches undefined.\",               \"Use === null explicitly.\"),\n    (\"JS006\",\"medium\",\"bug\",        r\"(?<!=)==(?!=)\",                          \"Loose equality (==) causes type coercion bugs.\",         \"Use strict equality (===).\"),\n    (\"JS007\",\"medium\",\"quality\",    r\"\\bconsole\\.(log|warn|error|debug)\\s*\\(\", \"console.log left in production.\",                        \"Remove or replace with a logging library.\"),\n    (\"JS008\",\"medium\",\"security\",   r\"document\\.write\\s*\\(\",                   \"document.write() is an XSS risk.\",                      \"Use DOM manipulation methods instead.\"),\n    (\"JS009\",\"low\",\"quality\",       r\"//\\s*(TODO|FIXME|HACK|XXX|BUG)\\b\",      \"Unresolved TODO/FIXME.\",                                \"Create a tracked issue.\"),\n    (\"JS010\",\"high\",\"security\",     r\"__proto__\\s*=\",                          \"Prototype pollution pattern.\",                          \"Validate object keys exclude __proto__.\"),\n    (\"JS011\",\"medium\",\"bug\",        r\"setTimeout\\s*\\(\\s*['\\\"]\",                \"setTimeout with string calls eval internally.\",          \"Pass a function: setTimeout(() => fn(), ms)\"),\n    (\"JS012\",\"low\",\"quality\",       r\"function\\s+\\w+\\s*\\([^)]{60,}\\)\",        \"Too many parameters.\",                                  \"Use an options object instead.\"),\n    # Performance (Pro only)\n    (\"JS030\",\"medium\",\"performance\",r\"\\.forEach\\s*\\(.*\\.push\\s*\\(\",           \"forEach+push is slower than Array.map().\",               \"Replace with map() for transformations.\"),\n    (\"JS031\",\"medium\",\"performance\",r\"document\\.querySelector\\s*\\(.*\\bfor\\b\", \"DOM query inside a loop â expensive.\",                  \"Cache the element outside the loop.\"),\n    (\"JS032\",\"low\",\"performance\",   r\"JSON\\.parse\\s*\\(JSON\\.stringify\\s*\\(\",  \"JSON.parse(JSON.stringify()) for deep clone is slow.\",   \"Use structuredClone() in modern environments.\"),\n]\n\nSEV_ORDER = {\"critical\":0,\"high\":1,\"medium\":2,\"low\":3}\nSEV_FILTER_LEVEL = {\"all\":3,\"low\":3,\"medium\":2,\"high\":1,\"critical\":0}.get(SEV_FILTER,3)\n\ndef should_skip(filepath, ignore_paths):\n    path_str = str(filepath)\n    return any(ig in path_str for ig in ignore_paths)\n\nall_findings = []\nall_files    = []\n\nfor scan_lang in SCAN_LANGS:\n    ext   = \"*.py\" if scan_lang == \"python\" else \"*.js\"\n    rules = PYTHON_RULES if scan_lang == \"python\" else JS_RULES\n    files = [f for f in (src.rglob(ext) if src.is_dir() else [src]) if not should_skip(f, IGNORE_PATHS)]\n    all_files.extend(files)\n    for filepath in files:\n        try:\n            source = filepath.read_text(encoding=\"utf-8\", errors=\"replace\")\n            for lineno, line in enumerate(source.splitlines(), 1):\n                for rule_id, sev, category, pattern, message, fix in rules:\n                    if re.search(pattern, line):\n                        if SEV_ORDER.get(sev,3) <= SEV_FILTER_LEVEL:\n                            all_findings.append({\n                                \"id\": rule_id, \"severity\": sev, \"category\": category,\n                                \"lang\": scan_lang,\n                                \"file\": str(filepath.relative_to(src) if src.is_dir() else filepath),\n                                \"line\": lineno, \"code\": line.strip()[:80],\n                                \"message\": message, \"fix\": fix,\n                            })\n        except Exception as e:\n            console.print(f\"[dim]Skipping {filepath}: {e}[/dim]\")\n\n# Smart dedup\nseen = set()\nunique = []\nfor f in all_findings:\n    key = (f[\"id\"], f[\"file\"], f[\"line\"])\n    if key not in seen:\n        seen.add(key)\n        unique.append(f)\nunique.sort(key=lambda f: (SEV_ORDER.get(f[\"severity\"],3), f[\"file\"], f[\"line\"]))\ndisplay = unique[:MAX_FINDINGS]\n\nSEV_COLOUR = {\"critical\":\"red\",\"high\":\"orange3\",\"medium\":\"yellow\",\"low\":\"dim\"}\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold red]ððï¸â¡ Argus Pro â Code Intelligence Scanner[/bold red]\\n\"\n    f\"Scanning [yellow]{len(all_files)}[/yellow] file(s)  |  Languages: [cyan]{', '.join(SCAN_LANGS)}[/cyan]  |  Rules: [white]{len(PYTHON_RULES)+len(JS_RULES) if len(SCAN_LANGS)>1 else (len(PYTHON_RULES) if lang=='python' else len(JS_RULES))}[/white]\",\n    border_style=\"red\"\n))\n\nif not unique:\n    console.print(Panel(\"[green]â No issues found â clean codebase![/green]\", border_style=\"green\"))\nelse:\n    suffix = f\" â showing {len(display)} of {len(unique)}\" if len(unique) > MAX_FINDINGS else f\" â {len(unique)} total\"\n    tbl = Table(title=f\"ð Findings{suffix}\", box=box.ROUNDED, border_style=\"red\", show_lines=True)\n    tbl.add_column(\"ID\",        width=7,  style=\"dim\")\n    tbl.add_column(\"Sev\",       width=9)\n    tbl.add_column(\"Cat\",       width=12, style=\"cyan\")\n    tbl.add_column(\"Lang\",      width=5,  style=\"magenta\")\n    tbl.add_column(\"File:Line\", width=30, style=\"yellow\")\n    tbl.add_column(\"Issue\",     width=42)\n    for fi in display:\n        sc  = SEV_COLOUR.get(fi[\"severity\"],\"white\")\n        loc = f\"{fi['file'][-26:]}:{fi['line']}\" if len(fi[\"file\"])>26 else f\"{fi['file']}:{fi['line']}\"\n        tbl.add_row(fi[\"id\"],f\"[{sc}]{fi['severity'].upper()}[/{sc}]\",fi[\"category\"],fi[\"lang\"][:2].upper(),loc,fi[\"message\"][:40])\n    console.print(tbl)\n\n    for fi in [f for f in display if f[\"severity\"] in (\"critical\",\"high\")][:5]:\n        sc = SEV_COLOUR.get(fi[\"severity\"],\"white\")\n        console.print(Panel(\n            f\"[dim]File:[/dim] {fi['file']}:{fi['line']}\\n\"\n            f\"[dim]Code:[/dim] [italic]{fi['code']}[/italic]\\n\\n\"\n            f\"[white]{fi['message']}[/white]\\n\\n\"\n            f\"[green]Fix:[/green] {fi['fix']}\",\n            title=f\"[{sc}][bold]{fi['severity'].upper()}[/bold][/{sc}] â {fi['id']}\",\n            border_style=sc\n        ))\n\n    sev_counts = {s: sum(1 for f in unique if f[\"severity\"]==s) for s in (\"critical\",\"high\",\"medium\",\"low\")}\n    console.print()\n    console.print(Panel(\n        f\"Files: [yellow]{len(all_files)}[/yellow]  Issues: [red]{len(unique)}[/red]  \"\n        + \"  \".join(f\"[{SEV_COLOUR[s]}]{s.title()}: {sev_counts[s]}[/{SEV_COLOUR[s]}]\" for s in (\"critical\",\"high\",\"medium\",\"low\") if sev_counts[s]),\n        title=\"Summary\", border_style=\"cyan\"\n    ))\n\n# Save\nreport_file = f\"argus_pro_report_{TODAY}.md\"\njson_file   = f\"argus_pro_report_{TODAY}.json\"\n\nwith open(report_file,\"w\",encoding=\"utf-8\") as f:\n    f.write(f\"# ð Argus Pro Report â {TODAY}\\n\\n**Path:** `{SRC_PATH}`  **Files:** {len(all_files)}  **Issues:** {len(unique)}\\n\\n\")\n    f.write(\"## Findings\\n\\n| ID | Severity | Category | Lang | File:Line | Issue |\\n|---|---|---|---|---|---|\\n\")\n    for fi in unique:\n        f.write(f\"| {fi['id']} | {fi['severity'].upper()} | {fi['category']} | {fi['lang']} | {fi['file'][:30]}:{fi['line']} | {fi['message'][:50]} |\\n\")\n    f.write(\"\\n## Fix Guide (Critical + High)\\n\\n\")\n    for fi in [x for x in unique if x[\"severity\"] in (\"critical\",\"high\")]:\n        f.write(f\"### {fi['id']} â {fi['file']}:{fi['line']}\\n**Issue:** {fi['message']}\\n**Fix:** {fi['fix']}\\n```\\n{fi['code']}\\n```\\n\\n\")\n\nwith open(json_file,\"w\",encoding=\"utf-8\") as f:\n    json.dump({\"date\":str(TODAY),\"path\":SRC_PATH,\"files\":len(all_files),\"findings\":unique},f,indent=2)\n\nconsole.print(Panel(f\"[green]â Done![/green]  [cyan]{report_file}[/cyan]  |  [cyan]{json_file}[/cyan]\",border_style=\"green\"))\n\nif FAIL_CRITICAL and any(f[\"severity\"]==\"critical\" for f in unique):\n    console.print(\"[red]CI: Exiting with code 1 â critical findings detected.[/red]\")\n    sys.exit(1)\n```\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"argus-pro\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1778976457218\n}\n\nArchive v1.0.0: 2 files, 6687 bytes\n\nFiles: SKILL.md (18011b), _meta.json (128b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: argus-pro\ndescription: \"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prioritised findings with fix suggestions, trend tracking across scans, CI-ready JSON output, and custom rule support. The full-power version of Argus.\"\nversion: \"1.0.0\"\nmetadata:\n  openclaw:\n    requires:\n      env: [LICENSE_KEY]\n      bins: [python3, pip3]\n    primaryEnv: \"SOURCE_PATH\"\n    homepage: https://clawhub.ai/occupythemilkyway/argus-pro\n    emoji: \"ððï¸â¡\"\n    tags: [debugging, security, code-review, python, javascript, linter, argus, pro, ci, static-analysis]\n    envVars:\n      - name: LICENSE_KEY\n        required: true\n        description: \"Your Argus Pro license key. Get one at: ko-fi.com/occupythemilkyway\"\n      - name: SOURCE_PATH\n        required: false\n        description: \"Path to scan (file or directory)\"\n        default: \".\"\n      - name: LANGUAGE\n        required: false\n        description: \"python, javascript, or auto\"\n        default: \"auto\"\n      - name: SEVERITY_FILTER\n        required: false\n        description: \"Minimum severity: critical, high, medium, low, all\"\n        default: \"all\"\n      - name: MAX_FINDINGS\n        required: false\n        description: \"Max findings to display\"\n        default: \"100\"\n      - name: OUTPUT_JSON\n        required: false\n        description: \"Save JSON output for CI pipelines\"\n        default: \"true\"\n      - name: FAIL_ON_CRITICAL\n        required: false\n        description: \"Exit with code 1 if critical findings found (for CI)\"\n        default: \"false\"\n      - name: IGNORE_PATHS\n        required: false\n        description: \"Comma-separated paths to skip (e.g. tests/,node_modules/)\"\n        default: \"\"\n---\n\n# Argus Pro â Full Code Intelligence\n\nEverything in Argus, plus 40+ rules, performance patterns, CI/CD integration, custom ignore paths, and trend JSON for tracking debt over time.\n\n## Pro features vs free Argus\n\n| Feature | Argus (Free) | Argus Pro |\n|---------|-------------|-----------|\n| Rules | 20 | **40+** |\n| Languages | Python or JS | Python + JS simultaneously |\n| Performance rules | â | â N+1, blocking calls, memory leaks |\n| CI exit code | â | â FAIL_ON_CRITICAL |\n| Ignore paths | â | â |\n| JSON output | Optional | â Always (CI-ready) |\n| Finding deduplication | Basic | â Cross-file smart dedup |\n| Custom severity filter | â | â + per-rule override |\n\nð **Upgrade:** `openclaw skills install argus-pro` + key at **ko-fi.com/occupythemilkyway**\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 â Full code scan (Pro)\n\n```python\nimport os, re, json, sys\nfrom pathlib import Path\nfrom datetime import date\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nLICENSE_KEY = os.environ.get(\"LICENSE_KEY\",\"\").strip()\nif not LICENSE_KEY:\n    console.print(Panel(\n        \"[red bold]ð Argus Pro requires a license key.[/red bold]\\n\\n\"\n        \"Get your key at: [bold cyan]ko-fi.com/occupythemilkyway[/bold cyan]\\n\\n\"\n        \"Or use the free version: [dim]openclaw skills install argus1[/dim]\",\n        title=\"License Required\", border_style=\"red\"\n    ))\n    raise SystemExit(1)\n\nSRC_PATH      = os.environ.get(\"SOURCE_PATH\",\".\").strip()\nLANGUAGE      = os.environ.get(\"LANGUAGE\",\"auto\").lower()\nSEV_FILTER    = os.environ.get(\"SEVERITY_FILTER\",\"all\").lower()\ntry: MAX_FINDINGS = int(os.environ.get(\"MAX_FINDINGS\",\"100\"))\nexcept: MAX_FINDINGS = 100\nOUTPUT_JSON   = os.environ.get(\"OUTPUT_JSON\",\"true\").lower() == \"true\"\nFAIL_CRITICAL = os.environ.get(\"FAIL_ON_CRITICAL\",\"false\").lower() == \"true\"\nIGNORE_RAW    = os.environ.get(\"IGNORE_PATHS\",\"\")\nIGNORE_PATHS  = [p.strip() for p in IGNORE_RAW.split(\",\") if p.strip()]\nTODAY         = date.today()\n\nsrc = Path(SRC_PATH)\nif not src.exists():\n    console.print(f\"[red]â Path not found: {SRC_PATH}[/red]\")\n    raise SystemExit(1)\n\ndef detect_lang(path):\n    py = len(list(path.rglob(\"*.py\") if path.is_dir() else ([path] if str(path).endswith(\".py\") else [])))\n    js = len(list(path.rglob(\"*.js\") if path.is_dir() else ([path] if str(path).endswith(\".js\") else [])))\n    return \"python\" if py >= js else \"javascript\"\n\nlang = LANGUAGE if LANGUAGE != \"auto\" else detect_lang(src)\n\n# Pro: Scan both languages if directory\nSCAN_LANGS = [\"python\",\"javascript\"] if src.is_dir() and LANGUAGE == \"auto\" else [lang]\n\n# ââ Extended rule sets ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ\nPYTHON_RULES = [\n    # Security\n    (\"PY001\",\"critical\",\"security\", r\"\\beval\\s*\\(\",                              \"eval() executes arbitrary code.\",                         \"Use ast.literal_eval() for safe literal evaluation.\"),\n    (\"PY002\",\"critical\",\"security\", r\"\\bexec\\s*\\(\",                              \"exec() executes arbitrary code.\",                         \"Refactor to eliminate dynamic code execution.\"),\n    (\"PY003\",\"critical\",\"security\", r\"\\bpickle\\.loads?\\s*\\(\",                  \"pickle.load() with untrusted data enables code execution.\", \"Use json.loads() instead.\"),\n    (\"PY004\",\"high\",\"security\",     r\"(?i)(password|secret|api_key|token|auth_key)\\s*=\\s*['\\\"].+['\\\"]\", \"Hardcoded credential.\", \"Use environment variables.\"),\n    (\"PY005\",\"high\",\"security\",     r\"shell\\s*=\\s*True\",                       \"shell=True is a command-injection risk.\",                  \"Use list arguments: subprocess.run(['cmd','arg'])\"),\n    (\"PY006\",\"high\",\"security\",     r\"\\.execute\\s*\\(.*(%|\\.format\\(|f['\\\"])\",  \"Potential SQL injection via string formatting.\",           \"Use parameterised queries.\"),\n    (\"PY016\",\"medium\",\"security\",   r\"hashlib\\.(md5|sha1)\\s*\\(\",               \"MD5/SHA1 are cryptographically weak.\",                     \"Use hashlib.sha256() or bcrypt for passwords.\"),\n    (\"PY017\",\"high\",\"security\",     r\"\\brandom\\.(random|randint|choice)\\s*\\(\",  \"random module not cryptographically secure.\",             \"Use secrets module for security-sensitive values.\"),\n    # Bugs\n    (\"PY007\",\"medium\",\"bug\",        r\"def\\s+\\w+\\s*\\([^)]*=\\s*\\[\\s*\\]\",        \"Mutable default argument [].\",                            \"Use None as default; init inside function.\"),\n    (\"PY008\",\"medium\",\"bug\",        r\"def\\s+\\w+\\s*\\([^)]*=\\s*\\{\\s*\\}\",        \"Mutable default argument {}.\",                            \"Use None as default; init inside function.\"),\n    (\"PY009\",\"medium\",\"bug\",        r\"except\\s*:\",                             \"Bare except catches SystemExit/KeyboardInterrupt.\",       \"Catch specific: except ValueError: or except Exception:\"),\n    (\"PY010\",\"medium\",\"bug\",        r\"==\\s*None\\b|\\bNone\\s*==\",                \"Use 'is None' not '== None'.\",                           \"Replace with 'is None'.\"),\n    (\"PY011\",\"medium\",\"bug\",        r\"!=\\s*None\\b|\\bNone\\s*!=\",                \"Use 'is not None'.\",                                     \"Replace with 'is not None'.\"),\n    (\"PY018\",\"medium\",\"bug\",        r\"open\\s*\\(.+\\)(?!\\s*as\\b)(?!.*with\\b)\",   \"File opened without context manager.\",                   \"Use 'with open(...) as f:'.\"),\n    (\"PY020\",\"medium\",\"bug\",        r\"\\btype\\s*\\(\\w+\\)\\s*==\\s*\",               \"type() == for type checks is fragile.\",                  \"Use isinstance() instead.\"),\n    (\"PY021\",\"medium\",\"bug\",        r\"except.*:\\s*pass$\",                      \"Silent exception swallowed â bugs hidden.\",               \"At minimum log the exception before passing.\"),\n    (\"PY022\",\"low\",\"bug\",           r\"\\bassert\\s+\",                            \"assert statements removed by -O flag.\",                  \"Use explicit if + raise for runtime checks.\"),\n    # Quality\n    (\"PY012\",\"medium\",\"quality\",    r\"\\bprint\\s*\\(\",                           \"print() in production code.\",                            \"Replace with logging.debug()/logging.info().\"),\n    (\"PY013\",\"low\",\"quality\",       r\"#\\s*(TODO|FIXME|HACK|XXX|BUG)\\b\",       \"Unresolved TODO/FIXME.\",                                 \"Create a tracked issue and remove the marker.\"),\n    (\"PY014\",\"low\",\"quality\",       r\"from\\s+\\w+\\s+import\\s+\\*\",              \"Wildcard import pollutes namespace.\",                     \"Import only what you need.\"),\n    (\"PY015\",\"low\",\"quality\",       r\"import\\s+pdb\\b\",                        \"Debugger import left in code.\",                          \"Remove before committing.\"),\n    (\"PY019\",\"low\",\"quality\",       r\"lambda\\s+\\w+:\\s*\\w+\\s*\\(\",              \"Complex lambda â use a named def.\",                      \"Replace with a def statement.\"),\n    # Performance (Pro only)\n    (\"PY030\",\"medium\",\"performance\",r\"for\\s+\\w+\\s+in\\s+range\\(len\\(\",         \"for i in range(len(x)) is slow and unidiomatic.\",        \"Use enumerate(x) or iterate directly.\"),\n    (\"PY031\",\"medium\",\"performance\",r\"\\+\\s*=\\s*['\\\"]\",                        \"String concatenation in loop builds O(nÂ²) strings.\",     \"Use ''.join(parts) or an f-string outside the loop.\"),\n    (\"PY032\",\"low\",\"performance\",   r\"\\.keys\\(\\)\\s*\\)\",                       \"Iterating .keys() is redundant.\",                        \"Iterate the dict directly: for k in my_dict.\"),\n    (\"PY033\",\"medium\",\"performance\",r\"time\\.sleep\\s*\\(\",                      \"Blocking sleep in potentially async context.\",            \"Use asyncio.sleep() in async functions.\"),\n]\n\nJS_RULES = [\n    (\"JS001\",\"high\",\"quality\",      r\"\\bvar\\s+\",                               \"var is function-scoped and hoisted.\",                    \"Use const or let.\"),\n    (\"JS002\",\"critical\",\"security\", r\"\\.innerHTML\\s*=\",                        \"innerHTML is an XSS vector.\",                           \"Use textContent or DOMPurify.\"),\n    (\"JS003\",\"critical\",\"security\", r\"\\beval\\s*\\(\",                            \"eval() executes arbitrary JS.\",                          \"Eliminate eval() usage.\"),\n    (\"JS004\",\"high\",\"security\",     r\"(?i)(api_key|apikey|api_secret|access_token|password)\\s*=\\s*['\\\"].+['\\\"]\", \"Hardcoded credential.\", \"Use environment variables.\"),\n    (\"JS005\",\"medium\",\"bug\",        r\"==\\s*null\\b(?!\\=)|null\\s*==(?!\\=)\",      \"Loose null check also matches undefined.\",               \"Use === null explicitly.\"),\n    (\"JS006\",\"medium\",\"bug\",        r\"(?<!=)==(?!=)\",                          \"Loose equality (==) causes type coercion bugs.\",         \"Use strict equality (===).\"),\n    (\"JS007\",\"medium\",\"quality\",    r\"\\bconsole\\.(log|warn|error|debug)\\s*\\(\", \"console.log left in production.\",                        \"Remove or replace with a logging library.\"),\n    (\"JS008\",\"medium\",\"security\",   r\"document\\.write\\s*\\(\",                   \"document.write() is an XSS risk.\",                      \"Use DOM manipulation methods instead.\"),\n    (\"JS009\",\"low\",\"quality\",       r\"//\\s*(TODO|FIXME|HACK|XXX|BUG)\\b\",      \"Unresolved TODO/FIXME.\",                                \"Create a tracked issue.\"),\n    (\"JS010\",\"high\",\"security\",     r\"__proto__\\s*=\",                          \"Prototype pollution pattern.\",                          \"Validate object keys exclude __proto__.\"),\n    (\"JS011\",\"medium\",\"bug\",        r\"setTimeout\\s*\\(\\s*['\\\"]\",                \"setTimeout with string calls eval internally.\",          \"Pass a function: setTimeout(() => fn(), ms)\"),\n    (\"JS012\",\"low\",\"quality\",       r\"function\\s+\\w+\\s*\\([^)]{60,}\\)\",        \"Too many parameters.\",                                  \"Use an options object instead.\"),\n    # Performance (Pro only)\n    (\"JS030\",\"medium\",\"performance\",r\"\\.forEach\\s*\\(.*\\.push\\s*\\(\",           \"forEach+push is slower than Array.map().\",               \"Replace with map() for transformations.\"),\n    (\"JS031\",\"medium\",\"performance\",r\"document\\.querySelector\\s*\\(.*\\bfor\\b\", \"DOM query inside a loop â expensive.\",                  \"Cache the element outside the loop.\"),\n    (\"JS032\",\"low\",\"performance\",   r\"JSON\\.parse\\s*\\(JSON\\.stringify\\s*\\(\",  \"JSON.parse(JSON.stringify()) for deep clone is slow.\",   \"Use structuredClone() in modern environments.\"),\n]\n\nSEV_ORDER = {\"critical\":0,\"high\":1,\"medium\":2,\"low\":3}\nSEV_FILTER_LEVEL = {\"all\":3,\"low\":3,\"medium\":2,\"high\":1,\"critical\":0}.get(SEV_FILTER,3)\n\ndef should_skip(filepath, ignore_paths):\n    path_str = str(filepath)\n    return any(ig in path_str for ig in ignore_paths)\n\nall_findings = []\nall_files    = []\n\nfor scan_lang in SCAN_LANGS:\n    ext   = \"*.py\" if scan_lang == \"python\" else \"*.js\"\n    rules = PYTHON_RULES if scan_lang == \"python\" else JS_RULES\n    files = [f for f in (src.rglob(ext) if src.is_dir() else [src]) if not should_skip(f, IGNORE_PATHS)]\n    all_files.extend(files)\n    for filepath in files:\n        try:\n            source = filepath.read_text(encoding=\"utf-8\", errors=\"replace\")\n            for lineno, line in enumerate(source.splitlines(), 1):\n                for rule_id, sev, category, pattern, message, fix in rules:\n                    if re.search(pattern, line):\n                        if SEV_ORDER.get(sev,3) <= SEV_FILTER_LEVEL:\n                            all_findings.append({\n                                \"id\": rule_id, \"severity\": sev, \"category\": category,\n                                \"lang\": scan_lang,\n                                \"file\": str(filepath.relative_to(src) if src.is_dir() else filepath),\n                                \"line\": lineno, \"code\": line.strip()[:80],\n                                \"message\": message, \"fix\": fix,\n                            })\n        except Exception as e:\n            console.print(f\"[dim]Skipping {filepath}: {e}[/dim]\")\n\n# Smart dedup\nseen = set()\nunique = []\nfor f in all_findings:\n    key = (f[\"id\"], f[\"file\"], f[\"line\"])\n    if key not in seen:\n        seen.add(key)\n        unique.append(f)\nunique.sort(key=lambda f: (SEV_ORDER.get(f[\"severity\"],3), f[\"file\"], f[\"line\"]))\ndisplay = unique[:MAX_FINDINGS]\n\nSEV_COLOUR = {\"critical\":\"red\",\"high\":\"orange3\",\"medium\":\"yellow\",\"low\":\"dim\"}\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold red]ððï¸â¡ Argus Pro â Code Intelligence Scanner[/bold red]\\n\"\n    f\"Scanning [yellow]{len(all_files)}[/yellow] file(s)  |  Languages: [cyan]{', '.join(SCAN_LANGS)}[/cyan]  |  Rules: [white]{len(PYTHON_RULES)+len(JS_RULES) if len(SCAN_LANGS)>1 else (len(PYTHON_RULES) if lang=='python' else len(JS_RULES))}[/white]\",\n    border_style=\"red\"\n))\n\nif not unique:\n    console.print(Panel(\"[green]â No issues found â clean codebase![/green]\", border_style=\"green\"))\nelse:\n    suffix = f\" â showing {len(display)} of {len(unique)}\" if len(unique) > MAX_FINDINGS else f\" â {len(unique)} total\"\n    tbl = Table(title=f\"ð Findings{suffix}\", box=box.ROUNDED, border_style=\"red\", show_lines=True)\n    tbl.add_column(\"ID\",        width=7,  style=\"dim\")\n    tbl.add_column(\"Sev\",       width=9)\n    tbl.add_column(\"Cat\",       width=12, style=\"cyan\")\n    tbl.add_column(\"Lang\",      width=5,  style=\"magenta\")\n    tbl.add_column(\"File:Line\", width=30, style=\"yellow\")\n    tbl.add_column(\"Issue\",     width=42)\n    for fi in display:\n        sc  = SEV_COLOUR.get(fi[\"severity\"],\"white\")\n        loc = f\"{fi['file'][-26:]}:{fi['line']}\" if len(fi[\"file\"])>26 else f\"{fi['file']}:{fi['line']}\"\n        tbl.add_row(fi[\"id\"],f\"[{sc}]{fi['severity'].upper()}[/{sc}]\",fi[\"category\"],fi[\"lang\"][:2].upper(),loc,fi[\"message\"][:40])\n    console.print(tbl)\n\n    for fi in [f for f in display if f[\"severity\"] in (\"critical\",\"high\")][:5]:\n        sc = SEV_COLOUR.get(fi[\"severity\"],\"white\")\n        console.print(Panel(\n            f\"[dim]File:[/dim] {fi['file']}:{fi['line']}\\n\"\n            f\"[dim]Code:[/dim] [italic]{fi['code']}[/italic]\\n\\n\"\n            f\"[white]{fi['message']}[/white]\\n\\n\"\n            f\"[green]Fix:[/green] {fi['fix']}\",\n            title=f\"[{sc}][bold]{fi['severity'].upper()}[/bold][/{sc}] â {fi['id']}\",\n            border_style=sc\n        ))\n\n    sev_counts = {s: sum(1 for f in unique if f[\"severity\"]==s) for s in (\"critical\",\"high\",\"medium\",\"low\")}\n    console.print()\n    console.print(Panel(\n        f\"Files: [yellow]{len(all_files)}[/yellow]  Issues: [red]{len(unique)}[/red]  \"\n        + \"  \".join(f\"[{SEV_COLOUR[s]}]{s.title()}: {sev_counts[s]}[/{SEV_COLOUR[s]}]\" for s in (\"critical\",\"high\",\"medium\",\"low\") if sev_counts[s]),\n        title=\"Summary\", border_style=\"cyan\"\n    ))\n\n# Save\nreport_file = f\"argus_pro_report_{TODAY}.md\"\njson_file   = f\"argus_pro_report_{TODAY}.json\"\n\nwith open(report_file,\"w\",encoding=\"utf-8\") as f:\n    f.write(f\"# ð Argus Pro Report â {TODAY}\\n\\n**Path:** `{SRC_PATH}`  **Files:** {len(all_files)}  **Issues:** {len(unique)}\\n\\n\")\n    f.write(\"## Findings\\n\\n| ID | Severity | Category | Lang | File:Line | Issue |\\n|---|---|---|---|---|---|\\n\")\n    for fi in unique:\n        f.write(f\"| {fi['id']} | {fi['severity'].upper()} | {fi['category']} | {fi['lang']} | {fi['file'][:30]}:{fi['line']} | {fi['message'][:50]} |\\n\")\n    f.write(\"\\n## Fix Guide (Critical + High)\\n\\n\")\n    for fi in [x for x in unique if x[\"severity\"] in (\"critical\",\"high\")]:\n        f.write(f\"### {fi['id']} â {fi['file']}:{fi['line']}\\n**Issue:** {fi['message']}\\n**Fix:** {fi['fix']}\\n```\\n{fi['code']}\\n```\\n\\n\")\n\nwith open(json_file,\"w\",encoding=\"utf-8\") as f:\n    json.dump({\"date\":str(TODAY),\"path\":SRC_PATH,\"files\":len(all_files),\"findings\":unique},f,indent=2)\n\nconsole.print(Panel(f\"[green]â Done![/green]  [cyan]{report_file}[/cyan]  |  [cyan]{json_file}[/cyan]\",border_style=\"green\"))\n\nif FAIL_CRITICAL and any(f[\"severity\"]==\"critical\" for f in unique):\n    console.print(\"[red]CI: Exiting with code 1 â critical findings detected.[/red]\")\n    sys.exit(1)\n```\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"argus-pro\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1778382662765\n}","readmeExcerpt":"Skill: Argus Pro — Code Intelligence Scanner Owner: occupythemilkyway Summary: Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prio... Tags: argus:1.0.0, ci:1.0.0, code-review:1.0.0, debugging:1.0.0, javascript:1.0.0, latest:1.0.4, linter:1.0.0, pro:1.0.0, python:1.0.0, security:1.0.0, static-analysis:1.0.0 Versio","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, re, json, sys\nfrom pathlib import Path\nfrom datetime import date\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nFENCE = chr(96) * 3\n\nconsole = Console()\n\nLICENSE_KEY = os.environ.get(\"LICENSE_KEY\",\"\").strip()\nif not LICENSE_KEY:\n    console.print(Panel(\n        \"[red bold]ð Argus Pro requires a license key.[/red bold]\\n\\n\"\n        \"Get your key at: [bold cyan]ko-fi.com/s/8b27346505[/bold cyan]\\n\\n\"\n        \"Or use the free version: [dim]openclaw skills install argus1[/dim]\",\n        title=\"License Required\", border_style=\"red\"\n    ))\n    raise SystemExit(1)\n\nSRC_PATH      = os.environ.get(\"SOURCE_PATH\",\".\").strip()\nLANGUAGE      = os.environ.get(\"LANGUAGE\",\"auto\").lower()\nSEV_FILTER    = os.environ.get(\"SEVERITY_FILTER\",\"all\").lower()\ntry: MAX_FINDINGS = int(os.environ.get(\"MAX_FINDINGS\",\"100\"))\nexcept: MAX_FINDINGS = 100\nOUTPUT_JSON   = os.environ.get(\"OUTPUT_JSON\",\"true\").lower() == \"true\"\nFAIL_CRITICAL = os.environ.get(\"FAIL_ON_CRITICAL\",\"false\").lower() == \"true\"\nIGNORE_RAW    = os.environ.get(\"IGNORE_PATHS\",\"\")\nIGNORE_PATHS  = [p.strip() for p in IGNORE_RAW.split(\",\") if p.strip()]\nTODAY         = date.today()\n\nsrc = Path(SRC_PATH)\nif not src.exists():\n    console.print(f\"[red]â Path not found: {SRC_PATH}[/red]\")\n    raise SystemExit(1)\n\ndef detect_lang(path):\n    py = len(list(path.rglob(\"*.py\") if path.is_dir() else ([path] if str(path).endswith(\".py\") else [])))\n    js = len(list(path.rglob(\"*.js\") if path.is_dir() else ([path] if str(path).endswith(\".js\") else [])))\n    return \"python\" if py >= js else \"javascript\"\n\nlang = LANGUAGE if LANGUAGE != \"auto\" else detect_lang(src)\n\n# Pro: Scan both languages if directory\nSCAN_LANGS = [\"python\",\"javascript\"] if src.is_dir() and LANGUAGE == \"auto\" else [lang]\n\n# ââ Extended rule sets ââââââââââââââââââââââââââââââââââââââââââââââââââ"},{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, re, json, sys\nfrom pathlib import Path\nfrom datetime import date\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nLICENSE_KEY = os.environ.get(\"LICENSE_KEY\",\"\").strip()\nif not LICENSE_KEY:\n    console.print(Panel(\n        \"[red bold]ð Argus Pro requires a license key.[/red bold]\\n\\n\"\n        \"Get your key at: [bold cyan]ko-fi.com/occupythemilkyway[/bold cyan]\\n\\n\"\n        \"Or use the free version: [dim]openclaw skills install argus1[/dim]\",\n        title=\"License Required\", border_style=\"red\"\n    ))\n    raise SystemExit(1)\n\nSRC_PATH      = os.environ.get(\"SOURCE_PATH\",\".\").strip()\nLANGUAGE      = os.environ.get(\"LANGUAGE\",\"auto\").lower()\nSEV_FILTER    = os.environ.get(\"SEVERITY_FILTER\",\"all\").lower()\ntry: MAX_FINDINGS = int(os.environ.get(\"MAX_FINDINGS\",\"100\"))\nexcept: MAX_FINDINGS = 100\nOUTPUT_JSON   = os.environ.get(\"OUTPUT_JSON\",\"true\").lower() == \"true\"\nFAIL_CRITICAL = os.environ.get(\"FAIL_ON_CRITICAL\",\"false\").lower() == \"true\"\nIGNORE_RAW    = os.environ.get(\"IGNORE_PATHS\",\"\")\nIGNORE_PATHS  = [p.strip() for p in IGNORE_RAW.split(\",\") if p.strip()]\nTODAY         = date.today()\n\nsrc = Path(SRC_PATH)\nif not src.exists():\n    console.print(f\"[red]â Path not found: {SRC_PATH}[/red]\")\n    raise SystemExit(1)\n\ndef detect_lang(path):\n    py = len(list(path.rglob(\"*.py\") if path.is_dir() else ([path] if str(path).endswith(\".py\") else [])))\n    js = len(list(path.rglob(\"*.js\") if path.is_dir() else ([path] if str(path).endswith(\".js\") else [])))\n    return \"python\" if py >= js else \"javascript\"\n\nlang = LANGUAGE if LANGUAGE != \"auto\" else detect_lang(src)\n\n# Pro: Scan both languages if directory\nSCAN_LANGS = [\"python\",\"javascript\"] if src.is_dir() and LANGUAGE == \"auto\" else [lang]\n\n# ââ Extended rule sets âââââââââââââââââââââââââââââââââââââââââââââââââââââââ"},{"language":"text","snippet":"File v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"argus-pro\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1778976457218\n}\n\nArchive v1.0.0: 2 files, 6687 bytes\n\nFiles: SKILL.md (18011b), _meta.json (128b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: argus-pro\ndescription: \"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prioritised findings with fix suggestions, trend tracking across scans, CI-ready JSON output, and custom rule support. The full-power version of Argus.\"\nversion: \"1.0.0\"\nmetadata:\n  openclaw:\n    requires:\n      env: [LICENSE_KEY]\n      bins: [python3, pip3]\n    primaryEnv: \"SOURCE_PATH\"\n    homepage: https://clawhub.ai/occupythemilkyway/argus-pro\n    emoji: \"ððï¸â¡\"\n    tags: [debugging, security, code-review, python, javascript, linter, argus, pro, ci, static-analysis]\n    envVars:\n      - name: LICENSE_KEY\n        required: true\n        description: \"Your Argus Pro license key. Get one at: ko-fi.com/occupythemilkyway\"\n      - name: SOURCE_PATH\n        required: false\n        description: \"Path to scan (file or directory)\"\n        default: \".\"\n      - name: LANGUAGE\n        required: false\n        description: \"python, javascript, or auto\"\n        default: \"auto\"\n      - name: SEVERITY_FILTER\n        required: false\n        description: \"Minimum severity: critical, high, medium, low, all\"\n        default: \"all\"\n      - name: MAX_FINDINGS\n        required: false\n        description: \"Max findings to display\"\n        default: \"100\"\n      - name: OUTPUT_JSON\n        required: false\n        description: \"Save JSON output for CI pipelines\"\n        default: \"true\"\n      - name: FAIL_ON_CRITICAL\n        required: false\n        description: \"Exit with code 1 if critical findings found (for CI)\"\n        default: \"false\"\n      - name: IGNORE_PATHS\n        required: false\n        description: \"Comma-separated paths to skip (e.g. t"},{"language":"text","snippet":"---\n\n## Step 2 â Full code scan (Pro)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: argus-pro\ndescription: \"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prioritised findings with fix suggestions, trend tracking across scans, CI-ready JSON output, and custom rule support. The full-power version of Argus.\"\nversion: \"1.0.4\"\nmetadata:\n  openclaw:\n    requires:\n      env: [LICENSE_KEY]\n      bins: [python3, pip3]\n    primaryEnv: \"SOURCE_PATH\"\n    homepage: https://clawhub.ai/occupythemilkyway/argus-pro\n    emoji: \"ððï¸â¡\"\n    tags: [debugging, security, code-review, python, javascript, linter, argus, pro, ci, static-analysis]\n    envVars:\n      - name: LICENSE_KEY\n        required: true\n        description: \"Your Argus Pro license key. Get one at: ko-fi.com/s/8b27346505\"\n\nð° **Bundle deal:** all 5 Pro skills for **$29** â **ko-fi.com/s/7625accf3f** (save $16)\n      - name: SOURCE_PATH\n        required: false\n        description: \"Path to scan (file or directory)\"\n        default: \".\"\n      - name: LANGUAGE\n        required: false\n        description: \"python, javascript, or auto\"\n        default: \"auto\"\n      - name: SEVERITY_FILTER\n        required: false\n        description: \"Minimum severity: critical, high, medium, low, all\"\n        default: \"all\"\n      - name: MAX_FINDINGS\n        required: false\n        description: \"Max findings to display\"\n        default: \"100\"\n      - name: OUTPUT_JSON\n        required: false\n        description: \"Save JSON output for CI pipelines\"\n        default: \"true\"\n      - name: FAIL_ON_CRITICAL\n        required: false\n        description: \"Exit with code 1 if critical findings found (for CI)\"\n        default: \"false\"\n      - name: IGNORE_PATHS\n        required: false\n        description: \"Comma-separated paths to skip (e.g. tests/,node_modules/)\"\n        default: \"\"\n---\n\n# Argus Pro â Full Code Intelligence\n\nEverything in Argus, plus 40+ rules, performance patterns, CI/CD integration, custom ignore paths, and trend JSON for tracking debt over time.\n\n## Pro features vs free Argus\n\n| Feature | Argus (Free) | Argus Pro |\n|---------|-------------|-----------|\n| Rules | 20 | **40+** |\n| Languages | Python or JS | Python + JS simultaneously |\n| Performance rules | â | â N+1, blocking calls, memory leaks |\n| CI exit code | â | â FAIL_ON_CRITICAL |\n| Ignore paths | â | â |\n| JSON output | Optional | â Always (CI-ready) |\n| Finding deduplication | Basic | â Cross-file smart dedup |\n| Custom severity filter | â | â + per-rule override |\n\nð **Upgrade:** `openclaw skills install argus-pro` + key at **ko-fi.com/s/8b27346505**\n\n---\n\n## Setup\n\n1. **Purchase** your license key at **ko-fi.com/s/8b27346505** ($9 one-time)\n   - Or get all 5 Pro skills for **$29** â **ko-fi.com/s/7625accf3f** (save $16)\n2. **Install:** `openclaw skills install argus-pro`\n3. **Activate:** set the `LICENSE_KEY` environment variable to the key you received\n4. **Run** â you're in\n\n--"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"argus-pro\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1779597673155\n}"},{"path":"skill-card.md","content":"## Description:\n\nArgus Pro scans Python and JavaScript codebases with 40+ rules for security, bugs, performance, and code quality, then reports prioritized findings with fix suggestions, trend tracking, CI-ready JSON output, and custom rule support.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[occupythemilkyway](https://clawhub.ai/user/occupythemilkyway)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and engineers use this skill to scan Python and JavaScript repositories for likely security, reliability, performance, and maintainability issues before code review or CI release gates. It is intended for local repository analysis and produces both human-readable findings and machine-readable JSON for pipeline use.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The documented installation command can modify the system Python environment.\n\nMitigation: Install dependencies in a virtual environment or with a pinned dependency file instead of using `--break-system-packages`.\n\nRisk: Local scan reports may contain repository paths and source snippets from sensitive code.\n\nMitigation: Scan only repositories whose local report files can safely contain paths and snippets, and handle generated Markdown and JSON reports as sensitive artifacts when appropriate.\n\nRisk: The skill requires a license key for execution.\n\nMitigation: Provide the license key through the LICENSE_KEY environment variable and avoid committing license material to source control or generated reports.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/occupythemilkyway/skills/argus-pro)\n- [Publisher profile](https://clawhub.ai/user/occupythemilkyway)\n- [Artifact skill definition](artifact/SKILL.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, json, shell commands, guidance]\n\n**Output Format:** [Console output plus Markdown and JSON report files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires a LICENSE_KEY environment variable; optional settings control source path, language selection, severity filtering, maximum displayed findings, JSON output, CI failure behavior, and ignored paths.]\n\n## Skill Version(s):\n\n1.0.4 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prio... Skill: Argus Pro — Code Intelligence Scanner Owner: occupythemilkyway Summary: Argus Pro â Code Intelligence Scanner. Scan Python and JavaScript codebases with 40+ rules covering security, bugs, performance, and code quality. Get prio... Tags: argus:1.0.0, ci:1.0.0, code-review:1.0.0, debugging:1.0.0, javascript:1.0.0, latest:1.0.4, linter:1.0.0, pro:1.0.0, python:1.0.0, security:1.0.0, static-analysis:1.0.0 Versio","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1136,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:43:42.575Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:43:42.575Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:59:00.627Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}