anymorph 0.4.0 → 0.6.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 (76) hide show
  1. package/README.md +3 -3
  2. package/dist/index.js +79 -6
  3. package/package.json +1 -1
  4. package/dist/skillpacks/geo/scaffold/AGENTS.md +0 -38
  5. package/dist/skillpacks/geo/scaffold/CLAUDE.md +0 -33
  6. package/dist/skillpacks/geo/shared/evidence-principles.md +0 -35
  7. package/dist/skillpacks/geo/shared/geo-principles.md +0 -281
  8. package/dist/skillpacks/geo/shared/vertical-playbooks/beauty.md +0 -65
  9. package/dist/skillpacks/geo/shared/vertical-playbooks/commerce.md +0 -65
  10. package/dist/skillpacks/geo/shared/vertical-playbooks/ota.md +0 -62
  11. package/dist/skillpacks/geo/shared/vertical-playbooks/saas.md +0 -64
  12. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/SKILL.md +0 -54
  13. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/agents/openai.yaml +0 -4
  14. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/diagnosis-contract.md +0 -95
  15. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/workflow.md +0 -194
  16. package/dist/skillpacks/geo/skills/geo-generating-actions/SKILL.md +0 -188
  17. package/dist/skillpacks/geo/skills/geo-generating-actions/agents/openai.yaml +0 -4
  18. package/dist/skillpacks/geo/skills/geo-generating-actions/references/orchestrator.workflow.md +0 -440
  19. package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo-scaffold.mjs +0 -358
  20. package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo.mjs +0 -66
  21. package/dist/skillpacks/geo/skills/geo-initializing-strategy/SKILL.md +0 -50
  22. package/dist/skillpacks/geo/skills/geo-initializing-strategy/agents/openai.yaml +0 -4
  23. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/external-authority-diagnosis.md +0 -66
  24. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/foundation-diagnosis.md +0 -86
  25. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/memory-contract.md +0 -15
  26. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/semantic-clusters-diagnosis.md +0 -58
  27. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/strategy-map-contract.md +0 -26
  28. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/visibility-diagnosis.md +0 -50
  29. package/dist/skillpacks/geo/skills/geo-local-setup/SKILL.md +0 -66
  30. package/dist/skillpacks/geo/skills/geo-local-setup/agents/openai.yaml +0 -4
  31. package/dist/skillpacks/geo/skills/geo-page-writer/SKILL.md +0 -81
  32. package/dist/skillpacks/geo/skills/geo-page-writer/agents/openai.yaml +0 -4
  33. package/dist/skillpacks/geo/skills/geo-page-writer/references/research.md +0 -61
  34. package/dist/skillpacks/geo/skills/geo-page-writer/references/validation.md +0 -59
  35. package/dist/skillpacks/geo/skills/geo-page-writer/references/writing.md +0 -55
  36. package/dist/skillpacks/geo/skills/geo-page-writer/scripts/check-page-mdx.mjs +0 -210
  37. package/dist/skillpacks/geo/skills/geo-page-writer/scripts/collect-page-sources.mjs +0 -303
  38. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/SKILL.md +0 -51
  39. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/agents/openai.yaml +0 -4
  40. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/diagnosis-contract.md +0 -125
  41. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/workflow.md +0 -269
  42. package/dist/skillpacks/geo/skills/geo-writer/SKILL.md +0 -234
  43. package/dist/skillpacks/geo/skills/geo-writer/agents/openai.yaml +0 -4
  44. package/dist/skillpacks/geo/skills/geo-writer/references/content-writer-contract.md +0 -316
  45. package/dist/skillpacks/geo/skills/geo-writer/references/direct-sql.md +0 -187
  46. package/dist/skillpacks/geo/skills/geo-writer/references/seo-geo-insights.md +0 -269
  47. package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/SKILL.md +0 -82
  48. package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/agents/openai.yaml +0 -5
  49. package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/references/ecommerce-rules.md +0 -31
  50. package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/SKILL.md +0 -57
  51. package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/agents/openai.yaml +0 -5
  52. package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/references/link-rules.md +0 -28
  53. package/dist/skillpacks/geo/skills/seo-opportunity-audit/SKILL.md +0 -141
  54. package/dist/skillpacks/geo/skills/seo-opportunity-audit/agents/openai.yaml +0 -5
  55. package/dist/skillpacks/geo/skills/seo-opportunity-audit/references/action-contract.md +0 -62
  56. package/dist/skillpacks/geo/skills/seo-opportunity-audit/scripts/seo-toolkit.mjs +0 -248
  57. package/dist/skillpacks/geo/skills/seo-page-diagnosis/SKILL.md +0 -56
  58. package/dist/skillpacks/geo/skills/seo-page-diagnosis/agents/openai.yaml +0 -5
  59. package/dist/skillpacks/geo/skills/seo-page-diagnosis/references/page-checks.md +0 -38
  60. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/SKILL.md +0 -66
  61. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/agents/openai.yaml +0 -5
  62. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/page-type-taxonomy.md +0 -40
  63. package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/serp-methodology.md +0 -38
  64. package/dist/skillpacks/geo/skills/seo-technical-diagnosis/SKILL.md +0 -64
  65. package/dist/skillpacks/geo/skills/seo-technical-diagnosis/agents/openai.yaml +0 -5
  66. package/dist/skillpacks/geo/skills/seo-technical-diagnosis/references/checks.md +0 -58
  67. package/dist/skillpacks/geo/skills/third-party-diagnosis/SKILL.md +0 -54
  68. package/dist/skillpacks/geo/skills/third-party-diagnosis/agents/openai.yaml +0 -4
  69. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/diagnosis-contract.md +0 -111
  70. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/workflow.md +0 -174
  71. package/dist/skillpacks/geo/skills/third-party-execution-planning/SKILL.md +0 -64
  72. package/dist/skillpacks/geo/skills/third-party-execution-planning/agents/openai.yaml +0 -4
  73. package/dist/skillpacks/geo/skills/third-party-execution-planning/references/execution-contract.md +0 -90
  74. package/dist/skillpacks/geo/skills/third-party-execution-planning/references/non-social-surface-playbooks.md +0 -123
  75. package/dist/skillpacks/geo/skills/third-party-execution-planning/references/reddit-rules.md +0 -69
  76. package/dist/skillpacks/geo/skills/third-party-execution-planning/references/social-platform-playbooks.md +0 -59
