> ## Documentation Index
> Fetch the complete documentation index at: https://docs.versuno.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# push_asset

> Push a local .versuno/ markdown file back to Versuno.

Pushes a local markdown file from `.versuno/` back to Versuno. If the file has an `id` in its frontmatter, a new version is created on the existing asset. If not, a new asset is created and its id is written back into the file.

## Input

| Parameter   | Type   | Required | Description                                                                                                     |
| ----------- | ------ | -------- | --------------------------------------------------------------------------------------------------------------- |
| `file`      | string | Yes      | Path to the local markdown file. Relative paths resolve from the working directory. Must be inside `.versuno/`. |
| `changelog` | string | No       | Version description. Stored with the new version. Only used when updating an existing asset.                    |

## Create vs update

The behaviour depends on the file's frontmatter:

| Frontmatter has `id` | Action               | Endpoint                     |
| -------------------- | -------------------- | ---------------------------- |
| Yes                  | Create a new version | `POST /assets/{id}/versions` |
| No                   | Create a new asset   | `POST /assets`               |

## Asset type inference

When creating a new asset (no `id`), the type is inferred from the file's parent directory:

| Directory         | Inferred type   |
| ----------------- | --------------- |
| `contexts/`       | `context`       |
| `prompts/`        | `prompt`        |
| `personas/`       | `persona`       |
| `system-prompts/` | `system_prompt` |
| `skills/`         | `skill`         |

You can override this by setting `type` explicitly in the frontmatter.

## Example: update an existing asset

**Prompt:**

> *"Push my edits to `.versuno/skills/code-review.md` with the message 'Added review checklist'."*

**Tool call:**

```json theme={null}
{
  "file": ".versuno/skills/code-review.md",
  "changelog": "Added review checklist"
}
```

**Response:**

```
Pushed v13 of "Code review checklist" from .versuno/skills/code-review.md
```

The file's frontmatter is updated with the new `version` and `updated_at`:

```diff theme={null}
---
  id: def456
  type: skill
  title: Code review checklist
- version: 12
+ version: 13
  ...
- updated_at: 2026-04-11T14:22:00.000Z
+ updated_at: 2026-04-19T10:33:12.000Z
```

## Example: create a new asset

Drop a new markdown file into `.versuno/prompts/`:

```md theme={null}
---
title: Weekly standup template
tags: [meetings]
---

# Weekly standup template

Each team member answers:
1. What did you ship last week?
2. What are you shipping this week?
3. What's blocking you?
```

Then:

> *"Push `.versuno/prompts/weekly-standup.md` to Versuno."*

**Response:**

```
Created new prompt "Weekly standup template" (id: xyz987) from .versuno/prompts/weekly-standup.md
```

The file's frontmatter is rewritten to include `id`, `type`, `version: 1`, `created_at`, and `updated_at`.

## Constraints

* **Path must be inside `.versuno/`.** Files outside this folder are refused. This is a security measure against prompt injection. See [Security](/mcp/security).
* **Extension must be `.md`.** Other extensions are refused.
* **Max file size: 1 MB.** Larger files are refused.

## Errors

| Error                                                                   | Cause                                                                          |
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| `Refusing to push: file must live under the project's .versuno/ folder` | Path is outside `.versuno/`.                                                   |
| `Refusing to push: only .md files are supported`                        | Wrong extension.                                                               |
| `File too large`                                                        | Over 1 MB.                                                                     |
| `File has no content body`                                              | Only frontmatter, no actual content.                                           |
| `Could not infer asset type`                                            | Creating a new asset without a known folder and without `type` in frontmatter. |

## See also

* [pull\_asset](/mcp/tools/pull-asset) — download an asset first.
* [Frontmatter reference](/mcp/frontmatter) — the schema written by `pull_asset` and read by `push_asset`.
* [CLI: versuno prompts push](/cli/push) — bulk version of this tool.
