<!-- enhance-docs page=reference/cli/prototype/publish -->
<!-- enhance-docs release-sha256=8a804cfc9a6fc6b942b8daf6a82266ad6e308291ae4351abee3346bc696d1258 -->

# enhance-dev prototype publish

```text
enhance-dev prototype publish [options]
```

## Arguments

This command takes no positional arguments.

## Options

| Option | Required | Default | Meaning |
| --- | --- | --- | --- |
| `--canvas-id <uuid>` | Yes | None | Canvas id, from `enhance canvas list`. |
| `--directory <path>` | Yes | None | Unpacked static build directory; do not pass a ZIP file. |
| `--title <title>` | Yes | None | Label above a new prototype frame, up to 200 characters. An update or a fork ignores it and keeps the title the node shows. |
| `--base-version <number>` | Yes | None | Document version returned by `enhance canvas document get`. |
| `--prototype-id <uuid>` | No | None | Existing prototype to update. Without `--node-id` it goes to the owner node, and is refused if that node is gone. |
| `--client-token <uuid>` | No | None | Stable UUID to reuse when retrying the exact same mutation. |
| `--node-id <id>` | No | None | The prototype's owner node to update it. Pass it with `--prototype-id`; any other node that shows the prototype forks into its own prototype. |
| `--entry <path>` | No | `index.html` | HTML entry relative to the uploaded directory. |
| `--x <pixels>` | No | `48` | Canvas x coordinate. |
| `--y <pixels>` | No | `48` | Canvas y coordinate. |
| `--width <pixels>` | No | `1440` | Prototype viewport width. |
| `--height <pixels>` | No | `900` | Prototype viewport height. |

## Input

This command presents the capability `prototype.publish`. It has external effect and composite idempotency.

<details class="reference-schema">
<summary>Show complete input JSON Schema</summary>

```json
{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"canvasId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"prototypeId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Existing prototype id to redeploy, or null to create one."},"nodeId":{"type":"string","minLength":1},"targetMode":{"type":"string","enum":["node","prototype"]},"canvasPageId":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"directory":{"type":"string","minLength":1,"description":"Absolute local directory containing the built prototype."},"entryPath":{"type":"string","minLength":1,"description":"HTML entry file path relative to directory, normally index.html."},"baseVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"box":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["x","y","width","height"],"description":"World-space position and size for the prototype node on the canvas."}},"required":["canvasId","prototypeId","nodeId","title","directory","entryPath","baseVersion","box"]}
```
</details>


## Output

This command writes JSON records to standard output. Returns a typed prototype.publish result from the Enhance API without transport-specific prose.

<details class="reference-schema">
<summary>Show complete output JSON Schema</summary>

```json
{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"canvasId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeId":{"type":"string","minLength":1},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"openUrl":{"type":"string","pattern":"^\\/c\\/.*"},"next":{"type":"array","items":{"type":"string"}}},"required":["canvasId","deploymentId","nodeId","version","openUrl","next"],"additionalProperties":{}}
```
</details>


## Examples

```bash
enhance-dev prototype publish --canvas-id <uuid> --directory <path> --title <title> --base-version <number>
```

<details class="reference-schema">
<summary>Show example input</summary>

```json
{
 "canvasId": "00000000-0000-4000-8000-000000000010",
 "prototypeId": null,
 "nodeId": "prototype_ready",
 "title": "Ready prototype",
 "directory": "/absolute/build",
 "entryPath": "index.html",
 "baseVersion": 1,
 "box": {
  "x": 48,
  "y": 48,
  "width": 1440,
  "height": 900
 }
}
```
</details>

<details class="reference-schema">
<summary>Show example output</summary>

```json
{
 "canvasId": "00000000-0000-4000-8000-000000000010",
 "deploymentId": "00000000-0000-4000-8000-000000000010",
 "nodeId": "prototype_ready",
 "version": 2,
 "openUrl": "/c/00000000-0000-4000-8000-000000000010",
 "next": [
  "Open the prototype."
 ]
}
```
</details>

## Exit behaviour

| Exit code | Meaning |
| --- | --- |
| `0` | The command succeeded. |
| `1` | The command failed for another reason (`INTERNAL`). A write may have an unknown outcome. |
| `2` | The command line was malformed. Nothing ran. |
| `3` | The API refused the input (`BAD_REQUEST`). |
| `4` | The credential is missing or expired (`UNAUTHORIZED`). |
| `5` | The API refused the request (`FORBIDDEN`, `NOT_FOUND`, `CONFLICT`, `RATE_LIMITED`). |
| `6` | A batch finished only in part. Retry with the same `--client-token`. |

## Versions

Minimum tested versions: Enhance CLI and MCP runtime 0.1.40, plugin 1.0.38, Node.js 24. No older floor is published.
