Import a Claude Code plugin
Takeaway
Run tessl plugin import in a Claude Code plugin folder. It writes .tessl-plugin/plugin.json from .claude-plugin/plugin.json, links the folder to a Tessl project, and prints the review, scenario, and eval commands to run next.
You have a Claude Code plugin with several skills, and you want to review them, generate scenarios, and run an eval. Tessl reads only .tessl-plugin/plugin.json, so a Claude Code plugin needs a Tessl manifest and a linked project first. tessl plugin import does both in one step and leaves .claude-plugin/ untouched, so the plugin keeps working in Claude Code.
Import the plugin
From the plugin's root folder, the one that holds .claude-plugin/:
engteam is a stand-in workspace. Run tessl workspace list and use one of yours in its place.
The command:
- Writes
.tessl-plugin/plugin.jsonfrom the Claude manifest. The Claude name is flat, so the workspace becomes its prefix:my-pluginbecomesengteam/my-plugin. - Checks the result with the same validator
tessl plugin lintuses, and prints anything it finds. - Links the folder to a Tessl project. It reports a project that is already linked, links the project that matches the repository, or creates one. When no
tessl.jsonencloses the folder, it creates one at the plugin root. - Prints the next commands with real paths:
tessl review runfor each skill, thentessl scenario generateandtessl eval runfor the plugin.
Run it again and nothing changes; it reports that the plugin is already imported.
What it imports
plugin import accepts four kinds of folder:
- A Claude Code plugin, with
.claude-plugin/plugin.json. Its fields map to the Tessl manifest as described below. - A folder of skills with no manifest, with
skills/<name>/SKILL.md. The plugin is named after the folder. Pass--description, since there is no manifest to copy it from. - A single
SKILL.mdat the folder root. This writes the same manifest astessl skill import. You can pass the folder or theSKILL.mdfile itself. - A Claude Code marketplace, with only
.claude-plugin/marketplace.json. It writes nothing. For each plugin the marketplace keeps in a local folder, it lists thetessl plugin importcommand to run. A plugin whose source is a git repository or URL is listed by name only; clone it and import it from its own folder.
A folder that already has .tessl-plugin/plugin.json keeps it. The command goes straight to the project step. Pass --force to rebuild the manifest from .claude-plugin/plugin.json.
How the Claude manifest maps
namebecomes<workspace>/<name>. Pass--nameto change the name part. Plugin names use lowercase letters, numbers, dots, underscores, and hyphens, up to 90 characters. A Claude name outside that set is converted, with a warning:My Pluginbecomesmy-plugin. The same applies to a folder name or aSKILL.mdname.versionis copied, or set to0.1.0.descriptionis copied. Tessl requires one, so without it pass--description, or answer the prompt in a terminal.authoris copied. A string becomes{ "name": "..." }.homepageandlicenseare copied.repositoryis kept when it is an http(s) URL.git@github.com:owner/repo.gitbecomeshttps://github.com/owner/repo. Anything else is dropped with a warning.skillsandcommandsare left out when they point at the default./skillsand./commandsfolders, which Tessl finds by convention. Other paths are written out as the list of skill folders and command files they reach, together with the ones in./skillsand./commands, since Claude Code reads both and Tessl reads only the list.mcpServerspointing at.mcp.jsonis kept. An inline server map is written to.mcp.jsonwhen that file is absent. An existing.mcp.jsonwith different content is kept, with a warning.agents,keywords, andhooksare not imported, and each one produces a warning that names what was dropped. Claude Code also loadshooks/hooks.jsonandagents/whenplugin.jsonnames neither, so those folders produce the same warning. Add hooks by hand underhooksornativeHooks; see Configuration files.
The plugin is private unless you pass --public.
Choose the workspace and organization
The plugin name needs a workspace. It comes from the first of these that is set:
--workspace- The workspace of the project the folder is already linked to
TESSL_WORKSPACE- A prompt, in a terminal
In CI or a piped shell with none of these set, the command stops and names --workspace. A workspace name has 4 to 40 lowercase letters, numbers, and hyphens; any other value is refused before anything is written.
The project step uses the same organization rules as tessl project create: --org, then TESSL_ORG, then your only organization, then a prompt.
Flags
Writing the manifest needs no login. Linking a project does: without one, the command writes the manifest, then stops and tells you to run tessl login and the import command to finish, with the same --workspace.
Next
- Prove a skill works using evaluation: generate scenarios and run an eval on the imported plugin.
- Create a plugin: the plugin layout and the content types it can hold.
- Publish and update: share the plugin with your team or publicly.