{"id":"2d09f71b-99c2-4a63-9135-bccc4996d8f5","shortId":"PfeRJB","kind":"skill","title":"st-lint","tagline":"Smalltalk best-practices linter for Tonel files. Use when validating .st files before importing to Pharo, checking code quality after editing, or diagnosing style issues in a package.","description":"# Lint Tonel Files\n\nValidate Tonel `.st` files for Smalltalk best practices before importing to Pharo.\n\n## When to Use\n\n- Before every `/st-import` — lint catches issues that would silently corrupt the image\n- After editing `.st` files — confirm no style regressions\n- When import fails with unexpected behavior — lint may reveal the root cause\n\n## Step 1: Check Meta Files (manual — MCP cannot validate these)\n\nBefore linting, verify required Tonel meta files exist:\n\n| File | Location | Required |\n|------|----------|---------|\n| `.project` | repo root | ✅ |\n| `src/.properties` | `src/` directory | ✅ |\n| `package.st` | each package directory | ✅ |\n\nIf any are missing, **warn the user, suggest `/st-setup-project`, and continue linting** — lint results are still useful even when meta files are absent, since the linter operates on `.st` file syntax independently.\n\nExpected `src/.properties` content:\n```\n{\n\t#format : #tonel\n}\n```\n\n## Step 2: Collect `.st` Files\n\nResolve the target to a list of absolute paths:\n\n- **Single file** (`src/MyPackage/MyClass.st`): use directly, skip if it is `package.st`\n- **Package directory** (`src/MyPackage`): Glob `**/*.st`, exclude `package.st`\n- **src root** (`src`): Glob `**/*.st` across all packages, exclude `package.st`\n\nAlways convert to **absolute paths** before passing to the MCP tool.\n\n## Step 3: Lint Each File\n\nCall `mcp__smalltalk-validator__lint_tonel_smalltalk_from_file` with the absolute path, one file at a time.\n\n## Step 4: Report Results\n\nShow a summary per file:\n\n```\nsrc/MyPackage/MyClass.st — ✅ clean\nsrc/MyPackage/AnotherClass.st — ⚠️ 2 warnings\n  • [warning] Method #doSomething has no comment\n  • [warning] Temporary variable 'x' shadows outer scope\nsrc/MyPackage/BrokenClass.st — ❌ 1 error\n  • [error] Syntax error near ']'\n```\n\n**Exit status semantics:**\n\n| Result | Meaning | Action |\n|--------|---------|--------|\n| 0 — clean | No issues | Proceed to import |\n| 1 — warnings only | Style issues | Proceed to import, consider fixing |\n| 2 — errors found | Syntax/structural errors | Fix before importing |\n\n## Interpreting Common Issues\n\n| Issue | Likely Cause | Fix |\n|-------|-------------|-----|\n| `Syntax error near '...'` | Unclosed bracket/paren, missing period | Check the indicated line |\n| `Method has no comment` | Missing method comment | Add a brief comment |\n| `Temporary variable shadows outer scope` | Variable name collision | Rename the temp var |\n| `Missing package.st` | package.st not found | Create it: `Package { #name : 'PkgName' }` |\n\n## Related Skills\n\n- `smalltalk-dev:st-setup-project` — Create missing meta files\n- `smalltalk-dev:smalltalk-developer` — Full Edit → Lint → Import → Test workflow","tags":["lint","smalltalk","dev","plugin","mumez","agent-skills","agents","claude-code","marketplace","mcp","pharo-smalltalk","skills"],"capabilities":["skill","source-mumez","skill-st-lint","topic-agent-skills","topic-agents","topic-claude-code","topic-marketplace","topic-mcp","topic-pharo-smalltalk","topic-plugin","topic-skills","topic-smalltalk"],"categories":["smalltalk-dev-plugin"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/mumez/smalltalk-dev-plugin/st-lint","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add mumez/smalltalk-dev-plugin","source_repo":"https://github.com/mumez/smalltalk-dev-plugin","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 13 github stars · SKILL.md body (2,694 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-18T19:07:00.622Z","embedding":null,"createdAt":"2026-05-09T01:04:42.113Z","updatedAt":"2026-05-18T19:07:00.622Z","lastSeenAt":"2026-05-18T19:07:00.622Z","tsv":"'/st-import':53 '/st-setup-project':122 '0':267 '1':84,255,274 '2':152,239,284 '3':204 '4':228 'absent':136 'absolut':163,195,220 'across':187 'action':266 'add':317 'alway':192 'behavior':76 'best':6,42 'best-practic':5 'bracket/paren':303 'brief':319 'call':208 'cannot':90 'catch':55 'caus':82,297 'check':21,85,306 'clean':237,268 'code':22 'collect':153 'collis':328 'comment':246,313,316,320 'common':293 'confirm':67 'consid':282 'content':148 'continu':124 'convert':193 'corrupt':60 'creat':338,352 'dev':347,358 'develop':361 'diagnos':27 'direct':169 'directori':109,113,176 'dosometh':243 'edit':25,64,363 'error':256,257,259,285,288,300 'even':131 'everi':52 'exclud':180,190 'exist':100 'exit':261 'expect':146 'fail':73 'file':11,16,35,39,66,87,99,101,134,143,155,166,207,217,223,235,355 'fix':283,289,298 'format':149 'found':286,337 'full':362 'glob':178,185 'imag':62 'import':18,45,72,273,281,291,365 'independ':145 'indic':308 'interpret':292 'issu':29,56,270,278,294,295 'like':296 'line':309 'lint':3,33,54,77,94,125,126,205,213,364 'linter':8,139 'list':161 'locat':102 'manual':88 'may':78 'mcp':89,201,209 'mean':265 'meta':86,98,133,354 'method':242,310,315 'miss':117,304,314,333,353 'name':327,341 'near':260,301 'one':222 'oper':140 'outer':252,324 'packag':32,112,175,189,340 'package.st':110,174,181,191,334,335 'pass':198 'path':164,196,221 'per':234 'period':305 'pharo':20,47 'pkgname':342 'practic':7,43 'proceed':271,279 'project':104,351 'qualiti':23 'regress':70 'relat':343 'renam':329 'repo':105 'report':229 'requir':96,103 'resolv':156 'result':127,230,264 'reveal':79 'root':81,106,183 'scope':253,325 'semant':263 'setup':350 'shadow':251,323 'show':231 'silent':59 'sinc':137 'singl':165 'skill':344 'skill-st-lint' 'skip':170 'smalltalk':4,41,211,215,346,357,360 'smalltalk-dev':345,356 'smalltalk-develop':359 'smalltalk-valid':210 'source-mumez' 'src':108,182,184 'src/.properties':107,147 'src/mypackage':177 'src/mypackage/anotherclass.st':238 'src/mypackage/brokenclass.st':254 'src/mypackage/myclass.st':167,236 'st':2,15,38,65,142,154,179,186,349 'st-lint':1 'st-setup-project':348 'status':262 'step':83,151,203,227 'still':129 'style':28,69,277 'suggest':121 'summari':233 'syntax':144,258,299 'syntax/structural':287 'target':158 'temp':331 'temporari':248,321 'test':366 'time':226 'tonel':10,34,37,97,150,214 'tool':202 'topic-agent-skills' 'topic-agents' 'topic-claude-code' 'topic-marketplace' 'topic-mcp' 'topic-pharo-smalltalk' 'topic-plugin' 'topic-skills' 'topic-smalltalk' 'unclos':302 'unexpect':75 'use':12,50,130,168 'user':120 'valid':14,36,91,212 'var':332 'variabl':249,322,326 'verifi':95 'warn':118,240,241,247,275 'workflow':367 'would':58 'x':250","prices":[{"id":"21d0f275-f3ac-4206-bc87-9dc07cfd6e05","listingId":"2d09f71b-99c2-4a63-9135-bccc4996d8f5","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"mumez","category":"smalltalk-dev-plugin","install_from":"skills.sh"},"createdAt":"2026-05-09T01:04:42.113Z"}],"sources":[{"listingId":"2d09f71b-99c2-4a63-9135-bccc4996d8f5","source":"github","sourceId":"mumez/smalltalk-dev-plugin/st-lint","sourceUrl":"https://github.com/mumez/smalltalk-dev-plugin/tree/develop/skills/st-lint","isPrimary":false,"firstSeenAt":"2026-05-09T01:04:42.113Z","lastSeenAt":"2026-05-18T19:07:00.622Z"}],"details":{"listingId":"2d09f71b-99c2-4a63-9135-bccc4996d8f5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"mumez","slug":"st-lint","github":{"repo":"mumez/smalltalk-dev-plugin","stars":13,"topics":["agent-skills","agents","claude-code","marketplace","mcp","pharo-smalltalk","plugin","skills","smalltalk"],"license":"mit","html_url":"https://github.com/mumez/smalltalk-dev-plugin","pushed_at":"2026-05-12T05:53:28Z","description":"Claude Code plugin for AI-driven Smalltalk (Pharo) development","skill_md_sha":"6fadfb8973707d033b2306ef0909bb7a77a4e05e","skill_md_path":"skills/st-lint/SKILL.md","default_branch":"develop","skill_tree_url":"https://github.com/mumez/smalltalk-dev-plugin/tree/develop/skills/st-lint"},"layout":"multi","source":"github","category":"smalltalk-dev-plugin","frontmatter":{"name":"st-lint","description":"Smalltalk best-practices linter for Tonel files. Use when validating .st files before importing to Pharo, checking code quality after editing, or diagnosing style issues in a package."},"skills_sh_url":"https://skills.sh/mumez/smalltalk-dev-plugin/st-lint"},"updatedAt":"2026-05-18T19:07:00.622Z"}}