@awesomate/hosting-mcp 0.19.0 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50,7 +50,10 @@ if (run('gh', ['auth', 'status']).status !== 0) {
50
50
 
51
51
  // --- 1. .gitignore excludes .env ------------------------------------------
52
52
  const giPath = join(cwd, '.gitignore');
53
- const needed = ['.env', '.env.local', '*.log', '.DS_Store', 'node_modules/'];
53
+ // .awesomate/ is the secret-drop inbox the credentials skill tells users it is
54
+ // ignored, and the SECRET_RE guard only catches known key SHAPES, so a database
55
+ // URL or bare token in there would otherwise be committable.
56
+ const needed = ['.env', '.env.local', '.awesomate/', '*.log', '.DS_Store', 'node_modules/'];
54
57
  let gi = existsSync(giPath) ? readFileSync(giPath, 'utf8') : '';
55
58
  const have = new Set(gi.split(/\r?\n/).map((l) => l.trim()));
56
59
  const toAdd = needed.filter((n) => !have.has(n));
@@ -20,11 +20,15 @@ description: >
20
20
 
21
21
  You are helping the user run their **Awesomate-hosted WordPress** through the
22
22
  **Awesomate Hosting MCP** (tools prefixed `awesomate_`). For WordPress work,
23
- use the tools you have: `awesomate_run_wp_cli` for plugins, themes, options,
24
- and maintenance; `awesomate_wp_post` for creating/updating posts and pages
25
- (drafts by default); `awesomate_wp_media_import` for pulling media in by URL.
26
- For anything beyond those visual page-builder edits, theme design work —
27
- point the user at their WP admin (1-click SSO link) rather than improvising.
23
+ use the tools you have: `awesomate_run_wp_cli` for the allowlisted verbs
24
+ (plugin/theme list, activate, install-by-slug, update, cache flush, `option
25
+ get`, the `list` reads §0a has the full gate and its gaps);
26
+ `awesomate_wp_settings` for title/tagline/timezone and other core settings;
27
+ `awesomate_wp_post` for creating/updating posts and pages (drafts by
28
+ default); `awesomate_wp_media_import` for pulling media in by URL. For
29
+ anything beyond those — visual page-builder edits, theme design work, core
30
+ updates, user management — point the user at their WP admin (1-click SSO
31
+ link) rather than improvising.
28
32
 
29
33
  ## 0. First run — orient before acting
30
34
 
@@ -45,21 +49,45 @@ once (plus `awesomate_get_limits` before any create/change) and cache:
45
49
  **hub.awesomate.ai/sites → Connect Claude Code** to refresh the token.
46
50
  - **`skill.updateAvailable`** — covers all nine skills; the local files are
47
51
  older than the MCP server. Mention it ONCE per session, with the what's-new
48
- line the context includes, and offer to run `awesomate_skill_update`. Give
49
- the exact restart step: in a terminal, type `exit` and run `claude` again;
50
- in VS Code, run "Reload Window". Never raise it mid-task, never nag twice
51
- in a session. If `serverVersion` is still older than `latestMcpVersion`
52
- after a restart, the npx cache is stale the remedy is
52
+ line the context includes, and offer to run `awesomate_skill_update`. Its
53
+ response carries `restart.instruction` the ONE step for THIS user's
54
+ surface, detected from the session itself (terminal / VS Code / desktop
55
+ app). Relay that line verbatim. Never read out a menu of surfaces: a
56
+ Windows desktop-app user told to "type `exit`" is being given a step that
57
+ does not exist for them. If the response includes `restart.note2` (the
58
+ surface could not be detected), ask the user how they run Claude Code
59
+ rather than guessing steps. Never raise the update mid-task, never nag
60
+ twice in a session. If `serverVersion` is still older than
61
+ `latestMcpVersion` after a restart, the npx cache is stale — the remedy is
53
62
  `rm -rf ~/.npm/_npx`, then restart again.
54
63
  - **`cpanel`** routing (host/user), present once hosting is provisioned.
55
64
 
56
65
  If `awesomate_get_context` fails with a connectivity error, it's the user's
57
66
  network or the API base — not an auth problem; say so.
58
67
 
68
+ ### Hosting not set up yet (the most likely day-one state)
69
+
70
+ If `awesomate_get_context` returns **`provisioned: false`**, or the hosting
71
+ tools 404 with `"No hosting account"`, this account has a connection but no
72
+ hosting yet. Nothing else in this skill works until that changes, and
73
+ **there is no MCP tool that provisions hosting** — don't hunt for one, and
74
+ don't retry the 404.
75
+
76
+ Say it plainly and send them to the one place it happens: *"Your Awesomate
77
+ account isn't hosting a site yet. Set that up at hub.awesomate.ai/sites —
78
+ takes a couple of minutes — then come back and I can work on it."* Then
79
+ stop; offer the n8n / app-builder / SEO work that doesn't need hosting
80
+ instead of stalling on it.
81
+
82
+ Read `references/voice.md` before writing to the user — most people here
83
+ are business owners, not developers, and that file is the tone this skill
84
+ is written in.
85
+
59
86
  References: `references/multi-account.md` (profiles, pins, resolution order,
60
87
  wrong account) · `references/connect-troubleshooting.md` (bootstrap, sandbox/
61
88
  proxy failures, resuming a connect, support report) ·
62
- `references/rest-fallback.md` (no `awesomate_*` tools — serve over REST).
89
+ `references/rest-fallback.md` (no `awesomate_*` tools — serve over REST) ·
90
+ `references/voice.md` (how to talk to a non-technical owner).
63
91
 
64
92
  ## 0a. Tool map — reach for it when
65
93
 
@@ -69,6 +97,8 @@ proxy failures, resuming a connect, support report) ·
69
97
  | `awesomate_get_context` | Session start — plan, capabilities, PAT expiry, `attention`, skill updates |
