anymorph 0.2.6 → 0.4.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.
- package/README.md +50 -36
- package/dist/index.js +9184 -251
- package/dist/skillpacks/geo/scaffold/AGENTS.md +38 -0
- package/dist/skillpacks/geo/scaffold/CLAUDE.md +33 -0
- package/dist/skillpacks/geo/shared/evidence-principles.md +35 -0
- package/dist/skillpacks/geo/shared/geo-principles.md +281 -0
- package/dist/skillpacks/geo/shared/vertical-playbooks/beauty.md +65 -0
- package/dist/skillpacks/geo/shared/vertical-playbooks/commerce.md +65 -0
- package/dist/skillpacks/geo/shared/vertical-playbooks/ota.md +62 -0
- package/dist/skillpacks/geo/shared/vertical-playbooks/saas.md +64 -0
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/SKILL.md +1 -1
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/diagnosis-contract.md +8 -9
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/workflow.md +11 -8
- package/dist/skillpacks/geo/skills/geo-generating-actions/SKILL.md +110 -22
- package/dist/skillpacks/geo/skills/geo-generating-actions/references/orchestrator.workflow.md +171 -5
- package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo-scaffold.mjs +358 -0
- package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo.mjs +66 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/foundation-diagnosis.md +1 -1
- package/dist/skillpacks/geo/skills/geo-local-setup/SKILL.md +66 -0
- package/dist/skillpacks/geo/skills/geo-local-setup/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/geo-page-writer/SKILL.md +81 -0
- package/dist/skillpacks/geo/skills/geo-page-writer/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/geo-page-writer/references/research.md +61 -0
- package/dist/skillpacks/geo/skills/geo-page-writer/references/validation.md +59 -0
- package/dist/skillpacks/geo/skills/geo-page-writer/references/writing.md +55 -0
- package/dist/skillpacks/geo/skills/geo-page-writer/scripts/check-page-mdx.mjs +210 -0
- package/dist/skillpacks/geo/skills/geo-page-writer/scripts/collect-page-sources.mjs +303 -0
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/SKILL.md +1 -1
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/diagnosis-contract.md +36 -17
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/workflow.md +65 -15
- package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/SKILL.md +82 -0
- package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/agents/openai.yaml +5 -0
- package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/references/ecommerce-rules.md +31 -0
- package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/SKILL.md +57 -0
- package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/agents/openai.yaml +5 -0
- package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/references/link-rules.md +28 -0
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/SKILL.md +141 -0
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/agents/openai.yaml +5 -0
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/references/action-contract.md +62 -0
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/scripts/seo-toolkit.mjs +248 -0
- package/dist/skillpacks/geo/skills/seo-page-diagnosis/SKILL.md +56 -0
- package/dist/skillpacks/geo/skills/seo-page-diagnosis/agents/openai.yaml +5 -0
- package/dist/skillpacks/geo/skills/seo-page-diagnosis/references/page-checks.md +38 -0
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/SKILL.md +66 -0
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/agents/openai.yaml +5 -0
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/page-type-taxonomy.md +40 -0
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/serp-methodology.md +38 -0
- package/dist/skillpacks/geo/skills/seo-technical-diagnosis/SKILL.md +64 -0
- package/dist/skillpacks/geo/skills/seo-technical-diagnosis/agents/openai.yaml +5 -0
- package/dist/skillpacks/geo/skills/seo-technical-diagnosis/references/checks.md +58 -0
- package/dist/skillpacks/geo/skills/third-party-diagnosis/SKILL.md +1 -1
- package/dist/skillpacks/geo/skills/third-party-diagnosis/references/diagnosis-contract.md +2 -2
- package/dist/skillpacks/geo/skills/third-party-diagnosis/references/workflow.md +1 -1
- package/dist/skillpacks/geo/skills/third-party-execution-planning/SKILL.md +64 -0
- package/dist/skillpacks/geo/skills/third-party-execution-planning/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/third-party-execution-planning/references/execution-contract.md +90 -0
- package/dist/skillpacks/geo/skills/third-party-execution-planning/references/non-social-surface-playbooks.md +123 -0
- package/package.json +2 -1
- package/dist/skillpacks/geo/skills/social-execution-planning/SKILL.md +0 -53
- package/dist/skillpacks/geo/skills/social-execution-planning/agents/openai.yaml +0 -5
- package/dist/skillpacks/geo/skills/social-execution-planning/references/execution-contract.md +0 -68
- /package/dist/skillpacks/geo/skills/{social-execution-planning → third-party-execution-planning}/references/reddit-rules.md +0 -0
- /package/dist/skillpacks/geo/skills/{social-execution-planning/references/platform-playbooks.md → third-party-execution-planning/references/social-platform-playbooks.md} +0 -0
|
@@ -19,18 +19,35 @@ Do not choose final production routes. The page generation executor owns route c
|
|
|
19
19
|
- brand is mentioned but not recommended
|
|
20
20
|
- low visibility and no page exists
|
|
21
21
|
|
|
22
|
+
## Freshness And Indexing Guard
|
|
23
|
+
|
|
24
|
+
Do not treat a newly generated page as weak just because it has no traffic,
|
|
25
|
+
GSC impressions, or AI citations yet. If a generated page was published less
|
|
26
|
+
than 7 days ago, return `no_action` / monitor unless there is a concrete
|
|
27
|
+
non-performance defect such as wrong intent, crawl/indexation blocker,
|
|
28
|
+
duplicate/cannibalization, missing brand/entity clarity, or factual/product
|
|
29
|
+
claim error.
|
|
30
|
+
|
|
31
|
+
If a generated page is not indexed after 7 days, flag this in the diagnosis.
|
|
32
|
+
Use `technical_issue` when indexation, crawlability, canonical, sitemap,
|
|
33
|
+
robots, noindex, render, or status-code evidence identifies a blocker. Use
|
|
34
|
+
`insufficient_evidence` when indexation state is unknown but the page still has
|
|
35
|
+
no measurable crawl, GSC, or visibility signal. Do not turn this into a content
|
|
36
|
+
update by default.
|
|
37
|
+
|
|
22
38
|
## Evidence Order
|
|
23
39
|
|
|
24
40
|
Use the cheapest sufficient evidence.
|
|
25
41
|
|
|
26
42
|
1. Common run context and routed candidates.
|
|
27
|
-
2. `
|
|
43
|
+
2. `list_geo_page_candidates` for the first generated-page or no-page candidate slice.
|
|
28
44
|
3. `get_geo_intent_diagnostic` for one intent before deeper checks.
|
|
29
|
-
4. For commerce workspaces and
|
|
30
|
-
5. `get_page_insights`, `get_page_visibility`, or `list_ai_responses`
|
|
31
|
-
6.
|
|
32
|
-
7. `
|
|
33
|
-
8. `
|
|
45
|
+
4. For commerce workspaces and hub/spoke create candidates, `get_intent_products` to verify catalog fit and product ids.
|
|
46
|
+
5. `get_page_insights` default compact mode for page decision evidence; use `mode: "full"`, `get_page_visibility`, or `list_ai_responses` only when raw prompt/answer evidence changes the recommendation.
|
|
47
|
+
6. Page age and indexation evidence before diagnosing low performance on existing generated pages.
|
|
48
|
+
7. `get_page_content` for generated page body or technical diagnosis.
|
|
49
|
+
8. `web_scrape` only for a specific cited/recommended competitor URL.
|
|
50
|
+
9. `serp_snapshot` or `dataforseo_research` only when the evidence depends on external search demand or SERP shape.
|
|
34
51
|
|
|
35
52
|
## Root Cause Buckets
|
|
36
53
|
|
|
@@ -56,13 +73,11 @@ Use `authority_gap` only when external citation evidence or recommendation reaso
|
|
|
56
73
|
|
|
57
74
|
Allowed families:
|
|
58
75
|
|
|
59
|
-
- `
|
|
60
|
-
- `
|
|
61
|
-
- `
|
|
62
|
-
- `
|
|
63
|
-
- `
|
|
64
|
-
- `expand_adjacent_intent`
|
|
65
|
-
- `fix_technical_issue`
|
|
76
|
+
- `create_hub_page`
|
|
77
|
+
- `create_spoke_page`
|
|
78
|
+
- `update_existing_page`
|
|
79
|
+
- `replace_existing_page`
|
|
80
|
+
- `remove_or_merge_page`
|
|
66
81
|
- `no_action`
|
|
67
82
|
|
|
68
83
|
## Output
|
|
@@ -73,7 +88,9 @@ Do not write intermediate diagnosis JSON files directly.
|
|
|
73
88
|
|
|
74
89
|
Do not include `workspaceId`, `runId`, `channel`, final action id, final URL, or final `assetType`; the orchestrator and executor derive them.
|
|
75
90
|
|
|
76
|
-
For commerce workspaces,
|
|
91
|
+
For commerce workspaces, `create_hub_page` and `create_spoke_page` proposals must include product evidence from `get_intent_products` when catalog fit is fit or weak-fit. Put the selected product ids in `target.targetProductIds`. If catalog fit is no-fit, reject the create action or propose a non-product informational direction.
|
|
92
|
+
|
|
93
|
+
For create proposals, put `target.pageRole: "HUB"` on `create_hub_page` and `target.pageRole: "SPOKE"` on `create_spoke_page`.
|
|
77
94
|
|
|
78
95
|
Use this shape:
|
|
79
96
|
|
|
@@ -84,11 +101,11 @@ Use this shape:
|
|
|
84
101
|
{
|
|
85
102
|
"intentId": "intent_123",
|
|
86
103
|
"candidateType": "low_visibility_no_page",
|
|
87
|
-
"target": { "suggestedSlug": "optional-non-binding-hint", "targetProductIds": ["optional-commerce-product-id"] },
|
|
104
|
+
"target": { "suggestedSlug": "optional-non-binding-hint", "pageRole": "HUB", "targetProductIds": ["optional-commerce-product-id"] },
|
|
88
105
|
"rootCauses": [
|
|
89
106
|
{ "bucket": "intent_coverage_gap", "confidence": 0.81, "evidence": ["No page covers the weak intent."] }
|
|
90
107
|
],
|
|
91
|
-
"actionFamily": "
|
|
108
|
+
"actionFamily": "create_hub_page",
|
|
92
109
|
"operations": ["Generate a CMS-backed GEO page for the intent"],
|
|
93
110
|
"priority": "high",
|
|
94
111
|
"confidence": "high",
|
|
@@ -100,7 +117,9 @@ Use this shape:
|
|
|
100
117
|
}
|
|
101
118
|
],
|
|
102
119
|
"rejected": [
|
|
103
|
-
{ "ref": "page_456", "reason": "Existing page is healthy." }
|
|
120
|
+
{ "ref": "page_456", "reason": "Existing page is healthy." },
|
|
121
|
+
{ "ref": "page_789", "reason": "Generated page was published less than 7 days ago; monitor until the minimum observation window has passed." },
|
|
122
|
+
{ "ref": "page_999", "reason": "Generated page is not indexed after 7 days; flag indexation analysis before recommending content changes." }
|
|
104
123
|
]
|
|
105
124
|
}
|
|
106
125
|
```
|
|
@@ -30,6 +30,9 @@ It works on pages where:
|
|
|
30
30
|
- `geo_page_intent_visibility_gaps`
|
|
31
31
|
- `geo_page_performance`
|
|
32
32
|
- `geo_strategy_actions_recent`
|
|
33
|
+
- page age and indexation signals when present:
|
|
34
|
+
- `createdAt`, `generatedAt`, `deployedAt`, `publishedAt`, or equivalent page timestamp
|
|
35
|
+
- indexation state, indexed URL inspection state, GSC impressions/clicks, crawler logs, or sitemap/canonical errors
|
|
33
36
|
- generated page scrape when needed
|
|
34
37
|
- representative prompts
|
|
35
38
|
- AI answer samples
|
|
@@ -50,11 +53,32 @@ Drop candidates when:
|
|
|
50
53
|
- recent action mask suppresses the same action
|
|
51
54
|
- tenant strategy forbids generated pages for that intent class
|
|
52
55
|
- evidence is too thin
|
|
56
|
+
- the only negative evidence is missing performance data for a fresh generated page still inside the minimum observation window
|
|
53
57
|
|
|
54
58
|
### 2. Classify Candidate Case
|
|
55
59
|
|
|
56
60
|
Assign one primary case.
|
|
57
61
|
|
|
62
|
+
### Freshness and Indexing Guard
|
|
63
|
+
|
|
64
|
+
Before using Case A for an existing generated page, check page age and indexation state.
|
|
65
|
+
|
|
66
|
+
Use a minimum observation window of 7 days after the page was first generated, deployed, or published. If the generated page was published less than 7 days ago, default to `no_action` / monitor unless there is a concrete non-performance defect:
|
|
67
|
+
|
|
68
|
+
- wrong intent or prompt mismatch
|
|
69
|
+
- broken route, bad canonical, blocked crawl, noindex, sitemap omission, or render failure
|
|
70
|
+
- duplicate/cannibalizing page
|
|
71
|
+
- missing brand/entity clarity visible in the page content
|
|
72
|
+
- factual, compliance, or product-claim defect
|
|
73
|
+
|
|
74
|
+
For fresh pages, do not use low visibility, zero traffic, zero GSC impressions, or zero AI citations alone as evidence for `update_existing_page`, `replace_existing_page`, or `remove_or_merge_page`. Record the page in `rejected` or `noActionRationale` with a monitor note and the next evaluation date when possible.
|
|
75
|
+
|
|
76
|
+
If a generated page is not indexed after 7 days, flag this in the analysis. Treat it as a possible `technical_issue` or `insufficient_evidence` finding depending on the evidence:
|
|
77
|
+
|
|
78
|
+
- Use `technical_issue` when there is an indexation, crawlability, canonical, sitemap, robots, noindex, render, or status-code signal.
|
|
79
|
+
- Use `insufficient_evidence` when indexation status is unknown but there are still no GSC impressions, crawler hits, or external visibility signals after the 7-day window.
|
|
80
|
+
- Prefer a diagnostic note or SEO technical follow-up over a content update unless the page content itself is also defective.
|
|
81
|
+
|
|
58
82
|
#### A. Generated Page Exists But Visibility Is Low
|
|
59
83
|
|
|
60
84
|
Use when:
|
|
@@ -62,6 +86,7 @@ Use when:
|
|
|
62
86
|
- `geo_page_count > 0`
|
|
63
87
|
- `current_visibility` is low
|
|
64
88
|
- quadrant is mostly `absent`, `cited_unnamed`, or `mentioned_not_recommended`
|
|
89
|
+
- the page is outside the freshness guard, or there is a concrete non-performance defect
|
|
65
90
|
|
|
66
91
|
Diagnosis questions:
|
|
67
92
|
|
|
@@ -120,6 +145,7 @@ Default evidence:
|
|
|
120
145
|
- representative prompts
|
|
121
146
|
- quadrant rates
|
|
122
147
|
- page performance summary
|
|
148
|
+
- page age and indexation status
|
|
123
149
|
- AI answer excerpts
|
|
124
150
|
|
|
125
151
|
Fetch generated page scrape when:
|
|
@@ -157,22 +183,23 @@ Use `authority_gap` only when external citation evidence or recommendation reaso
|
|
|
157
183
|
|
|
158
184
|
Allowed action families:
|
|
159
185
|
|
|
160
|
-
- `
|
|
161
|
-
- `
|
|
162
|
-
- `
|
|
163
|
-
- `
|
|
164
|
-
- `
|
|
165
|
-
- `expand_adjacent_intent`
|
|
166
|
-
- `fix_technical_issue`
|
|
186
|
+
- `create_hub_page`
|
|
187
|
+
- `create_spoke_page`
|
|
188
|
+
- `update_existing_page`
|
|
189
|
+
- `replace_existing_page`
|
|
190
|
+
- `remove_or_merge_page`
|
|
167
191
|
- `no_action`
|
|
168
192
|
|
|
169
193
|
Routing defaults:
|
|
170
194
|
|
|
171
|
-
-
|
|
172
|
-
-
|
|
173
|
-
- Existing page
|
|
174
|
-
- Existing page
|
|
175
|
-
-
|
|
195
|
+
- Broad uncovered intent that should anchor related questions -> `create_hub_page`
|
|
196
|
+
- Narrow uncovered or non-overlapping long-tail intent under an existing hub -> `create_spoke_page`
|
|
197
|
+
- Existing page has the right role and intent but needs content, proof, comparison, research, or technical improvement -> `update_existing_page`
|
|
198
|
+
- Existing page slot should remain but the angle/brief is fundamentally wrong -> `replace_existing_page`
|
|
199
|
+
- Existing page should not remain independent because it is duplicate, overlapping, or should consolidate into a stronger page -> `remove_or_merge_page`
|
|
200
|
+
- Healthy page or weak evidence -> `no_action`
|
|
201
|
+
- Fresh generated page with no concrete defect -> `no_action` until the minimum observation window has passed
|
|
202
|
+
- Page not indexed after 7 days -> flag the indexation issue in analysis; route to `no_action` or a technical follow-up unless there is enough evidence for a concrete fix
|
|
176
203
|
|
|
177
204
|
### 6. Output
|
|
178
205
|
|
|
@@ -186,11 +213,13 @@ Return a compact diagnosis for each accepted action:
|
|
|
186
213
|
- concrete operations
|
|
187
214
|
- evidence references
|
|
188
215
|
- why other actions were rejected
|
|
216
|
+
- freshness/indexation rationale for monitored fresh pages or pages not indexed after 7 days
|
|
189
217
|
|
|
190
218
|
For create actions:
|
|
191
219
|
|
|
192
220
|
- do not invent final URL
|
|
193
221
|
- optional `target.suggestedSlug` is non-binding only
|
|
222
|
+
- include `target.pageRole` as `HUB` for `create_hub_page` and `SPOKE` for `create_spoke_page`
|
|
194
223
|
|
|
195
224
|
## Examples
|
|
196
225
|
|
|
@@ -199,15 +228,32 @@ For create actions:
|
|
|
199
228
|
If a generated page exists but competitors win because their cited pages contain stronger comparison criteria:
|
|
200
229
|
|
|
201
230
|
- root cause: `comparison_gap`
|
|
202
|
-
- action family: `
|
|
231
|
+
- action family: `update_existing_page`
|
|
203
232
|
- operation: add comparison criteria, direct recommendation framing, and proof points
|
|
204
233
|
|
|
234
|
+
### Existing Generated Page Is Fresh
|
|
235
|
+
|
|
236
|
+
If a generated page was published less than 7 days ago and the only weak signals are zero traffic, zero GSC impressions, or zero AI citations:
|
|
237
|
+
|
|
238
|
+
- root cause: `insufficient_evidence`
|
|
239
|
+
- action family: `no_action`
|
|
240
|
+
- operation: monitor until the minimum observation window has passed
|
|
241
|
+
|
|
242
|
+
### Existing Generated Page Is Not Indexed After 7 Days
|
|
243
|
+
|
|
244
|
+
If a generated page is not indexed after 7 days:
|
|
245
|
+
|
|
246
|
+
- root cause: `technical_issue` when crawl/indexation evidence identifies a blocker
|
|
247
|
+
- root cause: `insufficient_evidence` when indexation status is unknown
|
|
248
|
+
- action family: `no_action` or technical follow-up, not a content update by default
|
|
249
|
+
- operation: flag the indexation issue in the analysis and recommend checking sitemap, canonical, robots, noindex, status code, and rendered HTML
|
|
250
|
+
|
|
205
251
|
### No Page Exists
|
|
206
252
|
|
|
207
253
|
If no discovered or generated page covers a weak intent:
|
|
208
254
|
|
|
209
255
|
- root cause: `intent_coverage_gap`
|
|
210
|
-
- action family: `
|
|
256
|
+
- action family: `create_hub_page`
|
|
211
257
|
- operation: generate a CMS-backed GEO page for the intent
|
|
212
258
|
|
|
213
259
|
## Guardrails
|
|
@@ -215,5 +261,9 @@ If no discovered or generated page covers a weak intent:
|
|
|
215
261
|
- Use CMS-backed generation only.
|
|
216
262
|
- Do not use legacy Astro paths.
|
|
217
263
|
- Do not duplicate a discovered page that clearly owns the intent.
|
|
218
|
-
- Do not
|
|
264
|
+
- Do not replace a page when a targeted update is sufficient.
|
|
265
|
+
- Do not create a spoke page unless the differentiation from the hub or existing page is explicit.
|
|
219
266
|
- Do not diagnose authority from low visibility alone.
|
|
267
|
+
- Do not diagnose a fresh generated page as underperforming from missing performance data alone.
|
|
268
|
+
- Do not recommend generated-page content updates for pages published less than 7 days ago unless a concrete non-performance defect is present.
|
|
269
|
+
- Do flag pages that are not indexed after 7 days, but separate indexation analysis from content-quality analysis.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo-ecommerce-opportunity
|
|
3
|
+
description: Use when diagnosing ecommerce SEO opportunities for product, category, collection, shopping-intent SERPs, Product schema, offers, reviews, availability, shipping, return policy, or merchant page actions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SEO Ecommerce Opportunity
|
|
7
|
+
|
|
8
|
+
Use this skill only when ecommerce signals exist. It adapts `claude-seo`
|
|
9
|
+
ecommerce, schema, product, and competitor-page patterns to Anymorph action
|
|
10
|
+
generation.
|
|
11
|
+
|
|
12
|
+
## Activation
|
|
13
|
+
|
|
14
|
+
Activate when any of these are true:
|
|
15
|
+
|
|
16
|
+
- product catalog exists.
|
|
17
|
+
- URLs contain product, collection, category, cart, checkout, shop, or pricing
|
|
18
|
+
product patterns.
|
|
19
|
+
- Product or Offer schema exists or should exist.
|
|
20
|
+
- DFS SERP shows shopping/product/category/listicle intent.
|
|
21
|
+
- workspace business type is ecommerce or commerce-enabled.
|
|
22
|
+
|
|
23
|
+
## Artifact
|
|
24
|
+
|
|
25
|
+
Write outputs under:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
agent/seo/seo-ecommerce-opportunity/{runId}/
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## References
|
|
32
|
+
|
|
33
|
+
- `references/ecommerce-rules.md` for product/category/schema rules.
|
|
34
|
+
- `../seo-opportunity-audit/references/action-contract.md` for output shape.
|
|
35
|
+
- `../../shared/evidence-principles.md` for claim strength, source hierarchy,
|
|
36
|
+
freshness, structured-data, and GEO/AEO framing rules.
|
|
37
|
+
- `../../shared/vertical-playbooks/commerce.md` for general commerce patterns.
|
|
38
|
+
- `../../shared/vertical-playbooks/beauty.md` instead of, or in addition to,
|
|
39
|
+
`commerce.md` when the catalog is beauty, skincare, makeup, haircare, or
|
|
40
|
+
personal care. Beauty rules take precedence for cosmetic, ingredient,
|
|
41
|
+
review/UGC, and regulated-claim safety.
|
|
42
|
+
|
|
43
|
+
Read only the matching vertical playbook(s). Treat vertical playbooks as
|
|
44
|
+
heuristics for diagnosis and action selection, not as evidence for claims.
|
|
45
|
+
|
|
46
|
+
## Workflow
|
|
47
|
+
|
|
48
|
+
1. Read product catalog, intent-product mappings, CMS/GEO pages, and product URLs.
|
|
49
|
+
2. Load `../../shared/evidence-principles.md` and the matching commerce/beauty
|
|
50
|
+
playbook when product, category, review, schema, or shopping-surface findings
|
|
51
|
+
are in scope.
|
|
52
|
+
3. Inspect product and category pages for title/meta, product description,
|
|
53
|
+
schema, offers, price, availability, reviews, shipping, return policy, images,
|
|
54
|
+
and FAQ-like buyer objections.
|
|
55
|
+
4. Use DFS through the toolkit for shopping/product/listicle SERP evidence.
|
|
56
|
+
5. Detect opportunities:
|
|
57
|
+
- product schema gap.
|
|
58
|
+
- offer/availability gap.
|
|
59
|
+
- review or aggregate rating evidence gap.
|
|
60
|
+
- merchant policy gap.
|
|
61
|
+
- category page gap.
|
|
62
|
+
- product comparison/buying guide gap.
|
|
63
|
+
- image/product rich result gap.
|
|
64
|
+
6. Map actions to product-linked GEO page creation, CMS updates, schema fixes,
|
|
65
|
+
or third-party/manual tasks.
|
|
66
|
+
|
|
67
|
+
## Output Files
|
|
68
|
+
|
|
69
|
+
- `products.json`
|
|
70
|
+
- `findings.json`
|
|
71
|
+
- `opportunities.json`
|
|
72
|
+
- `actions.json`
|
|
73
|
+
- `rationale.md`
|
|
74
|
+
|
|
75
|
+
## Guardrails
|
|
76
|
+
|
|
77
|
+
- Do not invent prices, availability, reviews, ratings, shipping, or return
|
|
78
|
+
policy details.
|
|
79
|
+
- Do not recommend review markup unless review evidence is first-party and
|
|
80
|
+
policy-safe.
|
|
81
|
+
- Product-linked page actions must include product ids when available.
|
|
82
|
+
- Comparison pages need factual, source-backed claims and a last-updated date.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "SEO Ecommerce Opportunity"
|
|
3
|
+
short_description: "Find ecommerce SEO, product schema, and shopping-intent opportunities."
|
|
4
|
+
default_prompt: "Use $seo-ecommerce-opportunity to diagnose product, category, schema, offer, review, and shopping SERP opportunities."
|
|
5
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Ecommerce Rules
|
|
2
|
+
|
|
3
|
+
## Product Pages
|
|
4
|
+
|
|
5
|
+
- Product title and description should be specific and useful.
|
|
6
|
+
- Product schema should include verifiable Product identity.
|
|
7
|
+
- Offer data must match visible page data.
|
|
8
|
+
- Price, availability, currency, shipping, and return policy must not be invented.
|
|
9
|
+
- Product images should have descriptive alt text and stable dimensions.
|
|
10
|
+
|
|
11
|
+
## Category and Collection Pages
|
|
12
|
+
|
|
13
|
+
- category title and intro explain who the collection is for.
|
|
14
|
+
- include comparison criteria, buying guidance, and links to key products.
|
|
15
|
+
- avoid thin grids with no explanatory content.
|
|
16
|
+
- add internal links from relevant guide/comparison pages.
|
|
17
|
+
|
|
18
|
+
## Reviews and Ratings
|
|
19
|
+
|
|
20
|
+
- only use review/aggregateRating when evidence exists.
|
|
21
|
+
- do not generate fake or extrapolated ratings.
|
|
22
|
+
- flag missing review collection motion as third-party/manual when appropriate.
|
|
23
|
+
|
|
24
|
+
## Shopping SERP Opportunities
|
|
25
|
+
|
|
26
|
+
- `best_of`, `comparison`, `alternatives`, and buying guide SERPs can justify new
|
|
27
|
+
GEO/CMS pages when product fit is clear.
|
|
28
|
+
- product/category SERPs can justify category improvement rather than blog posts.
|
|
29
|
+
- marketplace-dominated SERPs may require third-party execution, not owned-page
|
|
30
|
+
creation.
|
|
31
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo-internal-link-opportunity
|
|
3
|
+
description: Use when finding internal link opportunities, orphan pages, hub-and-spoke gaps, anchor text improvements, CMS/GEO page graph issues, or auto-applicable internal link actions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SEO Internal Link Opportunity
|
|
7
|
+
|
|
8
|
+
Use this skill for CMS, owned-page, and generated-page internal link analysis.
|
|
9
|
+
It follows the `claude-seo` cluster link-matrix pattern and adapts it to
|
|
10
|
+
Anymorph-managed actions.
|
|
11
|
+
|
|
12
|
+
## Artifact
|
|
13
|
+
|
|
14
|
+
Write outputs under:
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
agent/seo/seo-internal-link-opportunity/{runId}/
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## References
|
|
21
|
+
|
|
22
|
+
- `references/link-rules.md` for matrix and anchor guidance.
|
|
23
|
+
- `../seo-opportunity-audit/references/action-contract.md` for output shape.
|
|
24
|
+
|
|
25
|
+
## Workflow
|
|
26
|
+
|
|
27
|
+
1. Read CMS inventory, generated GEO pages, owned URLs, existing internal links,
|
|
28
|
+
intents, products, and SERP clusters.
|
|
29
|
+
2. Build a page graph: source, target, anchor, page type, intent, product, status.
|
|
30
|
+
3. Detect:
|
|
31
|
+
- orphan pages.
|
|
32
|
+
- weak hub pages.
|
|
33
|
+
- missing spoke-to-pillar links.
|
|
34
|
+
- missing pillar-to-spoke links.
|
|
35
|
+
- missing comparison/category/product support links.
|
|
36
|
+
- poor or generic anchors.
|
|
37
|
+
4. Create action candidates only where source and target are controlled or
|
|
38
|
+
editable through Anymorph/CMS.
|
|
39
|
+
5. Emit link action candidates with exact source page, target page, suggested
|
|
40
|
+
anchor, placement rationale, and verification method.
|
|
41
|
+
|
|
42
|
+
## Output Files
|
|
43
|
+
|
|
44
|
+
- `graph.json`
|
|
45
|
+
- `opportunities.json`
|
|
46
|
+
- `actions.json`
|
|
47
|
+
- `rationale.md`
|
|
48
|
+
|
|
49
|
+
## Auto-Apply Rule
|
|
50
|
+
|
|
51
|
+
Set `canAutoApply=true` only when:
|
|
52
|
+
|
|
53
|
+
- the source page is managed by Anymorph or known CMS tooling.
|
|
54
|
+
- the target URL is stable.
|
|
55
|
+
- the suggested anchor is natural and context-compatible.
|
|
56
|
+
- the change can be represented as a deterministic edit or generation action.
|
|
57
|
+
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "SEO Internal Link Opportunity"
|
|
3
|
+
short_description: "Find internal link, hub-spoke, and anchor opportunities."
|
|
4
|
+
default_prompt: "Use $seo-internal-link-opportunity to find orphan pages, hub-spoke gaps, anchor improvements, and internal link actions."
|
|
5
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Internal Link Rules
|
|
2
|
+
|
|
3
|
+
## Matrix
|
|
4
|
+
|
|
5
|
+
- pillar to spoke: required for every planned spoke.
|
|
6
|
+
- spoke to pillar: required for every spoke.
|
|
7
|
+
- same-cluster spoke to spoke: 2-3 links when context supports it.
|
|
8
|
+
- cross-cluster links: use sparingly for adjacent intent paths.
|
|
9
|
+
- money/product/category pages should receive links from relevant informational
|
|
10
|
+
pages, not unrelated pages.
|
|
11
|
+
|
|
12
|
+
## Anchors
|
|
13
|
+
|
|
14
|
+
- descriptive, natural, and context-specific.
|
|
15
|
+
- avoid repeated exact-match anchors across many pages.
|
|
16
|
+
- avoid generic anchors such as "click here" or "read more" unless surrounding
|
|
17
|
+
context makes target clear.
|
|
18
|
+
- use product/category/comparison terminology only when the source paragraph
|
|
19
|
+
supports it.
|
|
20
|
+
|
|
21
|
+
## Scorecard
|
|
22
|
+
|
|
23
|
+
- orphan pages: target has zero controlled inbound links.
|
|
24
|
+
- weak pages: target has fewer than two relevant controlled inbound links.
|
|
25
|
+
- hub weakness: pillar does not link to all active spokes.
|
|
26
|
+
- cannibalization risk: two pages target the same primary query without clear
|
|
27
|
+
differentiation.
|
|
28
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo-opportunity-audit
|
|
3
|
+
description: Use when running a complete SEO opportunity pass across technical diagnosis, page diagnosis, DFS-backed SERP research, internal linking, and ecommerce-specific opportunity discovery.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SEO Opportunity Audit
|
|
7
|
+
|
|
8
|
+
Use this as the integrated SEO workflow. It coordinates the five focused SEO
|
|
9
|
+
skills and writes one consolidated artifact set under `agent/seo/`.
|
|
10
|
+
|
|
11
|
+
This skill is diagnosis-to-action oriented. Every finding must become either an
|
|
12
|
+
action candidate, a blocked/no-action record, or a verification task.
|
|
13
|
+
|
|
14
|
+
## Source Pattern
|
|
15
|
+
|
|
16
|
+
Follow the structure and judgment style of `AgriciDaniel/claude-seo` where it
|
|
17
|
+
fits Anymorph:
|
|
18
|
+
|
|
19
|
+
- orchestrate first, then delegate to narrow skills.
|
|
20
|
+
- use technical, page, SERP/SXO, cluster, ecommerce, and DFS evidence separately.
|
|
21
|
+
- keep static rules in references.
|
|
22
|
+
- prefer evidence-backed, falsifiable recommendations over generic SEO advice.
|
|
23
|
+
|
|
24
|
+
Do not copy marketing footers, community CTAs, broad PDF/report workflow, or
|
|
25
|
+
unbounded 500-page crawling defaults.
|
|
26
|
+
|
|
27
|
+
## Shared References
|
|
28
|
+
|
|
29
|
+
Read shared references selectively:
|
|
30
|
+
|
|
31
|
+
- `../../shared/evidence-principles.md` before writing or accepting claim,
|
|
32
|
+
freshness, schema, feed, review, comparison, or compliance findings.
|
|
33
|
+
- `../../shared/vertical-playbooks/{vertical}.md` when the tenant vertical is
|
|
34
|
+
known. Use only the matching playbook(s). These files provide vertical
|
|
35
|
+
heuristics for entity patterns, asset plays, measurement signals, and risk
|
|
36
|
+
categories; they are not tenant evidence and do not override
|
|
37
|
+
`agent/BRAND.md`, `agent/STRATEGY.md`, or source data.
|
|
38
|
+
|
|
39
|
+
Vertical selection defaults:
|
|
40
|
+
|
|
41
|
+
- beauty/skincare/makeup/haircare/personal care -> `beauty.md`
|
|
42
|
+
- SaaS/software/subscription/developer tool -> `saas.md`
|
|
43
|
+
- OTA/travel/hospitality/lodging/tours/things-to-do -> `ota.md`
|
|
44
|
+
- ecommerce/consumer goods/retail outside beauty -> `commerce.md`
|
|
45
|
+
|
|
46
|
+
## Focused Skills
|
|
47
|
+
|
|
48
|
+
Invoke or apply these in order:
|
|
49
|
+
|
|
50
|
+
1. `$seo-technical-diagnosis`
|
|
51
|
+
2. `$seo-page-diagnosis`
|
|
52
|
+
3. `$seo-serp-opportunity-research`
|
|
53
|
+
4. `$seo-internal-link-opportunity`
|
|
54
|
+
5. `$seo-ecommerce-opportunity` only when ecommerce signals exist.
|
|
55
|
+
|
|
56
|
+
## Artifact Setup
|
|
57
|
+
|
|
58
|
+
All outputs go under:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
agent/seo/seo-opportunity-audit/{runId}/
|
|
62
|
+
agent/seo/seo-technical-diagnosis/{runId}/
|
|
63
|
+
agent/seo/seo-page-diagnosis/{runId}/
|
|
64
|
+
agent/seo/seo-serp-opportunity-research/{runId}/
|
|
65
|
+
agent/seo/seo-internal-link-opportunity/{runId}/
|
|
66
|
+
agent/seo/seo-ecommerce-opportunity/{runId}/
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Use the bundled script to create paths and validate JSON:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
SEO_TOOLKIT=.agents/skills/seo-opportunity-audit/scripts/seo-toolkit.mjs
|
|
73
|
+
test -f "$SEO_TOOLKIT" || SEO_TOOLKIT=.claude/skills/seo-opportunity-audit/scripts/seo-toolkit.mjs
|
|
74
|
+
node "$SEO_TOOLKIT" init-artifact --skill seo-opportunity-audit --run-id "$RUN_ID"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
If there is no host-provided `RUN_ID`, derive one from the current GEO run id.
|
|
78
|
+
Only use a timestamp fallback for local exploratory work.
|
|
79
|
+
|
|
80
|
+
## Workflow
|
|
81
|
+
|
|
82
|
+
1. Read the GEO run context, tenant memory, product catalog, intents, and known
|
|
83
|
+
page inventory before using external data.
|
|
84
|
+
2. Create the integrated audit artifact directory.
|
|
85
|
+
3. Run technical and page diagnosis first to establish crawl/index/page evidence.
|
|
86
|
+
4. Run DFS-backed SERP opportunity research. Use Firecrawl only to inspect
|
|
87
|
+
concrete competitor pages or public pages after DFS identifies candidates.
|
|
88
|
+
5. Run internal link opportunity analysis against the CMS/GEO page inventory.
|
|
89
|
+
6. Run ecommerce opportunity only when ecommerce signals exist.
|
|
90
|
+
7. Merge outputs into `summary.json`, `actions.json`, and `rationale.md`.
|
|
91
|
+
8. Reject duplicate or weak findings. Prefer no action over speculative action.
|
|
92
|
+
|
|
93
|
+
## DFS Rule
|
|
94
|
+
|
|
95
|
+
DFS API usage must be wrapped by the bundled script:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
node "$SEO_TOOLKIT" dfs-request --endpoint serp_organic_live_advanced --params '{"keyword":"example","location_name":"United States","language_code":"en"}'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Then call the matching DataForSEO MCP/API tool. If direct DataForSEO credentials
|
|
102
|
+
are available in the environment, use the same script for REST calls:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
node "$SEO_TOOLKIT" dfs-call --path /v3/dataforseo_labs/google/related_keywords/live --payload '[{"keyword":"example","location_name":"United States","language_code":"en","limit":10}]' > dfs-response.json
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
In hosted GEO strategy runs,
|
|
109
|
+
prefer the Anymorph MCP wrappers such as `mcp__anymorph__dataforseo_research`,
|
|
110
|
+
`mcp__anymorph__search_keywords`, `mcp__anymorph__serp_snapshot`, and
|
|
111
|
+
`mcp__anymorph__list_seo_opportunities` when direct DataForSEO tools are not
|
|
112
|
+
available. Normalize the response:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
node "$SEO_TOOLKIT" dfs-normalize --endpoint serp_organic_live_advanced < dfs-response.json
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Do not call DFS broadly without a request artifact, estimated cost tier, and
|
|
119
|
+
normalization output saved in the skill artifact directory.
|
|
120
|
+
|
|
121
|
+
## Consolidated Output
|
|
122
|
+
|
|
123
|
+
Write:
|
|
124
|
+
|
|
125
|
+
- `summary.json`: compact rollup and scorecard.
|
|
126
|
+
- `actions.json`: action candidates with fingerprints.
|
|
127
|
+
- `blocked.json`: rejected or blocked opportunities.
|
|
128
|
+
- `rationale.md`: short human-readable decision record.
|
|
129
|
+
|
|
130
|
+
Each final action must include:
|
|
131
|
+
|
|
132
|
+
- `sourceSkill`
|
|
133
|
+
- `opportunityType`
|
|
134
|
+
- `target`
|
|
135
|
+
- `evidence`
|
|
136
|
+
- `confidence`: `confirmed`, `likely`, or `hypothesis`
|
|
137
|
+
- `impact`, `effort`, and `priority`
|
|
138
|
+
- `canAutoApply`
|
|
139
|
+
- `requiresThirdPartyExecution`
|
|
140
|
+
- `verificationMethod`
|
|
141
|
+
- `actionFingerprint`
|