prompt-lookup
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use…
`editorctl` is the Monet CLI. Always try it directly first — Monet keeps it on `PATH` for every shell it spawns and persists the bin dir to `~/.zshrc` / `~/.bash_profile` so it survives subshells and PATH-rewriting wrappers. **If `command -v editorctl` returns nothing**, fall
Claude Code
$ npx -y skills add Monet-AI-Editor/Monet --skill Monet --agent claude-code
Codex
$ npx skills add Monet-AI-Editor/Monet --skill Monet -a codex -y
Cursor
$ npx skills add Monet-AI-Editor/Monet --skill Monet -a cursor -y
Gemini CLI
$ npx skills add Monet-AI-Editor/Monet --skill Monet -a gemini-cli -y
GitHub Copilot
$ npx skills add Monet-AI-Editor/Monet --skill Monet -a github-copilot -y
OpenCode
$ npx skills add Monet-AI-Editor/Monet --skill Monet -a opencode -y
Windsurf
$ npx skills add Monet-AI-Editor/Monet --skill Monet -a windsurf -y
`editorctl` is the Monet CLI. Always try it directly first — Monet keeps it on `PATH` for every shell it spawns and persists the bin dir to `~/.zshrc` / `~/.bash_profile` so it survives subshells and PATH-rewriting wrappers. **If `command -v editorctl` returns nothing**, fall back in order:
1. `"$HOME/Library/Application Support/Monet/bin/editorctl"` — macOS install (most users) 2. `node /Applications/Monet.app/Contents/Resources/app.asar.unpacked/out/cli/cli/editorctl.js …` 3. `node ./out/cli/cli/editorctl.js …` — dev tree
Never give up after the first "command not found". Prefer `editorctl` over raw `curl localhost:51847` — it always exposes the current command surface and arg shapes.
**Never reuse a filename when editing or regenerating a video or image.** The asset cache holds the previous file by path, so writing to the same name silently shows stale content. Every edit/regenerate must produce a **new unique filename** (e.g. `clip_v1.mp4`, `clip_v2.mp4`, or a timestamp suffix). Applies to all video renders, image generations, canvas exports, and thumbnails. If a target path already exists, append `_v2`, `_v3`, … — do not overwrite.
When adding audio to a timeline with **more than one video clip**, audio cuts at every clip boundary. Required flow:
1. Tell the user: *"To keep audio from cutting between clips, I'll merge all video clips into one combined video first, then add the audio. OK to proceed?"* 2. Wait for confirmation — do not auto-merge. 3. Concatenate all clips into a single new file (unique filename per the rule above). 4. Replace the multi-clip video track with that merged clip, then add the audio.
Single-clip timelines: skip the merge.
---
When `activeView=canvas` is reported by the hook or `editorctl get-state`:
**There are EXACTLY 3 canvas options. No others exist.** 1. **Paper.js** — code drawing with vector graphics (`canvas-run-paperjs`) 2. **Matter.js** — physics and animation (`canvas-run-matterjs`) 3. **GPT image 2** — AI-generated image (`generate-image` + `canvas-add-image`)
**REMOVED — do NOT offer these under any name:**
When the user asks for something visual in canvas mode, present ONLY these three options using these EXACT labels. Copy them verbatim. Do not invent a fourth option or rephrase option 1 as anything design-related.
---
**API Bridge:** `POST http://localhost:51847` — JSON body `{"command":"<name>","args":{...}}`
import urllib.request, json
def call(command, **args):
data = json.dumps({"command": command, "args": args}).encode()
req = urllib.request.Request(
"http://localhost:51847", data=data,
headers={"Content-Type": "application/json"}, method="POST"
)
return json.loads(urllib.request.urlopen(req).read())["result"]
call("ping") # → {"status":"ok","version":"1.0.0","port":51847}
call("help") # → full command list---
| Command | Args | Returns | |---------|------|---------| | `get_project` | — | Full project JSON | | `get_settings` | — | Model + provider config |
| Command | Args | Returns | |---------|------|---------| | `list_assets` | — | `[{id, name, path, type, duration, semantic}]` | | `get_asset` | `assetId` | Single asset with semantic + transcript | | `import_files` | `paths: string[]` | Imported asset records | | `transcribe_asset` | `assetId`, `language?` | `{segments}` via Whisper | | `embed_assets` | `all?: bool` | `{embedded, total}` via text-embedding-3-small | | `search_media` | `query, limit?` | Cosine similarity search (falls back to keyword) | | `search_spoken` | `query, limit?` | Substring search within transcribed segments |
| Command | Args | Returns | |---------|------|---------| | `list_sequences` | — | All sequences | | `create_sequence` | `name` | New sequence | | `activate_sequence` | `sequenceId` | Activated sequence | | `get_tracks` | — | `[{id, name, kind, clipCount}]` for active sequence | | `add_track` | `kind: video\|audio\|caption` | Updated sequence |
| Command | Args | Returns | |---------|------|---------| | `list_clips` | `sequenceId?` | All clips sorted by startTime, with trackKind | | `add_clip` | `assetId, trackId, startTime, duration?, inPoint?` | `{clipId, clip}` | | `remove_clip` | `clipId` | `{success}` | | `move_clip` | `clipId, startTime` | `{success}` | | `trim_clip` | `clipId, inPoint?, duration?, startTime?` | Updated clip | | `split_clip` | `clipId, time` | Updated sequence | | `duplicate_clip` | `clipId, offsetSeconds?` | `{clipId, clip}` | | `update_clip_label` | `clipId, label` | `{success}` |
| Command | Args | Returns | |---------|------|---------| | `list_effects` | — | Available effects + parameter docs | | `add_effect` | `clipId, effectType, parameters` | Updated project | | `remove_effect` | `clipId, effectId` | Updated project | | `set_speed` | `clipId, speed` | Updated project (0.1–10× playback) | | `set_volume` | `clipId, volume` | Updated project (0–4, 1=normal) | | `set_transition` | `clipId, side: in\|out, type, duration?` | `{success}` |
| Command | Args | |---------|------| | `undo` | — | | `redo` | — |
---
| Type | Parameters | |------|-----------| | `fade_in` | `duration` (sec) | | `fade_out` | `duration` (sec) | | `color_grade` | `brightness` (-1→1), `contrast` (0.5→2), `saturation` (0→3) | | `blur` | `radius` (px, default 5) | | `sharpen` | `amount` (0→3, default 1) |
`crossfade` · `dip_to_black` · `wipe` · `slide`
---
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use…
AI-driven presentation workflow for generating editable PPTX decks and slides, reconstructing page visuals, creating reusable…
Use this skill when the user wants a .pptx with smooth cross-slide animation — PowerPoint Morph transitions, Keynote-style…
Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to…