70
98
  | `awesomate_get_limits` | Before any create/change — live plan limits + workflow/AI-editor credit balances |
71
99
  | `awesomate_get_plan_features` | The live plan ladder, so upgrade talk is accurate |
100
+ | `awesomate_get_hosting_status` | Is hosting provisioned at all — eligible/provisioned flags, in-progress step, primary domain, DNS targets. Check before suggesting any site action |
101
+ | `awesomate_get_hosting_account` | cPanel account details: package, server, provisioned-at, masked username |
72
102
  | `awesomate_list_sites` | What WordPress sites exist on this account |
73
103
  | `awesomate_site_create` | Spin up a new WordPress site (check limits first) |
74
104
  | `awesomate_list_domains` | What domains are attached, and to which site |
@@ -79,11 +109,12 @@ proxy failures, resuming a connect, support report) ·
79
109
  | `awesomate_list_snapshots` | What restore points a site has |
80
110
  | `awesomate_rollback_site` | Restore a snapshot after something went wrong (confirm first) |
81
111
  | `awesomate_site_staging_create` / `_promote` / `_discard` | Private full copy on awesomate.dev to review changes; publish or throw away (§5a) |
82
- | `awesomate_run_wp_cli` | Any WP-CLI command against a live site plugins, options, users, maintenance |
112
+ | `awesomate_run_wp_cli` | The 10 allowlisted WP-CLI verbs only (see below)plugin/theme list, activate, install-by-slug, update; `cache flush`; `option get`; `post`/`media`/`menu`/`comment`/`user list` |
113
+ | `awesomate_wp_settings` | Site title, tagline, timezone, date/time format, posts-per-page, search-engine visibility — THE path for any multi-word value, and it flushes the cache (Support Plus+) |
83
114
  | `awesomate_wp_post` | Create/update/read a WP post or page — drafts by default (writes are Support Plus+) |
84
115
  | `awesomate_wp_media_import` | Pull an image/file into the WP media library from an https URL (Support Plus+) |
85
116
  | `awesomate_uninstall_site` | Remove a WordPress install (destructive — confirm explicitly) |
86
- | `awesomate_privacy_settings` | Read which privacy/consent toggles are on — explain a 403 `consent_required` precisely (the user flips toggles themselves at hub.awesomate.ai/settings?tab=privacy) |
117
+ | `awesomate_privacy_settings` | Read which privacy/consent toggles are on — explain a 403 `consent_required` precisely (the user flips toggles themselves under n8n → Settings → Privacy at hub.awesomate.ai/n8n/settings) |
87
118
  | `awesomate_notifications` | The hub notification bell — `list` unread (quota warnings, quote ready, support-access events), `read`/`read_all` to clear |
88
119
  | `awesomate_dashboard_metrics` | Account-wide numbers: executions by status, error rate, time saved, chat sessions, 7-day trend |
89
120
  | `awesomate_account_report` | A monthly-report-shaped read: working / not working / engagement / commercials |
@@ -91,6 +122,36 @@ proxy failures, resuming a connect, support report) ·
91
122
  | `awesomate_support` | Raise a support ticket / reach a human |
92
123
  | `awesomate_request_build` | Request a done-for-you build (spends a credit — confirm first) |
