@awesomate/hosting-mcp 0.19.1 → 0.20.0

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.
@@ -0,0 +1,121 @@
1
+ # From the user's own files to a live, answering agent
2
+
3
+ The end-to-end path when someone says "train this on my documents and put a
4
+ chat on my website". Every step below has a tool; none of it needs the hub UI
5
+ except buying an allowance pack and reading an agent's API key.
6
+
7
+ Do the steps in order. The one rule that matters: **never build on content you
8
+ have not verified is actually in there.** An agent published over a failed
9
+ ingest answers confidently from nothing.
10
+
11
+ ## 1. Agree the file list, and what it will cost
12
+
13
+ Ingest spends real money against a monthly allowance. Before uploading
14
+ anything:
15
+
16
+ - `awesomate_knowledge_status` — plan, consent, and the month-to-date usage
17
+ against the included quota. If `upgrade_required`, relay it and stop.
18
+ - List the candidate files for the user and get an explicit yes on the set.
19
+ Say roughly what it will consume: documents bill as pages (~1 page per
20
+ 100 KB), audio and video as media-hours.
21
+ - If the allowance is exhausted, a call returns `pack_required`: **nothing was
22
+ ingested and nothing was bought**. State the price (1 credit = $100) and let
23
+ them buy it in the hub. Never imply you purchased anything.
24
+
25
+ Media is far more expensive than documents. A folder of PDFs is cheap; three
26
+ hours of video is not. Say so before, not after.
27
+
28
+ ## 2. Upload, one file at a time
29
+
30
+ `awesomate_knowledge_upload { path, title? }` — a LOCAL path on their machine.
31
+ The MCP server reads the file off disk and streams it to the hub, so the file
32
+ contents never pass through the conversation and a 100 MB PDF costs no context.
33
+
34
+ - One call per file. Report progress as you go; never loop silently through
35
+ twenty files.
36
+ - 100 MB per file. Bigger media goes through the hub at Knowledge → Sources.
37
+ - A folder path is rejected on purpose — list it, agree the files, then upload.
38
+ - Public URLs and whole sitemaps stay on `awesomate_knowledge_sources`
39
+ `{action:'add'}`. Use that for their website; use upload for their disk.
40
+
41
+ ## 3. Wait for ingestion, and check it actually succeeded
42
+
43
+ `awesomate_knowledge_sources {action:'jobs'}` until the job reports
44
+ `succeeded`. Transcription of audio/video takes minutes, not seconds.
45
+
46
+ **The JOBS list is the authority on whether an upload worked — not
47
+ `failed_sources`, and not the source list.** A job that fails during document
48
+ processing never creates a source row, so `{action:'summary'}` still reports
49
+ `failed_sources: 0` and the library total is unchanged. Measured live on
50
+ 2026-09-01: an upload failed with a platform error while summary read
51
+ `total: 75, failed_sources: 0`. If you check the summary instead of the job,
52
+ a failed ingest looks exactly like one that was never attempted.
53
+
54
+ So: read the job's `status` AND its `error`, and relay the error text to the
55
+ user. Two real ones seen in the wild, both platform-side configuration rather
56
+ than anything wrong with their file:
57
+
58
+ - `new row violates row-level security policy for table "documents"` —
59
+ document/markdown ingestion is not currently permitted for that tenant.
60
+ - `transcription_not_configured: DEEPGRAM_API_KEY is not set` — audio/video
61
+ cannot be transcribed on that deployment yet.
62
+
63
+ Neither is fixable by the user or by retrying. Say plainly that the upload
64
+ reached Awesomate and failed on our side, and raise it with support
65
+ (awesomate-support skill) rather than re-uploading and spending allowance again.
66
+
67
+ Then `{action:'summary'}` for the whole-library counts once the job has
68
+ actually succeeded.
69
+
70
+ ## 4. Probe the content before building anything on it
71
+
72
+ `awesomate_knowledge_ask` with five real questions the user cares about, and
73
+ **one question you know the content cannot answer**. A base that answers the
74
+ fifth is not grounded, and that is the single most valuable thing to catch
75
+ before a customer sees it. Show the citations.
76
+
77
+ ## 5. Draft the agent
78
+
79
+ `awesomate_knowledge_agents {action:'create', goal}` — describe what the agent
80
+ is for and the platform drafts instructions, scope, tone and test questions
81
+ from the account's own content. It saves as a **private draft**; nothing is
82
+ live and nothing is lost.
83
+
84
+ Then `{action:'test', agentId, message}` — free and unmetered, and the right
85
+ way to check behaviour. Test the awkward cases: something out of scope, a
86
+ pricing question, a complaint, an ambiguous question. Confirm the refusal
87
+ wording is what the business would actually want to say.
88
+
89
+ Editing fields, policies, and API keys is hub UI only (Knowledge → Agents).
90
+
91
+ ## 6. Publish only with explicit approval
92
+
93
+ `{action:'publish', agentId}` makes it live **immediately for every key bound
94
+ to the agent**. Ask first, publish, then read the version back and confirm.
95
+
96
+ ## 7. Put it where their customers are
97
+
98
+ Two destinations. Ask which they want; do not assume.
99
+
100
+ **A chat on their existing website — via n8n.** This is usually the right
101
+ answer, and the plumbing is already provisioned. See
102
+ `references/n8n-connection.md`: the hub creates the scope credential and the
103
+ `knowledge_answer` tool. Build the workflow with the awesomate-n8n skill
104
+ (Chat Trigger or Webhook -> AI Agent with the `knowledge_answer` tool ->
105
+ Respond), test it, promote it, and give them the webhook URL to embed. Read
106
+ `awesomate-n8n/references/ai-agents.md` before designing the agent node.
107
+
108
+ **A standalone page or app — via the app builder.** When they want a hosted
109
+ "ask our docs" page rather than a widget on an existing site, use the
110
+ awesomate-app-builder skill. A Node app calls the agent server-side so the key
111
+ stays out of the browser: get the agent's API key from the hub (shown once),
112
+ store it with the awesomate-credentials secret-drop flow, and never put it in
113
+ page JavaScript. A static site cannot hold a secret — if the page must call the
114
+ agent directly, route it through their n8n webhook instead.
115
+
116
+ ## What to tell the user at the end
117
+
118
+ The library size, what it cost against their allowance, the agent's live
119
+ version, where it is reachable, and how to add more later. If anything failed
120
+ to ingest, say which files and why — a knowledge base with a silent hole is
121
+ worse than a smaller one they trust.
@@ -0,0 +1,59 @@
1
+ # Showing an image or video the knowledge base cited
2
+
3
+ A citation on its own is a title and a locator. To actually DISPLAY the asset
4
+ you need a media URL, and the rules differ depending on whether you are showing
5
+ it in chat or embedding it in something that has to keep working.
6
+
7
+ ## Getting the URL
8
+
9
+ `awesomate_knowledge_ask` citations do **not** carry media URLs — they return
10
+ `{ref, title, kind, section_path, locator, url, excerpt}`. When a citation's
11
+ `kind` is `image`, `video` or `audio` and the user wants to see it, follow up
12
+ with a search:
13
+
14
+ ```
15
+ awesomate_knowledge_search { q: "<the cited title>", kind: "image", include_media: true }
16
+ ```
17
+
18
+ `include_media: true` is what adds `url` and `poster_url` to the hits (over
19
+ REST it is `&include=media` on `/api/knowledge/explore` — easy to miss, and
20
+ without it you get titles with nothing to display). `poster_url` is the still
21
+ frame for a video; `url` is the asset itself.
22
+
23
+ Prefer `doc` filtering when you have the doc id from the citation — it resolves
24
+ the exact asset rather than the best text match for its title.
25
+
26
+ ## The constraint that decides your architecture
27
+
28
+ **These URLs are presigned and expire in minutes.** They are for showing
29
+ something to the user right now, in this conversation. They are NOT a link you
30
+ can put in a page, save in a data table, email, or hand to a customer.
31
+
32
+ So:
33
+
34
+ - **Showing it in chat, now** — fetch with `include_media` and display it.
35
+ Fine. Re-fetch if the user comes back later; do not reuse an old URL.
36
+ - **Building a page, app, or an n8n chat that displays assets** — a presigned
37
+ URL will 403 by the time a visitor loads it. Do not embed one. There is
38
+ currently **no stable, routable media URL** for knowledge assets, so the
39
+ page must resolve the asset at request time:
40
+ - the app calls `explore?include=media` server-side (holding the key
41
+ server-side, never in browser JavaScript) and returns a fresh URL per
42
+ request, or
43
+ - it proxies the bytes through the app's own route, or
44
+ - for anything long-lived, upload the asset to somewhere with a durable URL
45
+ (WordPress media via `awesomate_wp_media_import`, or the app's own static
46
+ assets) and reference THAT, using the knowledge base for the text.
47
+
48
+ Say this to the user plainly when they ask for a gallery or an image-rich page:
49
+ the knowledge base is the index, not the CDN. Getting that wrong produces a
50
+ page that looks right when built and is full of broken images an hour later.
51
+
52
+ ## Deciding quickly
53
+
54
+ | The user wants | Do |
55
+ |---|---|
56
+ | "show me that photo" | search with `include_media`, display it |
57
+ | "which images mention X" | search `kind:image`, list titles + show a few |
58
+ | a gallery page / a site section | resolve server-side per request, or re-host the assets; never embed a presigned URL |
59
+ | an n8n chat that returns images | have the workflow call the search endpoint at answer time and return fresh URLs in the reply |
@@ -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.
@@ -49,7 +49,9 @@ rebuilt (a rebuilt instance shows 0 workflows and invalidates every old key).
49
49
  5. `awesomate_n8n_executions {executionId, debug: true}` — node-level output
