Not in the top 1,000 by GitHub stars
gbessoni/seobuild-onpage
SEOBuild Onpage - The first AI agent that writes pages Google ranks AND LLMs cite. One command in, ranking page out. Built on DeerFlow, powered by 2026 SEO + GEO strategies tested / working. Forensic competitive analysis, 500-token chunk architecture, entity consensus, verification tags. BYOK GSC, DataforSEO. Works w/ OpenClaw, Claude Code, Codex
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
417f38706bc4 → 417f38706bc4
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 417f38706bc4
No earlier version was observed for comparison.
Verified commit 417f38706bc46a1a8e1c808267719d8eb76d1753
git clone --filter=blob:none --no-checkout https://github.com/gbessoni/seobuild-onpage.git .hotskills/gbessoni-seobuild-onpage && git -C .hotskills/gbessoni-seobuild-onpage checkout --detach 417f38706bc46a1a8e1c808267719d8eb76d1753
# Copy each selected skill directory from .hotskills/gbessoni-seobuild-onpage into .claude/skills/<skill-name>/Heat
2.9- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
seobuild-onpage
When your agent uses it
Write SEO pages that rank on Google AND get cited by LLMs. Uses live SERP data, 500-token chunk architecture, RAG optimization for Gemini 3.5 Flash, the Two-Gate AEO framework (retrieval-pool entry + selected-citation extraction), the Anti-NLP Stuffing Protocol (structural entity placement, no keyword-density stuffing), strict single-service local isolation, and the Reddit Test quality gate. Triggers on: "write an SEO page", "seo-agi", "seo page for [keyword]", "rank for [keyword]", "rewrite this page for SEO", "GEO", "AEO", "write a page that ranks".
What it loads into context
Frontmatter
211 tokensAlways available to the agent
SKILL.md
25,291 tokensWhen the skill is activated
Reference documents
31,484 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- MASTER RULE -- THE ANTI-HALLUCINATION META-DIRECTIVE
- NEW IN v2.6.0 -- SEMANTIC STRICTNESS & CREDENTIAL PROMINENCE
- NEW IN v2.5.0 -- SPECIFICITY SCORING & FORMAT BANS
- NEW IN v2.4.0 -- DISCOVERY ROUTES & OFF-PAGE EMBEDS
- NEW IN v2.3.0 -- AI SEO CORRELATION PROTOCOLS
- NEW IN v2.2.0 -- COMPLIANT AFFILIATE MONETIZATION & LOCAL ISOLATION
- NEW IN v2.1.0 -- THE ANTI-NLP PROTOCOL & TWO-GATE AEO
- 0. DATA LAYER -- COMPETITIVE INTELLIGENCE
- HARD RULES (never violate)
- 1. CORE BELIEF SYSTEM
- 2. GOOGLE AI SEARCH -- 7 RANKING SIGNALS
- 3. THE 500-TOKEN CHUNK ARCHITECTURE
- 4. SEAT SIGNALS (Semantic + E-E-A-T + Entity/Knowledge Graph)
- 5. QUALITY & AUDIT FILTERS
- 6. TECHNICAL MARKUP RULES
- 7. VERIFICATION & TAGGING SYSTEM
- 8. REQUIRED PAGE STRUCTURE
- 9. ABSOLUTE WRITING RULES
- 10. VERTICAL-SPECIFIC INSTRUCTIONS
- 11. LLM / AEO CITATION STRATEGY
- 11A. TRIBUTARY TRUST PROTOCOL (v1.7.0)
- 12. HUB & SPOKE INTERNAL LINKING
- 13. EXECUTION PROTOCOL
- 14. QUALITY CHECKLIST
- FORENSIC SEO PROTOCOLS (v1.5.0)
- 2026 MARCH UPDATE PROTOCOLS
- 15. OUTPUT FORMAT
- PAGE BRIEF TEMPLATE
- REFERENCE FILES
- TECHNICAL CODEBASE EXECUTION RULES (v1.7.1)
- DEPENDENCIES
Scripts executed separately
scripts/gsc_pull.pyscripts/lib/__init__.pyscripts/lib/dataforseo.pyscripts/lib/env.pyscripts/lib/gsc_client.pyscripts/lib/massive.pyscripts/lib/serp_analyze.pyscripts/research.pyscripts/setup.pyscripts/tributary_gen.pytests/test_dataforseo.pytests/test_dataforseo_nullsafe.pytests/test_env.pytests/test_gsc_ghost_paths.pytests/test_massive.pytests/test_research_v171.pytests/test_research_v191.pytests/test_research_v200.pytests/test_research_v220.pytests/test_serp_analyze.py
Files
.claude-plugin/marketplace.jsonasset790 bytes.claude-plugin/plugin.jsonasset732 bytes.env.exampleasset1,155 bytes.gitignoreasset59 bytesCHANGELOG.mddoc29,999 bytesCLAUDE.mddoc9,322 bytesCONNECTOR.mddoc10,822 bytesREADME.mddoc39,498 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSKILL.mdcore111,579 bytesSPEC.mddoc10,169 bytesfixtures/keywords_sample.jsonasset1,081 bytesfixtures/serp_sample.jsonasset2,528 bytesreferences/page-templates.mddoc7,815 bytesreferences/quality-checklist.mddoc20,870 bytesreferences/schema-patterns.mddoc4,430 bytesrequirements.txtdoc115 bytesscripts/gsc_pull.pyruns10,618 bytesscripts/lib/__init__.pyruns26 bytesscripts/lib/dataforseo.pyruns11,869 bytesscripts/lib/env.pyruns4,736 bytesscripts/lib/gsc_client.pyruns5,514 bytesscripts/lib/massive.pyruns4,918 bytesscripts/lib/serp_analyze.pyruns7,056 bytesscripts/research.pyruns39,232 bytesscripts/setup.pyruns5,390 bytesscripts/tributary_gen.pyruns12,757 bytestests/test_dataforseo.pyruns10,253 bytestests/test_dataforseo_nullsafe.pyruns3,982 bytestests/test_env.pyruns1,450 bytestests/test_gsc_ghost_paths.pyruns4,183 bytestests/test_massive.pyruns3,527 bytestests/test_research_v171.pyruns8,655 bytestests/test_research_v191.pyruns8,963 bytestests/test_research_v200.pyruns5,555 bytestests/test_research_v220.pyruns1,919 bytestests/test_serp_analyze.pyruns4,124 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- seobuild-onpage
Repository facts
- License
- No license detected
- Created
- Mar 18, 2026
- Last pushed
- Oct 20, 2026
- Forks
- 42
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 32 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 186 network referencesin 19 files: tests/test_research_v191.py:37 references/schema-patterns.md:9 CONNECTOR.md:41 and 16 more
- No hidden or obfuscated text
- No instruction overrides
- 20 executable scriptsin 20 files: scripts/gsc_pull.py:1 scripts/lib/__init__.py:1 scripts/lib/dataforseo.py:1 and 17 more
- 33 references to secretsin 10 files: scripts/lib/env.py:3 .env.example:2 scripts/setup.py:17 and 7 more
- No requests to vote in Hot
Show all 239 signals by file
.claude-plugin/marketplace.json
- Network accessline 3
"owner": { "name": "Greg Bessoni", "url": "https://github.com/gbessoni" - Network accessline 4
"name": "Greg Bessoni", "url": "https://github.com/gbessoni" }, - Network accessline 5
"url": "https://github.com/gbessoni" - Network accessline 16
"author": { "name": "Greg Bessoni", "url": "https://github.com/gbessoni" - Network accessline 17
"name": "Greg Bessoni", "url": "https://github.com/gbessoni" }, - Network accessline 18
"url": "https://github.com/gbessoni" - Network accessline 20
"source": "./", "category": "productivity", "homepage": "https://github.com/gbessoni/seobuild-onpage", - Network accessline 21
"category": "productivity", "homepage": "https://github.com/gbessoni/seobuild-onpage", "license": "MIT" - Network accessline 22
"homepage": "https://github.com/gbessoni/seobuild-onpage",
.claude-plugin/plugin.json
- Network accessline 5
"author": { "name": "Greg Bessoni", "url": "https://github.com/gbessoni" - Network accessline 6
"name": "Greg Bessoni", "url": "https://github.com/gbessoni" }, - Network accessline 7
"url": "https://github.com/gbessoni" - Network accessline 8
}, "homepage": "https://github.com/gbessoni/seobuild-onpage", "repository": "https://github.com/gbessoni/seobuild-onpage", - Network accessline 9
"homepage": "https://github.com/gbessoni/seobuild-onpage", - Network accessline 10
"repository": "https://github.com/gbessoni/seobuild-onpage",
.env.example
- Access to secretsline 2
[Credential-related source omitted] - Access to secretsline 5
[Credential-related source omitted] - Network accessline 7
# DataForSEO (required for live SERP research) # Sign up at https://dataforseo.com -- ~$0.002 per query - Network accessline 8
# Sign up at https://dataforseo.com -- ~$0.002 per query - Network accessline 12
# Google Search Console (optional -- for owned site performance data) # Create a service account at https://console.cloud.google.com - Network accessline 13
# Create a service account at https://console.cloud.google.com - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Network accessline 26
# DataForSEO's content_parsing/live endpoint misses. Falls back to # DataForSEO per-URL on failure or empty response, so partial outages # don't break the run. Get a token at https://joinmassive.com - Network accessline 27
# DataForSEO per-URL on failure or empty response, so partial outages # don't break the run. Get a token at https://joinmassive.com # SERP organic results and keyword data continue to come from DataForSEO. - Network accessline 28
# don't break the run. Get a token at https://joinmassive.com
.gitignore
- Access to secretsline 3
[Credential-related source omitted]
CONNECTOR.md
- Network accessline 41
│ ▼ 401 + WWW-Authenticate: Bearer resource_metadata="https://.../.well-known/oauth-protected-resource" - Network accessline 42
▼ 401 + WWW-Authenticate: Bearer resource_metadata="https://.../.well-known/oauth-protected-resource" │ - Network accessline 43
401 + WWW-Authenticate: Bearer resource_metadata="https://.../.well-known/oauth-protected-resource" - Network accessline 77
{ "resource": "https://seo.seobuild.md/mcp", - Network accessline 78
"resource": "https://seo.seobuild.md/mcp", - Network accessline 79
"authorization_servers": ["https://seo.seobuild.md"], - Network accessline 89
{ "issuer": "https://seo.seobuild.md", - Network accessline 90
"issuer": "https://seo.seobuild.md", - Network accessline 91
"authorization_endpoint": "https://seo.seobuild.md/oauth/authorize", - Network accessline 92
"token_endpoint": "https://seo.seobuild.md/oauth/token", - Network accessline 93
"registration_endpoint": "https://seo.seobuild.md/oauth/register", - Network accessline 94
"revocation_endpoint": "https://seo.seobuild.md/oauth/revoke", - Network accessline 95
"device_authorization_endpoint": "https://seo.seobuild.md/oauth/device", - Network accessline 224
Over-quota responses must be actionable. `"Trial limit reached: 3 of 3 page generations used. Continue at https://seobuild.md/pricing"` is a sales moment. - Network accessline 225
generations used. Continue at https://seobuild.md/pricing"` is a sales moment.
README.md
- Network accessline 332
git clone https://github.com/gbessoni/seobuild-onpage.git ~/.claude/skills/seobuild-onpage - Network accessline 337
git clone https://github.com/gbessoni/seobuild-onpage.git ~/.codex/skills/seobuild-onpage - Network accessline 342
git clone https://github.com/gbessoni/seobuild-onpage.git ~/.agents/skills/seobuild-onpage - Access to secretsline 373
[Credential-related source omitted] - Network accessline 379
# DataForSEO -- sign up at https://dataforseo.com (~$0.002/query) - Access to secretsline 424
[Credential-related source omitted] - Network accessline 499
Built by [Greg Bessoni](https://github.com/gbessoni) ([@gregbessoni](https://x.com/gregbessoni)).
SPEC.md
fixtures/serp_sample.json
- Network accessline 3
{ "position": 1, "url": "https://example.com/airport-parking-jfk", - Network accessline 4
"position": 1, "url": "https://example.com/airport-parking-jfk", "domain": "example.com", - Network accessline 5
"url": "https://example.com/airport-parking-jfk", - Network accessline 23
{ "position": 2, "url": "https://competitor1.com/jfk-parking", - Network accessline 24
"position": 2, "url": "https://competitor1.com/jfk-parking", "domain": "competitor1.com", - Network accessline 25
"url": "https://competitor1.com/jfk-parking", - Network accessline 42
{ "position": 3, "url": "https://competitor2.com/airports/jfk/parking", - Network accessline 43
"position": 3, "url": "https://competitor2.com/airports/jfk/parking", "domain": "competitor2.com", - Network accessline 44
"url": "https://competitor2.com/airports/jfk/parking",
references/schema-patterns.md
- Network accessline 9
{ "@context": "https://schema.org", - Network accessline 10
"@context": "https://schema.org", - Network accessline 28
{ "@context": "https://schema.org", - Network accessline 29
"@context": "https://schema.org", - Network accessline 31
"name": "Business Name", "description": "What the business does", "url": "https://example.com", - Network accessline 32
"description": "What the business does", "url": "https://example.com", "address": { - Network accessline 33
"url": "https://example.com", - Network accessline 54
{ "@context": "https://schema.org", - Network accessline 55
"@context": "https://schema.org", - Network accessline 72
{ "@context": "https://schema.org", - Network accessline 73
"@context": "https://schema.org", - Network accessline 93
{ "@context": "https://schema.org", - Network accessline 94
"@context": "https://schema.org", - Network accessline 99
"position": 1, "name": "Home", "item": "https://example.com/" - Network accessline 100
"name": "Home", "item": "https://example.com/" }, - Network accessline 101
"item": "https://example.com/" - Network accessline 105
"position": 2, "name": "Category", "item": "https://example.com/category/" - Network accessline 106
"name": "Category", "item": "https://example.com/category/" }, - Network accessline 107
"item": "https://example.com/category/" - Network accessline 131
[ { "@context": "https://schema.org", "@type": "FAQPage", ... }, - Network accessline 132
{ "@context": "https://schema.org", "@type": "FAQPage", ... }, - Network accessline 133
{ "@context": "https://schema.org", "@type": "BreadcrumbList", ... } - Network accessline 139
Always validate generated schema at: - https://search.google.com/test/rich-results - Network accessline 140
- https://search.google.com/test/rich-results - Network accessline 141
- https://validator.schema.org/ - Network accessline 155
<p vocab="https://schema.org/" typeof="Product"> - Network accessline 167
<span vocab="https://schema.org/" typeof="ParkingFacility"> - Network accessline 176
<div itemscope itemtype="https://schema.org/LocalBusiness">
scripts/gsc_pull.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 55
[Credential-related source omitted] - Network accessline 77
req = urllib.request.Request( - Network accessline 79
) try: with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 80
try: with urllib.request.urlopen(req, timeout=timeout) as resp: return resp.status - Network accessline 81
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 166
def parse_args(): parser = argparse.ArgumentParser(description="SEO-AGI GSC Pull") parser.add_argument("site_url", help="GSC site URL (e.g., https://example.com)") - Network accessline 167
parser = argparse.ArgumentParser(description="SEO-AGI GSC Pull") parser.add_argument("site_url", help="GSC site URL (e.g., https://example.com)") parser.add_argument("--keyword", default=None, help="Keyword filter") - Network accessline 168
parser.add_argument("site_url", help="GSC site URL (e.g., https://example.com)") - Access to secretsline 237
[Credential-related source omitted]
scripts/lib/__init__.py
- Executable scriptline 1
Executable file
scripts/lib/dataforseo.py
- Executable scriptline 1
Executable file - Network accessline 16
BASE_URL = "https://api.dataforseo.com/v3" - Network accessline 33
req = urllib.request.Request( - Network accessline 43
try: with urllib.request.urlopen(req, timeout=30) as resp: - Network accessline 44
with urllib.request.urlopen(req, timeout=30) as resp:
scripts/lib/env.py
- Executable scriptline 1
Executable file - Access to secretsline 3
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 103
[Credential-related source omitted]
scripts/lib/gsc_client.py
- Executable scriptline 1
Executable file - Access to secretsline 20
[Credential-related source omitted] - Network accessline 41
creds = service_account.Credentials.from_service_account_file( self.credentials_path, scopes=["https://www.googleapis.com/auth/webmasters.readonly"], - Network accessline 42
self.credentials_path, scopes=["https://www.googleapis.com/auth/webmasters.readonly"], ) - Network accessline 43
scopes=["https://www.googleapis.com/auth/webmasters.readonly"], - Network accessline 64
Args: site_url: The GSC property URL (e.g., "https://example.com") - Network accessline 65
site_url: The GSC property URL (e.g., "https://example.com")
scripts/lib/massive.py
- Executable scriptline 1
Executable file - Network accessline 30
BASE_URL = "https://render.joinmassive.com" - Network accessline 41
qs = urllib.parse.urlencode(params) url = f"{self.BASE_URL}{path}?{qs}" req = urllib.request.Request(url, headers=self._headers()) - Network accessline 42
url = f"{self.BASE_URL}{path}?{qs}" req = urllib.request.Request(url, headers=self._headers()) try: - Network accessline 43
req = urllib.request.Request(url, headers=self._headers()) - Network accessline 44
try: with urllib.request.urlopen(req, timeout=timeout) as resp: return resp.read().decode("utf-8", errors="ignore") - Network accessline 45
with urllib.request.urlopen(req, timeout=timeout) as resp:
scripts/lib/serp_analyze.py
- Executable scriptline 1
Executable file
scripts/research.py
scripts/setup.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 17
[Credential-related source omitted] - Network accessline 64
print("\n--- API Keys ---") print("DataForSEO is REQUIRED. Get credentials at:") print(" https://app.dataforseo.com/api-dashboard\n") - Network accessline 66
print(" https://app.dataforseo.com/api-dashboard\n") - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 116
[Credential-related source omitted]
scripts/tributary_gen.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 20
python3 tributary_gen.py "<keyword>" --money-page=<path-or-url> [--tiers=1] python3 tributary_gen.py "airport parking JFK" --money-page=~/Documents/SEO-AGI/pages/jfk.md python3 tributary_gen.py "best crm 2026" --money-page=https://examp - Network accessline 21
python3 tributary_gen.py "airport parking JFK" --money-page=~/Documents/SEO-AGI/pages/jfk.md python3 tributary_gen.py "best crm 2026" --money-page=https://example.com/best-crm """ - Network accessline 22
python3 tributary_gen.py "best crm 2026" --money-page=https://example.com/best-crm - Network accessline 113
src = source.strip() if src.startswith(("http://", "https://")): req = urllib.request.Request( - Network accessline 114
if src.startswith(("http://", "https://")): req = urllib.request.Request( src, headers={"User-Agent": "seobuild-onpage/1.7.0"} - Network accessline 115
req = urllib.request.Request( - Network accessline 116
src, headers={"User-Agent": "seobuild-onpage/1.7.0"} ) with urllib.request.urlopen(req, timeout=30) as resp: - Network accessline 117
) with urllib.request.urlopen(req, timeout=30) as resp: return resp.read().decode("utf-8", errors="ignore") - Network accessline 118
with urllib.request.urlopen(req, timeout=30) as resp:
tests/test_dataforseo.py
- Executable scriptline 1
Executable file - Network accessline 28
"type": "organic", "rank_absolute": 1, "url": "https://example.com/page", - Network accessline 29
"rank_absolute": 1, "url": "https://example.com/page", "domain": "example.com", - Network accessline 30
"url": "https://example.com/page", - Network accessline 36
"type": "organic", "rank_absolute": 2, "url": "https://other.com/page", - Network accessline 37
"rank_absolute": 2, "url": "https://other.com/page", "domain": "other.com", - Network accessline 38
"url": "https://other.com/page", - Network accessline 58
assert len(result["organic"]) == 2 assert result["organic"][0]["position"] == 1 assert result["organic"][0]["url"] == "https://example.com/page" - Network accessline 59
assert result["organic"][0]["position"] == 1 assert result["organic"][0]["url"] == "https://example.com/page" assert result["organic"][1]["title"] == "Other Page" - Network accessline 60
assert result["organic"][0]["url"] == "https://example.com/page"
tests/test_dataforseo_nullsafe.py
- Executable scriptline 1
Executable file
tests/test_env.py
- Executable scriptline 1
Executable file
tests/test_gsc_ghost_paths.py
- Executable scriptline 1
Executable file - Access to secretsline 22
[Credential-related source omitted] - Network accessline 69
["URL", "Purpose", "Response"], ) out = parse_crawl_stats_csv(path, "https://example.com") - Network accessline 70
) out = parse_crawl_stats_csv(path, "https://example.com") paths = [o["path"] for o in out] - Network accessline 71
out = parse_crawl_stats_csv(path, "https://example.com") - Network accessline 82
def test_csv_handles_absolute_urls_and_alt_headers(): path = _write_csv( [{"Page": "https://example.com/ghost", "Crawl purpose": "Discovery", "Status": "404 Not Found"}], - Network accessline 83
path = _write_csv( [{"Page": "https://example.com/ghost", "Crawl purpose": "Discovery", "Status": "404 Not Found"}], ["Page", "Crawl purpose", "Status"], - Network accessline 84
[{"Page": "https://example.com/ghost", "Crawl purpose": "Discovery", "Status": "404 Not Found"}], - Network accessline 85
["Page", "Crawl purpose", "Status"], ) out = parse_crawl_stats_csv(path, "https://example.com") - Network accessline 86
) out = parse_crawl_stats_csv(path, "https://example.com") assert len(out) == 1 - Network accessline 87
out = parse_crawl_stats_csv(path, "https://example.com") - Network accessline 88
assert len(out) == 1 assert out[0]["url"] == "https://example.com/ghost" assert out[0]["path"] == "/ghost" - Network accessline 89
assert out[0]["url"] == "https://example.com/ghost" - Network accessline 93
def test_csv_empty_returns_empty(): path = _write_csv([], ["URL", "Purpose", "Response"]) assert parse_crawl_stats_csv(path, "https://example.com") == [] - Network accessline 95
assert parse_crawl_stats_csv(path, "https://example.com") == []
tests/test_massive.py
- Executable scriptline 1
Executable file
tests/test_research_v171.py
- Executable scriptline 1
Executable file
tests/test_research_v191.py
- Executable scriptline 1
Executable file - Network accessline 37
def test_normalize_domain_strips_scheme_www_path(): assert _normalize_domain("https://www.example.com/foo/bar") == "example.com" - Network accessline 38
assert _normalize_domain("https://www.example.com/foo/bar") == "example.com" - Network accessline 39
assert _normalize_domain("http://example.com") == "example.com" - Network accessline 40
assert _normalize_domain("https://sub.example.com/x") == "sub.example.com" - Network accessline 97
def test_missing_spokes_keeps_only_same_domain_semantic(): organic = [ {"url": "https://spothero.com/airport/jfk"}, - Network accessline 98
organic = [ {"url": "https://spothero.com/airport/jfk"}, {"url": "https://example.com/page"}, - Network accessline 99
{"url": "https://spothero.com/airport/jfk"}, - Network accessline 100
{"url": "https://example.com/page"}, - Network accessline 103
{ # competitor 1 "links": [ {"text": "JFK Long Term Parking", "url": "https://spothero.com/airport/jfk-lt"}, - Network accessline 104
"links": [ {"text": "JFK Long Term Parking", "url": "https://spothero.com/airport/jfk-lt"}, {"text": "Newark Parking", "url": "https://spothero.com/airport/ewr"}, - Network accessline 105
{"text": "JFK Long Term Parking", "url": "https://spothero.com/airport/jfk-lt"}, - Network accessline 106
{"text": "Newark Parking", "url": "https://spothero.com/airport/ewr"}, - Network accessline 107
{"text": "Contact Us", "url": "https://spothero.com/contact"}, # generic - Network accessline 108
{"text": "Privacy Policy", "url": "https://spothero.com/privacy"}, # generic - Network accessline 109
{"text": "External Partner Site", "url": "https://other.com/partner"}, # external - Network accessline 113
{ # competitor 2 "links": [ {"text": "JFK Long Term Parking", "url": "https://example.com/jfk-long-term"}, - Network accessline 114
"links": [ {"text": "JFK Long Term Parking", "url": "https://example.com/jfk-long-term"}, ] - Network accessline 115
{"text": "JFK Long Term Parking", "url": "https://example.com/jfk-long-term"}, - Network accessline 134
def test_missing_spokes_respects_top_n_competitors(): organic = [{"url": f"https://site{i}.com/"} for i in range(5)] - Network accessline 135
organic = [{"url": f"https://site{i}.com/"} for i in range(5)] - Network accessline 136
content_data = [ {"links": [{"text": "Visible Anchor", "url": "https://site0.com/x"}]}, {"links": [{"text": "Visible Anchor", "url": "https://site1.com/x"}]}, - Network accessline 137
{"links": [{"text": "Visible Anchor", "url": "https://site0.com/x"}]}, - Network accessline 138
{"links": [{"text": "Visible Anchor", "url": "https://site1.com/x"}]}, - Network accessline 139
{"links": [{"text": "Visible Anchor", "url": "https://site2.com/x"}]}, - Network accessline 140
{"links": [{"text": "Hidden Anchor", "url": "https://site3.com/x"}]}, - Network accessline 141
{"links": [{"text": "Hidden Anchor", "url": "https://site4.com/x"}]}, - Network accessline 160
See our [Long Term Parking](https://spothero.com/long-term) page - Network accessline 161
or read about [Cell Phone Lots](https://spothero.com/cell-phone). - Network accessline 163
Skip image: 
tests/test_research_v200.py
- Executable scriptline 1
Executable file - Network accessline 62
{"headings": ["H2: y"], "word_count": 200}, ] organic = [{"url": "https://a.com"}, {"url": "https://b.com"}] - Network accessline 63
] organic = [{"url": "https://a.com"}, {"url": "https://b.com"}] out = flag_deep_nesting(content_data, organic, top_n=3, max_depth=3) - Network accessline 64
organic = [{"url": "https://a.com"}, {"url": "https://b.com"}] - Network accessline 77
{"raw_html": flat}, # depth 2 -> ok ] organic = [{"url": "https://deep.com"}, {"url": "https://flat.com"}] - Network accessline 78
] organic = [{"url": "https://deep.com"}, {"url": "https://flat.com"}] out = flag_deep_nesting(content_data, organic, top_n=3, max_depth=3) - Network accessline 79
organic = [{"url": "https://deep.com"}, {"url": "https://flat.com"}] - Network accessline 82
assert out["assessed_count"] == 2 assert len(out["flagged"]) == 1 assert out["flagged"][0]["url"] == "https://deep.com" - Network accessline 83
assert len(out["flagged"]) == 1 assert out["flagged"][0]["url"] == "https://deep.com" assert out["flagged"][0]["max_depth"] == 6 - Network accessline 84
assert out["flagged"][0]["url"] == "https://deep.com" - Network accessline 94
{"raw_html": deep}, # 4th competitor -- beyond top_n=3 ] organic = [{"url": f"https://s{i}.com"} for i in range(4)] - Network accessline 95
] organic = [{"url": f"https://s{i}.com"} for i in range(4)] out = flag_deep_nesting(content_data, organic, top_n=3, max_depth=3) - Network accessline 96
organic = [{"url": f"https://s{i}.com"} for i in range(4)]
tests/test_research_v220.py
- Executable scriptline 1
Executable file - Network accessline 19
def test_affiliate_block_compliant_when_link_present(): out = build_affiliate_block("https://partner.example.com/ref?id=123") - Network accessline 20
out = build_affiliate_block("https://partner.example.com/ref?id=123") - Network accessline 22
assert out["affiliate_link"] == "https://partner.example.com/ref?id=123" - Network accessline 31
out = build_affiliate_block("https://partner.example.com") - Network accessline 43
def test_affiliate_block_strips_whitespace(): out = build_affiliate_block(" https://x.com/aff ") - Network accessline 44
out = build_affiliate_block(" https://x.com/aff ") - Network accessline 45
assert out["affiliate_link"] == "https://x.com/aff"
tests/test_serp_analyze.py
- Executable scriptline 1
Executable file - Network accessline 99
serp_data = { "organic": [ {"position": 1, "url": "https://a.com", "title": "A", "description": ""}, - Network accessline 100
"organic": [ {"position": 1, "url": "https://a.com", "title": "A", "description": ""}, {"position": 2, "url": "https://b.com", "title": "B", "description": ""}, - Network accessline 101
{"position": 1, "url": "https://a.com", "title": "A", "description": ""}, - Network accessline 102
{"position": 2, "url": "https://b.com", "title": "B", "description": ""},
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 1 fact
- Contacts www.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/gsc_client.py:43High confidence
Signal confidence: 203 facts
- Network access in code of documentationCONNECTOR.md:41Low confidence
- Network access in code of documentationCONNECTOR.md:42Low confidence
- Network access in code of documentationCONNECTOR.md:43Low confidence
- Network access in code of documentationCONNECTOR.md:77Low confidence
- Network access in code of documentationCONNECTOR.md:78Low confidence
- Network access in code of documentationCONNECTOR.md:79Low confidence
- Network access in code of documentationCONNECTOR.md:89Low confidence
- Network access in code of documentationCONNECTOR.md:90Low confidence
- Network access in code of documentationCONNECTOR.md:91Low confidence
- Network access in code of documentationCONNECTOR.md:92Low confidence
- Network access in code of documentationCONNECTOR.md:93Low confidence
- Network access in code of documentationCONNECTOR.md:94Low confidence
- Network access in code of documentationCONNECTOR.md:95Low confidence
- Network access in prose of documentationCONNECTOR.md:224Low confidence
- Network access in prose of documentationCONNECTOR.md:225Low confidence
- Network access in code of documentationREADME.md:332Low confidence
- Network access in code of documentationREADME.md:337Low confidence
- Network access in code of documentationREADME.md:342Low confidence
- Access to secrets in code of documentationREADME.md:373Low confidence
- Network access in code of documentationREADME.md:379Low confidence
- Access to secrets in code of documentationREADME.md:424Low confidence
- Network access in prose of documentationREADME.md:499Low confidence
- Access to secrets in code of documentationSPEC.md:156Low confidence
- Access to secrets in prose of documentationSPEC.md:170Low confidence
- Network access in code of documentationreferences/schema-patterns.md:9Low confidence
- Network access in code of documentationreferences/schema-patterns.md:10Low confidence
- Network access in code of documentationreferences/schema-patterns.md:28Low confidence
- Network access in code of documentationreferences/schema-patterns.md:29Low confidence
- Network access in code of documentationreferences/schema-patterns.md:31Low confidence
- Network access in code of documentationreferences/schema-patterns.md:32Low confidence
- Network access in code of documentationreferences/schema-patterns.md:33Low confidence
- Network access in code of documentationreferences/schema-patterns.md:54Low confidence
- Network access in code of documentationreferences/schema-patterns.md:55Low confidence
- Network access in code of documentationreferences/schema-patterns.md:72Low confidence
- Network access in code of documentationreferences/schema-patterns.md:73Low confidence
- Network access in code of documentationreferences/schema-patterns.md:93Low confidence
- Network access in code of documentationreferences/schema-patterns.md:94Low confidence
- Network access in code of documentationreferences/schema-patterns.md:99Low confidence
- Network access in code of documentationreferences/schema-patterns.md:100Low confidence
- Network access in code of documentationreferences/schema-patterns.md:101Low confidence
- Network access in code of documentationreferences/schema-patterns.md:105Low confidence
- Network access in code of documentationreferences/schema-patterns.md:106Low confidence
- Network access in code of documentationreferences/schema-patterns.md:107Low confidence
- Network access in code of documentationreferences/schema-patterns.md:131Low confidence
- Network access in code of documentationreferences/schema-patterns.md:132Low confidence
- Network access in code of documentationreferences/schema-patterns.md:133Low confidence
- Network access in prose of documentationreferences/schema-patterns.md:139Low confidence
- Network access in prose of documentationreferences/schema-patterns.md:140Low confidence
- Network access in prose of documentationreferences/schema-patterns.md:141Low confidence
- Network access in code of documentationreferences/schema-patterns.md:155Low confidence
and 153 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.