@@ -1,269 +0,0 @@
1
- # GEO Pages Diagnosis Workflow
2
-
3
- ## Role
4
-
5
- The `geo_pages` channel diagnosis diagnoses and proposes actions for Anymorph-generated GEO pages.
6
-
7
- It works on pages where:
8
-
9
- - `source = generated`
10
- - `renderMode = CMS`
11
- - the action would create, iterate, re-research, regenerate, or retire a GEO page
12
-
13
- ## Non-Goals
14
-
15
- - Do not update customer-owned discovered pages.
16
- - Do not choose final production routes. The page generation executor owns route creation.
17
- - Do not propose third-party outreach in MVP.
18
- - Do not use legacy Astro generation paths.
19
-
20
- ## Inputs
21
-
22
- - candidate rows routed by the orchestrator
23
- - tenant `agent/BRAND.md`
24
- - tenant `agent/STRATEGY.md`
25
- - tenant `agent/LEARNINGS.md`
26
- - relevant rows from:
27
- - `geo_pages`
28
- - `geo_intent_coverage`
29
- - `geo_recommendation_quadrants`
30
- - `geo_page_intent_visibility_gaps`
31
- - `geo_page_performance`
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
36
- - generated page scrape when needed
37
- - representative prompts
38
- - AI answer samples
39
- - competitor cited/recommended page scrape when needed
40
-
41
- ## Workflow
42
-
43
- ### 1. Filter Candidates
44
-
45
- Keep candidates where:
46
-
47
- - generated page exists and the intent is weak
48
- - no page exists and the intent is weak
49
- - generated page is healthy and may support adjacent expansion
50
-
51
- Drop candidates when:
52
-
53
- - recent action mask suppresses the same action
54
- - tenant strategy forbids generated pages for that intent class
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
57
-
58
- ### 2. Classify Candidate Case
59
-
60
- Assign one primary case.
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
-
82
- #### A. Generated Page Exists But Visibility Is Low
83
-
84
- Use when:
85
-
86
- - `geo_page_count > 0`
87
- - `current_visibility` is low
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
90
-
91
- Diagnosis questions:
92
-
93
- 1. Does the generated page match representative prompts?
94
- 2. Is the page too generic?
95
- 3. Does it need re-research?
96
- 4. Does the competitor page have stronger content coverage, proof, comparison, or structure?
97
- 5. Is there a technical issue blocking citation or understanding?
98
-
99
- #### B. Cited But Not Mentioned
100
-
101
- Use when:
102
-
103
- - generated page is cited
104
- - brand is not clearly mentioned
105
-
106
- Diagnosis questions:
107
-
108
- 1. Is the generated page visibly tied to the brand?
109
- 2. Does the page lead with generic category information instead of brand-specific evidence?
110
- 3. Are publisher/entity/schema signals weak?
111
-
112
- #### C. Mentioned But Not Recommended
113
-
114
- Use when:
115
-
116
- - tenant brand is mentioned
117
- - competitors are recommended more often
118
-
119
- Diagnosis questions:
120
-
121
- 1. Which competitors are recommended?
122
- 2. What reasons did the answer give?
123
- 3. Does the generated page lack the proof, comparison criteria, or positioning that caused competitors to win?
124
-
125
- #### D. Low Visibility And No Page Exists
126
-
127
- Use when:
128
-
129
- - `brand_owned_page_count = 0`
130
- - `geo_page_count = 0`
131
- - `current_visibility` is low
132
- - `absent_rate` is high
133
-
134
- Diagnosis questions:
135
-
136
- 1. Is the intent real and valuable?
137
- 2. Does the tenant strategy allow a generated page for this intent?
138
- 3. Is there enough evidence to generate a useful page?
139
-
140
- ### 3. Gather Evidence
141
-
142
- Default evidence:
143
-
144
- - view rows
145
- - representative prompts
146
- - quadrant rates
147
- - page performance summary
148
- - page age and indexation status
149
- - AI answer excerpts
150
-
151
- Fetch generated page scrape when:
152
-
153
- - an existing generated page is being evaluated
154
-
155
- Fetch competitor page scrape when:
156
-
157
- - competitor pages are cited or recommended repeatedly
158
- - the action depends on comparison with competitor content
159
-
160
- Do not fetch competitor pages for every candidate.
161
-
162
- ### 4. Pick Root Cause Buckets
163
-
164
- Allowed buckets:
165
-
166
- - `intent_coverage_gap`
167
- - `content_depth_gap`
168
- - `entity_clarity_gap`
169
- - `generic_content_gap`
170
- - `proof_gap`
171
- - `comparison_gap`
172
- - `positioning_gap`
173
- - `technical_issue`
174
- - `authority_gap`
175
- - `product_fit_gap`
176
- - `prompt_mismatch`
177
- - `already_healthy`
178
- - `insufficient_evidence`
179
-
180
- Use `authority_gap` only when external citation evidence or recommendation reasons support it.
181
-
182
- ### 5. Route Action
183
-
184
- Allowed action families:
185
-
186
- - `create_hub_page`
187
- - `create_spoke_page`
188
- - `update_existing_page`
189
- - `replace_existing_page`
190
- - `remove_or_merge_page`
191
- - `no_action`
192
-
193
- Routing defaults:
194
-
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
203
-
204
- ### 6. Output
205
-
206
- Return a compact diagnosis for each accepted action:
207
-
208
- - candidate type
209
- - page URL/pageId when available
210
- - intentId
211
- - root cause buckets with confidence
212
- - recommended action family
213
- - concrete operations
214
- - evidence references
215
- - why other actions were rejected
216
- - freshness/indexation rationale for monitored fresh pages or pages not indexed after 7 days
217
-
218
- For create actions:
219
-
220
- - do not invent final URL
221
- - optional `target.suggestedSlug` is non-binding only
222
- - include `target.pageRole` as `HUB` for `create_hub_page` and `SPOKE` for `create_spoke_page`
223
-
224
- ## Examples
225
-
226
- ### Existing Generated Page Is Weak
227
-
228
- If a generated page exists but competitors win because their cited pages contain stronger comparison criteria:
229
-
230
- - root cause: `comparison_gap`
231
- - action family: `update_existing_page`
232
- - operation: add comparison criteria, direct recommendation framing, and proof points
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
-
251
- ### No Page Exists
252
-
253
- If no discovered or generated page covers a weak intent:
254
-
255
- - root cause: `intent_coverage_gap`
256
- - action family: `create_hub_page`
257
- - operation: generate a CMS-backed GEO page for the intent
258
-
259
- ## Guardrails
260
-
261
- - Use CMS-backed generation only.
262
- - Do not use legacy Astro paths.
263
- - Do not duplicate a discovered page that clearly owns the intent.
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.
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.
@@ -1,234 +0,0 @@
1
- ---
2
- name: geo-writer
3
- description: Use when the user asks to write SEO/GEO content, create a page-generation brief, turn weak intents or prompts into E-E-A-T page copy, use auto mode from domain/lang/topic, or extract Anymorph data for a content writer using ~/brain SEO GEO insight principles.
4
- ---
5
-
6
- # GEO Writer
7
-
8
- ## When to use
9
-
10
- - "SEO GEO insight 기반으로 content 써줘"
11
- - "page generation용 content writer brief 만들어줘"
12
- - "weak intent를 E-E-A-T한 페이지로 바꿔줘"
13
- - "Anymorph DB에서 데이터 뽑아서 page content context 만들어줘"
14
- - "GEO 페이지를 독창적이고 citation-ready하게 써줘"
15
- - "이 prompt/keyword/pageId로 글 초안 또는 generation brief 만들어줘"
16
- - "domain/lang/topic만 줄 테니 나머지는 알아서 채워줘"
17
-
18
- ## Core principle
19
-
20
- 이 Skill은 글쓰기 프롬프트가 아니라 **page generation 직전의 authoring intelligence layer**다. 목표는 검색어를 반복하는 글이 아니라, 사람에게는 결정을 돕고 AI에게는 답변에 인용할 수 있는 `answer unit + evidence unit`을 만드는 것이다.
21
-
22
- The output must be one of:
23
-
24
- - `Content Data Pack` + `Editorial Kernel` + `Section Evidence Contract`
25
- - research-only content brief / outline
26
- - `generate_managed_pages.context`에 넣을 page generation brief
27
- - tenant repo direct-edit용 page copy plan
28
-
29
- ## Input modes
30
-
31
- ### Auto mode
32
-
33
- Use this mode by default when the user gives only a domain/workspace, language, and free-form topic.
34
-
35
- Minimum input:
36
-
37
- ```yaml
38
- domain: "example.com"
39
- lang: "ko"
40
- topic: "GEO page generation이 기존 SEO 블로그 생성과 다른 이유"
41
- ```
42
-
43
- Auto-fill the rest:
44
-
45
- | Field | How to infer |
46
- | --- | --- |
47
- | `workspaceId` | `list_workspaces()` then exact/fuzzy match domain. If ambiguous, ask once. |
48
- | `market` | `get_brand_profile.primaryCountry`; fallback from lang (`ko`→`KR`, `ja`→`JP`, `en`→`US`, `zh`→`CN`, `th`→`TH`) and mark as inferred. |
49
- | `output_mode` | default `generation_brief`; use `managed_generation` only if the user says to create/generate now. |
50
- | `data_mode` | default `mcp_first`; direct SQL stays off unless explicitly requested or necessary and approved. |
51
- | `target_reader` | brand profile audience + topic; fallback to the likely buyer/researcher for the content type. |
52
- | `content_type` | infer from topic: vs/comparison, alternatives, what-is/glossary, how-to/guide, benchmark/report, pricing/ROI, docs/API, case-study; default guide. |
53
- | `primary_question` | rewrite topic into one direct reader question in the target language. |
54
- | `page_goal` | infer from funnel and brand fit: educate, compare, shortlist, prove ROI, implementation support, or conversion assist. |
55
- | `cta_goal` | infer from workspace/brand instructions; fallback to a low-friction next step such as demo, examples, docs, pricing, or audit. |
56
- | `title_selection_mode` | default `user_select_before_generation`; use `auto_recommended` only if the user explicitly asks to auto-pick. |
57
- | `route_or_slug` | derive from topic in target language style, then check collisions with `list_managed_pages`. |
58
-
59
- Do not ask for optional fields unless the missing value changes risk or execution path. If a field is inferred, label it as `inferred` in the brief.
60
-
61
- ### Full input mode
62
-
63
- Use this when the user provides structured inputs or wants precise control.
64
-
65
- ```yaml
66
- domain: "anymorph.ai"
67
- workspaceId: "optional"
68
- lang: "ko"
69
- market: "KR"
70
- topic: "GEO page generation이 기존 SEO 블로그 생성과 다른 이유"
71
- output_mode: "generation_brief" # auto | generation_brief | research_only | managed_generation | tenant_repo_copy
72
- data_mode: "mcp_first" # mcp_first | allow_direct_sql
73
- target_reader: "B2B SaaS founder와 마케팅 리더"
74
- page_goal: "Anymorph를 GEO 페이지 생성 솔루션으로 신뢰하게 만들기"
75
- content_type: "guide"
76
- primary_question: "GEO 페이지는 SEO 블로그와 무엇이 다른가?"
77
- cta_goal: "demo 요청"
78
- title_selection_mode: "user_select_before_generation" # user_select_before_generation | auto_recommended | user_provided
79
- route_or_slug: "/geo-page-generation"
80
- pageId: "optional existing page"
81
- intentId: "optional weak intent"
82
- promptIds: ["optional prompt ids"]
83
- ```
84
-
85
- ## Source hierarchy
86
-
87
- Use sources in this order:
88
-
89
- 1. User-provided page/topic/workspace constraints
90
- 2. Anymorph MCP read tools
91
- 3. Workspace living document, brand profile, product/catalog facts
92
- 4. Existing page research reports and page visibility diagnostics
93
- 5. Bundled SEO/GEO Insight Reference from `~/brain/01-Projects/Content/SEO GEO insight`: [seo-geo-insights.md](references/seo-geo-insights.md)
94
- 6. External research only when the topic needs fresh third-party evidence
95
- 7. Guarded direct SQL only when MCP tools cannot return the needed slice
96
-
97
- ## Workflow
98
-
99
- ### Step 1 - Resolve workspace and objective
100
-
101
- Parse the input as Auto mode or Full input mode. If only `domain`, `lang`, and `topic` are present, run Auto mode and infer the remaining fields. If `workspaceId` is unknown, call `list_workspaces()` and match by domain; ask only if no match or multiple likely matches exist. If the user gave a page path or URL, resolve it with `list_managed_pages`. If the user gave `pageId`, use it directly.
102
-
103
- Classify the task:
104
-
105
- | User intent | Output mode |
106
- | --- | --- |
107
- | domain/lang/topic only | auto → default `generation_brief` |
108
- | "먼저 방향/brief만" | research-only brief |
109
- | "대시보드 generation으로" or no tenant repo path | managed generation brief |
110
- | "바로 생성", "generate now", "대시보드에 만들어" | managed_generation |
111
- | local tenant repo path, code/layout edits | tenant repo direct-edit plan |
112
- | existing page refresh | hand off to `refreshing-existing-pages` unless user specifically wants a new authoring brief |
113
-
114
- ### Step 2 - Build the Content Data Pack
115
-
116
- Before collecting or drafting anything, read [seo-geo-insights.md](references/seo-geo-insights.md). Treat it as the non-negotiable operating and content law for the brief: SEO is page selection, GEO is answer inclusion, and every page must become a people-first, evidence-backed, citation-ready answer asset.
117
-
118
- Use MCP tools first:
119
-
120
- | Need | Tools |
121
- | --- | --- |
122
- | Workspace/brand rules | `get_workspace_instructions`, `get_brand_profile`, `get_brand_voice_kit` |
123
- | Demand/opportunity | `list_weak_intents`, `list_seo_opportunities`, `search_keywords`, `serp_snapshot` |
124
- | Existing page context | `list_managed_pages`, `get_page`, `get_page_research`, `get_page_prompts`, `get_page_visibility`, `get_page_insights` |
125
- | Brand/product evidence | `search_living_document`, `list_catalog_products`, `get_catalog_product`, `get_page_products` |
126
- | Prompt diagnostics | `insight_list_action_candidates`, `insight_get_prompt_diagnostic` |
127
-
128
- When the user explicitly asks for DB extraction, or MCP tools cannot answer a necessary data question, read [direct-sql.md](references/direct-sql.md) and use the guarded SQL path.
129
-
130
- When constructing the final data object or generation brief, read [content-writer-contract.md](references/content-writer-contract.md).
131
-
132
- ### Step 3 - Build the Editorial Kernel before drafting
133
-
134
- Do not start with an article draft. First produce:
135
-
136
- - `primaryQuestion`: the one question this page answers
137
- - `readerJob`: what the reader is trying to decide/do
138
- - `answerPromise`: the shortest true answer
139
- - `originalAngle`: the non-commodity POV, method, benchmark, product truth, or field observation
140
- - `evidenceWedge`: the strongest evidence type available
141
- - `honestBrandRole`: where the brand belongs and where it should not be forced
142
- - `hook`: concrete first sentence, not clickbait
143
- - `titlePosture`: whether this page needs an orthodox, hybrid, or POV-led title strategy
144
- - `caveats`: constraints, exceptions, non-fit cases, freshness limits
145
-
146
- Good hook shape:
147
-
148
- ```text
149
- Reader pain/context + concrete answer + useful tension + evidence promise
150
- ```
151
-
152
- Never use vague hooks such as "In today's digital age", "Have you ever wondered", "ultimate guide", "game-changing", or "transform your business".
153
-
154
- ### Step 4 - Create the Section Evidence Contract
155
-
156
- For every proposed H2, define:
157
-
158
- - the exact question answered
159
- - a 1-2 sentence answer capsule
160
- - allowed evidence IDs
161
- - forbidden claims
162
- - internal link target when useful
163
- - table/list/component recommendation only when it helps the reader
164
-
165
- Each H2 must be independently understandable. Do not rely on "as mentioned above".
166
-
167
- ### Step 5 - Write the brief or hand off to generation
168
-
169
- For **managed generation**, call `generate_managed_pages` only after the brief is ready:
170
-
171
- - If no title has been selected by the user, output the Title Candidate Set and stop for selection. Do not call `generate_managed_pages` yet.
172
- - Mark the title `selection_status` as `needs_user_selection` until the user chooses a candidate or explicitly authorizes auto-pick.
173
- - The user may choose by candidate ID (`T1`, `T2`, etc.) or edit a candidate. Preserve the user's chosen title unless it violates evidence, trust, or hype rules.
174
- - If the user explicitly requested auto-pick/auto-generate, use the `recommended` title candidate and mark `title_selection_mode: auto_recommended`.
175
-
176
- ```text
177
- generate_managed_pages(
178
- workspaceId,
179
- title,
180
- slug,
181
- description,
182
- context: "<Data Pack summary + Editorial Kernel + Section Evidence Contract + QA rules>",
183
- enableDeepResearch: true|false
184
- )
185
- ```
186
-
187
- Set `enableDeepResearch` to `true` only when the current evidence is not enough. If the Data Pack already contains strong first-party facts, page research, SERP patterns, and third-party sources, use `false`.
188
-
189
- For **research-only**, output the brief and outline without calling generation tools.
190
-
191
- For **tenant repo direct edit**, inspect the repo structure first, edit native page/content files, and run the repo's build/test/lint path.
192
-
193
- ### Step 6 - QA before final output
194
-
195
- Reject or repair the brief if any of these fail:
196
-
197
- - People-first: reader can complete the job without searching again.
198
- - E-E-A-T: who/how/why, source, method, date, and responsibility are clear where relevant.
199
- - Originality: not just a public-summary rewrite.
200
- - Answer-first: intro and every H2 start with a direct answer.
201
- - Evidence: factual claims map to evidence IDs; no invented stats or quotes.
202
- - Fan-out: major subquestions are covered without creating thin variants.
203
- - Scannability: meaningful headings, short paragraphs, useful tables only.
204
- - Hook/title: concrete, useful, intent-clear, and not hype or curiosity bait.
205
- - Brand honesty: fit and non-fit are clear.
206
- - Technical readiness: crawlable/indexable assumptions, metadata, visible content/schema consistency.
207
-
208
- ## Writing rules
209
-
210
- - Use the brand voice kit, but never expose the voice-kit payload in page copy.
211
- - Use statistics only when source material contains the exact number, source, year, and URL when available.
212
- - Use exact quotes only when the source contains the exact quote and attribution.
213
- - Prefer first-party/proprietary evidence when available: product facts, methodology, case detail, support patterns, benchmark, screenshots, pricing assumptions.
214
- - Do not fabricate customer stories, expert titles, testimonials, comparisons, prices, dates, screenshots, or proprietary data.
215
- - One page = one primary intent. Cover fan-out questions as supporting sections, not as thin sibling pages.
216
- - Avoid forced FAQ/table/schema. Include them only when they help the reader or extraction.
217
- - For YMYL-like topics, require stronger source quality and caveats.
218
-
219
- ## Failure modes
220
-
221
- - **No workspace access**: use `list_workspaces`; if empty, stop and ask for Anymorph authentication.
222
- - **MCP data too thin**: say which data is missing, then choose direct SQL, external research, or research-only brief.
223
- - **Direct SQL requested**: read `references/direct-sql.md`; enforce SELECT-only, workspace scoped, limited queries.
224
- - **No original angle**: do not write generic content. Ask for brand/product proof or create a research-only brief listing the missing evidence.
225
- - **Existing page collision**: use `list_managed_pages`; if route already exists, hand off to `refreshing-existing-pages`.
226
- - **Weak evidence for a claim**: remove the claim or rewrite qualitatively without numbers.
227
-
228
- ## References
229
-
230
- - Canonical SEO/GEO insight operating and content principles: [seo-geo-insights.md](references/seo-geo-insights.md)
231
- - Data pack, editorial kernel, section contract, and generation brief templates: [content-writer-contract.md](references/content-writer-contract.md)
232
- - Direct DB extraction guard and SQL recipes: [direct-sql.md](references/direct-sql.md)
233
- - Research foundation: `docs/seo-geo-eeat-content-writer-research.md`
234
- - Shared GEO principles: `../../shared/geo-principles.md`
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "GEO Writer"
3
- short_description: "Create SEO/GEO content briefs from domain, language, and topic."
4
- default_prompt: "Use $geo-writer to create a page-generation brief from this domain, language, and topic."