{
  "schemaVersion": "1.0",
  "item": {
    "slug": "smalltalk",
    "name": "Smalltalk",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/johnmci/smalltalk",
    "canonicalUrl": "https://clawhub.ai/johnmci/smalltalk",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/smalltalk",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=smalltalk",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "smalltalk-daemon.py",
      "smalltalk-dev-daemon.py",
      "smalltalk.py",
      "smalltalk_projects.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/smalltalk"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/smalltalk",
    "agentPageUrl": "https://openagent3.xyz/skills/smalltalk/agent",
    "manifestUrl": "https://openagent3.xyz/skills/smalltalk/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/smalltalk/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Smalltalk Skill",
        "body": "Execute Smalltalk code and browse live Squeak/Cuis images via MCP."
      },
      {
        "title": "Prerequisites",
        "body": "Get the ClaudeSmalltalk repo first:\n\ngit clone https://github.com/CorporateSmalltalkConsultingLtd/ClaudeSmalltalk.git\n\nThis repo contains:\n\nMCP server code for Squeak (MCP-Server-Squeak.st)\nSetup documentation (SQUEAK-SETUP.md, CLAWDBOT-SETUP.md)\nThis Clawdbot skill (clawdbot/)"
      },
      {
        "title": "Setup",
        "body": "Set up Squeak with MCP server — see SQUEAK-SETUP.md\nConfigure Clawdbot — see CLAWDBOT-SETUP.md"
      },
      {
        "title": "Usage",
        "body": "# Check setup\npython3 smalltalk.py --check\n\n# Evaluate code\npython3 smalltalk.py evaluate \"3 factorial\"\npython3 smalltalk.py evaluate \"Date today\"\n\n# Browse a class\npython3 smalltalk.py browse OrderedCollection\n\n# View method source (instance side)\npython3 smalltalk.py method-source String asUppercase\n\n# View method source (class side)\npython3 smalltalk.py method-source \"MCPServer class\" version\npython3 smalltalk.py method-source MCPServer version --class-side\n\n# List classes (with optional prefix filter)\npython3 smalltalk.py list-classes Collection\n\n# Get class hierarchy\npython3 smalltalk.py hierarchy OrderedCollection\n\n# Get subclasses  \npython3 smalltalk.py subclasses Collection\n\n# List all categories\npython3 smalltalk.py list-categories\n\n# List classes in a category\npython3 smalltalk.py classes-in-category \"Collections-Sequenceable\"\n\n# Define a new class\npython3 smalltalk.py define-class \"Object subclass: #Counter instanceVariableNames: 'count' classVariableNames: '' poolDictionaries: '' category: 'MyApp'\"\n\n# Define a method\npython3 smalltalk.py define-method Counter \"increment\n    count := (count ifNil: [0]) + 1.\n    ^ count\"\n\n# Delete a method\npython3 smalltalk.py delete-method Counter increment\n\n# Delete a class\npython3 smalltalk.py delete-class Counter"
      },
      {
        "title": "Playground (Default)",
        "body": "Stock image, ephemeral. Changes are discarded when daemon stops.\nUser says: \"load Smalltalk skill\" or \"invoke Smalltalk\" — no special flags.\n\n# Start playground daemon\nnohup python3 smalltalk-daemon.py start > /tmp/daemon.log 2>&1 &"
      },
      {
        "title": "Dev Mode",
        "body": "User supplies their own image/changes pair. Changes persist across sessions.\nUser says: \"load Smalltalk skill in dev mode with ~/MyProject.image\"\n\n# Start dev daemon with custom image\nnohup python3 smalltalk-daemon.py start --dev --image ~/MyProject.image > /tmp/daemon.log 2>&1 &\n\nDev mode sets SMALLTALK_DEV_MODE=1 so the MCP server keeps the .changes file\n(instead of redirecting to /dev/null). The supplied image must have a matching\n.changes file alongside it."
      },
      {
        "title": "Common Commands",
        "body": "# Check status\npython3 smalltalk.py --daemon-status\n\n# Stop daemon\npython3 smalltalk-daemon.py stop\n\n# Restart in dev mode\npython3 smalltalk-daemon.py restart --dev --image ~/MyProject.image"
      },
      {
        "title": "Commands",
        "body": "CommandDescription--checkVerify VM/image paths and dependencies--daemon-statusCheck if daemon is running--debugDebug hung system (sends SIGUSR1, captures stack trace)evaluate <code>Execute Smalltalk code, return resultbrowse <class>Get class metadata (superclass, ivars, instance methods and classMethods)method-source <class> <selector> [--class-side]View method source code (supports \"Class class\" syntax or --class-side flag)define-class <definition>Create or modify a classdefine-method <class> <source>Add or update a methoddelete-method <class> <selector>Remove a methoddelete-class <class>Remove a classlist-classes [prefix]List classes, optionally filteredhierarchy <class>Get superclass chainsubclasses <class>Get immediate subclasseslist-categoriesList all system categoriesclasses-in-category <cat>List classes in a categoryexplain <code>Explain Smalltalk code (requires ANTHROPIC_API_KEY or OPENAI_API_KEY)explain-method <class> <sel> [--class-side] [--source <code>]Fetch method from image and explain it (or use --source/--source-file/--source-stdin to bypass daemon)audit-comment <class> <sel> [--class-side] [--source <code>]Audit method comment vs implementation (or use --source/--source-file/--source-stdin to bypass daemon)audit-class <class>Audit all methods in a class (instance + class side)generate-sunit <targets> [--force] [--class-name <name>]Generate SUnit tests for methods and file into image"
      },
      {
        "title": "Environment Variables",
        "body": "VariableDescriptionSQUEAK_VM_PATHPath to Squeak/Cuis VM executableSQUEAK_IMAGE_PATHPath to Smalltalk image with MCP serverANTHROPIC_API_KEYAPI key for Anthropic Claude (preferred for LLM tools)ANTHROPIC_MODELAnthropic model (default: claude-opus-4-20250514)OPENAI_API_KEYAPI key for OpenAI (fallback for LLM tools)OPENAI_MODELOpenAI model (default: gpt-4o)LLM_PROVIDERForce LLM provider: anthropic or openai (auto-detected if not set)"
      },
      {
        "title": "Using with Claude Code (MCP mode)",
        "body": "When Claude Code has a live Smalltalk image connected via MCP, explain-method and audit-comment can use pre-fetched source code instead of requiring a running daemon. Use --source, --source-file, or --source-stdin to pass the method source directly:\n\n# Inline source (fetched via MCP, passed on command line)\npython3 smalltalk.py explain-method SmallInteger + --source \"+ aNumber <primitive: 1> ^ super + aNumber\"\n\n# Source from a file\npython3 smalltalk.py audit-comment Integer factorial --source-file /tmp/factorial.st\n\n# Source piped via stdin\necho \"printString ^ self printStringLimitedTo: 50000\" | python3 smalltalk.py explain-method Object printString --source-stdin\n\nThe three source flags are mutually exclusive. When none is provided, the daemon is used as before."
      },
      {
        "title": "Generating SUnit Tests",
        "body": "The generate-sunit command uses an LLM to generate SUnit test cases for Smalltalk methods and files them directly into the running image:\n\n# Generate tests for a single method\npython3 smalltalk.py generate-sunit \"String>>asUppercase\"\n\n# Generate tests for multiple methods\npython3 smalltalk.py generate-sunit \"Random>>next\" \"Random>>nextInt:\" \"Random>>seed:\"\n\n# Generate tests for an entire class (all instance methods)\npython3 smalltalk.py generate-sunit \"OrderedCollection\"\n\n# Generate tests for class-side methods\npython3 smalltalk.py generate-sunit \"Date class>>today\"\n\n# Custom test class name\npython3 smalltalk.py generate-sunit \"String>>asUppercase\" --class-name MyStringTests\n\n# Overwrite existing test class\npython3 smalltalk.py generate-sunit \"String>>asUppercase\" --force\n\n# Run the generated tests\npython3 smalltalk.py evaluate \"StringGeneratedTest buildSuite run printString\"\n\nThe generated TestCase uses standard SUnit assertions (assert:, assert:equals:, deny:, should:raise:) and is filed into a GeneratedSUnit-* category."
      },
      {
        "title": "Notes",
        "body": "Requires xvfb for headless operation on Linux servers\nUses Squeak 6.0 MCP server (GUI stays responsive if display available)\nsaveImage intentionally excluded for safety\nMCPServer version 7+ required (v7 adds class-side method support)\nPlayground mode: ephemeral, .changes → /dev/null\nDev mode: persistent, .changes kept, requires --dev --image PATH"
      }
    ],
    "body": "Smalltalk Skill\n\nExecute Smalltalk code and browse live Squeak/Cuis images via MCP.\n\nPrerequisites\n\nGet the ClaudeSmalltalk repo first:\n\ngit clone https://github.com/CorporateSmalltalkConsultingLtd/ClaudeSmalltalk.git\n\n\nThis repo contains:\n\nMCP server code for Squeak (MCP-Server-Squeak.st)\nSetup documentation (SQUEAK-SETUP.md, CLAWDBOT-SETUP.md)\nThis Clawdbot skill (clawdbot/)\nSetup\nSet up Squeak with MCP server — see SQUEAK-SETUP.md\nConfigure Clawdbot — see CLAWDBOT-SETUP.md\nUsage\n# Check setup\npython3 smalltalk.py --check\n\n# Evaluate code\npython3 smalltalk.py evaluate \"3 factorial\"\npython3 smalltalk.py evaluate \"Date today\"\n\n# Browse a class\npython3 smalltalk.py browse OrderedCollection\n\n# View method source (instance side)\npython3 smalltalk.py method-source String asUppercase\n\n# View method source (class side)\npython3 smalltalk.py method-source \"MCPServer class\" version\npython3 smalltalk.py method-source MCPServer version --class-side\n\n# List classes (with optional prefix filter)\npython3 smalltalk.py list-classes Collection\n\n# Get class hierarchy\npython3 smalltalk.py hierarchy OrderedCollection\n\n# Get subclasses  \npython3 smalltalk.py subclasses Collection\n\n# List all categories\npython3 smalltalk.py list-categories\n\n# List classes in a category\npython3 smalltalk.py classes-in-category \"Collections-Sequenceable\"\n\n# Define a new class\npython3 smalltalk.py define-class \"Object subclass: #Counter instanceVariableNames: 'count' classVariableNames: '' poolDictionaries: '' category: 'MyApp'\"\n\n# Define a method\npython3 smalltalk.py define-method Counter \"increment\n    count := (count ifNil: [0]) + 1.\n    ^ count\"\n\n# Delete a method\npython3 smalltalk.py delete-method Counter increment\n\n# Delete a class\npython3 smalltalk.py delete-class Counter\n\nOperating Modes\nPlayground (Default)\n\nStock image, ephemeral. Changes are discarded when daemon stops. User says: \"load Smalltalk skill\" or \"invoke Smalltalk\" — no special flags.\n\n# Start playground daemon\nnohup python3 smalltalk-daemon.py start > /tmp/daemon.log 2>&1 &\n\nDev Mode\n\nUser supplies their own image/changes pair. Changes persist across sessions. User says: \"load Smalltalk skill in dev mode with ~/MyProject.image\"\n\n# Start dev daemon with custom image\nnohup python3 smalltalk-daemon.py start --dev --image ~/MyProject.image > /tmp/daemon.log 2>&1 &\n\n\nDev mode sets SMALLTALK_DEV_MODE=1 so the MCP server keeps the .changes file (instead of redirecting to /dev/null). The supplied image must have a matching .changes file alongside it.\n\nCommon Commands\n# Check status\npython3 smalltalk.py --daemon-status\n\n# Stop daemon\npython3 smalltalk-daemon.py stop\n\n# Restart in dev mode\npython3 smalltalk-daemon.py restart --dev --image ~/MyProject.image\n\nCommands\nCommand\tDescription\n--check\tVerify VM/image paths and dependencies\n--daemon-status\tCheck if daemon is running\n--debug\tDebug hung system (sends SIGUSR1, captures stack trace)\nevaluate <code>\tExecute Smalltalk code, return result\nbrowse <class>\tGet class metadata (superclass, ivars, instance methods and classMethods)\nmethod-source <class> <selector> [--class-side]\tView method source code (supports \"Class class\" syntax or --class-side flag)\ndefine-class <definition>\tCreate or modify a class\ndefine-method <class> <source>\tAdd or update a method\ndelete-method <class> <selector>\tRemove a method\ndelete-class <class>\tRemove a class\nlist-classes [prefix]\tList classes, optionally filtered\nhierarchy <class>\tGet superclass chain\nsubclasses <class>\tGet immediate subclasses\nlist-categories\tList all system categories\nclasses-in-category <cat>\tList classes in a category\nexplain <code>\tExplain Smalltalk code (requires ANTHROPIC_API_KEY or OPENAI_API_KEY)\nexplain-method <class> <sel> [--class-side] [--source <code>]\tFetch method from image and explain it (or use --source/--source-file/--source-stdin to bypass daemon)\naudit-comment <class> <sel> [--class-side] [--source <code>]\tAudit method comment vs implementation (or use --source/--source-file/--source-stdin to bypass daemon)\naudit-class <class>\tAudit all methods in a class (instance + class side)\ngenerate-sunit <targets> [--force] [--class-name <name>]\tGenerate SUnit tests for methods and file into image\nEnvironment Variables\nVariable\tDescription\nSQUEAK_VM_PATH\tPath to Squeak/Cuis VM executable\nSQUEAK_IMAGE_PATH\tPath to Smalltalk image with MCP server\nANTHROPIC_API_KEY\tAPI key for Anthropic Claude (preferred for LLM tools)\nANTHROPIC_MODEL\tAnthropic model (default: claude-opus-4-20250514)\nOPENAI_API_KEY\tAPI key for OpenAI (fallback for LLM tools)\nOPENAI_MODEL\tOpenAI model (default: gpt-4o)\nLLM_PROVIDER\tForce LLM provider: anthropic or openai (auto-detected if not set)\nUsing with Claude Code (MCP mode)\n\nWhen Claude Code has a live Smalltalk image connected via MCP, explain-method and audit-comment can use pre-fetched source code instead of requiring a running daemon. Use --source, --source-file, or --source-stdin to pass the method source directly:\n\n# Inline source (fetched via MCP, passed on command line)\npython3 smalltalk.py explain-method SmallInteger + --source \"+ aNumber <primitive: 1> ^ super + aNumber\"\n\n# Source from a file\npython3 smalltalk.py audit-comment Integer factorial --source-file /tmp/factorial.st\n\n# Source piped via stdin\necho \"printString ^ self printStringLimitedTo: 50000\" | python3 smalltalk.py explain-method Object printString --source-stdin\n\n\nThe three source flags are mutually exclusive. When none is provided, the daemon is used as before.\n\nGenerating SUnit Tests\n\nThe generate-sunit command uses an LLM to generate SUnit test cases for Smalltalk methods and files them directly into the running image:\n\n# Generate tests for a single method\npython3 smalltalk.py generate-sunit \"String>>asUppercase\"\n\n# Generate tests for multiple methods\npython3 smalltalk.py generate-sunit \"Random>>next\" \"Random>>nextInt:\" \"Random>>seed:\"\n\n# Generate tests for an entire class (all instance methods)\npython3 smalltalk.py generate-sunit \"OrderedCollection\"\n\n# Generate tests for class-side methods\npython3 smalltalk.py generate-sunit \"Date class>>today\"\n\n# Custom test class name\npython3 smalltalk.py generate-sunit \"String>>asUppercase\" --class-name MyStringTests\n\n# Overwrite existing test class\npython3 smalltalk.py generate-sunit \"String>>asUppercase\" --force\n\n# Run the generated tests\npython3 smalltalk.py evaluate \"StringGeneratedTest buildSuite run printString\"\n\n\nThe generated TestCase uses standard SUnit assertions (assert:, assert:equals:, deny:, should:raise:) and is filed into a GeneratedSUnit-* category.\n\nNotes\nRequires xvfb for headless operation on Linux servers\nUses Squeak 6.0 MCP server (GUI stays responsive if display available)\nsaveImage intentionally excluded for safety\nMCPServer version 7+ required (v7 adds class-side method support)\nPlayground mode: ephemeral, .changes → /dev/null\nDev mode: persistent, .changes kept, requires --dev --image PATH"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/johnmci/smalltalk",
    "publisherUrl": "https://clawhub.ai/johnmci/smalltalk",
    "owner": "johnmci",
    "version": "1.7.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/smalltalk",
    "downloadUrl": "https://openagent3.xyz/downloads/smalltalk",
    "agentUrl": "https://openagent3.xyz/skills/smalltalk/agent",
    "manifestUrl": "https://openagent3.xyz/skills/smalltalk/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/smalltalk/agent.md"
  }
}