> For the complete documentation index, see [llms.txt](https://docs.tessl.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tessl.io/creating-skills-and-plugins/develop-and-test-locally.md).

# Develop and test locally

{% hint style="info" %}
**Takeaway** Install a plugin from your filesystem with `tessl install file:./my-plugin`, test it with your agent, then edit and reinstall to iterate. Nothing is published until you choose to.
{% endhint %}

You usually want to test a plugin before it reaches the registry. Tessl installs plugins directly from your filesystem, so you can iterate on the content and confirm it works with your agent first. This is also how you build context that stays with one codebase, or plugins for different parts of a monorepo.

{% hint style="info" %}
This whole loop is also handled by your agent: `tessl install tessl/plugin-creator`
{% endhint %}

## The loop

### 1. Create

Scaffold a plugin, seeding a first skill:

```bash
tessl plugin new --name engteam/my-plugin --workspace engteam --skill --skill-name my-skill --skill-description "When ..." --path ./my-plugin
```

`engteam` is a stand-in workspace; run `tessl workspace list` and use one of yours.

Add any further skills by authoring `my-plugin/skills/<name>/SKILL.md` directly. Use `tessl skill new` only for a standalone skill, not inside a plugin directory, where it would nest a separate package.

### 2. Install from the filesystem

```bash
tessl install file:./my-plugin
```

The plugin is now available to your agent, exactly as an installed one would be.

### 3. Test with your agent

* **Skills**: trigger the skill and confirm it runs and produces what you expect.
* **Rules**: ask the agent to write some code and check it follows the rule.
* **MCP servers**: confirm the server appears in the agent's tools.

### 4. Validate

Lint the structure, then pack it and inspect the archive to confirm every intended file ships. Lint alone can pass on a plugin that would drop content when packaged, so check both:

```bash
tessl plugin lint ./my-plugin
tessl plugin pack ./my-plugin --output /tmp/check.tgz
tar tzf /tmp/check.tgz
```

### 5. Iterate

Edit the content, reinstall, and test again. Repeat until it behaves.

## Plugin structure

```
<plugin-dir>/
├── .tessl-plugin/
│   └── plugin.json
├── skills/<skill-dir>/SKILL.md
├── rules/
│   └── standards.md
└── evals/
    └── scenario-1/
        ├── task.md
        ├── criteria.json
        └── scenario.json
```

* `.tessl-plugin/plugin.json` points at your content. If a skill sits at the plugin root use `"skills": ["."]`; if it sits under `skills/<name>` use `"skills": ["./skills/<name>"]`, or rely on the `./skills/` convention.
* `evals/` is present only once you have generated [scenarios](/improving-your-skills/overview-improving-skills-and-plugins.md).

The complete `.tessl-plugin/plugin.json` reference is in [Configuration files](/reference/configuration.md).

## Next

* [Publish and update](/creating-skills-and-plugins/publish-and-update.md) - share the plugin once it works locally.
* [Improving your skills](/improving-your-skills/overview-improving-skills-and-plugins.md) - prove and improve quality before you rely on it.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tessl.io/creating-skills-and-plugins/develop-and-test-locally.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
