{"id":"b9cd207f-e03a-4ba5-8e91-db9206c49ef5","shortId":"ba4Lns","kind":"skill","title":"verify-language","tagline":"Language-specific verification for Python, TypeScript/JavaScript, and Go. Checks type safety, language idioms, and best practices. Use when asked to \"verify language\", \"check types\", or for language-specific checks.","description":"# Language-Specific Verification\n\n## Purpose\n\nVerify code against language-specific best practices and idioms for Python, TypeScript/JavaScript, and Go. All analysis happens locally.\n\n## When to Use\n\nTrigger this skill when the user asks to:\n- \"verify agent language\"\n- \"verify language\"\n- \"check types\"\n- \"check Python/TypeScript/Go code\"\n\nThis skill is also auto-invoked by the main verification orchestrator based on detected language.\n\n> **Note:** For full verification including security, patterns, and quality checks, tell the user to say **\"verify agent\"**.\n\n## Process\n\n### Step 1: Detect Language\n\nIdentify the primary language by checking:\n\n| Indicator | Language |\n|-----------|----------|\n| `pyproject.toml`, `requirements.txt`, `setup.py` | Python |\n| `package.json`, `tsconfig.json` | TypeScript/JavaScript |\n| `go.mod`, `go.sum` | Go |\n| `Cargo.toml` | Rust |\n\nAlso check file extensions in `src/` or project root:\n- `.py` → Python\n- `.ts`, `.tsx`, `.js`, `.jsx` → TypeScript/JavaScript  \n- `.go` → Go\n- `.rs` → Rust\n\n### Step 2: Run Language-Specific Checks\n\nApply checks based on detected language. Each section below is only applicable for its language.\n\n---\n\n## Python Checks\n\n### `[PATTERN]` Type Hints on Public Functions\n\nFlag any `def` function in public scope (no leading `_`) that has parameters without type annotations.\n\n**Examples:**\n\n```python\n# ⚠️ Warning - Missing type hints\ndef get_user(user_id):\n    return db.find_user(user_id)\n\ndef process_items(items, filter_fn):\n    return [filter_fn(item) for item in items]\n\n# ✅ Pass - Has type hints\ndef get_user(user_id: int) -> User:\n    return db.find_user(user_id)\n\ndef process_items(items: list[Item], filter_fn: Callable[[Item], bool]) -> list[Item]:\n    return [filter_fn(item) for item in items]\n```\n\n**Scope:**\n- Public functions (no leading `_`)\n- Class methods (except `__init__` can skip return type)\n- Module-level functions\n\nSeverity: ⚠️ Warning\n\n---\n\n### `[HEURISTIC]` Docstrings\n\nCheck for missing docstrings:\n\n| Location | Requirement |\n|----------|-------------|\n| Module | Top-level docstring explaining purpose |\n| Class | Docstring explaining class responsibility |\n| Public function | Docstring explaining args, returns, raises |\n\n**Examples:**\n\n```python\n# ⚠️ Warning - Missing docstrings\nclass UserService:\n    def get_user(self, user_id: int) -> User:\n        return self.db.find(user_id)\n\n# ✅ Pass - Documented\nclass UserService:\n    \"\"\"Service for user-related operations.\"\"\"\n    \n    def get_user(self, user_id: int) -> User:\n        \"\"\"\n        Retrieve a user by ID.\n        \n        Args:\n            user_id: The unique identifier of the user\n            \n        Returns:\n            User object if found\n            \n        Raises:\n            UserNotFoundError: If user doesn't exist\n        \"\"\"\n        return self.db.find(user_id)\n```\n\nSeverity: ⚠️ Warning\n\n---\n\n### `[PATTERN]` Requirements Pinning\n\nCheck `requirements.txt` and `pyproject.toml` dependencies:\n\n| Pattern | Severity |\n|---------|----------|\n| `package>=1.0` | ❌ Issue |\n| `package>1.0` | ❌ Issue |\n| `package` (no version) | ❌ Issue |\n| `package==1.0.0` | ✅ Pass |\n| `package~=1.0` | ✅ Pass |\n\n**In `pyproject.toml`:**\n\n```toml\n# ❌ Issue\n[project]\ndependencies = [\n    \"langchain>=0.1.0\",\n    \"openai\",\n]\n\n# ✅ Pass\n[project]\ndependencies = [\n    \"langchain==0.1.0\",\n    \"openai==1.12.0\",\n]\n```\n\nSeverity: ❌ Issue\n\n---\n\n### `[HEURISTIC]` Python Idioms\n\nCheck for non-idiomatic patterns:\n\n| Anti-pattern | Idiomatic |\n|--------------|-----------|\n| `if len(list) > 0:` | `if list:` |\n| `if x == True:` | `if x:` |\n| `list = list + [item]` | `list.append(item)` |\n| `for i in range(len(list)):` | `for item in list:` or `enumerate()` |\n| `dict.keys()` iteration | Direct dict iteration |\n\nSeverity: ⚠️ Warning\n\n---\n\n## TypeScript/JavaScript Checks\n\n### `[PATTERN]` Strict Mode\n\nCheck `tsconfig.json` for strict type checking:\n\n```json\n// ❌ Issue - Not strict\n{\n  \"compilerOptions\": {\n    \"strict\": false\n  }\n}\n\n// ❌ Issue - Strict not set\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\"\n  }\n}\n\n// ✅ Pass\n{\n  \"compilerOptions\": {\n    \"strict\": true\n  }\n}\n```\n\nSeverity: ❌ Issue (if `strict` is `false` or absent)\n\n---\n\n### `[PATTERN]` No `any` Types\n\nFlag unqualified `: any` type annotations:\n\n```typescript\n// ⚠️ Warning\nfunction process(data: any): any {\n    return data.value;\n}\n\nconst items: any[] = [];\n\n// ✅ Pass - Specific types\nfunction process(data: UserData): ProcessedData {\n    return { value: data.value };\n}\n\n// ✅ Pass - Explicit unknown with narrowing\nfunction process(data: unknown): ProcessedData {\n    if (isUserData(data)) {\n        return { value: data.value };\n    }\n    throw new Error(\"Invalid data\");\n}\n```\n\nSeverity: ⚠️ Warning\n\n---\n\n### `[HEURISTIC]` Async/Await Error Handling\n\nCheck that async functions handle errors:\n\n```typescript\n// ⚠️ Warning - No error handling\nasync function fetchUser(id: string): Promise<User> {\n    const response = await fetch(`/users/${id}`);\n    return response.json();\n}\n\n// ✅ Pass - Has error handling\nasync function fetchUser(id: string): Promise<User> {\n    try {\n        const response = await fetch(`/users/${id}`);\n        if (!response.ok) {\n            throw new Error(`HTTP ${response.status}`);\n        }\n        return response.json();\n    } catch (error) {\n        logger.error(\"Failed to fetch user\", { id, error });\n        throw new UserFetchError(id, error);\n    }\n}\n```\n\nSeverity: ⚠️ Warning\n\n---\n\n### `[HEURISTIC]` Promise Handling\n\nCheck for common Promise anti-patterns:\n\n| Anti-pattern | Issue |\n|--------------|-------|\n| Missing `.catch()` | Unhandled rejection |\n| `new Promise()` with async executor | Anti-pattern |\n| Fire-and-forget promises | No await, no handling |\n\n```typescript\n// ⚠️ Warning - No catch\nfetchData().then(process);\n\n// ⚠️ Warning - Async executor\nnew Promise(async (resolve) => {\n    const data = await fetchData();\n    resolve(data);\n});\n\n// ✅ Pass\nfetchData().then(process).catch(handleError);\n\n// ✅ Pass - Using async/await\nconst data = await fetchData();\nprocess(data);\n```\n\nSeverity: ⚠️ Warning\n\n---\n\n## Go Checks\n\n### `[PATTERN]` No Ignored Errors\n\nFlag any `_ = ` assignments where the right-hand side returns `error`:\n\n```go\n// ❌ Issue - Ignored error\n_ = file.Close()\n_ = json.Unmarshal(data, &result)\nresult, _ := db.Query(sql)\n\n// ✅ Pass - Error handled\nif err := file.Close(); err != nil {\n    log.Printf(\"failed to close file: %v\", err)\n}\n\nresult, err := db.Query(sql)\nif err != nil {\n    return nil, fmt.Errorf(\"query failed: %w\", err)\n}\n```\n\nSeverity: ❌ Issue\n\n---\n\n### `[HEURISTIC]` Context Propagation\n\nCheck that context.Context is passed through call chains:\n\n```go\n// ⚠️ Warning - Context not passed\nfunc ProcessData(data []byte) error {\n    result, err := externalAPI.Call(data)  // No context\n    return err\n}\n\n// ✅ Pass - Context propagated\nfunc ProcessData(ctx context.Context, data []byte) error {\n    result, err := externalAPI.Call(ctx, data)\n    return err\n}\n```\n\n**Check for:**\n- HTTP handlers that don't use `r.Context()`\n- Functions that call external services without context\n- Long-running operations without context cancellation support\n\nSeverity: ⚠️ Warning\n\n---\n\n### `[HEURISTIC]` Proper Package Structure\n\nCheck Go project structure:\n\n| Issue | Description |\n|-------|-------------|\n| `package main` with many files | Should split into packages |\n| Circular imports | Package A imports B, B imports A |\n| Internal packages exposed | Internal code in public packages |\n| Missing `internal/` | Shared code that shouldn't be public |\n\nSeverity: ⚠️ Warning\n\n---\n\n### `[HEURISTIC]` Go Idioms\n\nCheck for non-idiomatic patterns:\n\n| Anti-pattern | Idiomatic |\n|--------------|-----------|\n| `if err != nil { return err }` repeatedly | Consider helper or wrap |\n| Naked returns in long functions | Explicit returns |\n| `interface{}` without type assertions | Use generics or specific types |\n| Getters named `GetX()` | Just `X()` |\n\nSeverity: ⚠️ Warning\n\n---\n\n## Step 3: Generate Report\n\n```markdown\n# Language Verification Report\n\n**Project:** [name or path]\n**Date:** [current date]\n**Language detected:** [Python | TypeScript | JavaScript | Go]\n**Files analyzed:** [count]\n\n## Summary\n\n✅ X checks passed | ⚠️ Y warnings | ❌ Z issues\n\n## Type Safety\n\n- [x] Types properly defined\n- [ ] ⚠️ Missing type hints at `[file:line]`\n- [ ] ❌ Strict mode not enabled in `tsconfig.json`\n\n## Language Idioms\n\n- [x] Code follows language best practices\n- [ ] ⚠️ Non-idiomatic pattern at `[file:line]`\n\n## Error Handling\n\n- [x] Errors properly handled\n- [ ] ❌ Ignored error at `[file:line]`\n\n## Findings\n\n> `[P]` = pattern-matched · `[H]` = heuristic\n\n### ✅ Passing\n- `[P]` [Check]: [confirmation]\n\n### ⚠️ Warnings\n- `[P|H]` [Check]: [description]\n  - **Location:** [file:line]\n  - **Language rule:** [which idiom/pattern]\n  - **Suggestion:** [how to fix]\n\n### ❌ Issues\n- `[P]` [Check]: [description]\n  - **Location:** [file:line]\n  - **Rule:** [which rule violated]\n  - **Fix:** [specific remediation]\n\n## Language-Specific Recommendations\n\n### Python\n1. Add type hints to public functions\n2. Include docstrings for classes and functions\n\n### TypeScript\n1. Enable strict mode in tsconfig.json\n2. Replace `any` with specific types\n\n### Go\n1. Handle all returned errors\n2. Propagate context through call chains\n```\n\n---\n\n*For full verification including security, patterns, and quality checks, say \"verify agent\".*","tags":["verify","language","agent","verifier","aurite-ai","agent-skills","agent-testing","agent-verification","ai-agent","ai-coding-assistant","claude-code","cline"],"capabilities":["skill","source-aurite-ai","skill-verify-language","topic-agent-skills","topic-agent-testing","topic-agent-verification","topic-ai-agent","topic-ai-coding-assistant","topic-claude-code","topic-cline","topic-code-quality","topic-code-review","topic-code-verification","topic-coding-agent","topic-cursor"],"categories":["agent-verifier"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Aurite-ai/agent-verifier/verify-language","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Aurite-ai/agent-verifier","source_repo":"https://github.com/Aurite-ai/agent-verifier","install_from":"skills.sh"}},"qualityScore":"0.469","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 38 github stars · SKILL.md body (9,412 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:58:29.849Z","embedding":null,"createdAt":"2026-04-29T01:03:26.960Z","updatedAt":"2026-05-18T18:58:29.849Z","lastSeenAt":"2026-05-18T18:58:29.849Z","tsv":"'/users':594,613 '0':445 '0.1.0':418,424 '1':115,1058,1073,1086 '1.0':396,399,409 '1.0.0':406 '1.12.0':426 '2':159,1065,1079,1091 '3':937 'absent':513 'add':1059 'agent':71,112,1108 'also':83,138 'analysi':56 'analyz':958 'annot':202,522 'anti':439,648,651,664,900 'anti-pattern':438,647,650,663,899 'appli':165 'applic':176 'arg':313,358 'ask':23,68 'assert':923 'assign':720 'async':575,584,602,661,683,687 'async/await':570,703 'auto':85 'auto-invok':84 'await':592,611,672,691,706 'b':867,868 'base':92,167 'best':19,46,992 'bool':259 'byte':790,808 'call':780,828,1095 'callabl':257 'cancel':839 'cargo.toml':136 'catch':624,655,678,699 'chain':781,1096 'check':13,27,34,75,77,105,123,139,164,166,181,291,388,432,478,482,487,573,643,713,774,817,847,893,962,1021,1026,1041,1105 'circular':862 'class':275,304,307,321,337,1069 'close':751 'code':41,79,875,882,989 'common':645 'compileropt':492,499,503 'confirm':1022 'consid':909 'const':532,590,609,689,704 'context':772,784,797,801,832,838,1093 'context.context':776,806 'count':959 'ctx':805,813 'current':949 'data':527,540,553,558,566,690,694,705,709,735,789,795,807,814 'data.value':531,545,561 'date':948,950 'db.find':215,245 'db.query':738,757 'def':190,209,219,237,249,323,345 'defin':973 'depend':392,416,422 'descript':852,1027,1042 'detect':94,116,169,952 'dict':473 'dict.keys':470 'direct':472 'docstr':290,294,301,305,311,320,1067 'document':336 'doesn':376 'enabl':983,1074 'enumer':469 'err':744,746,754,756,760,768,793,799,811,816,904,907 'error':564,571,578,582,600,619,625,632,637,717,728,732,741,791,809,1001,1004,1008,1090 'es2020':501 'exampl':203,316 'except':277 'executor':662,684 'exist':378 'explain':302,306,312 'explicit':547,918 'expos':873 'extens':141 'extern':829 'externalapi.call':794,812 'fail':627,749,766 'fals':494,511 'fetch':593,612,629 'fetchdata':679,692,696,707 'fetchus':586,604 'file':140,752,857,957,978,999,1010,1029,1044 'file.close':733,745 'filter':223,226,255,263 'find':1012 'fire':667 'fire-and-forget':666 'fix':1038,1050 'flag':188,518,718 'fmt.errorf':764 'fn':224,227,256,264 'follow':990 'forget':669 'found':371 'full':98,1098 'func':787,803 'function':187,191,272,286,310,525,538,551,576,585,603,826,917,1064,1071 'generat':938 'generic':925 'get':210,238,324,346 'getter':929 'getx':931 'go':12,54,135,154,155,712,729,782,848,891,956,1085 'go.mod':133 'go.sum':134 'h':1017,1025 'hand':725 'handl':572,577,583,601,642,674,742,1002,1006,1087 'handleerror':700 'handler':820 'happen':57 'helper':910 'heurist':289,429,569,640,771,843,890,1018 'hint':184,208,236,976,1061 'http':620,819 'id':213,218,241,248,328,334,350,357,360,382,587,595,605,614,631,636 'identifi':118,363 'idiom':17,49,431,892,987 'idiom/pattern':1034 'idiomat':436,441,897,902,996 'ignor':716,731,1007 'import':863,866,869 'includ':100,1066,1100 'indic':124 'init':278 'int':242,329,351 'interfac':920 'intern':871,874,880 'invalid':565 'invok':86 'issu':397,400,404,414,428,489,495,507,653,730,770,851,967,1039 'isuserdata':557 'item':221,222,228,230,232,251,252,254,258,261,265,267,269,455,457,465,533 'iter':471,474 'javascript':955 'js':151 'json':488 'json.unmarshal':734 'jsx':152 'langchain':417,423 'languag':3,5,16,26,32,36,44,72,74,95,117,121,125,162,170,179,941,951,986,991,1031,1054 'language-specif':4,31,35,43,161,1053 'lead':196,274 'len':443,462 'level':285,300 'line':979,1000,1011,1030,1045 'list':253,260,444,447,453,454,463,467 'list.append':456 'local':58 'locat':295,1028,1043 'log.printf':748 'logger.error':626 'long':834,916 'long-run':833 'main':89,854 'mani':856 'markdown':940 'match':1016 'method':276 'miss':206,293,319,654,879,974 'mode':481,981,1076 'modul':284,297 'module-level':283 'nake':913 'name':930,945 'narrow':550 'new':563,618,634,658,685 'nil':747,761,763,905 'non':435,896,995 'non-idiomat':434,895,994 'note':96 'object':369 'openai':419,425 'oper':344,836 'orchestr':91 'p':1013,1020,1024,1040 'packag':395,398,401,405,408,845,853,861,864,872,878 'package.json':130 'paramet':199 'pass':233,335,407,410,420,502,535,546,598,695,701,740,778,786,800,963,1019 'path':947 'pattern':102,182,385,393,437,440,479,514,649,652,665,714,898,901,997,1015,1102 'pattern-match':1014 'pin':387 'practic':20,47,993 'primari':120 'process':113,220,250,526,539,552,681,698,708 'processdata':788,804 'processeddata':542,555 'project':145,415,421,849,944 'promis':589,607,641,646,659,670,686 'propag':773,802,1092 'proper':844,972,1005 'public':186,193,271,309,877,887,1063 'purpos':39,303 'py':147 'pyproject.toml':126,391,412 'python':9,51,129,148,180,204,317,430,953,1057 'python/typescript/go':78 'qualiti':104,1104 'queri':765 'r.context':825 'rais':315,372 'rang':461 'recommend':1056 'reject':657 'relat':343 'remedi':1052 'repeat':908 'replac':1080 'report':939,943 'requir':296,386 'requirements.txt':127,389 'resolv':688,693 'respons':308,591,610 'response.json':597,623 'response.ok':616 'response.status':621 'result':736,737,755,792,810 'retriev':353 'return':214,225,244,262,281,314,331,367,379,530,543,559,596,622,727,762,798,815,906,914,919,1089 'right':724 'right-hand':723 'root':146 'rs':156 'rule':1032,1046,1048 'run':160,835 'rust':137,157 'safeti':15,969 'say':110,1106 'scope':194,270 'section':172 'secur':101,1101 'self':326,348 'self.db.find':332,380 'servic':339,830 'set':498 'setup.py':128 'sever':287,383,394,427,475,506,567,638,710,769,841,888,934 'share':881 'shouldn':884 'side':726 'skill':64,81 'skill-verify-language' 'skip':280 'source-aurite-ai' 'specif':6,33,37,45,163,536,927,1051,1055,1083 'split':859 'sql':739,758 'src':143 'step':114,158,936 'strict':480,485,491,493,496,504,509,980,1075 'string':588,606 'structur':846,850 'suggest':1035 'summari':960 'support':840 'target':500 'tell':106 'throw':562,617,633 'toml':413 'top':299 'top-level':298 'topic-agent-skills' 'topic-agent-testing' 'topic-agent-verification' 'topic-ai-agent' 'topic-ai-coding-assistant' 'topic-claude-code' 'topic-cline' 'topic-code-quality' 'topic-code-review' 'topic-code-verification' 'topic-coding-agent' 'topic-cursor' 'tri':608 'trigger':62 'true':450,505 'ts':149 'tsconfig.json':131,483,985,1078 'tsx':150 'type':14,28,76,183,201,207,235,282,486,517,521,537,922,928,968,971,975,1060,1084 'typescript':523,579,675,954,1072 'typescript/javascript':10,52,132,153,477 'unhandl':656 'uniqu':362 'unknown':548,554 'unqualifi':519 'use':21,61,702,824,924 'user':67,108,211,212,216,217,239,240,243,246,247,325,327,330,333,342,347,349,352,355,359,366,368,375,381,630 'user-rel':341 'userdata':541 'userfetcherror':635 'usernotfounderror':373 'userservic':322,338 'v':753 'valu':544,560 'verif':7,38,90,99,942,1099 'verifi':2,25,40,70,73,111,1107 'verify-languag':1 'version':403 'violat':1049 'w':767 'warn':205,288,318,384,476,524,568,580,639,676,682,711,783,842,889,935,965,1023 'without':200,831,837,921 'wrap':912 'x':449,452,933,961,970,988,1003 'y':964 'z':966","prices":[{"id":"143477a7-1f52-43fa-bc85-806f2d116e0b","listingId":"b9cd207f-e03a-4ba5-8e91-db9206c49ef5","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Aurite-ai","category":"agent-verifier","install_from":"skills.sh"},"createdAt":"2026-04-29T01:03:26.960Z"}],"sources":[{"listingId":"b9cd207f-e03a-4ba5-8e91-db9206c49ef5","source":"github","sourceId":"Aurite-ai/agent-verifier/verify-language","sourceUrl":"https://github.com/Aurite-ai/agent-verifier/tree/main/skills/verify-language","isPrimary":false,"firstSeenAt":"2026-04-29T01:03:26.960Z","lastSeenAt":"2026-05-18T18:58:29.849Z"}],"details":{"listingId":"b9cd207f-e03a-4ba5-8e91-db9206c49ef5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Aurite-ai","slug":"verify-language","github":{"repo":"Aurite-ai/agent-verifier","stars":38,"topics":["agent-skills","agent-testing","agent-verification","ai-agent","ai-coding-assistant","claude-code","cline","code-quality","code-review","code-verification","coding-agent","cursor","devtools","langgraph","security","skills","windsurf"],"license":"mit","html_url":"https://github.com/Aurite-ai/agent-verifier","pushed_at":"2026-05-01T10:31:12Z","description":"Agent Verifier is a coding agent skill that verifies code against organizational policies, code quality patterns, security requirements, and framework best practices — before code ships. Works with Claude Code, Cursor, Windsurf, and 30+ agents.","skill_md_sha":"a8a0aaa4eae9642624622673ad736c499b910a74","skill_md_path":"skills/verify-language/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Aurite-ai/agent-verifier/tree/main/skills/verify-language"},"layout":"multi","source":"github","category":"agent-verifier","frontmatter":{"name":"verify-language","description":"Language-specific verification for Python, TypeScript/JavaScript, and Go. Checks type safety, language idioms, and best practices. Use when asked to \"verify language\", \"check types\", or for language-specific checks."},"skills_sh_url":"https://skills.sh/Aurite-ai/agent-verifier/verify-language"},"updatedAt":"2026-05-18T18:58:29.849Z"}}