50
50
  data. Requires `error_content_analysis` consent:
51
51
  - `403 consent_required` → give the user the `settingsUrl` from the error
52
- 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).
53
55
  - `tooLarge: true` → payload over 15MB. Use the summary in the response;
54
56
  do NOT retry hoping for the full payload.
55
57
  6. Node behaving strangely rather than erroring → check its schema with
@@ -17,13 +17,42 @@ Be honest about limits: these are the signals that *let* you rank and be cited
17
17
 
18
18
  - **Static site or Node app** (from awesomate-app-builder) → you write the files
19
19
  directly into the project (below), commit, and deploy.
20
- - **WordPress** → drive it through WP-CLI via the awesomate-hosting skill
21
- (`wp` passthrough). Install a free SEO plugin + let it generate the sitemap
22
- rather than hand-writing files (see §WordPress).
20
+ - **WordPress** → drive it through the hosting tools via the awesomate-hosting
21
+ skill. Install a free SEO plugin + let it generate the sitemap rather than
22
+ hand-writing files (see §WordPress). **Check the plan gate first.**
23
23
  - **A shop (WooCommerce)** → same WordPress path, plus `Product` JSON-LD on
24
24
  product pages and product-data quality (real titles, descriptions, images,
25
- prices) drive it through WP-CLI like any WordPress site. This skill
26
- covers the site-level SEO around the shop.
25
+ prices). This skill covers the site-level SEO around the shop.
26
+
27
+ ### Plan gate — check before promising any WordPress change
28
+
29
+ **Every PAT-authenticated hosting WRITE is Support Plus and above**:
30
+ `awesomate_run_wp_cli`, `awesomate_wp_post`, `awesomate_wp_media_import`,
31
+ `awesomate_wp_settings`, plus `awesomate_site_create` and
32
+ `awesomate_domain_add`. On **Essentials** they all return **403
33
+ `upgrade_required`** — the server enforces it, so no retry or rewording gets
34
+ through.
35
+
36
+ This matters more here than anywhere else: **Essentials is the plan that
37
+ gets exactly one WordPress site**, so it is the most likely plan for someone
38
+ asking about SEO. Get `plan` from `awesomate_get_context` at the start and
39
+ branch honestly.
40
+
41
+ **On Essentials, assume no tool touches their WordPress at all.** Note that
42
+ `awesomate_run_wp_cli` is gated even for its READS (`option get`,
43
+ `plugin list`) — the whole route is behind the write gate, so "just reading
44
+ the options" is not a way round it. The account-level reads do work
45
+ (`awesomate_get_context`, `awesomate_list_sites`, `awesomate_list_domains`,
46
+ `awesomate_dns_check`, `awesomate_site_uptime`).
47
+
48
+ **What Essentials CAN do — which is most of the value:** audit and advise
49
+ from the outside. `curl` the pages, the sitemap, robots.txt and the rendered
50
+ HTML; combine that with what they tell you; then produce the exact changes —
51
+ the titles and descriptions to paste, the JSON-LD block, the llms.txt
52
+ content, which plugin to install and where its settings live. They apply
53
+ them in wp-admin; you verify by fetching the live page again. Say that up
54
+ front — *"I can audit the site and write every change out for you to paste
55
+ in; me making them directly needs Support Plus"* — not after a 403.
27
56
 
