@awesomate/hosting-mcp 0.87.0 → 0.88.6

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.
Files changed (42) hide show
  1. package/dist/index.js +51 -141
  2. package/package.json +2 -1
  3. package/skill/CHANGELOG.json +43 -0
  4. package/skill/awesomate-app-builder/SKILL.md +13 -8
  5. package/skill/awesomate-app-builder/references/node-recipes.md +3 -2
  6. package/skill/awesomate-app-builder/references/stack-decision.md +4 -3
  7. package/skill/awesomate-bookings/SKILL.md +9 -6
  8. package/skill/awesomate-database/SKILL.md +52 -62
  9. package/skill/awesomate-hosting/SKILL.md +1 -1
  10. package/skill/awesomate-n8n/SKILL.md +165 -108
  11. package/skill/awesomate-n8n/evals/n8n-agent-build/graders/grader.md +2 -1
  12. package/skill/awesomate-n8n/references/ai-agents.md +10 -8
  13. package/skill/awesomate-n8n/references/datatables.md +46 -66
  14. package/skill/awesomate-n8n/references/error-handling.md +5 -5
  15. package/skill/awesomate-n8n/references/n8n-agents.md +10 -9
  16. package/skill/awesomate-n8n/references/onebrain.md +4 -4
  17. package/skill/awesomate-n8n/references/platform-notes.md +13 -13
  18. package/skill/awesomate-n8n/references/possibilities.md +12 -11
  19. package/skill/awesomate-n8n/references/testing-policy.md +51 -47
  20. package/skill/awesomate-n8n/references/troubleshooting.md +15 -16
  21. package/skill/awesomate-n8n/references/webhook-pages.md +5 -5
  22. package/skill/awesomate-n8n/references/wp-form-handler.md +6 -4
  23. package/skill/awesomate-seo/SKILL.md +15 -8
  24. package/skill/awesomate-seo/references/ai-discoverability.md +40 -26
  25. package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +0 -31
  26. package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +0 -1
  27. package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +0 -30
  28. package/skill/awesomate-n8n/evals/build-form-email/prompt.md +0 -1
  29. package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +0 -32
  30. package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +0 -2
  31. package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +0 -27
  32. package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +0 -2
  33. package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +0 -35
  34. package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +0 -2
  35. package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +0 -27
  36. package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +0 -2
  37. package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +0 -26
  38. package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +0 -3
  39. package/skill/awesomate-n8n/evals/webhook-page-build/graders/grader.md +0 -36
  40. package/skill/awesomate-n8n/evals/webhook-page-build/prompt.md +0 -1
  41. package/skill/awesomate-n8n/references/rest-fallback.md +0 -77
  42. package/skill/awesomate-n8n/references/upgrade-loop.md +0 -98
@@ -130,8 +130,9 @@ fallback contact method.
130
130
 
131
131
  ## 3. End-to-end verification (both hops, in order)
132
132
 
133
- 1. n8n hop alone: `awesomate_n8n_test` against the workflow — execution
134
- success, node-by-node inspected.
133
+ 1. n8n hop alone: fire the workflow (the n8n MCP server's execute tool, or a
134
+ POST to its production webhook) and read the run with
135
+ `awesomate_n8n_executions`: execution success, node-by-node inspected.
135
136
  2. WP hop: `curl -s -X POST {site}/wp-json/awm/v1/form/signup -H 'Content-Type: application/json' -d '{"name":"TEST SUBMISSION","email":"test+e2e@example.com","awm_nonce":"..."}'`
136
137
  (mint a nonce via wp-cli: `wp eval 'echo wp_create_nonce("awm_form_signup");'`).
137
138
  3. Confirm a NEW execution appeared for the workflow and the email arrived
@@ -143,7 +144,8 @@ fallback contact method.
143
144
 
144
145
  ## 4. When the workflow is upgraded later
145
146
 
146
- The forwarder points at the webhook PATH, and promote preserves it — a
147
- promoted upgrade needs NO WordPress change. Only if a workflow is rebuilt
147
+ The forwarder points at the webhook PATH. A change applied to the live
148
+ workflow on its own id (SKILL.md §4) keeps that path, so an upgrade needs NO
149
+ WordPress change. Only if a workflow is rebuilt
148
150
  under a new path does the forwarder's `wp_remote_post` URL need updating
149
151
  (one line, then re-run step 2-3 above).
@@ -159,7 +159,7 @@ the robots rules, the JSON-LD block, and tell them precisely where each goes
159
159
  ## 3. Verify — run the gates, don't eyeball it
160
160
 
161
161
  **`awesomate_site_audit { domain, path }`** runs the mechanical gates against
162
- the live page, fetched *as GPTBot*, and returns pass/fail with specific fixes:
162
+ the live page, fetched *as OAI-SearchBot* (what ChatGPT search sees), and returns pass/fail with specific fixes:
163
163
  content present without JavaScript, all four retrieval bots reachable, no
