UNPKG

@awesomate/hosting-mcp

Version:

Awesomate MCP server — lets Claude manage your Awesomate WordPress hosting, plan, limits, n8n automations, and build Node/static apps + databases

99 lines (83 loc) • 5.41 kB
# Upgrade loop — changing a workflow that already exists Use this whenever the target workflow is not a fresh build: a live self-built workflow, a draft mid-iteration, or a workflow the user built in the n8n UI. ## Invariants (violating any of these breaks external callers) - **Never edit a live workflow directly.** Live changes go draft → test → promote. `update_draft` on a live workflow is refused (409, below). - **Never activate the copy.** A duplicated draft has different webhook URLs; activating it instead of promoting strands every external caller. - **Promote preserves webhookIds** — that is the whole point. The live id and its production URLs never change across a promote. - **Promote only works between self-built (`awm:client-cli`) workflows.** UI-built workflows need the duplication path at the bottom. - **Save the `operationId`** returned by promote — it is the only rollback handle. ## Which path | Situation | Path | |---|---| | Iterating on an INACTIVE draft (not yet promoted/activated) | `update_draft` in place — no new workflow ids | | Changing a LIVE self-built workflow | Duplicate → draft loop → promote (steps below) | | Changing a workflow built in the n8n UI (no `awm:client-cli` tag) | Duplicate into a CLI draft; coordinated URL cutover | | Agency-managed workflow (`agency_managed` 403) | Read/explain; may be switched off or on when the user asks; other changes go through Awesomate support | ## Iterating on a draft: `update_draft` `awesomate_n8n_deploy {action:'update_draft', workflowId, workflowJson:{name?, nodes, connections, settings?}}` - **Full JSON replace** — nodes + connections replace the draft's entirely; send the complete workflow, not a delta. - Settings are **whitelisted server-side**: unknown keys and null/undefined values are dropped, `saveExecutionProgress` is pinned false (2TB WAL incident), `executionOrder` defaults to `v1`. Omit a key to keep the draft's current value. - Refusals: **409 `workflow_active`** — the workflow is live; do NOT deactivate it to force the edit, use the promote path below. 403 `not_self_built` — only `awm:client-cli` workflows. 403 `agency_managed`. - Validate (`{action:'validate', workflowJson}`) before every update; re-test after (the full Phase 5 testing policy from SKILL.md applies). ## Upgrading a LIVE self-built workflow 1. **Duplicate.** Fetch the live workflow's full JSON (`awesomate_n8n_workflows {id, detail:'full'}` or `GET /api/my-n8n/workflows/:id`), then `create_draft` with the modified JSON — new name, e.g. same name; the hub adds `[CLI] ` + fresh test webhookIds automatically. 2. **Iterate.** Apply the requested changes; validate. Further revisions go through `update_draft` on the draft — no need to delete and recreate. 3. **Test the draft on its own (test) URLs.** Activate the DRAFT (approval gate applies), then `awesomate_n8n_test {workflowId:<draft id>, payload}`. Full testing policy: inspect node-by-node output, happy path + empty + malformed payloads, confirm error branches routed. 4. **Present the diff — mandatory before promote.** Human-readable, covering ALL of: nodes added / removed / changed (name + what changed), credential changes (added, swapped, removed), and a behavior summary in the user's terms (what the workflow will now do differently). **Wait for explicit approval.** No diff, no promote. 5. **Promote.** `awesomate_n8n_deploy {action:'promote', workflowId:<LIVE id>, draftId:<draft id>}`. The hub snapshots both workflows, swaps the draft's body into the live id (preserving its webhookIds so external URLs never change), restores activation, and archives the draft as `[promoted <date>]`. Save the returned `operationId`. 6. **Verify against the ORIGINAL URL.** `awesomate_n8n_test` against the LIVE workflow id — the original production URL must still respond, and the execution must show the NEW behavior (inspect node output; a 200 alone proves nothing). On any failure: `{action:'rollback', operationId}` restores both workflows to their pre-promote state, then investigate — do not iterate on the live body. 7. **Cleanup.** Once the user confirms the promoted version, `delete_draft` the archived `[promoted …]` draft (it is deactivated and still CLI-tagged), or leave it as a manual fallback if they prefer. ## UI-built workflows (no `awm:client-cli` tag) Promote refuses these. Instead: 1. Fetch the UI workflow's JSON; `create_draft` a CLI copy with the changes. 2. Test the draft fully (steps 2–3 above). 3. The draft becomes the live workflow going forward — its webhook URL DIFFERS from the original. Coordinate the cutover with the user: they update every external caller to the new URL, confirm traffic arrives on the new workflow, then deactivate the old UI workflow themselves (it is theirs — do not delete it). ## Errors you will hit | Code | Meaning | Do | |---|---|---| | 409 `workflow_active` | `update_draft` on a live workflow | Promote path, never deactivate-to-edit | | 403 `not_self_built` | No `awm:client-cli` tag | UI-built duplication path | | 403 `agency_managed` | Awesomate-deployed workflow | Explain; offer to switch it off or on if that is what they want; route changes to support | | 429 `quota_exceeded` | Daily plan cap | Tell the user; never retry-loop |