--- name: inklate-setup description: > Connect the agent to a real Inklate workspace and prove the connection works end to end. Logs in from the terminal (device flow, or an environment key when headless), lists every connected channel across LinkedIn, X (Twitter), Instagram, and Facebook today (with Mastodon, Threads, Bluesky, TikTok, and YouTube in platform review), and fetches the live capability rules for each one. Use when the user says "set up Inklate", "connect Inklate", "verify my Inklate connection", or asks "which channels do I have". Requires the Inklate CLI (npm i -g inklate) or the Inklate MCP connection — this skill is the smoke test that every other Inklate skill assumes has already passed. Reads social-context.md when present and offers to pre-fill its Platforms section from the channels that are actually connected. Run this first, once per workspace. license: MIT metadata: version: 0.1.1 topics: - foundation examplePrompt: "Set up Inklate and show me my connected channels" pairsWith: - social-context mcpTools: - organizations_list - channels_list - capabilities - connections_create - connections_get - connections_destinations - connections_select - channels_disconnect cliCommands: - auth login - auth check - auth set - organizations list - channels list - channels connect - channels disconnect - capabilities --- Verify the Inklate connection, inventory the connected channels with their real capability rules, and leave the workspace ready for every other skill. ## Transports Every Inklate skill drives the platform through whichever transport this agent has — the operations are identical: - **CLI (preferred):** the `inklate` command (`npm i -g inklate`). Structured YAML on stdout (`--json` for JSON), progress and prompts on stderr, and typed exit codes: `3` no credentials, `4` a deliberate refusal with its machine-readable payload on stdout, `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 its CLI equivalent in parentheses; run the CLI form when available. ## Connection check 1. Run `inklate auth check` (MCP: call `organizations_list`). This is always the first step. 2. On exit 3 — the CLI is installed but has no credentials — pick the path that fits the session: - **Interactive:** `inklate auth login` runs the device flow. It prints a short code and a browser URL; the user approves the code and picks the organization, and the key lands automatically. - **Headless (CI, unattended agents):** the key comes from `INKLATE_API_KEY=inklate_…` in the environment, or `inklate auth set --token inklate_…`. No browser involved. Agents holding several workspaces keep them apart with `--profile `. - If neither the CLI nor the Inklate tools are available at all, tell the user to install with `npm i -g inklate` (or connect at `https://inklate.com/skills/connect?ref=skills-inklate-setup`) and STOP. Do not attempt any workaround. 3. If exactly one organization comes back, name it and continue. If several come back, list them and ask which one to use — never guess. Remember the choice for the rest of the session (CLI: pass `--org `). ## Context Look for `social-context.md` at the project root, then `.agents/social-context.md`. If found, read it — especially the `## Platforms` section — so you can later compare what the user _says_ they post on against what is _actually_ connected. If absent, proceed without it; setup does not depend on it. ## Workflow 1. With the organization settled, call `channels_list` (CLI: `inklate channels list`). For each channel record: platform (LinkedIn, X, Instagram, Facebook, Mastodon, Threads, Bluesky, TikTok, YouTube — the last five in platform review), account name/handle, and connection status. 2. If `channels_list` returns nothing, say so plainly: the connection works but no social accounts are connected yet. Offer to connect one right now — `inklate channels connect ` opens the provider's consent in the browser and picks destinations in the terminal (MCP: `connections_create` → hand the URL to the user → poll `connections_get` → `connections_destinations` → `connections_select`). Otherwise stop after the receipt. 3. Call `capabilities` **once** (CLI: `inklate capabilities`) — it returns every channel's effective capabilities plus every provider's manifest in one response, so there is no per-channel call to make. Read out of it, per connected channel, the rules that matter day to day: - Character limits per post and per thread segment. - Media rules: image/video counts, formats, and whether media is required (Instagram) or optional. - Threading support and link handling. - Anything the channel flags as unavailable, restricted, or expired. The same response also enumerates providers that have an adapter but no connection here — that is what connecting one more would unlock. 4. If any channel reports a broken or expired connection, flag it prominently — it will fail silently later during publishing if ignored. Reconnecting is `inklate channels connect ` again. Only reach for `inklate channels disconnect ` (MCP: `channels_disconnect`) when the user explicitly wants a channel gone, and say what it costs first: scheduled posts targeting that channel return to draft, though published history survives. 5. Summarize the inventory in chat: one line per channel with platform, handle, status, and the two or three capability rules the user is most likely to hit (e.g. "X: 280 chars, 4 images max, threads supported"). 6. **Offer the social-context sync.** If `social-context.md` exists, compare its `## Platforms` section with the connected channels: - Channels connected in Inklate but missing from the file: offer to add them. - Platforms in the file but not connected: point them out, but never remove them — the user may connect them later. - Show the exact lines you would add, get an explicit yes, then apply the edit. Additive only: never rewrite, reorder, or delete anything the user wrote by hand. - If no `social-context.md` exists, suggest running the `social-context` skill and offer to seed its Platforms section from this inventory when they do. 7. Confirm the smoke test verdict: transport reachable, N channels live, M channels needing attention. 8. Close by naming what the workspace is now ready for, one line each, only for skills whose channels are actually healthy: `posts-create` for a validated draft in one call, `posts-publish` for shipping or scheduling it, `calendar-schedule` for booking a whole plan, `posts-update` for editing or cancelling what is already queued, `files-upload` for getting media in first, `inbox-triage` for engagement, `analytics-review` for retros. ## Quality bar - Never proceed past a failed `auth check` / `organizations_list` — a broken connection makes every downstream answer fiction. - Report channel status exactly as the API returns it; do not soften "expired" or "disconnected" into "needs a refresh sometime". - Capability summaries must come from the live `capabilities` response, not from memorized platform trivia — limits change. One call covers every channel; calling it per channel is waste, not thoroughness. - Edits to `social-context.md` are additive and pre-approved by the user, line by line. When in doubt, show the diff and ask. - If multiple organizations exist, every subsequent statement names which organization it refers to. - Disconnecting a channel is the user's explicit call, made after hearing that its scheduled posts return to draft — never a cleanup you perform on your own initiative. - This skill changes nothing in Inklate itself unless the user asks for a connect or disconnect — it reads, verifies, and (with approval) touches only the local `social-context.md`. ## Receipt End with this table, filled from the real responses: | Organization | Channel | Platform | Status | Capabilities summary | | ------------ | --------- | --------- | ------------------- | -------------------------------- | | Acme Inc | @acme | X | connected | 280 chars, 4 images, threads OK | | Acme Inc | Acme Page | LinkedIn | connected | 3000 chars, 9 images, no threads | | Acme Inc | acme.co | Instagram | expired — reconnect | requires media on every post | Below the table, state: the organization in use, the count of healthy channels, any channels needing reconnection, and whether `social-context.md` was updated (with the exact lines added) or left untouched.