anymorph 0.2.5 → 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.
Files changed (63) hide show
  1. package/README.md +50 -36
  2. package/dist/index.js +9231 -251
  3. package/dist/skillpacks/geo/scaffold/AGENTS.md +38 -0
  4. package/dist/skillpacks/geo/scaffold/CLAUDE.md +33 -0
  5. package/dist/skillpacks/geo/shared/evidence-principles.md +35 -0
  6. package/dist/skillpacks/geo/shared/geo-principles.md +281 -0
  7. package/dist/skillpacks/geo/shared/vertical-playbooks/beauty.md +65 -0
  8. package/dist/skillpacks/geo/shared/vertical-playbooks/commerce.md +65 -0
  9. package/dist/skillpacks/geo/shared/vertical-playbooks/ota.md +62 -0
  10. package/dist/skillpacks/geo/shared/vertical-playbooks/saas.md +64 -0
  11. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/SKILL.md +1 -1
  12. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/diagnosis-contract.md +8 -9
  13. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/workflow.md +11 -8
  14. package/dist/skillpacks/geo/skills/geo-generating-actions/SKILL.md +110 -22
  15. package/dist/skillpacks/geo/skills/geo-generating-actions/references/orchestrator.workflow.md +171 -5
  16. package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo-scaffold.mjs +358 -0
  17. package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo.mjs +66 -0
  18. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/foundation-diagnosis.md +1 -1
  19. package/dist/skillpacks/geo/skills/geo-local-setup/SKILL.md +66 -0
  20. package/dist/skillpacks/geo/skills/geo-local-setup/agents/openai.yaml +4 -0
  21. package/dist/skillpacks/geo/skills/geo-page-writer/SKILL.md +81 -0
  22. package/dist/skillpacks/geo/skills/geo-page-writer/agents/openai.yaml +4 -0
  23. package/dist/skillpacks/geo/skills/geo-page-writer/references/research.md +61 -0
  24. package/dist/skillpacks/geo/skills/geo-page-writer/references/validation.md +59 -0
  25. package/dist/skillpacks/geo/skills/geo-page-writer/references/writing.md +55 -0
  26. package/dist/skillpacks/geo/skills/geo-page-writer/scripts/check-page-mdx.mjs +210 -0
  27. package/dist/skillpacks/geo/skills/geo-page-writer/scripts/collect-page-sources.mjs +303 -0
  28. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/SKILL.md +1 -1
  29. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/diagnosis-contract.md +36 -17
  30. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/workflow.md +65 -15
  31. package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/SKILL.md +82 -0
  32. package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/agents/openai.yaml +5 -0
  33. package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/references/ecommerce-rules.md +31 -0
  34. package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/SKILL.md +57 -0
  35. package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/agents/openai.yaml +5 -0
  36. package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/references/link-rules.md +28 -0
  37. package/dist/skillpacks/geo/skills/seo-opportunity-audit/SKILL.md +141 -0
  38. package/dist/skillpacks/geo/skills/seo-opportunity-audit/agents/openai.yaml +5 -0
  39. package/dist/skillpacks/geo/skills/seo-opportunity-audit/references/action-contract.md +62 -0
  40. package/dist/skillpacks/geo/skills/seo-opportunity-audit/scripts/seo-toolkit.mjs +248 -0
  41. package/dist/skillpacks/geo/skills/seo-page-diagnosis/SKILL.md +56 -0
  42. package/dist/skillpacks/geo/skills/seo-page-diagnosis/agents/openai.yaml +5 -0
  43. package/dist/skillpacks/geo/skills/seo-page-diagnosis/references/page-checks.md +38 -0
  44. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/SKILL.md +66 -0
  45. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/agents/openai.yaml +5 -0
  46. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/page-type-taxonomy.md +40 -0
  47. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/serp-methodology.md +38 -0
  48. package/dist/skillpacks/geo/skills/seo-technical-diagnosis/SKILL.md +64 -0
  49. package/dist/skillpacks/geo/skills/seo-technical-diagnosis/agents/openai.yaml +5 -0
  50. package/dist/skillpacks/geo/skills/seo-technical-diagnosis/references/checks.md +58 -0
  51. package/dist/skillpacks/geo/skills/third-party-diagnosis/SKILL.md +1 -1
  52. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/diagnosis-contract.md +2 -2
  53. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/workflow.md +1 -1
  54. package/dist/skillpacks/geo/skills/third-party-execution-planning/SKILL.md +64 -0
  55. package/dist/skillpacks/geo/skills/third-party-execution-planning/agents/openai.yaml +4 -0
  56. package/dist/skillpacks/geo/skills/third-party-execution-planning/references/execution-contract.md +90 -0
  57. package/dist/skillpacks/geo/skills/third-party-execution-planning/references/non-social-surface-playbooks.md +123 -0
  58. package/package.json +2 -1
  59. package/dist/skillpacks/geo/skills/social-execution-planning/SKILL.md +0 -53
  60. package/dist/skillpacks/geo/skills/social-execution-planning/agents/openai.yaml +0 -5
  61. package/dist/skillpacks/geo/skills/social-execution-planning/references/execution-contract.md +0 -68
  62. /package/dist/skillpacks/geo/skills/{social-execution-planning → third-party-execution-planning}/references/reddit-rules.md +0 -0
  63. /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. `list_geo_strategy_candidates` for the first generated-page or no-page candidate slice.
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 create_geo_page candidates, `get_intent_products` to verify catalog fit and product ids.
30
- 5. `get_page_insights`, `get_page_visibility`, or `list_ai_responses` for prompt/answer evidence.
31
- 6. `get_page_content` or `get_page_source_code` for generated page body or technical diagnosis.
32
- 7. `web_scrape` only for a specific cited/recommended competitor URL.
33
- 8. `serp_snapshot` or `dataforseo_research` only when the evidence depends on external search demand or SERP shape.
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
- - `create_geo_page`
60
- - `iterate_geo_page`
61
- - `re_research_geo_page`
62
- - `regenerate_geo_page`
63
- - `retire_geo_page`
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, create_geo_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.
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": "create_geo_page",
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
- - `create_geo_page`
161
- - `iterate_geo_page`
162
- - `re_research_geo_page`
163
- - `regenerate_geo_page`
164
- - `retire_geo_page`
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
- - No page + low visibility + absent -> `create_geo_page`
172
- - Existing page + intent mismatch -> `regenerate_geo_page` or `retire_geo_page`
173
- - Existing page + weak content -> `iterate_geo_page`
174
- - Existing page + missing evidence -> `re_research_geo_page`
175
- - Healthy page -> `expand_adjacent_intent` or `no_action`
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: `iterate_geo_page`
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: `create_geo_page`
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 regenerate when a targeted iteration is sufficient.
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`
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "SEO Opportunity Audit"
3
+ short_description: "Run a complete SEO opportunity audit across focused SEO skills."
4
+ default_prompt: "Use $seo-opportunity-audit to run technical, page, SERP, internal link, and ecommerce SEO opportunity analysis."
5
+