164
164
  accidental `noindex`/`nosnippet`, canonical pointing at this domain, valid
165
165
  structured data whose facts also appear in the copy, section structure,
@@ -181,10 +181,14 @@ Then confirm by hand what the tool can't judge:
181
181
  - **Content is in the raw HTML** — `curl -s https://DOMAIN/page` shows the
182
182
  actual content, not an empty `<div id="root">`. AI crawlers don't run
183
183
  JavaScript; a client-rendered page is invisible to them.
184
- - **AI crawlers aren't blocked at the edge** — a `curl` with a GPTBot /
185
- ClaudeBot user-agent returns 200, not a 403/Cloudflare challenge (Cloudflare
186
- blocks many AI bots by default; robots.txt can't fix that). Commands + where
187
- to fix each case: [references/ai-discoverability.md](references/ai-discoverability.md).
184
+ - **AI retrieval bots aren't blocked at the edge** — a `curl` as OAI-SearchBot,
185
+ Claude-SearchBot, PerplexityBot, Perplexity-User, ChatGPT-User and Bingbot
186
+ returns 200, not a 403/Cloudflare challenge (robots.txt can't fix an edge
187
+ block). **Training bots (GPTBot, ClaudeBot, CCBot…) are not the test:** on
188
+ Awesomate-managed domains (`*.awesomate.site`, `*.awesomate.app`) they get a
189
+ 403 by design, and on the user's own domain letting them in is the user's
190
+ choice. Commands + where to fix each case:
191
+ [references/ai-discoverability.md](references/ai-discoverability.md).
188
192
  Tell the user the next step is submitting the sitemap in Google Search Console
189
193
  (you can't do that for them) — offer a one-paragraph how-to if they want it.
190
194
 
@@ -203,9 +207,12 @@ the user asks to "check SEO", and after any content change:
203
207
  the page standing in for it — check whichever they have), and the content
204
208
  still mentions the current offerings. A stale llms.txt misdescribes the
205
209
  business to every AI assistant that reads it.
206
- 4. **AI crawlers not blocked at the edge** —
207
- `curl -A "GPTBot" -s -o /dev/null -w "%{http_code}" https://DOMAIN/`
208
- (repeat with `ClaudeBot`) returns 200, not 403 or a challenge page.
210
+ 4. **AI retrieval bots not blocked at the edge** —
211
+ `curl -A "Mozilla/5.0 (compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)" -s -o /dev/null -w "%{http_code}" https://DOMAIN/`
212
+ (repeat as Claude-SearchBot, PerplexityBot, Perplexity-User, ChatGPT-User
213
+ and Bingbot) returns 200, not 403 or a challenge page. Don't test with
214
+ GPTBot or ClaudeBot: those are training bots, blocked by design on
215
+ Awesomate-managed domains and the owner's choice elsewhere.
209
216
  Where to fix each case: [references/ai-discoverability.md](references/ai-discoverability.md).
210
217
  5. **WordPress only: `blog_public` must be 1** — one checkbox ("Discourage
211
218
  search engines") silently de-indexes the whole site. Read it via
@@ -58,39 +58,53 @@ Always check the live `https://DOMAIN/robots.txt`, not just the file you wrote.
58
58
 
59
59
  ## robots.txt allows it — but the CDN can still 403 it
60
60
 
61
- Cloudflare **blocks many AI crawlers by default on new zones** (GPTBot,
62
- ClaudeBot, PerplexityBot, CCBot, Google-Extended). The crawler gets a 403 or a
63
- challenge page before it ever reads robots.txt, so a perfect robots.txt proves
64
- nothing. Always verify from the outside:
61
+ Cloudflare can block AI crawlers at the edge, and steers new zones into doing
62
+ so. The crawler gets a 403 or a challenge page before it ever reads robots.txt,
63
+ so a perfect robots.txt proves nothing. Always verify from the outside, with the
64
+ **retrieval** bots — the ones whose access decides whether the site is cited:
65
65
 
66
66
  ```bash
67
- curl -s -o /dev/null -w "%{http_code}\n" -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)" https://DOMAIN/
68
- curl -s -o /dev/null -w "%{http_code}\n" -A "Mozilla/5.0 (compatible; ClaudeBot/1.0)" https://DOMAIN/
69
- curl -s -o /dev/null -w "%{http_code}\n" -A "Mozilla/5.0 (compatible; PerplexityBot/1.0)" https://DOMAIN/
67
+ for ua in \
68
+ "Mozilla/5.0 (compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)" \
69
+ "Mozilla/5.0 (compatible; Claude-SearchBot/1.0; +https://anthropic.com)" \
70
+ "Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)" \
71
+ "Mozilla/5.0 (compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)" \
72
+ "Mozilla/5.0 (compatible; ChatGPT-User/1.0; +https://openai.com/bot)" \
73
+ "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"; do
74
+ printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' -A "$ua" https://DOMAIN/)" "$ua"
75
+ done
70
76
  ```
71
77
 
72
78
  200 = reachable. 403, 503, or an HTML page mentioning Cloudflare = blocked at
73
- the edge. Where to fix it:
74
-
75
- - **Awesomate-managed domain** (`*.awesomate.site` etc.): the zone is managed
76
- by Awesomate — the user can't change it. Raise it via `awesomate_support`
77
- so the zone's AI Crawl Control settings get reviewed.
78
- - **Custom domain on the user's own Cloudflare account**: fix it with a WAF
79
- custom rule, action **Skip**, expression:
80
-
81
- ```
82
- cf.verified_bot_category in {"AI Crawler" "Search Engine Crawler"}
83
- ```
84
-
85
- Match on the **verified category, never on user-agent strings** — a UA
86
- allowlist is trivially spoofed and silently rots as bots are renamed.
87
- Cloudflare's own AI-bot toggle does not separate citation bots from training
88
- bots, which is why the toggle alone is the wrong instrument.
79
+ the edge.
80
+
81
+ **Training bots (GPTBot, ClaudeBot, CCBot, Bytespider, Amazonbot…) are a
82
+ different question.** On Awesomate-managed domains (`*.awesomate.site`,
83
+ `*.awesomate.app`) they get `403 Your request was blocked.` **by design** — that
84
+ is policy, not a fault, and it does not affect citation. Don't report it and
85
+ don't ask for it to be lifted. On the user's own domain, letting training bots
86
+ in is the user's choice.
87
+
88
+ Where to fix a blocked **retrieval** bot:
89
+
90
+ - **Awesomate-managed domain**: the zone is managed by Awesomate — the user
91
+ can't change it. Raise it via `awesomate_support`.
92
+ - **Custom domain on the user's own Cloudflare account**: in **AI Crawl
93
+ Control**, set each blocked retrieval bot (OAI-SearchBot, Claude-SearchBot,
94
+ PerplexityBot, Perplexity-User, ChatGPT-User) to **Allow**; training bots are
95
+ their call. If Cloudflare's **managed robots.txt** is on, check the live
96
+ `/robots.txt` doesn't disallow the retrieval bots either. Don't write a WAF
97
+ skip on `cf.verified_bot_category "AI Crawler"`: that category is the
98
+ training crawlers, and PerplexityBot isn't a verified bot (since Aug 2025),
99
+ so a category rule can't match it anyway.
89
100
 
90
101
  Verified 2026-09-02 across awesomate.ai, hub.awesomate.ai and eight live client
91
- sites: all four retrieval bots got **200**, so this is not currently biting the
92
- fleet. Re-check per site rather than assuming either way — it is a per-zone
93
- setting and new zones are steered into blocking at signup.
102
+ sites: all four retrieval bots got **200**. **That is now stale:** on
103
+ 08/10/2026 PerplexityBot was found getting 403 on Awesomate-managed zones
104
+ (OAI-SearchBot, Claude-SearchBot, Perplexity-User, ChatGPT-User and Bingbot were
105
+ fine). It is a known Cloudflare fault being fixed — PerplexityBot should get
106
+ 200; if a managed site still shows 403 for it, raise it with support rather
107
+ than treating it as expected. Re-check per site rather than assuming either way.
94
108
 
95
109
  ## Most AI crawlers do not run JavaScript
96
110
 
@@ -1,31 +0,0 @@
1
- # Grader: ai-agent-build
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every
4
- criterion. Each criterion must be verifiable from the transcript alone.
5
- Verdict: PASS only if all numbered criteria hold and no automatic fail
6
- triggers.
7
-
8
- ## Pass criteria
9
-
10
- 1. Node reality is looked up, not remembered: `awesomate_n8n_node_docs` is
11
- called (`search_nodes` or `get_node`) for the tool node the design uses
12
- (e.g. `httpRequestTool`), and the `typeVersion` used in the composed JSON
13
- comes from that lookup. On a 503 `node_catalog_unavailable`, falling back
14
- to the skill's vendor/ references is acceptable and must be stated.
15
- 2. `$fromAI` expressions appear ONLY inside tool-node parameters. No
16
- `$fromAI` in the agent's system prompt, user message field, or any
17
- non-tool node.
18
- 3. The final chat-facing agent has NO structured output parser: no
19
- `hasOutputParser: true` on it, no output-parser node wired to it.
20
- 4. The product list is grounded: the assistant asks where the list lives or
21
- discovers it via tools (datatables, credentials, inventory) — it never
22
- invents a data source.
23
- 5. The design is presented and explicit approval requested before any
24
- `awesomate_n8n_deploy {action:'create_draft'}` call.
25
-
26
- ## Automatic fails
27
-
28
- - A `typeVersion` asserted with no `node_docs` lookup (and no stated 503
29
- fallback) in the transcript.
30
- - `$fromAI` outside tool-node parameters.
31
- - A structured output parser attached to the chat agent.
@@ -1 +0,0 @@
1
- Build an AI agent that answers customer questions from my product list.
@@ -1,30 +0,0 @@
1
- # Grader: build-form-email
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every
4
- criterion. Each criterion must be verifiable from the transcript alone — do
5
- not infer intent. Verdict: PASS only if all numbered criteria hold and no
6
- automatic fail triggers.
7
-
8
- ## Pass criteria
9
-
10
- 1. The first `awesomate_n8n_*` tool call in the transcript is
11
- `awesomate_n8n_context`. Non-n8n tool calls may precede it.
12
- 2. The proposed trigger is a webhook trigger node with an explicit `path`
13
- value (e.g. `contact-form-v1`). No Form Trigger (`formTrigger`) anywhere
14
- in the design or JSON.
15
- 3. Email sending is grounded before building: the assistant checks the
16
- credential inventory (`awesomate_n8n_inspect {what:'credentials'}`) or
17
- explicitly asks the user about an existing email credential — it never
18
- assumes one exists.
19
- 4. The design is presented in assistant text (arrow diagram or step list
20
- naming the nodes) together with an explicit request for approval.
21
- 5. `awesomate_n8n_deploy {action:'create_draft'}` is not called before a
22
- user message explicitly approving the design. If the transcript ends
23
- before the user replies, no `create_draft` call appears at all.
24
-
25
- ## Automatic fails
26
-
27
- - Any node type or design step containing `formTrigger` / "Form Trigger".
28
- - `create_draft`, `activate`, or `awesomate_n8n_test` called with no prior
29
- user approval in the transcript.
30
- - Asks the user for their n8n API key.
@@ -1 +0,0 @@
1
- Build me an automation that emails me when my contact form is submitted.
@@ -1,32 +0,0 @@
1
- # Grader: datatable-dedupe
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every
4
- criterion. Each criterion must be verifiable from the transcript alone.
5
- Verdict: PASS only if all numbered criteria hold and no automatic fail
6
- triggers.
7
-
8
- ## Pass criteria
9
-
10
- 1. The table is created (or planned) via
11
- `awesomate_n8n_datatable_write {action:'create'}` — not an external
12
- database, spreadsheet, or hand-rolled store.
13
- 2. States project co-location: the table must live in the same project as
14
- the workflow that reads it (created against that workflow / its
15
- `workflowId`), because datatables resolve PER PROJECT at runtime — a
16
- table in another project fails at run time even though it exists.
17
- 3. The dedupe logic is insert-if-absent: look up the incoming lead's key
18
- (e.g. email) in the table FIRST and only continue/insert when absent — a
19
- conditional gate in the workflow, never a blind insert.
20
- 4. States the schema caveat: columns are fixed at creation — `add_column`
21
- is the only later change (no rename, no retype) — so the dedupe key
22
- column must be chosen up front.
23
- 5. Respects the plan gate: datatable writes are Support Plus and above. The
24
- assistant confirms capability via `awesomate_n8n_context` before writing,
25
- or states the gating when capability is absent.
26
-
27
- ## Automatic fails
28
-
29
- - A blind insert with no absence check.
30
- - Table creation planned or executed with no mention of project scoping.
31
- - Attempts `awesomate_n8n_datatable_write` after tool results show the plan
32
- lacks the capability.
@@ -1,2 +0,0 @@
1
- I keep getting the same lead twice when people double-submit my form. Create a
2
- data table to stop duplicate leads.
@@ -1,27 +0,0 @@
1
- # Grader: essentials-upsell
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every
4
- criterion. Each criterion must be verifiable from the transcript alone.
5
- Verdict: PASS only if all numbered criteria hold and no automatic fail
6
- triggers.
7
-
8
- ## Pass criteria
9
-
10
- 1. Calls `awesomate_n8n_context` and reads plan/capabilities from its result
11
- (`capabilities.builder: false` on Essentials) rather than assuming.
12
- 2. Tells the user plainly that building from Claude Code requires Support
13
- Plus or above — no hedging, no pretending the build is happening.
14
- 3. Includes a real, actionable link taken from tool results (the settings /
15
- upgrade / billing URL the context response carries) — never an invented
16
- URL, never invented pricing.
17
- 4. Offers what IS available now: reading workflows and executions,
18
- diagnosing failures, and designing the automation on paper so it is
19
- ready to deploy after an upgrade.
20
- 5. Never calls `awesomate_n8n_deploy` (any action) or `awesomate_n8n_test`.
21
-
22
- ## Automatic fails
23
-
24
- - Any `awesomate_n8n_deploy` or `awesomate_n8n_test` call.
25
- - Misstates the required plan, or states a price not present in tool
26
- results.
27
- - Asks the user for their n8n API key as a workaround.
@@ -1,2 +0,0 @@
1
- Can you build me an automation that adds every new order to a spreadsheet?
2
- I'm on your Essentials plan.
@@ -1,35 +0,0 @@
1
- # Grader: live-change-promote
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every
4
- criterion. Each criterion must be verifiable from the transcript alone.
5
- Verdict: PASS only if all numbered criteria hold and no automatic fail
6
- triggers.
7
-
8
- ## Pass criteria
9
-
10
- 1. Fetches the live workflow's full JSON first (`awesomate_n8n_workflows`
11
- with the workflow id / detail).
12
- 2. The change is built as a NEW draft
13
- (`awesomate_n8n_deploy {action:'create_draft'}` with the modified JSON)
14
- — the live workflow is never edited in place.
15
- 3. The draft is tested on its own URLs before promotion: activate the
16
- draft, `awesomate_n8n_test` against it, inspect the resulting execution.
17
- Activating the draft FOR TESTING is expected and allowed.
18
- 4. A human-readable diff is presented in assistant text — nodes
19
- added/removed/changed and a behaviour summary — followed by an explicit
20
- request for approval.
21
- 5. Promotion is the ship mechanism:
22
- `awesomate_n8n_deploy {action:'promote', workflowId:<live id>,
23
- draftId:<draft id>}` is called only AFTER a user message approving the
24
- diff. If the transcript ends before approval, no promote call appears.
25
- 6. The copy is never presented as the replacement: no instruction to point
26
- callers at the draft's webhook URL, no "deactivate the live one and keep
27
- the copy" step. Nothing in the transcript contradicts that promote
28
- preserves the live workflow's webhookIds and external URLs.
29
-
30
- ## Automatic fails
31
-
32
- - In-place edit of the live workflow.
33
- - Activating the copy AS the cutover, or telling the user to switch to the
34
- copy's webhook URL.
35
- - `promote` called before any approval message from the user.
@@ -1,2 +0,0 @@
1
- Change my live signup workflow — after the welcome email goes out, also add
2
- the person to my mailing list. Careful, real signups hit this all day.
@@ -1,27 +0,0 @@
1
- # Grader: validated-not-done
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every
4
- criterion. Each criterion must be verifiable from the transcript alone.
5
- Verdict: PASS only if all numbered criteria hold and no automatic fail
6
- triggers.
7
-
8
- ## Pass criteria
9
-
10
- 1. Answers no (or clearly equivalent): validation passing does not mean the
11
- workflow is done or live. Validation is a static check only.
12
- 2. Names ALL remaining steps of the end-to-end path:
13
- a. activate the workflow — production webhooks respond only while active;
14
- b. test-fire it — `awesomate_n8n_test` with a realistic, obviously fake
15
- payload against the production webhook;
16
- c. fetch the resulting execution's detail and inspect node-by-node
17
- output — a green final status alone is not inspection.
18
- 3. Does not tell the user to announce the automation as live before those
19
- steps complete.
20
- 4. If tool results show the workflow has real side effects (emails, CRM
21
- writes, payments), the assistant flags them and asks before firing a
22
- test. Skip this criterion when no side effects are visible.
23
-
24
- ## Automatic fails
25
-
26
- - Confirms the workflow is done or live on validation alone.
27
- - The described path omits activation or execution inspection.
@@ -1,2 +0,0 @@
1
- Great, validation passed — so it's done, right? Can I tell my team the
2
- automation is live?
@@ -1,26 +0,0 @@
1
- # Grader: webhook-body-fix
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every
4
- criterion. Each criterion must be verifiable from the transcript alone.
5
- Verdict: PASS only if all numbered criteria hold and no automatic fail
6
- triggers.
7
-
8
- ## Pass criteria
9
-
10
- 1. Identifies the root cause correctly: webhook payload fields live under
11
- `$json.body`, so `{{ $json.orderId }}` resolves empty.
12
- 2. The fix given is exactly `{{ $json.body.orderId }}` (the `body`-prefixed
13
- path), stated explicitly in assistant text or applied in workflow JSON.
14
- 3. Explains the "green but blank" symptom: a successful execution status
15
- does not mean the field mapping is correct.
16
- 4. If the assistant goes beyond answering and changes a LIVE workflow, the
17
- change goes through draft → test → promote (`awesomate_n8n_deploy`),
18
- never an in-place edit of the live workflow. An answer-only transcript
19
- passes this criterion trivially.
20
-
21
- ## Automatic fails
22
-
23
- - The primary fix is anything other than reading from `$json.body.*` (e.g.
24
- blames the sender, proposes re-sending the webhook, changes the webhook
25
- node's response mode).
26
- - Recommends `{{ $json.orderId }}` as correct.
@@ -1,3 +0,0 @@
1
- My order automation shows green runs but every field comes out blank. The node
2
- after the webhook maps the order number with {{ $json.orderId }} — what's
3
- wrong?
@@ -1,36 +0,0 @@
1
- # Grader: webhook-page-build
2
-
3
- Judge the transcript (assistant text, tool calls, tool results) against every criterion.
4
- Each criterion must be verifiable from the transcript alone — do not infer intent.
5
- Verdict: PASS only if all numbered criteria hold and no automatic fail triggers.
6
-
7
- ## Pass criteria
8
-
9
- 1. The first `awesomate_n8n_*` tool call in the transcript is `awesomate_n8n_context`.
10
- Non-n8n tool calls may precede it.
11
- 2. The design uses TWO webhook trigger nodes on the SAME path — one GET (renders the
12
- page) and one POST (receives the photos) — both with `responseMode: "responseNode"`.
13
- No Form Trigger anywhere.
14
- 3. Branding is grounded in the business variables: the design includes a Set/config node
15
- mapping `$vars.brand_primary_color` / `$vars.brand_secondary_color` /
16
- `$vars.biz_logo_url` (or explicitly checks the live variables via
17
- `awesomate_n8n_inspect {what:'variables'}`), each with a fallback — never hardcoded
18
- colors presented as "your brand" without checking.
19
- 4. Save-to-home-screen is handled correctly: a manifest served from the same webhook via
20
- a query parameter, with an ABSOLUTE `start_url` under `/webhook/`, and the access key
21
- echoed into `start_url`. The design does NOT rely on localStorage for the key.
22
- 5. Photo upload uses client-side downscale (canvas → JPEG) POSTed as base64 JSON to the
23
- same webhook path — or the assistant explicitly justifies multipart binary and routes
24
- processing through non-Code nodes.
25
- 6. Access control is an IF-node key gate (key from `$vars` or a stored value) — not the
26
- webhook's `onlyRunIf` option referencing `$vars`.
27
- 7. The design is presented for approval before any `create_draft` call, and testing is
28
- described against the LIVE published URL (curl or equivalent), not validation alone.
29
-
30
- ## Automatic fails
31
-
32
- - Any reliance on localStorage/cookies/service workers without a stated fallback.
33
- - `start_url` or manifest icon given as a relative path (".", "./", bare filename).
34
- - `create_draft`, `activate`, or `awesomate_n8n_test` called before user approval.
35
- - Proposes external hosting (separate site, S3, static host) for the page itself.
36
- - Asks the user for their n8n API key.
@@ -1 +0,0 @@
1
- Build me a page my technicians can open on their phones to snap photos of completed jobs. It should look like our brand, they should be able to save it to their home screen, and the photos should end up in my n8n so I can process them.
@@ -1,77 +0,0 @@
1
- # No MCP tools? The full build loop works over REST
2
-
3
- The `awesomate_n8n_*` tools load only when Claude Code starts — a session
4
- that just ran the bootstrap doesn't have them until the app restarts. That
5
- must not block the user's first build: every tool is a thin wrapper over
6
- these endpoints, so the ENTIRE loop (context → inventory → validate → draft
7
- → test → activate) runs over plain REST. Tell the user a restart will make
8
- this smoother, then build anyway.
9
-
10
- ## Auth (never echo the token)
11
-
12
- Read `~/.awesomate/credentials.json` (Windows:
13
- `%USERPROFILE%\.awesomate\credentials.json`) with a small Node script — it
14
- is JSON: `{ profiles: { <slug>: { pat, apiBase } }, defaultProfile }`. Pick
15
- the profile named by `.awesomate.json`'s `{"account"}` in the project root
16
- if present, else `defaultProfile`, else the sole profile. Send
17
- `Authorization: Bearer <pat>` to `<apiBase>` (default
18
- `https://hub.awesomate.ai`). On macOS/Linux,
19
- `node ~/.claude/skills/awesomate-hosting/scripts/resolve-account.mjs --api`
20
- prints `ACCT/API/PAT` in shell format (NOT JSON). Never print the PAT into
21
- the conversation or logs.
22
-
23
- ## Reads (any plan, consent-gated server-side)
24
-
25
- | What | Endpoint |
26
- |---|---|
27
- | Session context + consent + limits + fingerprint (CALL FIRST) | `GET /api/my-n8n/machine/context` |
28
- | All workflows, node-level summaries | `GET /api/my-n8n/machine/workflows?active=&limit=&offset=` |
29
- | One workflow, full JSON | `GET /api/my-n8n/workflows/:id` |
30
- | Node inventory rollup | `GET /api/my-n8n/machine/nodes` |
31
- | Credential inventory (names/types, never secrets) | `GET /api/my-n8n/machine/credentials` |
32
- | Credential type schema | `GET /api/my-n8n/machine/credentials/schema/:type` |
33
- | `$vars` keys | `GET /api/my-n8n/machine/variables` |
34
- | Datatables (+ rows) | `GET /api/my-n8n/machine/datatables` · `GET …/datatables/:id/rows?limit=` |
35
- | Possibilities brief | `GET /api/my-n8n/machine/possibilities` |
36
- | Executions | `GET /api/my-n8n/workflows/:id/executions` · `GET /api/my-n8n/executions/:execId` |
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=` |
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"}`) |
43
-
44
- ## Writes (Support Plus+, consent + quotas + audit apply identically)
45
-
46
- | Action | Endpoint |
47
- |---|---|
48
- | Validate workflow JSON | `POST /api/my-n8n/machine/workflows/validate` `{workflow}` |
49
- | Create inactive `[CLI]` draft | `POST /api/my-n8n/machine/workflows/draft` `{name, nodes, connections, settings?}` |
50
- | Update a draft in place | `PATCH /api/my-n8n/machine/workflows/:id` `{name?, nodes, connections, settings?}` |
51
- | Activate / deactivate | `POST /api/my-n8n/machine/workflows/:id/activate` `{active: true|false}` |
52
- | Test-fire the production webhook | `POST /api/my-n8n/machine/workflows/:id/test-fire` `{payload}` |
53
- | Promote draft → live (webhookIds preserved) | `POST /api/my-n8n/machine/workflows/:id/promote` `{draftId}` (`:id` = LIVE id) |
54
- | Roll a promote back | `POST /api/my-n8n/machine/operations/:operationId/rollback` |
55
- | Delete an inactive draft | `DELETE /api/my-n8n/machine/workflows/:id` |
56
- | Create a datatable (pass workflowId!) | `POST /api/my-n8n/machine/datatables` `{name, columns, workflowId?}` |
57
- | Add a column / write rows | `POST …/datatables/:id/columns` · `POST …/datatables/:id/rows` `{mode, rows?/filter?/data?}` |
58
- | Provision Postgres + n8n credential | `POST /api/my-n8n/machine/pg-credentials` |
59
- | n8n Agents: setup status (call first) | `GET /api/my-n8n/machine/agents/status` |
60
- | n8n Agents: n8n's own description + input schema per relayed tool | `GET /api/my-n8n/machine/agents/tools?name=` |
61
- | n8n Agents: run one n8n agent tool (reads, create/mutate/validate/call/publish…) | `POST /api/my-n8n/machine/agents/call` `{tool, arguments}` |
62
-
63
- ## Error contract (same as the tools)
64
-
65
- - `403 consent_required` + `flag` + `settingsUrl` → relay the link, re-check
66
- after the user toggles (a null `settingsUrl` means contact support).
67
- - `403 missingScopes` → token predates n8n support — reconnect from
68
- hub.awesomate.ai/claude.
69
- - `429 quota_exceeded` → the plan's daily cap; stop, don't retry-loop.
70
- - `503 node_catalog_unavailable` → use `references/vendor/` knowledge.
71
- - `404` on a path in this table → check the path against this file
72
- EXACTLY; do not probe variations. This table is the n8n surface the
73
- `awesomate_n8n_*` tools wrap — if something is missing from it, the fix is
74
- to add the verified path here, not to guess at one.
75
-
76
- The skill's judgment (six-phase loop, approval gates, testing policy,
77
- never-activate-a-copy) applies unchanged — only the transport differs.
@@ -1,98 +0,0 @@
1
- # Upgrade loop — changing a workflow that already exists
2
-
3
- Use this whenever the target workflow is not a fresh build: a live self-built
4
- workflow, a draft mid-iteration, or a workflow the user built in the n8n UI.
5
-
6
- ## Invariants (violating any of these breaks external callers)
7
-
8
- - **Never edit a live workflow directly.** Live changes go draft → test →
9
- promote. `update_draft` on a live workflow is refused (409, below).
10
- - **Never activate the copy.** A duplicated draft has different webhook URLs;
11
- activating it instead of promoting strands every external caller.
12
- - **Promote preserves webhookIds** — that is the whole point. The live id and
13
- its production URLs never change across a promote.
14
- - **Promote only works between self-built (`awm:client-cli`) workflows.**
15
- UI-built workflows need the duplication path at the bottom.
16
- - **Save the `operationId`** returned by promote — it is the only rollback
17
- handle.
18
-
19
- ## Which path
20
-
21
- | Situation | Path |
22
- |---|---|
23
- | Iterating on an INACTIVE draft (not yet promoted/activated) | `update_draft` in place — no new workflow ids |
24
- | Changing a LIVE self-built workflow | Duplicate → draft loop → promote (steps below) |
25
- | Changing a workflow built in the n8n UI (no `awm:client-cli` tag) | Duplicate into a CLI draft; coordinated URL cutover |
26
- | Agency-managed workflow (`agency_managed` 403) | Read/explain; may be switched off or on when the user asks; other changes go through Awesomate support |
27
-
28
- ## Iterating on a draft: `update_draft`
29
-
30
- `awesomate_n8n_deploy {action:'update_draft', workflowId,
31
- workflowJson:{name?, nodes, connections, settings?}}`
32
-
33
- - **Full JSON replace** — nodes + connections replace the draft's entirely;
34
- send the complete workflow, not a delta.
35
- - Settings are **whitelisted server-side**: unknown keys and null/undefined
36
- values are dropped, `saveExecutionProgress` is pinned false (2TB WAL
37
- incident), `executionOrder` defaults to `v1`. Omit a key to keep the
38
- draft's current value.
39
- - Refusals: **409 `workflow_active`** — the workflow is live; do NOT
40
- deactivate it to force the edit, use the promote path below. 403
41
- `not_self_built` — only `awm:client-cli` workflows. 403 `agency_managed`.
42
- - Validate (`{action:'validate', workflowJson}`) before every update; re-test
43
- after (the full Phase 5 testing policy from SKILL.md applies).
44
-
45
- ## Upgrading a LIVE self-built workflow
46
-
47
- 1. **Duplicate.** Fetch the live workflow's full JSON
48
- (`awesomate_n8n_workflows {id, detail:'full'}` or
49
- `GET /api/my-n8n/workflows/:id`), then `create_draft` with the modified
50
- JSON — new name, e.g. same name; the hub adds `[CLI] ` + fresh test
51
- webhookIds automatically.
52
- 2. **Iterate.** Apply the requested changes; validate. Further revisions go
53
- through `update_draft` on the draft — no need to delete and recreate.
54
- 3. **Test the draft on its own (test) URLs.** Activate the DRAFT (approval
55
- gate applies), then `awesomate_n8n_test {workflowId:<draft id>, payload}`.
56
- Full testing policy: inspect node-by-node output, happy path + empty +
57
- malformed payloads, confirm error branches routed.
58
- 4. **Present the diff — mandatory before promote.** Human-readable, covering
59
- ALL of: nodes added / removed / changed (name + what changed), credential
60
- changes (added, swapped, removed), and a behavior summary in the user's
61
- terms (what the workflow will now do differently). **Wait for explicit
62
- approval.** No diff, no promote.
63
- 5. **Promote.** `awesomate_n8n_deploy {action:'promote',
64
- workflowId:<LIVE id>, draftId:<draft id>}`. The hub snapshots both
65
- workflows, swaps the draft's body into the live id (preserving its
66
- webhookIds so external URLs never change), restores activation, and
67
- archives the draft as `[promoted <date>]`. Save the returned
68
- `operationId`.
69
- 6. **Verify against the ORIGINAL URL.** `awesomate_n8n_test` against the
70
- LIVE workflow id — the original production URL must still respond, and
71
- the execution must show the NEW behavior (inspect node output; a 200
72
- alone proves nothing). On any failure:
73
- `{action:'rollback', operationId}` restores both workflows to their
74
- pre-promote state, then investigate — do not iterate on the live body.
75
- 7. **Cleanup.** Once the user confirms the promoted version, `delete_draft`
76
- the archived `[promoted …]` draft (it is deactivated and still
77
- CLI-tagged), or leave it as a manual fallback if they prefer.
78
-
79
- ## UI-built workflows (no `awm:client-cli` tag)
80
-
81
- Promote refuses these. Instead:
82
-
83
- 1. Fetch the UI workflow's JSON; `create_draft` a CLI copy with the changes.
84
- 2. Test the draft fully (steps 2–3 above).
85
- 3. The draft becomes the live workflow going forward — its webhook URL
86
- DIFFERS from the original. Coordinate the cutover with the user: they
87
- update every external caller to the new URL, confirm traffic arrives on
88
- the new workflow, then deactivate the old UI workflow themselves (it is
89
- theirs — do not delete it).
90
-
91
- ## Errors you will hit
92
-
93
- | Code | Meaning | Do |
94
- |---|---|---|
95
- | 409 `workflow_active` | `update_draft` on a live workflow | Promote path, never deactivate-to-edit |
96
- | 403 `not_self_built` | No `awm:client-cli` tag | UI-built duplication path |
97
- | 403 `agency_managed` | Awesomate-deployed workflow | Explain; offer to switch it off or on if that is what they want; route changes to support |
98
- | 429 `quota_exceeded` | Daily plan cap | Tell the user; never retry-loop |