--- name: posts-update description: > Change or call off a post that already exists in Inklate: find it, show what it says now, edit the content, channels, media, labels, campaign, or the schedule in one call, and let the server re-validate it on the spot — or take it off the calendar and delete it. Covers LinkedIn, X (Twitter), Instagram, and Facebook today, with Mastodon, Threads, Bluesky, TikTok, and YouTube in platform review. Use when the user says "edit that scheduled post", "change the time", "unschedule that", "cancel tomorrow's post", or "delete that draft". Requires the Inklate CLI (npm i -g inklate) or the Inklate MCP connection. Reads social-context.md when present so edits stay on-voice. Published posts are immutable and this skill says so rather than pretending; every edit's response carries fresh per-channel validation, and every cancellation is confirmed first. license: MIT metadata: version: 0.2.0 topics: - editing - publishing examplePrompt: "Change the time on tomorrow's LinkedIn post and fix the typo in the first line" pairsWith: - social-post mcpTools: - posts_list - posts_get - posts_update - posts_delete - search cliCommands: - posts list - posts get - posts update - posts delete - search --- Edit, reschedule, or cancel a post that already exists — the half of the loop `posts-create` and `posts-publish` leave to the dashboard. ## Transports - **CLI (preferred):** `inklate` (`npm i -g inklate`) — structured YAML on stdout (`--json` for JSON), progress on stderr, and typed exit codes: `3` no credentials, `4` a deliberate refusal — arming a not-ready post with `--scheduled-at` — with its machine-readable payload on stdout, `5` not found, `6` the resource changed underneath you, `7` rate limited but safe to re-run later. Pass `--no-input` when running unattended so a missing flag fails loudly instead of prompting, and `--yes` to carry an approval the user has already given in chat. - **MCP (fallback):** the Inklate MCP tools when the CLI is not installed. Steps below name the MCP operation with the CLI form in parentheses; the fields are the same on both. ## Connection check 1. Run `inklate auth check` (MCP: `organizations_list`) first. 2. On exit 3 (no credentials): interactively run `inklate auth login`; headless, the key comes from `INKLATE_API_KEY=inklate_…` in the environment or `inklate auth set --token inklate_…`. If neither transport is available at all, tell the user to install with `npm i -g inklate` (or connect at `https://inklate.com/skills/connect?ref=skills-posts-update`) and STOP. 3. If multiple organizations exist, ask which one owns the post (CLI: `--org `). ## What can change, and what cannot Read this before touching anything — it decides whether the request is even possible: | Post state | Editable? | How | | ---------------------- | --------- | ------------------------------------------------------------------------------------------ | | draft | yes | `posts_update` — content/channels/media/labels/campaign, or add `--scheduled-at` to arm it | | scheduled | yes | `posts_update` — `--scheduled-at` reschedules, `--clear-schedule` returns it to draft | | failed | yes | `posts_update`, then hand off to `posts-publish` (`inklate posts publish `) | | publishing (in flight) | no — wait | poll `posts_get`; it is mid-flight, not stuck — there is no separate status call | | published | **never** | immutable; say so and offer the real alternatives | **Published is immutable.** No flag changes that. When the user asks to edit something already live, say it plainly and offer what actually exists: delete it on the platform and publish a corrected post, or leave it and post a follow-up. Never imply an edit went through. ## Craft boundary This skill owns find → show → change → re-validate → confirm. The WRITING belongs to the paired craft skill: when `social-post` is installed, hand it the new copy and use what comes back. Without it, make the edit the user asked for and nothing more — an edit request is not an invitation to restyle the post. ## Context Read `social-context.md` (project root, then `.agents/social-context.md`) if present. `## Voice` and `## Never` constrain any rewriting you do while editing; `## Platforms` resolves a vague reference ("the LinkedIn one") to a channel. Proceed without it if absent. ## Workflow 1. **Find the post, don't guess it.** A vague reference ("tomorrow's post", "the roadmap one") resolves through `posts_list` (CLI: `inklate posts list --status scheduled --scheduled-from … --scheduled-to …`) or `search` (CLI: `inklate search "roadmap"`) — never through memory of an earlier session. If more than one candidate matches, list them with IDs and times and ask which one. Acting on the wrong post is unrecoverable once it publishes. 2. **Read it before you change it.** Call `posts_get` (CLI: `inklate posts get `) and show the user what the post says right now — per-channel content (`content.markdown` — the copy exactly as you would write it back — and `content.text`, the same copy as the platform will show it), media, scheduled time, and status. This is also where you capture the post's `updated_at` for step 4's concurrency guard, and where you check the state table above. 3. **State the change in one line and get a yes.** "Replacing the first line and moving Tuesday 9:00 → Wednesday 14:00" — then wait. Editing a scheduled post is a real-world action: it changes what goes out and when. 4. **Apply the edit in one call.** `inklate posts update --content … --channel … --media … --scheduled-at