{"id":"b4abc627-cc1b-423c-b1db-e398d7528f14","shortId":"UnBDe9","kind":"skill","title":"smalltalk-developer","tagline":"Comprehensive Pharo Smalltalk development workflow guide with AI-driven Tonel editing. Provides expertise in Tonel file format syntax (class definitions with name, superclass, instVars, category, method categories, class comment placement), package structure (package.st placement","description":"# Smalltalk Developer Workflow\n\nImplement the standard workflow for Pharo Smalltalk development using AI editors and the Tonel file format.\n\n## Core Development Cycle\n\nThe fundamental workflow for Smalltalk development consists of three steps that repeat:\n\n### 1. Edit Tonel Files\n\nEdit Tonel files directly in the AI editor. The AI editor is the **single source of truth** for code.\n\n**Key principle**: All code changes happen in `.st` files, not in the Pharo image.\n\n**Tonel basics:**\n- One class per `.st` file\n- File name matches class name\n- Each package directory contains `package.st`\n\nFor detailed Tonel syntax and examples, see [Tonel Format Reference](references/tonel-format.md).\n\nFollow the [Style Guide](references/style-guide.md) for idiomatic Smalltalk.\n\nRefer to [Implementation Patterns](references/patterns.md) for common patterns (Singleton, Settings, etc.).\n\n### 2. Import to Pharo\n\n**Before importing**, run lint to check code quality:\n\n```\n/st-lint src/MyPackage   # Check Smalltalk best practices\n```\n\nThen import the package into the running Pharo image using absolute paths:\n\n```\nmcp__smalltalk-interop__import_package: 'MyPackage' path: '/home/user/project/src'\n```\n\n**Critical rules:**\n- ✅ **Lint before import** - Check code quality first\n- ✅ Always use **absolute paths** (never relative)\n- ✅ Re-import after **every change**\n- ✅ Import packages in **dependency order**\n- ✅ Import test packages **after main packages**\n\n### 3. Run Tests\n\nAfter import, run tests to verify changes:\n\n```\nmcp__smalltalk-interop__run_class_test: 'MyClassTest'\nmcp__smalltalk-interop__run_package_test: 'MyPackage-Tests'\n```\n\nIf tests fail, return to step 1, fix the Tonel file, and repeat.\n\n## Essential Best Practices\n\n### Path Management\n\n**Always use absolute paths for imports:**\n```\n✅ /home/user/myproject/src\n❌ ./src\n❌ ../myproject/src\n```\n\n**Finding the source directory:**\n1. Check `.project` file for `srcDirectory` field\n2. Common locations: `src/`, `repositories/`\n3. Construct full path: `<project_root>/<srcDirectory>`\n\nSee [Best Practices Reference](references/best-practices.md#path-management) for details.\n\n### Package Dependencies\n\nCheck `BaselineOf<ProjectName>` to determine correct import order:\n\n```smalltalk\nbaseline: spec\n    <baseline>\n    spec for: #common do: [\n        spec\n            package: 'MyPackage-Core';\n            package: 'MyPackage-Json' with: [\n                spec requires: #('MyPackage-Core')\n            ]\n    ]\n```\n\n**Import order**: Dependencies first → `MyPackage-Core` → `MyPackage-Json`\n\nSee [Best Practices: Dependencies](references/best-practices.md#package-dependencies-and-import-order) for complete guide.\n\n### Import Timing\n\n**Re-import after every change** - Pharo doesn't automatically reload files.\n\n**Standard sequence:**\n1. Edit `MyPackage/MyClass.st`\n2. Import `MyPackage`\n3. Edit `MyPackage-Tests/MyClassTest.st`\n4. Import `MyPackage-Tests`\n5. Run tests\n\n### File Editing Philosophy\n\nThe AI editor is the source of truth:\n\n- ✅ Edit `.st` files → Import to Pharo\n- ❌ Edit in Pharo → Export to `.st` files\n\nUse `export_package` only for:\n- Initial project setup\n- Emergency recovery\n- Exploring existing code\n\nSee [Best Practices: File Editing](references/best-practices.md#file-editing-philosophy) for rationale.\n\n## Common Patterns\n\n### Pattern 1: Creating New Class\n\n```\n1. Ensure .project file exists in project root (create if missing - see Best Practices)\n2. Create src/MyPackage/MyClass.st with class definition\n3. import_package: 'MyPackage' path: '/absolute/path/src'\n4. run_class_test: 'MyClassTest'\n```\n\n### Pattern 2: Adding Methods\n\n```\n1. Read existing src/MyPackage/MyClass.st\n2. Add new method to file\n3. import_package: 'MyPackage' path: '/absolute/path/src'\n4. run_class_test: 'MyClassTest'\n```\n\n### Pattern 3: Multi-Package Development\n\n```\n1. Check BaselineOf for dependency order\n2. Import packages in correct sequence\n3. Import test packages last\n4. Run comprehensive tests\n```\n\n### Pattern 4: Installing External Packages from GitHub\n\nWhen a required package is **not present locally**, use `install_project` — never use Metacello directly via `eval`:\n\n```\nmcp__smalltalk-interop__install_project\n  project_name: 'MyLib'\n  repository_url: 'github://owner/MyLib:branch/src'\n```\n\nParameters:\n- `project_name` (required): the baseline/project name\n- `repository_url` (required): Metacello-style URL (e.g. `github://owner/repo:branch/src`)\n- `load_groups` (optional): comma-separated groups to load\n\n**Critical rule**: If a class or package is missing and is not in the local source tree, **always reach for `install_project` first**. Do NOT try to load it with `Metacello new baseline:... load` via `eval` — that approach bypasses the managed workflow and can corrupt the image state.\n\nFor complete examples, see [Development Session Examples](examples/development-sessions.md).\n\n## Automation\n\nWhen this skill is active, automatically suggest:\n\n1. **Import commands** after editing Tonel files\n2. **Test commands** after successful import\n3. **Debugging procedures** when tests fail\n\n## Quick Reference\n\n### MCP Tools\n\n**Install external package (GitHub/remote):**\n```\nmcp__smalltalk-interop__install_project\n  project_name: 'MyLib'\n  repository_url: 'github://owner/MyLib:branch/src'\n```\n> Use this when a package is not present locally. Never use Metacello via eval for this purpose.\n\n**Import local package:**\n```\nmcp__smalltalk-interop__import_package: 'PackageName' path: '/absolute/path'\n```\n\n**Test:**\n```\nmcp__smalltalk-interop__run_class_test: 'TestClassName'\nmcp__smalltalk-interop__run_package_test: 'PackageName-Tests'\n```\n\n**Debug:**\n```\nmcp__smalltalk-interop__eval: 'Smalltalk code here'\n```\n\n**Validate (optional):**\n```\nmcp__smalltalk-validator__validate_tonel_smalltalk_from_file: '/path/to/file.st'\n```\n\n### Common Commands\n\n- `/st-import PackageName /path` - Import package\n- `/st-test TestClass` - Run tests\n- `/st-eval code` - Execute Smalltalk snippet\n- `/st-validate file.st` - Validate syntax\n\n## Troubleshooting\n\n### Import Fails\n\n**\"Package not found\":**\n- Verify absolute path is correct (in Docker, use container-side path: typically `/root/repos` — check `compose.yml` for volume mounts)\n- Check `package.st` exists\n- Ensure package name matches directory\n\n**\"Syntax error\":**\n- Run `validate_tonel_smalltalk_from_file` first\n- Check Tonel syntax (brackets, quotes, periods)\n\n**\"Dependency not found\" / missing external package:**\n- If the package is not in the local source tree, install it from GitHub:\n  ```\n  mcp__smalltalk-interop__install_project\n    project_name: 'MyLib'\n    repository_url: 'github://owner/MyLib:branch/src'\n  ```\n- Do **NOT** try `Metacello new baseline: ... load` via `eval` — use `install_project` instead\n- If it is a local package, check Baseline for required packages and import dependencies first\n\n### Tests Fail\n\n1. Read error message carefully\n2. Use `/st-eval` to debug incrementally\n3. Fix in Tonel file (not Pharo)\n4. Re-import and re-test\n\nSee [Best Practices: Error Handling](references/best-practices.md#error-handling-and-debugging) for complete guide.\n\n## Complete Documentation\n\nThis skill provides focused guidance for the core workflow. For comprehensive information:\n\n- **[Tonel Format Reference](references/tonel-format.md)** - Complete Tonel syntax guide\n- **[Style Guide](references/style-guide.md)** - Idiomatic Smalltalk patterns and concise coding practices\n- **[Best Practices](references/best-practices.md)** - Detailed practices and patterns\n- **[Development Examples](examples/development-sessions.md)** - Real-world session workflows\n- **[Implementation Patterns](references/patterns.md)** - Common patterns (Singleton, etc.)\n\n## Summary Workflow\n\n```\nEdit .st file\n    ↓\nLint code (/st-lint)\n    ↓\nImport package (absolute path)\n    ↓\nRun tests\n    ↓\nTests pass? → Done\n    ↓\nTests fail? → Debug with /st-eval → Fix .st file → Re-import\n```\n\n**Remember**: The cycle is Edit → Lint → Import → Test. Never skip lint, import, or tests.","tags":["smalltalk","developer","dev","plugin","mumez","agent-skills","agents","claude-code","marketplace","mcp","pharo-smalltalk","skills"],"capabilities":["skill","source-mumez","skill-smalltalk-developer","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/smalltalk-developer","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.455","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 11 github stars · SKILL.md body (8,012 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-04-24T07:03:21.883Z","embedding":null,"createdAt":"2026-04-23T13:04:03.384Z","updatedAt":"2026-04-24T07:03:21.883Z","lastSeenAt":"2026-04-24T07:03:21.883Z","tsv":"'/absolute/path':738 '/absolute/path/src':485,510 '/home/user/myproject/src':280 '/home/user/project/src':195 '/myclasstest.st':395 '/myproject/src':282 '/path':783 '/path/to/file.st':778 '/root/repos':818 '/src':281 '/st-eval':790,917,1025 '/st-import':781 '/st-lint':169,1011 '/st-test':786 '/st-validate':795 '1':73,262,287,384,456,460,495,522,670,910 '2':157,294,387,474,492,499,528,677,915 '3':228,299,390,480,505,517,534,683,921 '4':396,486,511,539,544,928 '5':401 'absolut':185,207,276,806,1014 'activ':667 'ad':493 'add':500 'ai':12,51,83,86,408 'ai-driven':11 'alway':205,274,623 'approach':643 'autom':662 'automat':379,668 'baselin':323,638,885,900 'baseline/project':585 'baselineof':316,524 'basic':111 'best':173,270,304,355,442,472,937,982 'bracket':844 'branch/src':579,596,709,879 'bypass':644 'care':914 'categori':29,31 'chang':100,216,237,375 'check':166,171,201,288,315,523,819,824,841,899 'class':23,32,113,120,243,459,478,488,513,610,745 'code':95,99,167,202,440,765,791,980,1010 'comma':601 'comma-separ':600 'command':672,679,780 'comment':33 'common':152,295,327,453,779,1000 'complet':366,655,948,950,968 'compose.yml':820 'comprehens':4,541,962 'concis':979 'consist':67 'construct':300 'contain':125,814 'container-sid':813 'core':58,333,343,350,959 'correct':319,532,809 'corrupt':650 'creat':457,468,475 'critic':196,606 'cycl':60,1034 'debug':684,758,919,946,1023 'definit':24,479 'depend':220,314,346,357,361,526,847,906 'detail':128,312,985 'determin':318 'develop':3,7,40,49,59,66,521,658,989 'direct':80,564 'directori':124,286,831 'docker':811 'document':951 'doesn':377 'done':1020 'driven':13 'e.g':594 'edit':15,74,77,385,391,405,415,421,445,449,674,1006,1036 'editor':52,84,87,409 'emerg':436 'ensur':461,827 'error':833,912,939,943 'error-handling-and-debug':942 'essenti':269 'etc':156,1003 'eval':566,641,723,763,888 'everi':215,374 'exampl':132,656,660,990 'examples/development-sessions.md':661,991 'execut':792 'exist':439,464,497,826 'expertis':17 'explor':438 'export':424,429 'extern':546,694,851 'fail':258,688,801,909,1022 'field':293 'file':20,56,76,79,104,116,117,266,290,381,404,417,427,444,448,463,504,676,777,839,925,1008,1028 'file-editing-philosophi':447 'file.st':796 'find':283 'first':204,347,628,840,907 'fix':263,922,1026 'focus':955 'follow':138 'format':21,57,135,965 'found':804,849 'full':301 'fundament':62 'github':549,866 'github/remote':696 'group':598,603 'guid':9,141,367,949,971,973 'guidanc':956 'handl':940,944 'happen':101 'idiomat':144,975 'imag':109,183,652 'implement':42,148,997 'import':158,162,176,191,200,213,217,222,232,279,320,344,363,368,372,388,397,418,481,506,529,535,671,682,727,734,784,800,905,931,1012,1031,1038,1043 'increment':920 'inform':963 'initi':433 'instal':545,559,571,626,693,701,863,871,890 'instead':892 'instvar':28 'interop':190,241,249,570,700,733,743,751,762,870 'json':337,353 'key':96 'last':538 'lint':164,198,1009,1037,1042 'load':597,605,633,639,886 'local':557,620,718,728,860,897 'locat':296 'main':226 'manag':273,310,646 'match':119,830 'mcp':187,238,246,567,691,697,730,740,748,759,769,867 'messag':913 'metacello':563,591,636,721,883 'metacello-styl':590 'method':30,494,502 'miss':470,614,850 'mount':823 'multi':519 'multi-packag':518 'myclasstest':245,490,515 'mylib':575,705,875 'mypackag':193,254,332,336,342,349,352,389,393,399,483,508 'mypackage-cor':331,341,348 'mypackage-json':335,351 'mypackage-test':253,392,398 'mypackage/myclass.st':386 'name':26,118,121,574,582,586,704,829,874 'never':209,561,719,1040 'new':458,501,637,884 'one':112 'option':599,768 'order':221,321,345,364,527 'owner/mylib':578,708,878 'owner/repo':595 'packag':35,123,178,192,218,224,227,251,313,330,334,360,430,482,507,520,530,537,547,553,612,695,714,729,735,753,785,802,828,852,855,898,903,1013 'package-dependencies-and-import-ord':359 'package.st':37,126,825 'packagenam':736,756,782 'packagename-test':755 'paramet':580 'pass':1019 'path':186,194,208,272,277,302,309,484,509,737,807,816,1015 'path-manag':308 'pattern':149,153,454,455,491,516,543,977,988,998,1001 'per':114 'period':846 'pharo':5,47,108,160,182,376,420,423,927 'philosophi':406,450 'placement':34,38 'practic':174,271,305,356,443,473,938,981,983,986 'present':556,717 'principl':97 'procedur':685 'project':289,434,462,466,560,572,573,581,627,702,703,872,873,891 'provid':16,954 'purpos':726 'qualiti':168,203 'quick':689 'quot':845 'rational':452 're':212,371,930,934,1030 're-import':211,370,929,1029 're-test':933 'reach':624 'read':496,911 'real':993 'real-world':992 'recoveri':437 'refer':136,146,306,690,966 'references/best-practices.md':307,358,446,941,984 'references/patterns.md':150,999 'references/style-guide.md':142,974 'references/tonel-format.md':137,967 'relat':210 'reload':380 'rememb':1032 'repeat':72,268 'repositori':298,576,587,706,876 'requir':340,552,583,589,902 'return':259 'root':467 'rule':197,607 'run':163,181,229,233,242,250,402,487,512,540,744,752,788,834,1016 'see':133,303,354,441,471,657,936 'separ':602 'sequenc':383,533 'session':659,995 'set':155 'setup':435 'side':815 'singl':90 'singleton':154,1002 'skill':665,953 'skill-smalltalk-developer' 'skip':1041 'smalltalk':2,6,39,48,65,145,172,189,240,248,322,569,699,732,742,750,761,764,771,775,793,837,869,976 'smalltalk-develop':1 'smalltalk-interop':188,239,247,568,698,731,741,749,760,868 'smalltalk-valid':770 'snippet':794 'sourc':91,285,412,621,861 'source-mumez' 'spec':324,325,329,339 'src':297 'src/mypackage':170 'src/mypackage/myclass.st':476,498 'srcdirectori':292 'st':103,115,416,426,1007,1027 'standard':44,382 'state':653 'step':70,261 'structur':36 'style':140,592,972 'success':681 'suggest':669 'summari':1004 'superclass':27 'syntax':22,130,798,832,843,970 'test':223,230,234,244,252,255,257,394,400,403,489,514,536,542,678,687,739,746,754,757,789,908,935,1017,1018,1021,1039,1045 'testclass':787 'testclassnam':747 'three':69 'time':369 'tonel':14,19,55,75,78,110,129,134,265,675,774,836,842,924,964,969 'tool':692 'topic-agent-skills' 'topic-agents' 'topic-claude-code' 'topic-marketplace' 'topic-mcp' 'topic-pharo-smalltalk' 'topic-plugin' 'topic-skills' 'topic-smalltalk' 'tree':622,862 'tri':631,882 'troubleshoot':799 'truth':93,414 'typic':817 'url':577,588,593,707,877 'use':50,184,206,275,428,558,562,710,720,812,889,916 'valid':767,772,773,797,835 'verifi':236,805 'via':565,640,722,887 'volum':822 'workflow':8,41,45,63,647,960,996,1005 'world':994","prices":[{"id":"ea527231-41d4-4e08-a043-78f4c964cfdc","listingId":"b4abc627-cc1b-423c-b1db-e398d7528f14","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-04-23T13:04:03.384Z"}],"sources":[{"listingId":"b4abc627-cc1b-423c-b1db-e398d7528f14","source":"github","sourceId":"mumez/smalltalk-dev-plugin/smalltalk-developer","sourceUrl":"https://github.com/mumez/smalltalk-dev-plugin/tree/develop/skills/smalltalk-developer","isPrimary":false,"firstSeenAt":"2026-04-23T13:04:03.384Z","lastSeenAt":"2026-04-24T07:03:21.883Z"}],"details":{"listingId":"b4abc627-cc1b-423c-b1db-e398d7528f14","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"mumez","slug":"smalltalk-developer","github":{"repo":"mumez/smalltalk-dev-plugin","stars":11,"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-04-21T15:21:41Z","description":"Claude Code plugin for AI-driven Smalltalk (Pharo) development","skill_md_sha":"e0aabb39b125a1f34a44e6743edb690c13dd15cf","skill_md_path":"skills/smalltalk-developer/SKILL.md","default_branch":"develop","skill_tree_url":"https://github.com/mumez/smalltalk-dev-plugin/tree/develop/skills/smalltalk-developer"},"layout":"multi","source":"github","category":"smalltalk-dev-plugin","frontmatter":{"name":"smalltalk-developer","description":"Comprehensive Pharo Smalltalk development workflow guide with AI-driven Tonel editing. Provides expertise in Tonel file format syntax (class definitions with name, superclass, instVars, category, method categories, class comment placement), package structure (package.st placement, directory organization, BaselineOf dependencies), development workflow (Edit → Import → Test cycle with absolute paths, re-import timing, test execution), and Pharo best practices (CRC format documentation, method categorization conventions). Use when working with Pharo Smalltalk projects, creating or editing Tonel .st files, organizing packages and dependencies, resolving import order issues, writing class comments, implementing standard Pharo development patterns (Singleton, Settings, etc.), or troubleshooting Tonel syntax."},"skills_sh_url":"https://skills.sh/mumez/smalltalk-dev-plugin/smalltalk-developer"},"updatedAt":"2026-04-24T07:03:21.883Z"}}