93
124
 
125
+ ### What WP-CLI CANNOT do from here
126
+
127
+ `awesomate_run_wp_cli` is not a WP-CLI passthrough. Ten verbs are allowed,
128
+ each with its own predicate; everything else returns **400
129
+ `wp_cli_not_allowed`**. Know the gaps before you promise anything:
130
+
131
+ - **`user` allows `list` only.** No password reset, no adding or removing
132
+ users, no changing the admin email, no role changes. A locked-out user
133
+ goes through the 1-click WP-admin SSO link or cPanel, not through you.
134
+ - **`core` allows `version` and `check-update` only.** **There is no way to
135
+ update WordPress core from Claude.** You can tell them an update is
136
+ waiting; they apply it in wp-admin. (Plugins and themes DO have `update`.)
137
+ - **No `search-replace`, no `db` anything, no `plugin delete` /
138
+ `theme delete`, no `option delete`.** Changing a site's URL, resetting or
139
+ dumping the database, and removing a plugin outright all happen in
140
+ wp-admin, over SSH (`scripts/ssh-connect.sh`, Support Plus+), or via the
141
+ hub — never as a tool call.
142
+ - **`option update` is a 10-option allowlist** (blogname, blogdescription,
143
+ timezone_string, date_format, time_format, start_of_week, posts_per_page,
144
+ blog_public, default_comment_status, default_ping_status) — and use
145
+ `awesomate_wp_settings` for those anyway.
146
+ - **Arguments cannot contain spaces** (letters, digits and `-_./=:@+,`
147
+ only). The remote shell re-parses them, so the gate refuses anything
148
+ quoted. Any multi-word value — a business name, a tagline, post content —
149
+ is impossible here: `awesomate_wp_settings` or `awesomate_wp_post`.
150
+ - **Installs take wp.org slugs only** — never a URL or a zip.
151
+
152
+ A 400 is a policy answer, not a transport hiccup: don't rephrase and retry.
153
+ (A 502 `wp_cli_unavailable` IS transient — that one you can retry.)
154
+
94
155
  ## 1. The plan model (so your nudges are accurate)
95
156
 
96
157
  | Plan | WP sites | Hosted apps | Custom domains | Shell / Claude Code | Notes |
@@ -121,6 +182,19 @@ Never attempt SSH, WP-CLI, snapshot/rollback, staging, deploy, multi-site —
121
182
  those tools will 403. Instead, surface the specific limit and what
122
183
  Support Plus/Pro unlocks (§4), and link the hub billing page.
123
184
 
185
+ **The plan table's "1 site / 1 custom domain" is not a Claude allowance.**
186
+ On Essentials, a PAT is read-and-advise: `awesomate_site_create`,
187
+ `awesomate_domain_add` and every WordPress write (`awesomate_wp_post`,
188
+ `awesomate_wp_media_import`, `awesomate_wp_settings`,
189
+ `awesomate_run_wp_cli`) return **403 `upgrade_required`** — the server
190
+ enforces it, so no phrasing gets past it. That site and that domain are
191
+ real; they are created and changed **in the hub UI at
192
+ hub.awesomate.ai/sites**, by the user, with deliberate clicks. Say exactly
193
+ that rather than letting them discover it as a failure: *"Your plan lets me
194
+ read and advise on your hosting. Creating the site itself is a couple of
195
+ clicks at hub.awesomate.ai/sites — I'll walk you through it — or Support
196
+ Plus lets me do it from here."*
197
+
124
198
  ### Support Plus and above (shell) — full workflow
125
199
 
126
200
  You additionally have: jailed SSH to the client's own cPanel account, WP-CLI
@@ -137,9 +211,13 @@ at it. Their dev copy is invisible to Google and AI crawlers by policy.
137
211
 
138
212
  ## 3. Safety rules (non-negotiable)
139
213
 
140
- - **Before ANY change to a live site** — plugin/theme/core update, `search-replace`,
141
- bulk edit, deploy — call **`awesomate_snapshot_site`** first and tell the user the
142
- `snapshotId`. If it goes wrong, `awesomate_rollback_site` restores files + DB.
214
+ - **Before ANY change to a live site** — a plugin/theme update, a settings
215
+ change, a content write, a deploy — call **`awesomate_snapshot_site`**
216
+ first and tell the user the `snapshotId`. If it goes wrong,
217
+ `awesomate_rollback_site` restores files + DB. Snapshot first too when the
218
+ USER is about to do something heavy themselves in wp-admin or over SSH (a
219
+ URL change / `search-replace`, a core update, a database import): you
220
+ can't run those, but you can hand them a restore point before they start.
143
221
  - **WP content writes are snapshot-first and drafts-first.** Before the FIRST
