@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.
- package/dist/index.js +51 -141
- package/package.json +2 -1
- package/skill/CHANGELOG.json +43 -0
- package/skill/awesomate-app-builder/SKILL.md +13 -8
- package/skill/awesomate-app-builder/references/node-recipes.md +3 -2
- package/skill/awesomate-app-builder/references/stack-decision.md +4 -3
- package/skill/awesomate-bookings/SKILL.md +9 -6
- package/skill/awesomate-database/SKILL.md +52 -62
- package/skill/awesomate-hosting/SKILL.md +1 -1
- package/skill/awesomate-n8n/SKILL.md +165 -108
- package/skill/awesomate-n8n/evals/n8n-agent-build/graders/grader.md +2 -1
- package/skill/awesomate-n8n/references/ai-agents.md +10 -8
- package/skill/awesomate-n8n/references/datatables.md +46 -66
- package/skill/awesomate-n8n/references/error-handling.md +5 -5
- package/skill/awesomate-n8n/references/n8n-agents.md +10 -9
- package/skill/awesomate-n8n/references/onebrain.md +4 -4
- package/skill/awesomate-n8n/references/platform-notes.md +13 -13
- package/skill/awesomate-n8n/references/possibilities.md +12 -11
- package/skill/awesomate-n8n/references/testing-policy.md +51 -47
- package/skill/awesomate-n8n/references/troubleshooting.md +15 -16
- package/skill/awesomate-n8n/references/webhook-pages.md +5 -5
- package/skill/awesomate-n8n/references/wp-form-handler.md +6 -4
- package/skill/awesomate-seo/SKILL.md +15 -8
- package/skill/awesomate-seo/references/ai-discoverability.md +40 -26
- package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +0 -31
- package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +0 -1
- package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +0 -30
- package/skill/awesomate-n8n/evals/build-form-email/prompt.md +0 -1
- package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +0 -32
- package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +0 -27
- package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +0 -35
- package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +0 -27
- package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +0 -26
- package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +0 -3
- package/skill/awesomate-n8n/evals/webhook-page-build/graders/grader.md +0 -36
- package/skill/awesomate-n8n/evals/webhook-page-build/prompt.md +0 -1
- package/skill/awesomate-n8n/references/rest-fallback.md +0 -77
- 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:
|
|
134
|
-
|
|
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
|
|
147
|
-
|
|
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
|
|
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
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
|
207
|
-
`curl -A "
|
|
208
|
-
(repeat
|
|
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
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
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,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,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,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,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,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 |
|