@awesomate/hosting-mcp 0.18.0 → 0.19.1

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@awesomate/hosting-mcp",
3
- "version": "0.18.0",
4
- "description": "Awesomate MCP server \u2014 lets Claude manage your Awesomate WordPress hosting, plan, limits, n8n automations, and build Node/static apps + databases",
3
+ "version": "0.19.1",
4
+ "description": "Awesomate MCP server lets Claude manage your Awesomate WordPress hosting, plan, limits, n8n automations, and build Node/static apps + databases",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
7
7
  "publishConfig": {
@@ -32,4 +32,4 @@
32
32
  "esbuild": "^0.25.0",
33
33
  "typescript": "^6.0.3"
34
34
  }
35
- }
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "versions": [
3
+ {
4
+ "version": "0.19.1",
5
+ "highlights": [
6
+ "When your n8n API key stops working, Claude now tells you exactly how to fix it instead of reporting a confusing server error"
7
+ ]
8
+ },
9
+ {
10
+ "version": "0.19.0",
11
+ "highlights": [
12
+ "Claude can now see what's broken across all your automations at once and explain it in plain language",
13
+ "Update your WordPress pages and posts straight from Claude (drafts first, you approve publishing)",
14
+ "Weekly business reports: uptime, automation health and usage in one summary",
15
+ "Claude notices when an update to these tools is ready and installs it for you in one step"
16
+ ]
17
+ },
18
+ {
19
+ "version": "0.18.0",
20
+ "highlights": [
21
+ "Search your knowledge base with filters and ask questions within a slice of your content",
22
+ "People & entities: your knowledge base now recognises who appears in your content, and you can name and merge them",
23
+ "Build AI agents from your own content \u2014 drafted, tested privately, and published only when you approve"
24
+ ]
25
+ },
26
+ {
27
+ "version": "0.14.0",
28
+ "highlights": [
29
+ "Tools built for business owners, not developers \u2014 plain-language answers about your account, plan and limits",
30
+ "New support skill: get help, understand credits, or request a done-for-you build without leaving Claude",
31
+ "New database skill: Claude picks the right place to keep your data and sets it up for you"
32
+ ]
33
+ }
34
+ ]
35
+ }
@@ -16,7 +16,10 @@ own hosting) but you should always confirm the **stack + name** before creating.
16
16
  1. Run `awesomate_whoami` — everything acts on whichever ACCOUNT this folder
17
17
  resolves to. Every tool response is stamped `account: <slug>`; if it isn't