28
57
  ## 1. Static / Node — write these
29
58
 
@@ -50,20 +79,69 @@ affected `<head>` tags, `sitemap.xml` `<lastmod>`, and `llms.txt`.
50
79
 
51
80
  ## 2. WordPress
52
81
 
53
- Through the awesomate-hosting skill's `wp` passthrough:
54
- - Install + activate a free SEO plugin (e.g. `wp plugin install wordpress-seo
55
- --activate` for Yoast, or the user's preference). It manages titles/meta,
56
- Open Graph, and the XML sitemap.
82
+ **Find the domain, don't ask for it.** `awesomate_list_sites` and
83
+ `awesomate_list_domains` tell you what sites exist and which domain is
84
+ attached to which. Ask only when the answer is genuinely ambiguous (more
85
+ than one site, and the user hasn't said which).
86
+
87
+ **Snapshot before you change a live site.** `awesomate_snapshot_site` first,
88
+ and tell the user the `snapshotId` — the hosting skill requires this and SEO
89
+ work is exactly the kind of change that touches the whole site at once (a
90
+ plugin, a theme option, an indexing flag). `awesomate_rollback_site` is the
91
+ undo.
92
+
93
+ Then, on Support Plus and above:
94
+
95
+ - **Install + activate an SEO plugin** — `awesomate_run_wp_cli` with args
96
+ `['plugin','install','wordpress-seo','--activate']` for Yoast, or the
97
+ user's preference. Slugs only, never a URL or zip. This part works.
98
+ - **Configuring it does NOT work from here.** The wp-cli gate allows
99
+ `option update` for exactly ten core options, and `wpseo_titles` and
100
+ friends are not among them; their values are JSON full of spaces, which
101
+ the argument charset gate refuses anyway. So: you install and activate,
102
+ then hand off — *"Yoast is installed. Open Settings → Yoast SEO in
103
+ wp-admin and I'll talk you through the title template and the social
104
+ image, or give me the values and I'll write out exactly what to paste."*
105
+ Don't burn attempts discovering this at runtime.
57
106
  - Confirm the sitemap is live (`/sitemap_index.xml` or `/sitemap.xml`) and
58
- `robots.txt` references it.
59
- - Add an `llms.txt` at the site root for AI discoverability (the plugin won't).
60
- - Posts and pages can be created/updated directly via `awesomate_wp_post`
61
- (drafts first the user approves publishing). Useful for adding the content
62
- pages that back up `llms.txt` — a services overview, an FAQ, an about page —
63
- when the site is thin on machine-readable substance.
107
+ `robots.txt` references it — `curl` the live URLs.
108
+ - **Posts and pages** via `awesomate_wp_post` (drafts first the user
109
+ approves publishing). Useful for the content pages that back up
110
+ `llms.txt`a services overview, an FAQ, an about page — when the site is
111
+ thin on machine-readable substance.
112
+ - **The og:image / logo** goes in via `awesomate_wp_media_import` — one https
113
+ URL per call, returns an `attachmentId` you can reference from a post or
114
+ hand to the SEO plugin's social settings. It cannot read a local file:
115
+ the image has to be reachable on the web first.
116
+ - **Site title, tagline, timezone, search visibility** → `awesomate_wp_settings`
117
+ (§4), never wp-cli — those values contain spaces.
64
118
  - WordPress is the recommended stack precisely when SEO/organic reach matters —
65
119
  lean into it here.
66
120
 
121
+ ### Files at the site root: say what's actually possible
122
+
123
+ §1's `robots.txt` / `sitemap.xml` / `llms.txt` advice is for **static sites
124
+ and Node apps**, where you write the file into the project and deploy it.
125
+ **On WordPress there is no tool that writes a file to the site.**
126
+ `awesomate_run_wp_cli` cannot (no file verbs are allowlisted), `wp_post`
127
+ writes posts and pages, and `wp_media_import` takes an https URL. Don't
128
+ promise the file and then discover this.
129
+
130
+ On WordPress those three come from:
131
+
132
+ - **`robots.txt` and `sitemap.xml`** — the SEO plugin generates both
133
+ (WordPress serves a virtual robots.txt; Yoast and friends add the sitemap
134
+ and the reference to it). That's why installing the plugin is step one.
135
+ - **`llms.txt`** — no plugin makes one. Either the user places the file over
136
+ SSH or cPanel's File Manager (`scripts/ssh-connect.sh` in the hosting
137
+ skill, Support Plus+), or you publish the same content as a normal page
138
+ with `awesomate_wp_post` and link it — a real page is crawlable and
139
+ editable, and gets most of the benefit.
140
+
141
+ **You can always generate the content.** Write the exact `llms.txt` body,
142
+ the robots rules, the JSON-LD block, and tell them precisely where each goes
143
+ — that is the useful half, and it works on every plan.
144
+
67
145
  ## 3. Verify
68
146
  - `robots.txt` and `sitemap.xml` (or the WP sitemap) return 200 at the root.
69
147
  - Each key page has a unique title + description and valid JSON-LD (no syntax
@@ -90,17 +168,28 @@ the user asks to "check SEO", and after any content change:
90
168
  2. **Sitemap** — `/sitemap.xml` (WP: `/sitemap_index.xml`) returns 200 and
91
169
  `<lastmod>` is fresh. A months-old lastmod on a site that changed last week
92
170
  means generation is broken, not that nothing changed.
93
- 3. **robots.txt + llms.txt** — both exist, and `llms.txt` still mentions the
94
- current offerings. A stale llms.txt misdescribes the business to every AI
95
- assistant that reads it.
171
+ 3. **robots.txt + llms.txt** — both exist (on WordPress, `llms.txt` may be
172
+ the page standing in for it check whichever they have), and the content
173
+ still mentions the current offerings. A stale llms.txt misdescribes the
174
+ business to every AI assistant that reads it.
96
175
  4. **AI crawlers not blocked at the edge** —
97
176
  `curl -A "GPTBot" -s -o /dev/null -w "%{http_code}" https://DOMAIN/`
98
177
  (repeat with `ClaudeBot`) returns 200, not 403 or a challenge page.
99
178
  Where to fix each case: [references/ai-discoverability.md](references/ai-discoverability.md).
100
179
  5. **WordPress only: `blog_public` must be 1** — one checkbox ("Discourage
101
180
  search engines") silently de-indexes the whole site. Read it via
102
- `awesomate_run_wp_cli` with args `['option','get','blog_public']`; if it's
103
- 0, fix with `['option','update','blog_public','1']` (allowlisted).
181
+ `awesomate_run_wp_cli` with args `['option','get','blog_public']`. If it's
182
+ 0, fix it with **`awesomate_wp_settings {domain, searchEngineVisible:
183
+ true}`** — that path also flushes the object cache, which the wp-cli
184
+ `option update` does not, so the change actually shows on the live site
185
+ instead of sitting behind a stale cache. (A page or CDN cache may still
186
+ need its own refresh.)
187
+ 6. **"My site vanished from Google" is often not SEO at all.** Before
188
+ auditing tags, check the two things that take a site off the internet:
189
+ `awesomate_dns_check` (is the domain still pointing at the hosting?) and
190
+ `awesomate_site_uptime` (30-day availability and incidents). A domain
191
+ that stopped resolving, or a site that was down for two days, explains a
192
+ ranking drop far better than a meta description does.
104
193
 
105
194
  Report pass/fail per check, with the fix for each failure.
106
195
 
@@ -12,13 +12,21 @@ doing it. For tone, read the voice reference installed at
12
12
 
13
13
  ## 0. Orient
14
14
 
15
- On the first support question in a session, call `awesomate_whoami` so you
16
- know whose account and plan you're speaking for (`awesomate_get_context`
17
- also carries the plan). Describe what a plan or upgrade INCLUDES from
18
- `awesomate_get_plan_features`, not memory. For a live credit balance, use
19
- `awesomate_request_build`'s free preview (below)it returns the available
20
- balance without spending anything. Never quote a plan, price, or balance
21
- from memory.
15
+ On the first support question in a session, call `awesomate_get_context`
16
+ it carries the LIVE plan and limits. Use `awesomate_whoami` only to confirm
17
+ WHICH account you're connected to: it's a zero-network read of a file
18
+ written when the token was minted, so straight after an upgrade it still
19
+ reports the OLD planand "I just upgraded" is one of the commonest
20
+ support moments. Describe what a plan or upgrade INCLUDES from
21
+ `awesomate_get_plan_features`, not memory.
22
+
23
+ For a live credit balance, call `awesomate_get_limits` and read
24
+ `dimensions.workflowCredits.balance` — that works on every plan.
25
+ (`awesomate_request_build`'s free preview also reports a balance, but only
26
+ on Pro and Embedded, and it returns the reservation-aware `available` —
27
+ what's actually spendable once credits promised to builds in flight are
28
+ set aside — rather than the raw balance.) Never quote a plan, price, or
29
+ balance from memory.
22
30
 
23
31
  ## 1. FAQ first, then help docs
24
32
 
@@ -56,6 +64,15 @@ When the user wants a human, or §1 came up empty:
56
64
 
57
65
  ## 3. Done-for-you build — spending a credit
58
66
 
67
+ **Build requests are Pro and Embedded only.** Check the plan from
68
+ `awesomate_get_context` BEFORE you start this flow: on Essentials the token
69
+ has no `requests:write` scope, and on Support Plus the route re-checks
70
+ wizard access live and returns an honest `upgrade_required` 403 — either
71
+ way the user hits a wall mid-flow if you didn't say so upfront. On those
72
+ plans, say it in one line ("done-for-you builds are on Pro — here's the
73
+ link if you want it"), offer a ticket (§2) instead, and help fully with
74
+ what you can build yourself.
75
+
59
76
  Offer this when the ask exceeds what you can build from here, or the user
60
77
  would rather hand it off ("can you guys just do it?"). It submits a request
61
78
  to the Awesomate team, who scope, build, test, and deliver it.
@@ -78,20 +95,50 @@ to the Awesomate team, who scope, build, test, and deliver it.
78
95
 
79
96
  ## 4. Plans and billing — honest, never pushy
80
97
 
81
- - "What plan am I on?" / "what do I get?" → `awesomate_whoami` for the
82
- plan, `awesomate_get_plan_features` for what it includes report as facts.
98
+ - "What plan am I on?" / "what do I get?" → `awesomate_get_context` for the
99
+ live plan (never `awesomate_whoami` its plan is a cached file that goes
100
+ stale the moment they upgrade), `awesomate_get_plan_features` for what it
101
+ includes — report as facts.
83
102
  - "How much to upgrade?" / "what would X plan give me?" →
84
103
  `awesomate_get_plan_features` for what the plan includes, then point them
85
104
  at hub.awesomate.ai/billing to see the price and upgrade. Name the plan once, link, move on.
86
105
  All purchases happen
87
106
  in the BROWSER at those links — never take payment details in chat.
88
- - Credits: one currency, $100 each, spendable on a build request, an
89
- automation, or a 1:1 session. Say "credits", never "free workflows".
107
+ - Credits: one currency, $100 each, spendable on an automation or build
108
+ request and on Knowledge Base ingestion packs. Say "credits", never "free
109
+ workflows". If they ask about anything else a credit might buy, check
110
+ rather than assume — those are the spend paths that exist.
90
111
  - If a feature the user wants is on a higher plan, say so once, honestly
91
112
  ("that's on Support Plus — here's the link if you want it"), then help
92
113
  fully within what their plan allows. Never manufacture urgency.
93
114
 
94
- ## 5. Hard rules
115
+ ## 5. Things only these tools can tell you
116
+
117
+ - **`awesomate_notifications {action:'list'}` is the ONLY channel where
118
+ Awesomate pushes to the client** — knowledge quota warnings, "your quote
119
+ is ready", support-access events. Check it whenever the user asks about a
120
+ pending request, a quote, or "did anyone get back to me?". Relay unread
121
+ items in one line, then mark them read (`read` / `read_all`). It sends
122
+ nothing; it only reads their bell.
123
+ - **"How is my account doing?"** → `awesomate_dashboard_metrics` (executions
124
+ by status, error rate, time saved, 7-day trend, most recent failure) and
125
+ `awesomate_account_report` (monthly-report shaped: what's working, what
126
+ isn't, engagement, commercials). Tell the story in their words — never
127
+ paste the JSON at a business owner. A `null` section means "couldn't be
128
+ read right now", never zero.
129
+ - **A fix already prepared, waiting on a ticket.** `awesomate_n8n_findings`
130
+ lists the error analyzer's findings for this account. `fixReady: true`
131
+ means a reviewed fix exists — that is exactly when to raise a support
132
+ ticket (§2) asking to have it applied, quoting the workflow and the
133
+ finding's plain-language summary. `needsClientAction: true` means only the
134
+ user can fix it (an expired login, a third-party quota) — tell them what
135
+ to do rather than opening a ticket.
136
+ - **A 403 that mentions consent is a toggle, not a bug.** Call
137
+ `awesomate_privacy_settings` to see exactly which toggle is off, name it,
138
+ and send them to hub.awesomate.ai/n8n/settings. You cannot flip it
139
+ for them, and there is deliberately no tool that can.
140
+
141
+ ## 6. Hard rules
95
142
 
96
143
  - **Never invent policy or pricing.** If the FAQ and tools don't say it,
97
144
  say so and offer to check with the team via a ticket (§2).