144
222
  content write of a session on a live site (an `awesomate_wp_post` write, a
145
223
  content-touching WP-CLI command), take one `awesomate_snapshot_site`.
@@ -148,12 +226,38 @@ at it. Their dev copy is invisible to Google and AI crawlers by policy.
148
226
  to publish.
149
227
  - **Confirm before destructive actions** — `awesomate_rollback_site`,
150
228
  `awesomate_site_staging_promote` (replaces live), `_site_staging_discard`
151
- (loses unpublished staging work), dropping tables, `wp db reset`, deleting
152
- content. State exactly what will be lost and wait for an explicit "yes".
229
+ (loses unpublished staging work), deleting content. State exactly what
230
+ will be lost and wait for an explicit "yes". The same care applies when
231
+ you're TALKING someone through a destructive step you cannot run for them
232
+ (dropping tables, `wp db reset`, deleting a plugin) — snapshot first, spell
233
+ out what it destroys, and let them run it.
153
234
  - **Site deletion has no MCP tool.** The user deletes sites themselves at
154
235
  **hub.awesomate.ai** — deep-link them there; never script around it.
155
236
  - Prefer building/testing in **WordPress Studio locally**, then deploy (§5).
156
- - Dry-run risky WP-CLI where the command supports it before the real run.
237
+ - Read before you write: `option get`, `plugin list`, `theme list` cost
238
+ nothing and tell you what the current state actually is.
239
+
240
+
241
+ ### Changing site title, tagline and other WordPress settings
242
+
243
+ Use **`awesomate_wp_settings`** (domain + any of: title, tagline, timezone,
244
+ dateFormat, timeFormat, postsPerPage, searchEngineVisible). It flushes the
245
+ object cache for you, so the change actually shows on the live site.
246
+
247
+ **Do not reach for `awesomate_run_wp_cli` for these.** Its arguments cannot
248
+ contain spaces — the transport re-parses them on the remote shell, so the
249
+ charset gate refuses anything with a space. `option update blogname "Care
250
+ Connect AI"` will always be rejected there, and a business name is multi-word
251
+ by definition. Same rule for post and page content: that is `awesomate_wp_post`.
252
+
253
+ `awesomate_run_wp_cli` remains right for space-free operations: plugin/theme
254
+ list, activate, install by slug, `option get`, `cache flush`, listing posts,
255
+ media, users and comments.
256
+
257
+ Snapshot before the session's first change to a live site
258
+ (`awesomate_snapshot_site`), and tell the user the snapshot id so they know
259
+ rollback exists. `searchEngineVisible: false` de-indexes the site — always
260
+ confirm that one explicitly before setting it.
157
261
 
158
262
  ## 4. Limits & upgrade etiquette
159
263
 
@@ -198,7 +302,14 @@ AI crawlers — anyone with the link can view, perfect for client review).
198
302
 
199
303
  - `awesomate_site_staging_create <live domain>` — clones files + DB, rewrites
200
304
  URLs. One staging copy per site (409 `staging_exists` → promote or discard
201
- first). Takes a few minutes on large sites.
305
+ first). Takes a few minutes on large sites. On an account whose primary
306
+ site this is, the copy lands at `staging.{slug}.awesomate.dev`; a second
307
+ site keeps its own first label.
308
+ - **A 409 `no_dev_domain` is not your mistake.** Some accounts have no
309
+ awesomate.dev address on file yet, and staging needs one. The message says
310
+ so: relay it and offer to raise it with support (`awesomate_support`) —
311
+ there is no tool that adds the dev address, so don't retry or improvise a
312
+ staging copy on a live domain.
202
313
  - Make the changes ON the staging domain (WP-CLI / wp-admin / deploy.sh with
203
314
  `--domain <staging domain>`), send the user the staging URL to review.
204
315
  - `awesomate_site_staging_promote <live domain>` — publishes staging over live.
@@ -45,7 +45,7 @@ doubt: outcome first, cost before spend, one question at a time.
45
45
  9. **Confirm names and anything hard to undo before acting.** App names
46
46
  become web addresses; deletes are forever.
47
47
  Bad: "Created app xk9-test-2."
48
- Good: "I'll call it 'bookings' — that becomes bookings.acme.awesomate.site.
48
+ Good: "I'll call it 'bookings' — that becomes bookings.acme.awesomate.app.
49
49
  OK?"