18
18
  the account the user means, fix the pin/connection first (see the
19
- awesomate-hosting skill's multi-account section).
19
+ awesomate-hosting skill's multi-account section). If `awesomate_get_context`'s
20
+ `attention` block shows erroring workflows or unread notifications, surface
21
+ that first in one line ("two of your automations failed this week — want me
22
+ to look?"), then get on with the ask.
20
23
  2. Call `awesomate_app_context` once and cache it. It returns:
21
24
  - `capability.appBuilder` — if **false**, building is Support Plus+. Relay
22
25
  the upgrade suggestion (don't attempt to build); reads still work.
@@ -106,8 +109,8 @@ target; never touch prod without an explicit ask.**
106
109
  `/api/ready`). Show the user the live dev URL and let them try it. Iterate
107
110
  on dev until they're happy.
108
111
  7. **Wrap-up / promote** — only when the user approves, promote **dev → staging
109
- → main** (merge + push per branch). `awesomate_app_deploy` reports the
110
- branch→env map + last-deploy state. Prod is `main`. **Before merging to
112
+ → main** (merge + push per branch). `awesomate_app_deploy_info` reports the
113
+ branch→env map + last-deploy state (it never deploys — `git push` does). Prod is `main`. **Before merging to
111
114
  main**, walk [references/security-checklist.md](references/security-checklist.md)
112
115
  — the deploy workflow's automated gate blocks prod on high-severity
113
116
  findings (secrets, injectable SQL, eval…), and the checklist covers what
@@ -64,8 +64,9 @@ never throws — check `result.ok` and degrade gracefully.
64
64
  through a PR from staging.
65
65
  - **Roll back** = `git revert <bad-sha>` on the affected branch + push — the
66
66
  workflow redeploys the previous good state. Re-check health after.
67
- - `awesomate_app_deploy` reports the branch→env map, last-deploy SHA/time,
68
- and last health per env.
67
+ - `awesomate_app_deploy_info` reports the branch→env map, last-deploy
68
+ SHA/time, and last health per env. It reports how deploys work — it never
69
+ deploys; `git push` is the deploy.
69
70
 
70
71
  ## Health semantics (don't mix these up)
71
72
 
@@ -9,7 +9,7 @@ confirm before building. **Never default to WordPress.**
9
9
  | What the user is really trying to do | Stack | Why / how |
10
10
  |---|---|---|
11
11
  | "I already have a WordPress site" / a blog / publishes content regularly / **wants to rank on Google & AI** | **WordPress** | Best CMS for indexable content, sitemaps, schema. Hand to the awesomate-hosting skill to provision, then run **awesomate-seo**. Existing WP elsewhere → migrate it, don't rebuild: [wp-migrate.md](wp-migrate.md) (also covers WP ↔ app coexistence on subdomains). |
12
- | Sell products / online shop | **WordPress + WooCommerce** | Reuse the `woo-agent-storefront` (AI-shopping feeds + `llms.txt`) and `woo-catalog-perfection` skills. |
12
+ | Sell products / online shop | **WordPress + WooCommerce** | Provision via the awesomate-hosting skill, install WooCommerce over WP-CLI, then run **awesomate-seo** (product pages need `Product` JSON-LD + real product data). |
13
13
  | A landing page / capture leads / a one-pager / "just needs to look good and be found" | **static site** (`kind: 'static'`) | Served straight from the cPanel docroot — no database, no server process, fastest load. Add SEO + a lead form (below). The right default for marketing pages. |
14
14
  | A tool/app with **logins, custom logic, a dashboard, or an API** | **Node app** (`kind: 'node'`) | A real backend + database. |
15
15
 
@@ -19,10 +19,12 @@ description: >
19
19
  # Awesomate Hosting
20
20
 
21
21
  You are helping the user run their **Awesomate-hosted WordPress** through the
22
- **Awesomate Hosting MCP** (tools prefixed `awesomate_`). This skill is the thin
23
- hosting/account/deploy/plan layer for WordPress theming, blocks, and content
24
- generation, defer to WordPress Studio and any installed WordPress skills
25
- (`WordPress/agent-skills`, respira). Don't reimplement those.
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.
26
28
 
27
29
  ## 0. First run — orient before acting
28
30
 
@@ -34,12 +36,21 @@ before any work** — every tool response is stamped `account: <slug> (source:
34
36
  once (plus `awesomate_get_limits` before any create/change) and cache:
35
37
 
36
38
  - **`plan`** and **`capabilities.shell`** — decides which branch below you're on.
39
+ - **`attention`** — `{unreadNotifications, erroringWorkflows7d, patExpiresInDays}`.
40
+ If it shows erroring workflows or unread notifications, say so in ONE line
41
+ ("two of your automations failed this week — want me to look?") before the
42
+ asked task, then get on with the task. `null` means unknown, never zero —
43
+ say nothing on null.
37
44
  - **`patExpiresAt`** — within ~7 days, or any 401: re-run the setup prompt at
38
45
  **hub.awesomate.ai/sites → Connect Claude Code** to refresh the token.
39
- - **`skill.updateAvailable`** — this skill's local files are older than the MCP
40
- server. Mention once (don't nag); run `awesomate_skill_update` to refresh in
41
- place (new content loads next session). If the token is also near expiry, the
42
- Connect re-run above does both. Not urgent finish the user's request first.
46
+ - **`skill.updateAvailable`** — covers all nine skills; the local files are
47
+ 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
53
+ `rm -rf ~/.npm/_npx`, then restart again.
43
54
  - **`cpanel`** routing (host/user), present once hosting is provisioned.
44
55
 
45
56
  If `awesomate_get_context` fails with a connectivity error, it's the user's
@@ -50,13 +61,43 @@ wrong account) · `references/connect-troubleshooting.md` (bootstrap, sandbox/
50
61
  proxy failures, resuming a connect, support report) ·
51
62
  `references/rest-fallback.md` (no `awesomate_*` tools — serve over REST).
52
63
 
64
+ ## 0a. Tool map — reach for it when
65
+
66
+ | Tool | Reach for it when |
67
+ |---|---|
68
+ | `awesomate_whoami` | First call of every session — which account this folder acts on (zero network) |
69
+ | `awesomate_get_context` | Session start — plan, capabilities, PAT expiry, `attention`, skill updates |
70
+ | `awesomate_get_limits` | Before any create/change — live plan limits + workflow/AI-editor credit balances |
71
+ | `awesomate_get_plan_features` | The live plan ladder, so upgrade talk is accurate |
72
+ | `awesomate_list_sites` | What WordPress sites exist on this account |
73
+ | `awesomate_site_create` | Spin up a new WordPress site (check limits first) |
74
+ | `awesomate_list_domains` | What domains are attached, and to which site |
75
+ | `awesomate_domain_add` | Attach a custom domain to a site |
76
+ | `awesomate_dns_check` | Live answer to "where does this domain actually point" — before and after any DNS change |
77
+ | `awesomate_site_uptime` | 30-day availability, incidents, downtime per domain (cached, free) |
78
+ | `awesomate_snapshot_site` | Before ANY change to a live site — files + DB restore point |
79
+ | `awesomate_list_snapshots` | What restore points a site has |
80
+ | `awesomate_rollback_site` | Restore a snapshot after something went wrong (confirm first) |
81
+ | `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 |
83
+ | `awesomate_wp_post` | Create/update/read a WP post or page — drafts by default (writes are Support Plus+) |
84
+ | `awesomate_wp_media_import` | Pull an image/file into the WP media library from an https URL (Support Plus+) |
85
+ | `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) |
87
+ | `awesomate_notifications` | The hub notification bell — `list` unread (quota warnings, quote ready, support-access events), `read`/`read_all` to clear |
88
+ | `awesomate_dashboard_metrics` | Account-wide numbers: executions by status, error rate, time saved, chat sessions, 7-day trend |
89
+ | `awesomate_account_report` | A monthly-report-shaped read: working / not working / engagement / commercials |
90
+ | `awesomate_skill_update` | Refresh these skills when `skill.updateAvailable` says so |
91
+ | `awesomate_support` | Raise a support ticket / reach a human |
92
+ | `awesomate_request_build` | Request a done-for-you build (spends a credit — confirm first) |
93
+
53
94
  ## 1. The plan model (so your nudges are accurate)
54
95
 
55
96
  | Plan | WP sites | Hosted apps | Custom domains | Shell / Claude Code | Notes |
56
97
  |---|---|---|---|---|---|
57
- | **Essentials** | 1 | 0 | 0 | **No** | read/status + upgrade nudges only |
58
- | **Support Plus** | 2 | 5 | 3 | **Yes** | shell, WP-CLI, snapshot/rollback, deploy, app builder |
59
- | **Pro** | 10 | 20 | 10 | **Yes** | + higher limits |
98
+ | **Essentials** | 1 | 0 | 1 | **No** | read/status + upgrade nudges only |
99
+ | **Support Plus** | 2 | 5 | 5 | **Yes** | shell, WP-CLI, snapshot/rollback, deploy, app builder |
100
+ | **Pro** | 10 | 20 | 20 | **Yes** | + higher limits |
60
101
  | **Embedded** | 100 | 100 | 100 | **Yes** | agency tier, not generally available |
61
102
 
62
103
  Authoritative limits are what `awesomate_get_limits` returns for THIS account
@@ -72,7 +113,9 @@ recommended plan instead.
72
113
  Allowed: `awesomate_get_context`, `_get_hosting_status` (hosting stats),
73
114
  `_get_hosting_account`, `_list_sites`, `_list_domains`, `_get_limits` (plan
74
115
  limits AND workflow/AI-editor credit balances), `_get_plan_features` (live plan
75
- ladder), and 1-click WP-admin / cPanel SSO links. Billing/plan changes: §4.
116
+ ladder), the other reads (`_dns_check`, `_site_uptime`, `_notifications`,
117
+ `_dashboard_metrics`, `_account_report`, `_privacy_settings`), and 1-click
118
+ WP-admin / cPanel SSO links. Billing/plan changes: §4.
76
119
 
77
120
  Never attempt SSH, WP-CLI, snapshot/rollback, staging, deploy, multi-site —
78
121
  those tools will 403. Instead, surface the specific limit and what
@@ -97,6 +140,12 @@ at it. Their dev copy is invisible to Google and AI crawlers by policy.
97
140
  - **Before ANY change to a live site** — plugin/theme/core update, `search-replace`,
98
141
  bulk edit, deploy — call **`awesomate_snapshot_site`** first and tell the user the
99
142
  `snapshotId`. If it goes wrong, `awesomate_rollback_site` restores files + DB.
143
+ - **WP content writes are snapshot-first and drafts-first.** Before the FIRST
144
+ content write of a session on a live site (an `awesomate_wp_post` write, a
145
+ content-touching WP-CLI command), take one `awesomate_snapshot_site`.
146
+ `awesomate_wp_post` creates DRAFTS by default — never pass
147
+ `status: 'publish'` unless the user has seen the content or explicitly said
148
+ to publish.
100
149
  - **Confirm before destructive actions** — `awesomate_rollback_site`,
101
150
  `awesomate_site_staging_promote` (replaces live), `_site_staging_discard`
102
151
  (loses unpublished staging work), dropping tables, `wp db reset`, deleting
@@ -165,15 +214,18 @@ Prefer this flow over editing live whenever the change is user-visible
165
214
 
166
215
  Awesomate's snapshots are your safety net, so Git isn't required — but for real
167
216
  version history and diffs, initialise a repo in the Studio site folder and use
168
- the `gh` CLI (`gh auth login`, `gh repo create`). Let the installed WordPress /
169
- Git skills drive the Git workflow; this skill just deploys the result.
217
+ the `gh` CLI (`gh auth login`, `gh repo create`). Let the **awesomate-github**
218
+ skill drive the Git workflow; this skill just deploys the result.
170
219
 
171
220
  ## 7. Bundled scripts (`scripts/`)
172
221
 
173
- - `bootstrap.mjs` — one-time setup: redeems the hub setup code for a scoped Run it with `--update` to refresh the installed skills from the current package without redeeming a new setup code.
174
- token (chmod 600), **installs this skill into `~/.claude/skills`**, registers
175
- the MCP server, best-effort SSH setup (Support Plus+). Invocation + failure
176
- modes: `references/connect-troubleshooting.md`.
222
+ - `bootstrap.mjs` — one-time setup: redeems the hub setup code for a scoped
223
+ access token and installs the skills. Run it with `--update` to refresh the
224
+ installed skills from the current package without redeeming a new setup
225
+ code. It also stores the token (chmod 600), **installs the skills into
226
+ `~/.claude/skills`**, registers the MCP server, and does best-effort SSH
227
+ setup (Support Plus+). Invocation + failure modes:
228
+ `references/connect-troubleshooting.md`.
177
229
  - `ssh-connect.sh` — open a jailed SSH session (or run one remote command).
178
230
  - `wp.sh` — run a WP-CLI command against a live site over that SSH.
179
231
  - `deploy.sh` — snapshot-first Studio→live deploy (files, optional DB).
@@ -184,3 +236,17 @@ Git skills drive the Git workflow; this skill just deploys the result.
184
236
  (`references/connect-troubleshooting.md`); `--submit` returns a reference ID.
185
237
 
186
238
  All scripts read `~/.awesomate/credentials.json`; none take secrets on the CLI.
239
+
240
+ ## 8. The other Awesomate skills
241
+
242
+ This skill is the front door; deeper work belongs to its siblings (same
243
+ connection, same PAT — just load the skill):
244
+
245
+ - Automations, workflows, AI agents, data tables → **awesomate-n8n**
246
+ - Building an app or a landing page → **awesomate-app-builder**
247
+ - Knowledge base / "train the AI on my content" → **awesomate-knowledge**
248
+ - SEO and AI discoverability → **awesomate-seo**
249
+ - Handing over any secret (API key, token, password) → **awesomate-credentials**
250
+ - Version control / backing up their work → **awesomate-github**
251
+ - Where should this data live (data table vs Postgres) → **awesomate-database**
252
+ - Plans, credits, billing, or reaching a human → **awesomate-support**
@@ -305,10 +305,17 @@ function installSkill() {
305
305
  const hostingSkill = dirname(dirname(selfPath));
306
306
  const skillRoot = dirname(hostingSkill);
307
307
  const isPackageLayout = basename(skillRoot) === 'skill';
308
- // Only the package layout (skill/<name>/) has bundled siblings; from an
309
- // installed copy the parent is the user's skills folder full of unrelated
310
- // skills, so fall back to just this skill.
311
- const bundled = isPackageLayout ? readdirSync(skillRoot) : [basename(hostingSkill)];
308
+ if (!isPackageLayout) {
309
+ // Running from an INSTALLED copy (~/.claude/skills/...): the siblings here
310
+ // are the user's other skills, not the bundle, and this skill's src IS its
311
+ // dest so an "update" from here silently refreshed nothing while
312
+ // reporting success. Say so honestly and point at the two real paths.
313
+ console.log('• This is the installed copy of the skill — it cannot refresh the bundle from here.');
314
+ console.log(' Update instead with the awesomate_skill_update tool in Claude Code, or re-run the');
315
+ console.log(' full bootstrap: npx -y --package=@awesomate/hosting-mcp awesomate-hosting-bootstrap --update');
316
+ return false;
317
+ }
318
+ const bundled = readdirSync(skillRoot);
312
319
  // Package version, stamped into each installed skill as .installed-version.
313
320
  // The MCP server (always latest via unpinned npx) compares it against its own
314
321
  // version and reports skill.updateAvailable in awesomate_get_context.
@@ -57,6 +57,7 @@ platform's answer beats anything you remember.
57
57
  | Agent persona / fallback message / model tier — get & set (the single workspace default) | `awesomate_knowledge_agent` |
58
58
  | Agent BUILDER: list / get / create (AI-drafted from their content, saved as a private draft) / test the draft / publish (explicit approval first) | `awesomate_knowledge_agents` |
59
59
  | People, places, topics: list / name / hide / merge / alias suggestions / re-run resolution | `awesomate_knowledge_people` |
60
+ | Business-data warehouse: `metrics` / `datasets` / `query` / `imports` — answer quantitative questions from their own imported business data (query is free-form but read-only) | `awesomate_knowledge_data` |
60
61
  | Refresh these skills from the latest package | `awesomate_skill_update` |
61
62
 
62
63
  Local FILES (PDFs, videos on disk) cannot travel through these tools — send
@@ -88,6 +89,17 @@ bigger media by URL). Formats + caps: [ingestion-sources.md](references/ingestio
88
89
  ([n8n-connection.md](references/n8n-connection.md)) — never hand-build
89
90
  the credential.
90
91
 
92
+ Two natural follow-ons, each one sentence when the moment fits:
93
+
94
+ - **The same content should feed SEO.** What makes a good knowledge source
95
+ (a services page, an FAQ, an about page) is exactly what `llms.txt` and AI
96
+ discoverability need on their public site — route to the **awesomate-seo**
97
+ skill.
98
+ - **"Ask my knowledge base on a schedule" / "build me reports"** — that's
99
+ the weekly-pulse recipe in the **awesomate-n8n** skill
100
+ (`references/recurring-reports.md`); knowledge usage joins the report via
101
+ `awesomate_knowledge_status`.
102
+
91
103
  ## 4. REST fallback (no `awesomate_knowledge_*` tools loaded, or an action with no tool)
92
104
 
93
105
  Auth exactly as the awesomate-hosting skill: `Authorization: Bearer <pat>`
@@ -49,6 +49,21 @@ designing or diagnosing — it is the live truth for THIS platform ($vars not
49
49
  $env, `$json.body`, task-runner limits, activation semantics). When it
50
50
  conflicts with anything under `references/vendor/`, platform-notes wins.
51
51
 
52
+ ## 0a. Health sweep — the guardian pattern
53
+
54
+ 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.
61
+
62
+ When diagnosing, trust `errorSummary` only when `confident: true` (it then
63
+ also carries `errorType`, `code`, `lastNodeExecuted`). When `confident:
64
+ false`, the failing-node name came from a heuristic and may be WRONG — verify
65
+ the named node actually exists in the workflow before editing anything.
66
+
52
67
  ## 1. Tools
53
68
 
54
69
  | Task | Tool |
@@ -56,12 +71,17 @@ conflicts with anything under `references/vendor/`, platform-notes wins.
56
71
  | Session context, consent, quotas, fingerprint | `awesomate_n8n_context` |
57
72
  | All workflows (node-level summaries) / one workflow (`detail: full\|structure`) | `awesomate_n8n_workflows` |
58
73
  | Node inventory, datatables (+rows), possibilities, credentials, $vars | `awesomate_n8n_inspect` |
74
+ | 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
+ | Instance-WIDE error events grouped by fingerprint (category, workflow, node, occurrences, first/last seen) — "what is broken across everything" | `awesomate_n8n_errors` |
76
+ | 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` |
59
78
  | Executions list / detail / node-by-node debug | `awesomate_n8n_executions` |
60
79
  | Node schemas, node search, community templates, node-level validation | `awesomate_n8n_node_docs` |
61
80
  | Validate / create draft / update draft / activate / promote / rollback / delete draft | `awesomate_n8n_deploy` |
62
81
  | Fire a test payload at an active workflow | `awesomate_n8n_test` |
63
82
  | Create/alter data tables, write rows | `awesomate_n8n_datatable_write` |
64
83
  | Provision a Postgres DB + n8n credential | `awesomate_n8n_provision_pg` |
84
+ | Wire a tested webhook workflow into one of their hosted apps (stores URL + secret on the app; returns the secret ONCE for the workflow's header check) | `awesomate_n8n_attach_to_app` |
65
85
  | Refresh these skills from the latest package | `awesomate_skill_update` |
66
86
 
67
87
  No `awesomate_n8n_*` tools in this session (fresh bootstrap, or the server
@@ -79,6 +99,8 @@ they're blocked on a restart.
79
99
  | Anything involving data tables | [datatables.md](references/datatables.md) |
80
100
  | Building AI agents / chatbots / LLM steps | [ai-agents.md](references/ai-agents.md) |
81
101
  | A workflow is failing | [troubleshooting.md](references/troubleshooting.md) |
102
+ | Error plans, error workflows, notify-the-owner on failure | [error-handling.md](references/error-handling.md) |
103
+ | A weekly business report / "email me my numbers" | [recurring-reports.md](references/recurring-reports.md) |
82
104
  | Changing a LIVE workflow | [upgrade-loop.md](references/upgrade-loop.md) |
83
105
  | "What could I automate?" | [possibilities.md](references/possibilities.md) |
84
106
  | WordPress form → n8n | [wp-form-handler.md](references/wp-form-handler.md) |
@@ -142,7 +164,9 @@ Full procedure: [upgrade-loop.md](references/upgrade-loop.md).
142
164
  Executions list → detail → walk the item data BACKWARDS (the cause is
143
165
  usually upstream) → `debug: true` for node-level output → check against
144
166
  [troubleshooting.md](references/troubleshooting.md) → explain in the user's
145
- terms with the exact fix. Self-built workflows: fix via update_draft or the
167
+ terms with the exact fix. Trust `errorSummary` only on `confident: true`
168
+ (§0a). While you're there, check whether the workflow has an error plan at
169
+ all — [error-handling.md](references/error-handling.md). Self-built workflows: fix via update_draft or the
146
170
  upgrade loop. Agency-managed (`agency_managed` error): read and explain
147
171
  freely; changes go through Awesomate support.
148
172
 
@@ -151,7 +175,9 @@ freely; changes go through Awesomate support.
151
175
  `awesomate_n8n_inspect {what:'possibilities'}` returns facts; YOU make the
152
176
  suggestions — grounded, ≤8, honestly labelled with what each needs. Rules:
153
177
  [possibilities.md](references/possibilities.md). Offer it once, in one
154
- sentence, after the first inventory pass when the user's ask is vague.
178
+ sentence, after the first inventory pass when the user's ask is vague. One
179
+ standing recipe worth offering: the weekly business pulse —
180
+ [recurring-reports.md](references/recurring-reports.md).
155
181
 
156
182
  ## 7. Hard rules
157
183
 
@@ -0,0 +1,91 @@
1
+ # Error handling — every production workflow needs a plan
2
+
3
+ A workflow with no error plan fails silently: the run turns red in a list
4
+ nobody looks at, and the user finds out days later when a customer asks why
5
+ they never got a reply. Before you call any build "done", it needs one of
6
+ two things (both is better):
7
+
8
+ 1. **A per-node error plan** — retry/fallback on the nodes that can fail.
9
+ 2. **An error workflow** — a separate workflow that runs whenever THIS one
10
+ fails and notifies the OWNER.
11
+
12
+ **Errors route to the client, never to Awesomate.** The notification target
13
+ is always the user's own email/Slack/inbox — they own the automation, they
14
+ get told when it breaks. Never wire a notification to an Awesomate address.
15
+
16
+ ## 1. Per-node error plans
17
+
18
+ Every node has error settings (in the workflow JSON, on the node object):
19
+
20
+ - `retryOnFail: true` + `maxTries` (2–3) + `waitBetweenTries` (ms) — for
21
+ anything that can fail transiently: HTTP calls, email sends, API nodes.
22
+ - `onError: 'continueErrorOutput'` — gives the node a second (error) output
23
+ you can route to a fallback branch (log the failure to a data table, send
24
+ an apology, use a default value). Use when the workflow should keep going.
25
+ - `onError: 'stopWorkflow'` (the default) — right when continuing would do
26
+ damage (don't charge a card after the lookup failed).
27
+
28
+ Rule of thumb from the build loop: **every external call has an error plan.**
29
+ An HTTP Request with no retry and no error branch is a design gap, not a
30
+ style choice.
31
+
32
+ ## 2. The error workflow (`settings.errorWorkflow`)
33
+
34
+ n8n lets any workflow name another workflow as its **error workflow**: when a
35
+ run fails, n8n executes that workflow with the failure details. The link
36
+ lives in the workflow's settings:
37
+
38
+ ```json
39
+ { "settings": { "errorWorkflow": "<workflow id of the error handler>" } }
40
+ ```
41
+
42
+ **To check whether a workflow has one:** `awesomate_n8n_workflows` with the
43
+ id and `detail: 'full'` — look at `settings.errorWorkflow`. Empty/absent =
44
+ failures go nowhere.
45
+
46
+ **Agency-deployed workflows may already have an error handler wired** (the
47
+ bundle installs one that alerts the user). Don't replace or repoint it — it
48
+ outranks anything you'd build for that slot. Check what the existing handler
49
+ does before adding your own.
50
+
51
+ ## 3. Building a simple notify-me error workflow
52
+
53
+ Two nodes:
54
+
55
+ 1. **Error Trigger** (`n8n-nodes-base.errorTrigger`) — no parameters; it
56
+ fires when any workflow that names this one as its errorWorkflow fails.
57
+ Its output includes the failed workflow's name/id, the execution id and
58
+ URL, and the error message + node.
59
+ 2. **Send Email** (reuse their existing email credential from the inventory)
60
+ — to the USER's address, subject like
61
+ `[Automation failed] {{ $json.workflow.name }}`, body with the error
62
+ message, the node that failed, and the execution URL so they can open it.
63
+
64
+ Build it through the normal loop (validate → create_draft → approval →
65
+ activate), then set `settings.errorWorkflow` on each production workflow via
66
+ `update_draft`/promote. One error workflow can serve every workflow on the
67
+ instance — build it once, point everything at it.
68
+
69
+ Test it honestly: you can't fake a failure through `awesomate_n8n_test`
70
+ without breaking something, so tell the user what will happen ("if any of
71
+ these fail, you'll get an email like this") and verify the error workflow
72
+ itself runs by executing it against a sample payload where possible.
73
+
74
+ ## 4. AI error analysis (`awesomate_n8n_findings`)
75
+
76
+ On Pro/Embedded with the "AI error analysis" privacy toggle on, Awesomate's
77
+ platform already analyzes their failures. `awesomate_n8n_findings` returns
78
+ those findings for their account — `clientSummary` (plain-language
79
+ explanation), `needsClientAction` (something only they can do, like
80
+ reconnecting a credential), and `fixReady` (a fix exists). It is read-only:
81
+ use it to explain and prioritise, not as a substitute for your own diagnosis
82
+ of the execution data. On a 403, the plan or the toggle is the reason —
83
+ `awesomate_privacy_settings` (hosting skill) tells you which; the user flips
84
+ toggles themselves at hub.awesomate.ai/settings?tab=privacy.
85
+
86
+ ## 5. What to do when you inherit a workflow with no plan
87
+
88
+ When diagnosing a failure (SKILL.md §5) on a workflow with no error plan,
89
+ say so in one line after the fix: "this workflow has no failure alert — want
90
+ me to add one so you hear about the next one from your inbox instead of from
91
+ a customer?" Once per session, not on every workflow.
@@ -9,8 +9,18 @@ instance's real inventory — never in what n8n generically supports.
9
9
  |---|---|
10
10
  | Explicit ask ("what could I automate", "give me ideas", "what else") | Run the inspect, present the tiers below |
11
11
  | Vague request, right after the first inventory pass | ONE offering sentence ("Based on what you have connected I can suggest a few automations — want that?"), then wait |
12
+ | The inventory shows something striking | ONE grounded observation, once per session, in one line — then back to the task |
12
13
  | Anything else | Never volunteer an unprompted idea dump |
13
14
 
15
+ **The one-observation rule:** never dump a list unprompted, but a single
16
+ grounded observation per session is welcome when the inventory genuinely
17
+ shows something. Examples: `awesomate_n8n_storage` shows executions heavy
18
+ with media/binary data → "you've got 4GB of generated media sitting in
19
+ executions — want a small app to browse it?" (awesomate-app-builder); a
20
+ credential for a paid SaaS whose job an n8n workflow could do → name what it
21
+ would replace. One line, grounded in a number or a name from THEIR account,
22
+ easy to decline.
23
+
14
24
  ## Data source — facts only
15
25
 
16
26
  `awesomate_n8n_inspect {what:'possibilities'}` returns facts, zero ideas.
@@ -25,6 +35,18 @@ Ideation is your job; this payload is the ground truth you build on:
25
35
  | `communityPackages` | `{packageName, installedVersion, nodeTypes}`. **null = unknown, [] = verified none — never collapse the two** |
26
36
  | `counts` | `workflows`, `activeWorkflows`, `credentials`, `datatables` (null = table absent on this n8n version) |
27
37
 
38
+ **Other legitimate inventory inputs** (same grounding standard — a real
39
+ number from their account, never a guess):
40
+
41
+ - `awesomate_n8n_storage` — heavy media/binary in executions is a signal
42
+ (a browse/archive app, a cleanup automation, a delivery workflow).
43
+ - WP media and post counts via `awesomate_run_wp_cli`
44
+ (`['media','list','--format=count']`, `['post','list','--format=count']`)
45
+ — a big library with no automation around it suggests publishing or
46
+ repurposing workflows.
47
+ - `awesomate_knowledge_sources {action:'summary'}` — content already
48
+ ingested is content an agent or workflow could answer from.
49
+
28
50
  ## Presentation — at most 8 ideas, three grounded tiers
29
51
 
30
52
  Order by concreteness. Skip a tier rather than pad it.
@@ -42,6 +64,16 @@ Order by concreteness. Skip a tier rather than pad it.
42
64
  a plan upgrade ("builds need Support Plus+"), or the FFMPEG variant
43
65
  ("media nodes are Support Plus+ only"). Never disguise tier 3 as tier 2.
44
66
 
67
+ **Say what it saves.** Every suggestion carries its money line: the hours
68
+ per week it removes ("that's the 2 hours you spend re-typing enquiries"),
69
+ the SaaS subscription it replaces ("this is what you're paying $49/mo for"),
70
+ or the missed-lead cost it prevents ("the enquiries that arrive after 6pm
71
+ currently wait overnight"). The yardstick: a credit is $100 and a
72
+ done-for-you build spends 1 credit — an idea worth suggesting should beat
73
+ that comparison obviously, and saying so is what makes the suggestion
74
+ concrete rather than a feature tour. Estimates are estimates — say "roughly"
75
+ and ground them in their numbers, never invent precision.
76
+
45
77
  ## Grounding rules (hard)
46
78
 
47
79
  - Only suggest nodes present on THIS variant. `capabilities.variant` from
@@ -0,0 +1,82 @@
1
+ # Recurring reports — the weekly business pulse
2
+
3
+ A short weekly email that tells the owner how the business machinery is
4
+ doing: what came in, what went out, what broke. Built once, then it just
5
+ arrives. This is one of the highest-value things you can offer a business
6
+ owner, because it replaces "I should check on that" with an inbox habit.
7
+
8
+ There are two versions, and they report different things. Be honest about
9
+ the boundary between them.
10
+
11
+ ## The boundary (read this before promising anything)
12
+
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`,
16
+ `awesomate_knowledge_status`). Those tools authenticate with the user's
17
+ PAT on this machine. **A workflow inside their n8n cannot call them**, and
18
+ it can't query n8n's own execution database either.
19
+ - **Business data** — leads captured, emails sent, orders processed — lives
20
+ in the data tables, apps, and services their automations already touch.
21
+ **That's what a scheduled workflow CAN report on.**
22
+
23
+ So: on-demand pulse = you, from hub metrics. Scheduled pulse = a workflow,
24
+ from business data. Offer both; never promise the scheduled one will contain
25
+ hub metrics.
26
+
27
+ ## Version 1 — on demand, assembled by you (no build needed)
28
+
29
+ When the user asks "how's everything going?" or it's report time, assemble
30
+ it live:
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.
36
+
37
+ Present it as a short plain-language summary — five lines, not a dashboard:
38
+ what ran, what it saved, what failed (and whether it's fixed), site status.
39
+ Numbers with no comparison are noise; lead with the deltas.
40
+
41
+ ## Version 2 — scheduled, built once as a workflow
42
+
43
+ The recipe:
44
+
45
+ **Schedule Trigger** (Monday 8am, THEIR timezone — ask, don't assume) →
46
+ **gather** → **format** → **Send Email** to the owner.
47
+
48
+ The gather step reads the business data their automations already produce:
49
+
50
+ - Data tables the workflows write to — new rows this week (leads captured,
51
+ form submissions, orders logged). A `Get row(s)` per table with a
52
+ created-this-week filter, or a Code node to count.
53
+ - Services they have credentials for — e.g. their CRM or store, queried
54
+ through the same nodes their workflows already use.
55
+ - Their own hosted app's API, if one exists (the app can expose a
56
+ `/api/stats` endpoint — awesomate-app-builder territory).
57
+
58
+ Format in a Code node (short HTML: 3–6 lines of "this week vs last week"),
59
+ then Send Email with their existing email credential.
60
+
61
+ Build notes:
62
+
63
+ - Follow the full build loop (validate → draft → approval → activate → test).
64
+ Test by running the workflow once manually and checking the email arrives
65
+ and the numbers match reality — a report that's wrong once is never
66
+ trusted again.
67
+ - Store last week's numbers in a small data table so the report can show
68
+ deltas ("12 leads, up from 8"). Same pattern as any remember-between-runs
69
+ need ([datatables.md](datatables.md)).
70
+ - Keep it to what their inventory actually has. A report line per data
71
+ source they own beats a template full of "N/A".
72
+ - Give the workflow an error plan ([error-handling.md](error-handling.md)) —
73
+ a silent failure in the report workflow is the report lying by omission.
74
+
75
+ ## Offering it
76
+
77
+ Offer once, in one sentence, when the moment fits (after a health sweep,
78
+ after building their first few automations): "Want a short weekly email with
79
+ your numbers — what ran, what it saved, what needs attention? I can do it on
80
+ demand now, and build the scheduled version once you like the shape."
81
+ Starting with Version 1 is the cheap way to find out what they actually want
82
+ in it before a workflow exists.