anymorph 0.2.1 → 0.2.3

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 (36) hide show
  1. package/README.md +5 -0
  2. package/dist/index.js +26 -6
  3. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/SKILL.md +54 -0
  4. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/agents/openai.yaml +4 -0
  5. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/diagnosis-contract.md +96 -0
  6. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/workflow.md +191 -0
  7. package/dist/skillpacks/geo/skills/geo-generating-actions/SKILL.md +43 -0
  8. package/dist/skillpacks/geo/skills/geo-generating-actions/agents/openai.yaml +4 -0
  9. package/dist/skillpacks/geo/skills/geo-generating-actions/references/orchestrator.workflow.md +274 -0
  10. package/dist/skillpacks/geo/skills/geo-initializing-strategy/SKILL.md +50 -0
  11. package/dist/skillpacks/geo/skills/geo-initializing-strategy/agents/openai.yaml +4 -0
  12. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/external-authority-diagnosis.md +66 -0
  13. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/foundation-diagnosis.md +86 -0
  14. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/memory-contract.md +15 -0
  15. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/semantic-clusters-diagnosis.md +58 -0
  16. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/strategy-map-contract.md +26 -0
  17. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/visibility-diagnosis.md +50 -0
  18. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/SKILL.md +51 -0
  19. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/agents/openai.yaml +4 -0
  20. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/diagnosis-contract.md +106 -0
  21. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/workflow.md +219 -0
  22. package/dist/skillpacks/geo/skills/geo-writer/SKILL.md +234 -0
  23. package/dist/skillpacks/geo/skills/geo-writer/agents/openai.yaml +4 -0
  24. package/dist/skillpacks/geo/skills/geo-writer/references/content-writer-contract.md +316 -0
  25. package/dist/skillpacks/geo/skills/geo-writer/references/direct-sql.md +187 -0
  26. package/dist/skillpacks/geo/skills/geo-writer/references/seo-geo-insights.md +269 -0
  27. package/dist/skillpacks/geo/skills/social-execution-planning/SKILL.md +53 -0
  28. package/dist/skillpacks/geo/skills/social-execution-planning/agents/openai.yaml +5 -0
  29. package/dist/skillpacks/geo/skills/social-execution-planning/references/execution-contract.md +68 -0
  30. package/dist/skillpacks/geo/skills/social-execution-planning/references/platform-playbooks.md +59 -0
  31. package/dist/skillpacks/geo/skills/social-execution-planning/references/reddit-rules.md +69 -0
  32. package/dist/skillpacks/geo/skills/third-party-diagnosis/SKILL.md +54 -0
  33. package/dist/skillpacks/geo/skills/third-party-diagnosis/agents/openai.yaml +4 -0
  34. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/diagnosis-contract.md +111 -0
  35. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/workflow.md +174 -0
  36. package/package.json +2 -2