50
50
 
51
51
  10. **When something fails, say what you're doing about it.** Never paste a
@@ -30,10 +30,17 @@ platform's answer beats anything you remember.
30
30
  - `upgrade_required: true` → relay the included upsell copy + billing
31
31
  link once, honestly, then help within what reads allow. Never retry
32
32
  into the gate.
33
- - `consent.knowledge_platform_enabled: false` → the user must enable it
34
- under Settings Privacy ("Knowledge Platform") in the hub — you
35
- cannot flip it for them. Explain what it consents to (their selected
36
- content is indexed in Sydney, deletable any time), wait, re-check.
33
+ - `consent.knowledge_platform_enabled: false` → the user must turn it on
34
+ themselves: hub.awesomate.ai/n8n/settings, under the heading
35
+ **"Knowledge Base"**, the toggle **"Send My Content to the Knowledge
36
+ Platform"**. Name it exactly like that one heading and one switch, so
37
+ they can find it without hunting. You cannot flip it for them, and
38
+ there is no tool that can. If you're unsure which toggle is blocking
39
+ (or a knowledge call 403s), call `awesomate_privacy_settings` — it
40
+ reads which consents are on or off and names the one that's stopping
41
+ you. Explain what it consents to (their selected content is indexed in
42
+ Sydney, kept isolated to their account, deletable any time; turning it
43
+ off suspends the Knowledge Base immediately), wait, re-check.
37
44
  - `tenant: null` or `status: 'provisioning'` → not enabled yet /
38
45
  still building; `usage` → month-to-date vs `usage.included` quota.
39
46
  3. Only then design: what content exists, what's already ingested, what the
@@ -110,6 +117,9 @@ enough to route through explicit REST calls the user has just approved.
110
117
  | Action | Endpoint |
111
118
  |---|---|
112
119
  | Status / provision / sources / jobs / agent / ask | `GET\|POST /api/knowledge/{status,provision,sources,jobs,agent,chat}` (tool equivalents) |
120
+ | Faceted search (what `awesomate_knowledge_search` calls) | `GET /api/knowledge/explore?q=…` + the same facet params |
121
+ | Business-data warehouse (what `awesomate_knowledge_data` calls) | `GET /api/knowledge/data/{metrics,datasets,datasets/:id,imports,imports/:id}` · `PATCH /api/knowledge/data/datasets/:id` · `POST /api/knowledge/data/imports/:id/:action` · `POST /api/knowledge/data/query` (read-only SQL) |
122
+ | Agent builder (what `awesomate_knowledge_agents` calls) | `GET\|POST /api/knowledge/agents` · `GET\|PATCH\|DELETE /api/knowledge/agents/:agent_id` · `POST /api/knowledge/agents/:agent_id/{publish,suspend,resume}` |
113
123
  | Entity layer probe (`available` false = not enabled yet, stop) | `GET /api/knowledge/entities` |
114
124
  | People list / detail | `GET /api/knowledge/people?status=named\|unknown\|hidden\|all` · `GET /api/knowledge/people/:id` |
115
125
  | Name or hide/unhide a person (after approval) | `PATCH /api/knowledge/people/:id` `{display_name}` or `{status: "hidden"\|"unknown"}` |
@@ -28,8 +28,11 @@ as outcomes ("your form now emails you") with URLs.
28
28
  resolves to. Wrong slug → stop and fix the pin/connection first. Every
29
29
  tool response is stamped `account: <slug>` — watch it.
30
30
  2. `awesomate_n8n_context` — cache the result:
31
- - `consented: false` → give the user the `settingsUrl` (Settings
32
- Privacy "Allow Claude Code to Build n8n Workflows"), wait, re-check.
31
+ - `consented: false` → give the user the `settingsUrl` and tell them
32
+ where it lands: **n8n Settings Privacy** at
33
+ `hub.awesomate.ai/n8n/settings` → "Allow Claude Code to Build n8n
34
+ Workflows". Privacy moved there; the plain `/settings` page no longer
35
+ has it (old `?tab=privacy` links just redirect). Wait, then re-check.
33
36
  - `403 missingScopes` → token predates n8n support — reconnect from
34
37
  hub.awesomate.ai/sites (Connect Claude Code card).
35
38
  - `capabilities.builder: false` → reads only; building is Support Plus+.
@@ -52,12 +55,22 @@ conflicts with anything under `references/vendor/`, platform-notes wins.
52
55
  ## 0a. Health sweep — the guardian pattern
53
56
 
