Atomemo-official-plugins atomemo-plugin-development
git clone https://github.com/choice-open/atomemo-official-plugins
T=$(mktemp -d) && git clone --depth=1 https://github.com/choice-open/atomemo-official-plugins "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/clickhouse/.agents/skills/atomemo-plugin-development" ~/.claude/skills/choice-open-atomemo-official-plugins-atomemo-plugin-development-7641c5 && rm -rf "$T"
plugins/clickhouse/.agents/skills/atomemo-plugin-development/SKILL.mdAtomemo Plugin Development
You are helping a developer build an Atomemo plugin. Atomemo is Choiceform's workflow automation platform. Plugins extend it with new Tools (external API calls, functions) and Models (LLM definitions).
Architecture Overview
Host (Atomemo App) ↕ (secure, decoupled) Plugin Hub ← intermediary, handles security + comms ↕ Your Plugin ← SDK + your business logic
- Plugin Hub: Prevents direct host↔plugin contact; protects both sides
- SDK (
): Handles communication, types, i18n, lifecycle@choiceopen/atomemo-plugin-sdk-js - CLI (
): Project scaffolding, dev server, build, publish@choiceopen/atomemo-plugin-cli
Two Plugin Types
| Type | What it does | Source directory |
|---|---|---|
| Tool | Invokes external APIs or runs local logic | |
| Model | Describes an LLM (capabilities, pricing, params) | |
A single plugin can contain multiple Tools AND multiple Models.
Identify the Scenario
Scenario A — New project from scratch: Read
references/quick-start.md, then the appropriate type guide.
Scenario B — Adding to an existing project: Read the relevant guide directly:
- Adding a Tool →
references/tool-plugin.md - Adding a Model →
references/model-plugin.md - Adding Credentials →
references/credential.md - Configuring Parameters →
references/declarative-parameters.md
Scenario C — Publishing: Read
references/publishing.md.
Workflow
Step 1: Clarify intent
Ask (or infer from context):
- New project or adding to an existing one?
- Tool plugin, Model plugin, or both?
- Does it need credentials (API keys, tokens)?
- Target language? (TypeScript strongly recommended)
Step 2: Verify the Atomemo CLI
Before running any
atomemo command, check that the CLI is installed and up to date.
Check if installed:
atomemo --version
If the command is not found, install it first:
npm install @choiceopen/atomemo-plugin-cli --global
Check if up to date:
# Get the currently installed version atomemo --version # Get the latest published version npm view @choiceopen/atomemo-plugin-cli version
If the versions differ, upgrade before proceeding:
npm install @choiceopen/atomemo-plugin-cli@latest --global
Both of these checks are safe to run automatically. Confirm the upgrade with the user before running it — it modifies their global environment.
Step 3: Set up the project (new projects only)
See
references/quick-start.md. Key commands:
atomemo auth login atomemo plugin init # interactive: name, description, language cd <plugin-name> atomemo plugin refresh-key bun install bun run build bun run ./dist # connects to Plugin Hub
Step 4: Implement plugin components
For each component:
- Create the definition file in the appropriate directory
- Implement the required interface (
/satisfies ToolDefinition
/ModelDefinition
)CredentialDefinition - Register in
src/index.ts
Project file layout:
src/ index.ts ← entry point; register everything here tools/ ← one file per tool models/ ← one file per model credentials/ ← one file per credential type i18n/ ← translations (auto-generated by SDK)
Registration pattern (index.ts):
import { createPlugin } from "@choiceopen/atomemo-plugin-sdk-js" import { myTool } from "./tools/my-tool" import { myModel } from "./models/my-model" import { myCredential } from "./credentials/my-credential" const plugin = await createPlugin({ /* manifest fields */ }) plugin.addTool(myTool) plugin.addModel(myModel) plugin.addCredential(myCredential) plugin.run()
Step 5: Internationalization
All user-facing strings support i18n. Always use the
helper — it keeps
translations centralized and consistent across the project:t()
import { t } from "../i18n/i18n-node" display_name: t("WEATHER_TOOL_DISPLAY_NAME"), description: t("WEATHER_TOOL_DESCRIPTION"),
Only fall back to inline
I18nText objects { en_US: "...", zh_Hans: "..." } when
the t() helper is not available (e.g., in one-off scripts or test fixtures).
Step 6: Test locally
bun run build # build the plugin bun run ./dist # connect to Plugin Hub
bun run dev is watch mode for rebuilding on file changes, but it does not connect to the Hub. You must run bun run ./dist (the built output) to establish the Hub connection.
Successful connection shows:
status: ok, response: { success: true }
Step 7: Publish (when ready)
See
references/publishing.md. Key steps:
— validates, builds, syncs versionsbun run release- Fork
repoatomemo-official-plugins - Add plugin to
plugins/<your-plugin-name>/ - Open PR with title
feat(plugin): add <your-plugin-name>
Reference Files
Load these on demand based on what the developer needs:
| File | When to read |
|---|---|
| New project setup |
| Building Tool plugins |
| Building Model plugins |
| Defining credentials |
| Parameter types and UI config |
| Ready-to-copy parameter examples |
| Publishing to the marketplace |
CLI Automation
When helping a developer set up a new project, you can execute CLI commands on their behalf using the Bash tool — except for
atomemo auth login, which requires the user to complete OAuth in a browser.
What you can run automatically:
# CLI environment check — always run these before any atomemo command: atomemo --version # check if installed; install if missing npm view @choiceopen/atomemo-plugin-cli version # check latest version # Install or upgrade (confirm with user before running — modifies global environment): npm install @choiceopen/atomemo-plugin-cli --global npm install @choiceopen/atomemo-plugin-cli@latest --global # Non-interactive project init — provide all flags to skip prompts: atomemo plugin init --no-interactive -n <plugin-name> -d "<description>" -l typescript # These are always non-interactive: atomemo plugin refresh-key bun install bun run build bun run ./dist # connects to Plugin Hub; bun run dev only rebuilds, does not connect
What requires user action:
atomemo auth login uses a device authorization flow. You cannot automate it.
Instead, guide the user: tell them to run it, show them the verification URL/code
that appears, and wait for them to confirm before continuing.
Always confirm with the user before running CLI commands that create files or modify their environment.
Common Mistakes to Avoid
- Plugin naming: Must match
— lowercase only, 4–64 chars, starts with a letter, ends with a letter or digit, no consecutive special chars/^[a-z][a-z0-9_-]{2,62}[a-z0-9]$/ - Hardcoded secrets: Never hardcode API keys; always use the Credentials system
- Model naming: Must follow
format (4–64 chars, alphanumeric/underscore/hyphen/slash only)provider/model_name - Dev key expiry: Debug API key expires after 24 hours; run
to renewatomemo plugin refresh-key - Missing registration: Every tool/model/credential must be registered in
src/index.ts