@@ -0,0 +1,111 @@
1
+ # GEO Strategy: Third-Party Diagnosis
2
+
3
+ You diagnose external citation surfaces.
4
+
5
+ Do not force proposals. Return no proposal when the external path is only speculative or not plausibly actionable.
6
+
7
+ ## Scope
8
+
9
+ Work on:
10
+
11
+ - cited third-party domains
12
+ - competitor presence on cited sources
13
+ - tenant-owned third-party profiles
14
+ - submission/listing/review opportunities with evidence of feasibility
15
+ - negative or risky external sentiment
16
+
17
+ Do not recommend outreach only because a domain is frequently cited.
18
+
19
+ ## Evidence Order
20
+
21
+ Use the cheapest sufficient evidence.
22
+
23
+ 1. Common run context and routed candidates.
24
+ 2. `list_geo_strategy_candidates` for the first third-party domain slice.
25
+ 3. `get_geo_intent_diagnostic` when an intent-level citation pattern needs explanation.
26
+ 4. `get_citation_intelligence` first, then `list_citations`, `get_citation_domains`, and `get_citation_timeseries` for citation evidence.
27
+ 5. `list_ai_responses` for answer excerpts and recommendation reasons.
28
+ 6. `social_analyze` for YouTube, Reddit, TikTok, Instagram, or LinkedIn URLs; do not use `web_scrape` for these platforms.
29
+ 7. `web_scrape` only for a specific non-social external page where feasibility or profile quality must be checked.
30
+ 8. `web_search` only to find an official submission/profile path or verify third-party actionability.
31
+
32
+ ## Candidate Types
33
+
34
+ - `competitor_cited_surface_gap`
35
+ - `owned_3p_profile_gap`
36
+ - `submission_target`
37
+ - `owned_3p_refresh`
38
+ - `authority_source_monitor`
39
+ - `negative_or_risk_domain`
40
+ - `not_actionable`
41
+
42
+ ## Root Cause Buckets
43
+
44
+ Allowed buckets:
45
+
46
+ - `third_party_presence_gap`
47
+ - `external_authority_gap`
48
+ - `owned_3p_entity_gap`
49
+ - `submission_feasibility_gap`
50
+ - `sentiment_risk`
51
+ - `not_actionable`
52
+ - `insufficient_evidence`
53
+
54
+ ## Action Families
55
+
56
+ Allowed families:
57
+
58
+ - `refresh_owned_3p_profile`
59
+ - `publish_owned_3p_content`
60
+ - `request_submission_inclusion`
61
+ - `update_listing_or_profile`
62
+ - `collect_reviews`
63
+ - `monitor_only`
64
+ - `no_action`
65
+
66
+ Prefer a concrete action when there is a plausible evidence-backed path. Use `monitor_only` or `no_action` when feasibility is too speculative.
67
+
68
+ When `list_geo_strategy_candidates` returns `competitor_presence`, `tenant_presence`, and `actionability`, use those fields as the primary planning frame:
69
+
70
+ - Propose action for `competitor_cited_surface_gap` when competitors are present, tenant presence is missing or weak, and `actionability.actionable=true`.
71
+ - Propose `owned_3p_profile_gap` when the tenant has an owned profile URL but the cited surface shows weak tenant presence.
72
+ - Keep editorial, forum, unknown, or `actionability.actionable=false` cases as `monitor_only` or rejected unless additional evidence proves a direct path.
73
+
74
+ ## Output
75
+
76
+ Produce one `third_party` diagnosis object in this shape.
77
+
78
+ Do not write intermediate diagnosis JSON files directly.
79
+
80
+ Do not include `workspaceId`, `runId`, `channel`, final action id, or final `assetType`; the orchestrator can derive them.
81
+
82
+ Use this shape:
83
+
84
+ ```json
85
+ {
86
+ "summary": "Short diagnosis.",
87
+ "proposals": [
88
+ {
89
+ "intentId": "intent_123",
90
+ "candidateType": "submission_target",
91
+ "target": { "domain": "example.com", "url": "https://example.com/vendor-list" },
92
+ "rootCauses": [
93
+ { "bucket": "third_party_presence_gap", "confidence": 0.68, "evidence": ["Competitors appear on a repeatedly cited list; tenant is absent."] }
94
+ ],
95
+ "actionFamily": "request_submission_inclusion",
96
+ "operations": ["Prepare human-reviewed inclusion request"],
97
+ "priority": "medium",
98
+ "confidence": "medium",
99
+ "evidence": [
100
+ { "type": "source", "ref": "citation_domain:example.com", "summary": "Repeatedly cited for weak intent." }
101
+ ],
102
+ "whyNow": "Why this matters this week.",
103
+ "risks": ["External owner may not accept submissions."]
104
+ }
105
+ ],
106
+ "rejected": [
107
+ { "ref": "example.org", "reason": "Frequently cited but no action path found." }
108
+ ],
109
+ "noActionRationale": "Use when proposals is empty."
110
+ }
111
+ ```
@@ -0,0 +1,174 @@
1
+ # Third-Party Diagnosis Workflow
2
+
3
+ ## Role
4
+
5
+ The `third_party` channel diagnosis reviews external citation surfaces and decides whether third-party action is warranted.
6
+
7
+ It always participates in the orchestrated run, but it should not force proposals when evidence is not actionable.
8
+
9
+ It covers two action channels:
10
+
11
+ - `owned_3p`: tenant-controlled third-party profiles or channels
12
+ - `submission_3p`: external domains where inclusion, listing, outreach, or profile updates may be possible
13
+
14
+ ## Non-Goals
15
+
16
+ - Do not recommend outreach only because a domain is frequently cited.
17
+ - Do not assume a domain is actionable without category or feasibility evidence.
18
+ - Do not replace brand-owned or GEO page fixes with third-party work unless evidence shows the bottleneck is external authority or third-party presence.
19
+
20
+ ## Inputs
21
+
22
+ - common run context from the orchestrator
23
+ - tenant `agent/BRAND.md`
24
+ - tenant `agent/STRATEGY.md`
25
+ - tenant `agent/LEARNINGS.md`
26
+ - relevant rows from:
27
+ - `geo_recommendation_quadrants`
28
+ - `geo_intent_citations`
29
+ - `geo_third_party_domains`
30
+ - `geo_competitor_citations`
31
+ - `geo_third_party_sentiment`
32
+ - `geo_strategy_actions_recent`
33
+ - brand social profiles
34
+ - competitor/domain evidence when available
35
+ - social evidence from the scraper SocialAnalyzer for YouTube, Reddit, TikTok, Instagram, and LinkedIn
36
+ - submission/contact feasibility scrape only when needed for non-social pages
37
+
38
+ ## Workflow
39
+
40
+ ### 1. Review External Citation Pattern
41
+
42
+ Look for:
43
+
44
+ - domains repeatedly cited for weak intents
45
+ - competitor presence on cited domains
46
+ - tenant absence on cited domains
47
+ - negative or weak sentiment on external sources
48
+ - owned third-party profiles that are cited but under-optimized
49
+
50
+ Do not treat citation count alone as actionability.
51
+
52
+ ### 2. Classify Candidate Type
53
+
54
+ #### A. Submission Target
55
+
56
+ Use when:
57
+
58
+ - competitors are present on a cited third-party domain
59
+ - tenant brand is absent or weak
60
+ - domain category is directory, review site, marketplace, partner page, or open listicle
61
+ - there is evidence of submission/contact feasibility
62
+
63
+ Potential action:
64
+
65
+ - create listing
66
+ - update profile
67
+ - request inclusion
68
+ - collect reviews
69
+
70
+ #### B. Competitor-Cited Surface Gap
71
+
72
+ Use when `list_geo_strategy_candidates` reports:
73
+
74
+ - `candidate_type=competitor_cited_surface_gap`
75
+ - `competitor_presence.status=present`
76
+ - `tenant_presence.status=missing` or `weak`
77
+ - `actionability.actionable=true`
78
+
79
+ Potential action:
80
+
81
+ - request inclusion
82
+ - create or update listing
83
+ - collect reviews on the cited surface
84
+
85
+ #### C. Owned 3P Profile Gap
86
+
87
+ Use when:
88
+
89
+ - `candidate_type=owned_3p_profile_gap`
90
+ - `tenant_presence.owned_profile_url` is present
91
+ - owned third-party page is cited, competitor-cited, or likely relevant
92
+ - tenant messaging, category terms, proof, or content coverage is weak
93
+
94
+ Potential action:
95
+
96
+ - update owned profile
97
+ - publish owned-channel post
98
+ - add category keywords and proof
99
+
100
+ For YouTube, Reddit, TikTok, Instagram, and LinkedIn URLs, inspect the content with `social_analyze`.
101
+ Do not use generic web scraping for those platforms.
102
+
103
+ #### D. Authority Source Monitor
104
+
105
+ Use when:
106
+
107
+ - domain is highly cited
108
+ - source is not directly controllable
109
+ - no clear submission path exists
110
+
111
+ Potential action:
112
+
113
+ - `no_action`
114
+ - monitor only
115
+ - PR/analyst relations note in `rationale.md`
116
+
117
+ #### E. Negative Or Risk Domain
118
+
119
+ Use when:
120
+
121
+ - sentiment is negative
122
+ - domain appears repeatedly
123
+ - factual correction or review response may be needed
124
+
125
+ Potential action:
126
+
127
+ - monitor sentiment
128
+ - prepare factual correction
129
+ - flag for human review
130
+
131
+ ### 3. Pick Root Cause Buckets
132
+
133
+ Allowed buckets:
134
+
135
+ - `third_party_presence_gap`
136
+ - `external_authority_gap`
137
+ - `owned_3p_entity_gap`
138
+ - `submission_feasibility_gap`
139
+ - `sentiment_risk`
140
+ - `not_actionable`
141
+ - `insufficient_evidence`
142
+
143
+ ### 4. Route Action
144
+
145
+ Allowed action families:
146
+
147
+ - `refresh_owned_3p_profile`
148
+ - `publish_owned_3p_content`
149
+ - `request_submission_inclusion`
150
+ - `update_listing_or_profile`
151
+ - `collect_reviews`
152
+ - `monitor_only`
153
+ - `no_action`
154
+
155
+ Prefer a concrete action when the candidate carries a plausible evidence-backed path. Use `monitor_only` or `no_action` when feasibility is speculative.
156
+
157
+ ### 5. Output JSON
158
+
159
+ Return:
160
+
161
+ - channel summary
162
+ - proposals
163
+ - rejected candidates
164
+ - no-action rationale
165
+
166
+ If no third-party action is warranted, return an empty `proposals` array and explain why.
167
+
168
+ ## Guardrails
169
+
170
+ - Frequency is not actionability.
171
+ - Citation count alone does not justify outreach.
172
+ - Prefer `monitor_only` when feasibility is unknown.
173
+ - Require evidence before labeling a domain as submission-friendly.
174
+ - Do not emit third-party actions that the product cannot execute or review.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anymorph",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Check your brand's AI visibility across ChatGPT, Perplexity, Gemini, and more",
5
5
  "type": "module",
6
6
  "private": false,
@@ -14,7 +14,7 @@
14
14
  "scripts": {
15
15
  "build": "node build.ts",
16
16
  "dev": "tsx src/index.ts",
17
- "test": "tsx --test src/**/*.test.ts"
17
+ "test": "tsx --test src/*.test.ts src/**/*.test.ts"
18
18
  },
19
19
  "publishConfig": {
20
20
  "access": "public"