54
57
  At the START of any n8n session, alongside the context call: run
55
- `awesomate_n8n_errors` (last 7 days) and `awesomate_n8n_kpis` once. If
56
- something is failing, surface it in ONE line in the user's language "two of
57
- your automations failed overnight want me to look?" before proceeding
58
- with the asked task. If everything is green, say nothing and get on with it.
59
- Never let the sweep hijack the session; the user's ask comes first unless
60
- they say otherwise.
58
+ `awesomate_n8n_errors` **with `days: 7`** and `awesomate_n8n_kpis` once. The
59
+ `days` parameter is not optional in practice the tool defaults to **30**,
60
+ so omitting it sweeps a month and dresses old, already-fixed failures up as
61
+ this week's news. If something is failing, surface it in ONE line in the
62
+ user's language "two of your automations failed overnight want me to
63
+ look?" before proceeding with the asked task. If everything is green, say
64
+ nothing and get on with it. Never let the sweep hijack the session; the
65
+ user's ask comes first unless they say otherwise.
66
+
67
+ **Zeros on a new account are not a clean bill of health.** A brand-new
68
+ instance has no error history and no error-reporter workflow installed yet,
69
+ so the sweep returns empty for the same reason it would on a flawless one.
70
+ Check the inventory before you interpret it: no workflows, or workflows with
71
+ no executions, means *there is nothing here yet* — say that, plainly
72
+ ("nothing has run yet, so there's nothing to report — want to build the
73
+ first one?"). Never let "no errors found" imply "everything is working".
61
74
 
62
75
  When diagnosing, trust `errorSummary` only when `confident: true` (it then
63
76
  also carries `errorType`, `code`, `lastNodeExecuted`). When `confident:
@@ -74,7 +87,8 @@ the named node actually exists in the workflow before editing anything.
74
87
  | Instance KPIs: exec totals, error rate, avg/p95 duration, time saved, 7d-vs-prior deltas (per-workflow adds `last_error_at` + `clean_days`) | `awesomate_n8n_kpis` |
75
88
  | Instance-WIDE error events grouped by fingerprint (category, workflow, node, occurrences, first/last seen) — "what is broken across everything" | `awesomate_n8n_errors` |
76
89
  | Execution/table/DB byte sizes + 24h per-workflow offenders ("your executions weigh 4GB") | `awesomate_n8n_storage` |
77
- | AI error-analyzer findings: clientSummary, needsClientAction, fixReady (Pro/Embedded + the "AI error analysis" privacy toggle; read-only) | `awesomate_n8n_findings` |
90
+ | AI error-analyzer findings: clientSummary, needsClientAction, fixReady (Pro/Embedded + the **"Enable AI Error Diagnosis"** toggle under n8n → Settings → Privacy; read-only) | `awesomate_n8n_findings` |
91
+ | Account-wide numbers in one call: executions by status, error rate, time saved, workflows total/active, chat sessions, 7-day trend, most recent live failure — the single best source for a status update or weekly report | `awesomate_dashboard_metrics` |
78
92
  | Executions list / detail / node-by-node debug | `awesomate_n8n_executions` |
79
93
  | Node schemas, node search, community templates, node-level validation | `awesomate_n8n_node_docs` |
80
94
  | Validate / create draft / update draft / activate / promote / rollback / delete draft | `awesomate_n8n_deploy` |
@@ -117,8 +131,20 @@ criteria, error handling — in the user's words. Check the inventory FIRST:
117
131
  reuse existing credentials, $vars, tables, workflows. Email decision tree:
118
132
  existing Gmail/Google credential → reference its ID · none → offer an
119
133
  API-key credential (SMTP / Resend / SendGrid — instant) OR guided Gmail
120
- OAuth (user connects at `{instanceUrl}/home/credentials`, you re-check the
121
- inventory to verify). A credential existing ≠ working.
134
+ OAuth. A credential existing working.
135
+
136
+ **Say the credential catch before they pick, not after it fails.** No tool
137
+ creates a credential on their instance — the one exception is
138
+ `awesomate_n8n_provision_pg`, which makes a Postgres one. Everything else,
139
+ API-key credentials included, the user creates in n8n at
140
+ `{instanceUrl}/home/credentials`; you then re-check the inventory to verify
141
+ it exists. **Gmail and any other OAuth credential can only ever be finished
142
+ in the browser** — the consent screen is Google's, so that branch always
143
+ ends with them, no matter what you try. Flag it while they're choosing:
144
+ *"Either way you'll paste it in on your n8n — an SMTP or Resend key is one
145
+ box and a minute; Gmail means clicking through Google's permission screen.
146
+ Tell me which and I'll give you the exact steps, then pick it up from
147
+ there."*
122
148
 
123
149
  **Phase 2 — Design.** Resolve EVERY planned node and typeVersion via
124
150
  `awesomate_n8n_node_docs` (search similar community templates too — a
@@ -81,7 +81,9 @@ reconnecting a credential), and `fixReady` (a fix exists). It is read-only:
81
81
  use it to explain and prioritise, not as a substitute for your own diagnosis
82
82
  of the execution data. On a 403, the plan or the toggle is the reason —
83
83
  `awesomate_privacy_settings` (hosting skill) tells you which; the user flips
84
- toggles themselves at hub.awesomate.ai/settings?tab=privacy.
84
+ toggles themselves under **n8n → Settings → Privacy** at
85
+ hub.awesomate.ai/n8n/settings — the one for this tool is labelled
86
+ **"Enable AI Error Diagnosis"**.
85
87
 
86
88
  ## 5. What to do when you inherit a workflow with no plan
87
89
 
@@ -73,7 +73,9 @@ trust this file.
73
73
  debug: true}` decodes an execution into per-node input/output and the
74
74
  real error. Use it instead of guessing from the summary. It is gated on
75
75
  the client's `error_content_analysis` privacy toggle (default OFF) — on
76
- a consent refusal, ask the user to enable it on /settingsPrivacy;
76
+ a consent refusal, ask the user to enable it under **n8nSettings →
77
+ Privacy** at `hub.awesomate.ai/n8n/settings` (Privacy moved off the plain
78
+ `/settings` page; old `?tab=privacy` links redirect there);
77
79
  never work around the gate.
78
80
 
79
81
  ## Credentials
@@ -11,8 +11,8 @@ the boundary between them.
11
11
  ## The boundary (read this before promising anything)
12
12
 
13
13
  - **Hub metrics** — execution counts, error rates, time saved, site uptime,
14
- knowledge usage — come from YOUR tools (`awesomate_n8n_kpis`,
15
- `awesomate_n8n_errors`, `awesomate_site_uptime`,
14
+ knowledge usage — come from YOUR tools (`awesomate_dashboard_metrics`,
15
+ `awesomate_n8n_kpis`, `awesomate_n8n_errors`, `awesomate_site_uptime`,
16
16
  `awesomate_knowledge_status`). Those tools authenticate with the user's
17
17
  PAT on this machine. **A workflow inside their n8n cannot call them**, and
18
18
  it can't query n8n's own execution database either.
@@ -29,10 +29,17 @@ hub metrics.
29
29
  When the user asks "how's everything going?" or it's report time, assemble
30
30
  it live:
31
31
 
32
- 1. `awesomate_n8n_kpis` — executions, error rate, time saved, 7d-vs-prior.
33
- 2. `awesomate_n8n_errors` (last 7 days) anything broken, grouped.
34
- 3. `awesomate_site_uptime` per-domain availability and incidents.
35
- 4. `awesomate_knowledge_status` usage vs quota, if they have a knowledge base.
32
+ 1. `awesomate_dashboard_metrics` — **start here.** The account-wide aggregate
33
+ in one call: executions by status, error rate, time saved, workflows
34
+ total/active, chat sessions and unique users (30d), a 7-day daily trend,
35
+ and the most recent live-workflow failure. It is the single best source
36
+ for a status update or weekly report; the rest fill in around it.
37
+ 2. `awesomate_n8n_kpis` — per-workflow detail and 7d-vs-prior deltas.
38
+ 3. `awesomate_n8n_errors` with **`days: 7`** — anything broken, grouped. Pass
39
+ the days: the tool defaults to 30, which turns a weekly report into a
40
+ monthly one without saying so.
41
+ 4. `awesomate_site_uptime` — per-domain availability and incidents.
42
+ 5. `awesomate_knowledge_status` — usage vs quota, if they have a knowledge base.
36
43
 
37
44
  Present it as a short plain-language summary — five lines, not a dashboard:
38
45
  what ran, what it saved, what failed (and whether it's fixed), site status.
@@ -35,6 +35,10 @@ the conversation or logs.
35
35
  | Possibilities brief | `GET /api/my-n8n/machine/possibilities` |
36
36
  | Executions | `GET /api/my-n8n/workflows/:id/executions` · `GET /api/my-n8n/executions/:execId` |
37
37
  | Node-by-node execution debug | `GET /api/my-n8n/machine/executions/:execId/debug` |
38
+ | Instance KPIs (the health sweep) | `GET /api/my-n8n/kpis` · per-workflow: `GET /api/my-n8n/workflows/:id/kpis` |
39
+ | Instance-wide error events, grouped | `GET /api/my-n8n/errors?days=7&limit=` — **pass `days`**, it defaults to 30 |
40
+ | Execution/table/DB byte sizes + 24h offenders | `GET /api/my-n8n/machine/storage` |
41
+ | AI error-analyzer findings (Pro/Embedded) | `GET /api/my-n8n/machine/findings?limit=` |
38
42
  | Live node docs + community templates | `POST /api/my-n8n/machine/node-catalog/:tool` — tool ∈ search_nodes, get_node, search_templates, get_template, validate_node, tools_documentation; body = the tool's args (e.g. `{"query":"gmail"}`, `{"nodeType":"n8n-nodes-base.gmail"}`) |
39
43
 
40
44
  ## Writes (Support Plus+, consent + quotas + audit apply identically)
@@ -62,8 +66,9 @@ the conversation or logs.
62
66
  - `429 quota_exceeded` → the plan's daily cap; stop, don't retry-loop.
63
67
  - `503 node_catalog_unavailable` → use `references/vendor/` knowledge.
64
68
  - `404` on a path in this table → check the path against this file
65
- EXACTLY; do not probe variations anything not listed here does not
66
- exist, and everything listed here is the complete surface.
69
+ EXACTLY; do not probe variations. This table is the n8n surface the
70
+ `awesomate_n8n_*` tools wrap if something is missing from it, the fix is
71
+ to add the verified path here, not to guess at one.
67
72
 
68
73
  The skill's judgment (six-phase loop, approval gates, testing policy,
69
74
  never-activate-a-copy) applies unchanged — only the transport differs.
@@ -3,6 +3,34 @@
3
3
  Diagnosis playbook. Work the flow top-to-bottom; do not jump to fixes before
4
4
  you have the failing execution's detail.
5
5
 
6
+
7
+ ## "Could not create the draft" / writes fail while reads work
8
+
9
+ If reads, `awesomate_n8n_context` and `validate` all succeed but every WRITE
10
+ (create draft, activate, promote, test-fire) fails, the cause is almost always
11
+ the account's stored n8n API key — not the hub, not Cloudflare, not the
12
+ workflow JSON. Validation runs on Awesomate's side and never touches the
13
+ instance, which is exactly why it keeps passing.
14
+
15
+ The server says so explicitly: HTTP **409** with `code: n8n_credential_invalid`.
16
+ Older builds reported this as a 502, which reads like an outage — if you see a
17
+ bare 502 on writes only, suspect the key before you suspect the platform.
18
+
19
+ **Tell the user to do this, in this order:**
20
+
21
+ 1. Open their n8n (the response's `instanceUrl`, e.g. `https://<slug>.awesomate.io`)
22
+ → **Settings → n8n API** → **Create an API key**. Copy it.
23
+ 2. Open **https://hub.awesomate.ai/n8n/settings** → paste it into
24
+ **"New n8n API Key"** → save. The status chip should go from
25
+ *Key rejected* to *Connected*.
26
+ 3. Retry the action.
27
+
28
+ Do not retry before they confirm the new key is saved, and do not go probing
29
+ hub or Cloudflare status — a genuine hub problem breaks reads too.
30
+
31
+ Common causes: the key was revoked or regenerated in n8n, or the instance was
32
+ rebuilt (a rebuilt instance shows 0 workflows and invalidates every old key).
33
+
6
34
  ## Diagnosis flow
7
35
 
8
36
  1. `awesomate_n8n_context` — confirm consent flags, capabilities, and the
@@ -21,7 +49,9 @@ you have the failing execution's detail.
21
49
  5. `awesomate_n8n_executions {executionId, debug: true}` — node-level output
22
50
  data. Requires `error_content_analysis` consent:
23
51
  - `403 consent_required` → give the user the `settingsUrl` from the error
24
- response and stop; they enable it under Settings → Privacy.
52
+ response and stop; they enable it under **n8n → Settings → Privacy** at
53
+ `hub.awesomate.ai/n8n/settings` (the plain `/settings` page no longer
54
+ carries Privacy; old `?tab=privacy` links redirect there).
25
55
  - `tooLarge: true` → payload over 15MB. Use the summary in the response;
26
56
  do NOT retry hoping for the full payload.
27
57
  6. Node behaving strangely rather than erroring → check its schema with