@growthub/cli 0.3.52 → 0.3.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/worker-kits/growthub-geo-seo-v1/.env.example +12 -0
- package/assets/worker-kits/growthub-geo-seo-v1/QUICKSTART.md +138 -0
- package/assets/worker-kits/growthub-geo-seo-v1/brands/NEW-CLIENT.md +104 -0
- package/assets/worker-kits/growthub-geo-seo-v1/brands/_template/brand-kit.md +116 -0
- package/assets/worker-kits/growthub-geo-seo-v1/brands/growthub/brand-kit.md +117 -0
- package/assets/worker-kits/growthub-geo-seo-v1/bundles/growthub-geo-seo-v1.json +54 -0
- package/assets/worker-kits/growthub-geo-seo-v1/docs/geo-seo-fork-integration.md +244 -0
- package/assets/worker-kits/growthub-geo-seo-v1/docs/pdf-report-layer.md +139 -0
- package/assets/worker-kits/growthub-geo-seo-v1/docs/scoring-methodology.md +230 -0
- package/assets/worker-kits/growthub-geo-seo-v1/docs/subagent-dispatch.md +273 -0
- package/assets/worker-kits/growthub-geo-seo-v1/examples/citability-sample.md +155 -0
- package/assets/worker-kits/growthub-geo-seo-v1/examples/geo-audit-sample.md +126 -0
- package/assets/worker-kits/growthub-geo-seo-v1/examples/pdf-report-sample.md +207 -0
- package/assets/worker-kits/growthub-geo-seo-v1/examples/prospect-proposal-sample.md +184 -0
- package/assets/worker-kits/growthub-geo-seo-v1/growthub-meta/README.md +124 -0
- package/assets/worker-kits/growthub-geo-seo-v1/growthub-meta/kit-standard.md +116 -0
- package/assets/worker-kits/growthub-geo-seo-v1/kit.json +102 -0
- package/assets/worker-kits/growthub-geo-seo-v1/output/README.md +114 -0
- package/assets/worker-kits/growthub-geo-seo-v1/output-standards.md +143 -0
- package/assets/worker-kits/growthub-geo-seo-v1/runtime-assumptions.md +175 -0
- package/assets/worker-kits/growthub-geo-seo-v1/setup/check-deps.sh +80 -0
- package/assets/worker-kits/growthub-geo-seo-v1/setup/clone-fork.sh +56 -0
- package/assets/worker-kits/growthub-geo-seo-v1/setup/verify-env.mjs +152 -0
- package/assets/worker-kits/growthub-geo-seo-v1/skills.md +359 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/brand-visibility-report.md +101 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/citability-analysis.md +131 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/client-proposal.md +172 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/content-analysis.md +136 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/crawler-access-report.md +115 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/geo-audit-brief.md +114 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/geo-score-summary.md +113 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/llmstxt-plan.md +173 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/remediation-roadmap.md +150 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/schema-validation.md +177 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/technical-foundations.md +108 -0
- package/assets/worker-kits/growthub-geo-seo-v1/validation-checklist.md +139 -0
- package/assets/worker-kits/growthub-geo-seo-v1/workers/geo-seo-operator/CLAUDE.md +320 -0
- package/package.json +1 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"kit": {
|
|
4
|
+
"id": "growthub-geo-seo-v1",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"name": "Growthub Agent Worker Kit — GEO SEO Studio",
|
|
7
|
+
"description": "Self-contained local execution environment for GEO + SEO auditing using geo-seo-claude. Produces AI search visibility audits, citability scores, crawler access reports, brand mention scans, remediation roadmaps, and client-ready PDF deliverables via 14 specialized commands and 5 parallel subagents.",
|
|
8
|
+
"type": "worker",
|
|
9
|
+
"visibility": "public-open-source",
|
|
10
|
+
"sourceRepo": "growthub-local",
|
|
11
|
+
"family": "studio"
|
|
12
|
+
},
|
|
13
|
+
"entrypoint": {
|
|
14
|
+
"workerId": "geo-seo-operator",
|
|
15
|
+
"path": "workers/geo-seo-operator/CLAUDE.md"
|
|
16
|
+
},
|
|
17
|
+
"workerIds": ["geo-seo-operator"],
|
|
18
|
+
"agentContractPath": "workers/geo-seo-operator/CLAUDE.md",
|
|
19
|
+
"brandTemplatePath": "brands/_template/brand-kit.md",
|
|
20
|
+
"publicExampleBrandPaths": ["brands/growthub/brand-kit.md"],
|
|
21
|
+
"frozenAssetPaths": [
|
|
22
|
+
"QUICKSTART.md",
|
|
23
|
+
".env.example",
|
|
24
|
+
"skills.md",
|
|
25
|
+
"output-standards.md",
|
|
26
|
+
"runtime-assumptions.md",
|
|
27
|
+
"validation-checklist.md",
|
|
28
|
+
"workers/geo-seo-operator/CLAUDE.md",
|
|
29
|
+
"brands/_template/brand-kit.md",
|
|
30
|
+
"brands/growthub/brand-kit.md",
|
|
31
|
+
"brands/NEW-CLIENT.md",
|
|
32
|
+
"setup/clone-fork.sh",
|
|
33
|
+
"setup/verify-env.mjs",
|
|
34
|
+
"setup/check-deps.sh",
|
|
35
|
+
"output/README.md",
|
|
36
|
+
"templates/geo-audit-brief.md",
|
|
37
|
+
"templates/citability-analysis.md",
|
|
38
|
+
"templates/crawler-access-report.md",
|
|
39
|
+
"templates/brand-visibility-report.md",
|
|
40
|
+
"templates/geo-score-summary.md",
|
|
41
|
+
"templates/content-analysis.md",
|
|
42
|
+
"templates/schema-validation.md",
|
|
43
|
+
"templates/technical-foundations.md",
|
|
44
|
+
"templates/llmstxt-plan.md",
|
|
45
|
+
"templates/remediation-roadmap.md",
|
|
46
|
+
"templates/client-proposal.md",
|
|
47
|
+
"examples/geo-audit-sample.md",
|
|
48
|
+
"examples/citability-sample.md",
|
|
49
|
+
"examples/pdf-report-sample.md",
|
|
50
|
+
"examples/prospect-proposal-sample.md",
|
|
51
|
+
"docs/geo-seo-fork-integration.md",
|
|
52
|
+
"docs/subagent-dispatch.md",
|
|
53
|
+
"docs/scoring-methodology.md",
|
|
54
|
+
"docs/pdf-report-layer.md",
|
|
55
|
+
"growthub-meta/README.md",
|
|
56
|
+
"growthub-meta/kit-standard.md"
|
|
57
|
+
],
|
|
58
|
+
"setupPaths": {
|
|
59
|
+
"quickstart": "QUICKSTART.md",
|
|
60
|
+
"envExample": ".env.example",
|
|
61
|
+
"setupDir": "setup/",
|
|
62
|
+
"outputDir": "output/"
|
|
63
|
+
},
|
|
64
|
+
"outputStandard": {
|
|
65
|
+
"type": "working-directory",
|
|
66
|
+
"description": "Exported folder is intended to be pointed at directly by the agent Working Directory. All outputs are Markdown files written to output/<client-slug>/<project-slug>/.",
|
|
67
|
+
"requiredPaths": [
|
|
68
|
+
"QUICKSTART.md",
|
|
69
|
+
".env.example",
|
|
70
|
+
"kit.json",
|
|
71
|
+
"bundles/growthub-geo-seo-v1.json",
|
|
72
|
+
"skills.md",
|
|
73
|
+
"workers/geo-seo-operator/CLAUDE.md",
|
|
74
|
+
"brands/_template/brand-kit.md",
|
|
75
|
+
"brands/growthub/brand-kit.md",
|
|
76
|
+
"brands/NEW-CLIENT.md",
|
|
77
|
+
"setup/clone-fork.sh",
|
|
78
|
+
"setup/verify-env.mjs",
|
|
79
|
+
"setup/check-deps.sh",
|
|
80
|
+
"output/README.md",
|
|
81
|
+
"templates",
|
|
82
|
+
"docs",
|
|
83
|
+
"growthub-meta"
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
"bundles": [
|
|
87
|
+
{
|
|
88
|
+
"id": "growthub-geo-seo-v1",
|
|
89
|
+
"version": "1.0.0",
|
|
90
|
+
"path": "bundles/growthub-geo-seo-v1.json"
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"executionMode": "export",
|
|
94
|
+
"activationModes": ["export"],
|
|
95
|
+
"compatibility": {
|
|
96
|
+
"cliMinVersion": "0.3.50"
|
|
97
|
+
},
|
|
98
|
+
"provenance": {
|
|
99
|
+
"sourceRepo": "growthub-local",
|
|
100
|
+
"frozenAt": "2026-04-14T00:00:00.000Z"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Output Directory
|
|
2
|
+
|
|
3
|
+
All GEO SEO audit artifacts are written here. Each client gets a subdirectory. Each engagement gets a project subdirectory.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Directory Structure
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
output/
|
|
11
|
+
<client-slug>/
|
|
12
|
+
<project-slug>/
|
|
13
|
+
GeoAuditBrief_v1_YYYYMMDD.md
|
|
14
|
+
CitabilityAnalysis_v1_YYYYMMDD.md
|
|
15
|
+
CrawlerAccessReport_v1_YYYYMMDD.md
|
|
16
|
+
BrandVisibilityReport_v1_YYYYMMDD.md
|
|
17
|
+
GeoScoreSummary_v1_YYYYMMDD.md
|
|
18
|
+
ContentAnalysis_v1_YYYYMMDD.md
|
|
19
|
+
SchemaValidation_v1_YYYYMMDD.md
|
|
20
|
+
TechnicalFoundations_v1_YYYYMMDD.md
|
|
21
|
+
LlmstxtPlan_v1_YYYYMMDD.md
|
|
22
|
+
RemediationRoadmap_v1_YYYYMMDD.md
|
|
23
|
+
ClientProposal_v1_YYYYMMDD.md (if requested)
|
|
24
|
+
geo_score_data.json (machine-readable score data for PDF generation)
|
|
25
|
+
<ClientSlug>_GeoScoreReport_v1_YYYYMMDD.pdf (if PDF delivery requested)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## File Naming Convention
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
<ClientSlug>_<OutputType>_v<N>_<YYYYMMDD>.md
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
| Part | Format | Example |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| ClientSlug | TitleCase, no spaces | `GrowthHub` |
|
|
39
|
+
| OutputType | CamelCase artifact type | `GeoScoreSummary` |
|
|
40
|
+
| Version | `v` + integer | `v1`, `v2` |
|
|
41
|
+
| Date | `YYYYMMDD` | `20260414` |
|
|
42
|
+
|
|
43
|
+
Full example: `GrowthHub_GeoScoreSummary_v1_20260414.md`
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Artifact Types (9 Core + 2 Optional)
|
|
48
|
+
|
|
49
|
+
| Artifact | File Name Pattern | Description |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| GEO Audit Brief | `GeoAuditBrief_v<N>_<YYYYMMDD>.md` | Project scope, objective, command plan |
|
|
52
|
+
| Citability Analysis | `CitabilityAnalysis_v<N>_<YYYYMMDD>.md` | 5-metric citability score with component breakdown |
|
|
53
|
+
| Crawler Access Report | `CrawlerAccessReport_v<N>_<YYYYMMDD>.md` | 14 AI crawler permission matrix |
|
|
54
|
+
| Brand Visibility Report | `BrandVisibilityReport_v<N>_<YYYYMMDD>.md` | 8-platform brand mention scan |
|
|
55
|
+
| GEO Score Summary | `GeoScoreSummary_v<N>_<YYYYMMDD>.md` | 6-component weighted composite score |
|
|
56
|
+
| Content Analysis | `ContentAnalysis_v<N>_<YYYYMMDD>.md` | E-E-A-T, answer blocks, statistical density |
|
|
57
|
+
| Schema Validation | `SchemaValidation_v<N>_<YYYYMMDD>.md` | Structured data coverage and errors |
|
|
58
|
+
| Technical Foundations | `TechnicalFoundations_v<N>_<YYYYMMDD>.md` | Server headers, Core Web Vitals signals |
|
|
59
|
+
| llms.txt Plan | `LlmstxtPlan_v<N>_<YYYYMMDD>.md` | llms.txt implementation plan and files |
|
|
60
|
+
| Remediation Roadmap | `RemediationRoadmap_v<N>_<YYYYMMDD>.md` | 4-week sprint plan with owners |
|
|
61
|
+
| Client Proposal | `ClientProposal_v<N>_<YYYYMMDD>.md` | Agency proposal with pricing and ROI |
|
|
62
|
+
| PDF Report | `<ClientSlug>_GeoScoreReport_v<N>_<YYYYMMDD>.pdf` | Branded PDF for stakeholder delivery |
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Usage Notes
|
|
67
|
+
|
|
68
|
+
- **Never edit output files directly.** Always run a new audit and increment the version number.
|
|
69
|
+
- **Version numbering:** Start at v1. Increment on each rescore or significant update.
|
|
70
|
+
- **Rescore tracking:** Compare GEO Score Summary files across versions to track improvement.
|
|
71
|
+
- **Brand kit log:** The operator appends a line to the brand kit's DELIVERABLES LOG after each package is delivered.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Deliverable Tracking Format
|
|
76
|
+
|
|
77
|
+
Append this line to `brands/<client-slug>/brand-kit.md` after each delivery:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
- YYYY-MM-DD | GEO SEO Audit Package v<N> — <Project Name> | output/<client-slug>/<project-slug>/
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Examples:
|
|
84
|
+
```
|
|
85
|
+
- 2026-04-14 | GEO SEO Audit Package v1 — Studio Launch Reference | output/growthub/studio-launch-reference/
|
|
86
|
+
- 2026-05-01 | GEO SEO Audit Package v1 — UrbanCycle Full Audit | output/urban-cycle/full-audit-q2-2026/
|
|
87
|
+
- 2026-05-15 | GEO SEO Audit Package v2 — UrbanCycle Post-Remediation Rescore | output/urban-cycle/rescore-may-2026/
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Example Layout (Populated)
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
output/
|
|
96
|
+
growthub/
|
|
97
|
+
studio-launch-reference/
|
|
98
|
+
GeoAuditBrief_v1_20260414.md
|
|
99
|
+
CitabilityAnalysis_v1_20260414.md
|
|
100
|
+
CrawlerAccessReport_v1_20260414.md
|
|
101
|
+
BrandVisibilityReport_v1_20260414.md
|
|
102
|
+
GeoScoreSummary_v1_20260414.md
|
|
103
|
+
ContentAnalysis_v1_20260414.md
|
|
104
|
+
SchemaValidation_v1_20260414.md
|
|
105
|
+
TechnicalFoundations_v1_20260414.md
|
|
106
|
+
LlmstxtPlan_v1_20260414.md
|
|
107
|
+
RemediationRoadmap_v1_20260414.md
|
|
108
|
+
geo_score_data.json
|
|
109
|
+
GrowthHub_GeoScoreReport_v1_20260414.pdf
|
|
110
|
+
urban-cycle/
|
|
111
|
+
full-audit-q2-2026/
|
|
112
|
+
GeoAuditBrief_v1_20260501.md
|
|
113
|
+
...
|
|
114
|
+
```
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Output Standards
|
|
2
|
+
|
|
3
|
+
**All GEO SEO Operator outputs must meet these standards before being delivered to a client.**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Output Directory Structure
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
output/
|
|
11
|
+
<client-slug>/
|
|
12
|
+
<project-slug>/
|
|
13
|
+
GeoAuditBrief_v<N>_<YYYYMMDD>.md
|
|
14
|
+
CitabilityAnalysis_v<N>_<YYYYMMDD>.md
|
|
15
|
+
CrawlerAccessReport_v<N>_<YYYYMMDD>.md
|
|
16
|
+
BrandVisibilityReport_v<N>_<YYYYMMDD>.md
|
|
17
|
+
GeoScoreSummary_v<N>_<YYYYMMDD>.md
|
|
18
|
+
ContentAnalysis_v<N>_<YYYYMMDD>.md
|
|
19
|
+
SchemaValidation_v<N>_<YYYYMMDD>.md
|
|
20
|
+
TechnicalFoundations_v<N>_<YYYYMMDD>.md
|
|
21
|
+
LlmstxtPlan_v<N>_<YYYYMMDD>.md
|
|
22
|
+
RemediationRoadmap_v<N>_<YYYYMMDD>.md
|
|
23
|
+
ClientProposal_v<N>_<YYYYMMDD>.md (if requested)
|
|
24
|
+
geo_score_data.json (always — powers PDF and rescores)
|
|
25
|
+
<ClientSlug>_GeoScoreReport_v<N>_<YYYYMMDD>.pdf (if PDF requested)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## File Naming Convention
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
<ClientSlug>_<OutputType>_v<N>_<YYYYMMDD>.md
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
| Part | Rules | Example |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| ClientSlug | TitleCase, no spaces, no special chars | `UrbanCycle` |
|
|
39
|
+
| OutputType | CamelCase from the list below | `GeoScoreSummary` |
|
|
40
|
+
| Version | `v` + integer, starting at 1 | `v1` |
|
|
41
|
+
| Date | `YYYYMMDD` format | `20260414` |
|
|
42
|
+
|
|
43
|
+
**Output type names:**
|
|
44
|
+
|
|
45
|
+
| Artifact | OutputType string |
|
|
46
|
+
|---|---|
|
|
47
|
+
| GEO Audit Brief | `GeoAuditBrief` |
|
|
48
|
+
| Citability Analysis | `CitabilityAnalysis` |
|
|
49
|
+
| Crawler Access Report | `CrawlerAccessReport` |
|
|
50
|
+
| Brand Visibility Report | `BrandVisibilityReport` |
|
|
51
|
+
| GEO Score Summary | `GeoScoreSummary` |
|
|
52
|
+
| Content Analysis | `ContentAnalysis` |
|
|
53
|
+
| Schema Validation | `SchemaValidation` |
|
|
54
|
+
| Technical Foundations | `TechnicalFoundations` |
|
|
55
|
+
| llms.txt Plan | `LlmstxtPlan` |
|
|
56
|
+
| Remediation Roadmap | `RemediationRoadmap` |
|
|
57
|
+
| Client Proposal | `ClientProposal` |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Required Sections Per Artifact
|
|
62
|
+
|
|
63
|
+
Each artifact must include all sections from its template. Incomplete sections must be marked `<!-- data-gap: reason -->` — never left blank without explanation.
|
|
64
|
+
|
|
65
|
+
| Artifact | Minimum Required Sections |
|
|
66
|
+
|---|---|
|
|
67
|
+
| GeoAuditBrief | Project Overview table, Audit Objective, Command Selection Plan, Success Criteria |
|
|
68
|
+
| CitabilityAnalysis | URL Audited, Citability Score table, Component Breakdown table, Top 3 Improvements |
|
|
69
|
+
| CrawlerAccessReport | URL Audited, Crawler Permission Matrix (all 14 rows), Summary, Recommended Actions |
|
|
70
|
+
| BrandVisibilityReport | Brand Audited, Platform Scan table (all 8 rows), Brand Authority Score, Gap Analysis |
|
|
71
|
+
| GeoScoreSummary | Overall GEO Score (number + grade), Component Scores table, Score Narrative, Priority Recommendations |
|
|
72
|
+
| ContentAnalysis | E-E-A-T Assessment table, Answer Block Analysis, Self-Containment Check, Content Quality Score |
|
|
73
|
+
| SchemaValidation | Schema Types Found table, Validation Errors table, Missing Recommended Types, Implementation Priority |
|
|
74
|
+
| TechnicalFoundations | Server Headers table, Core Signals table, Technical Score, Critical Fixes |
|
|
75
|
+
| LlmstxtPlan | Current Status, Proposed llms.txt content, Proposed llms-full.txt content, Implementation Steps |
|
|
76
|
+
| RemediationRoadmap | Current vs. Target Score, 4-Week Sprint Plan (all 4 weeks), Estimated Score After Roadmap |
|
|
77
|
+
| ClientProposal | GEO Audit Summary, Why GEO Matters Now, 3 Critical Issues, Recommended Engagement (all 3 tiers), ROI Projection |
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Quality Bar
|
|
82
|
+
|
|
83
|
+
### Data-Grounded
|
|
84
|
+
|
|
85
|
+
- Every score must be derived from actual page data, not estimated without basis
|
|
86
|
+
- If a score cannot be determined (e.g., robots.txt returns 500), use 50 and flag as `data-gap`
|
|
87
|
+
- Never invent a score to complete a section — a flagged gap is more useful than a fabricated number
|
|
88
|
+
|
|
89
|
+
### No Filler
|
|
90
|
+
|
|
91
|
+
- Every sentence must either present data, explain a finding, or specify an action
|
|
92
|
+
- Remove phrases like "This is an important area to consider" — replace with the actual consideration
|
|
93
|
+
- Recommendations must be specific: name the exact robots.txt line, the exact schema type, the exact paragraph to rewrite
|
|
94
|
+
|
|
95
|
+
### Actionable
|
|
96
|
+
|
|
97
|
+
- Every finding must have a corresponding action in the Remediation Roadmap
|
|
98
|
+
- Actions must include: what to do, who should do it, how long it should take, what the expected impact is
|
|
99
|
+
- Code snippets in SchemaValidation must be copy-pasteable
|
|
100
|
+
|
|
101
|
+
### Consistent
|
|
102
|
+
|
|
103
|
+
- All scores in all artifacts must match — the GEO Score in GeoScoreSummary must equal the calculated composite from all component scores
|
|
104
|
+
- Dates must be consistent across all artifacts
|
|
105
|
+
- Client name and URL must match the brand kit exactly
|
|
106
|
+
|
|
107
|
+
### Output Order
|
|
108
|
+
|
|
109
|
+
Artifacts must be produced and numbered in this order:
|
|
110
|
+
|
|
111
|
+
1. GeoAuditBrief
|
|
112
|
+
2. CitabilityAnalysis
|
|
113
|
+
3. CrawlerAccessReport
|
|
114
|
+
4. BrandVisibilityReport
|
|
115
|
+
5. GeoScoreSummary
|
|
116
|
+
6. ContentAnalysis
|
|
117
|
+
7. SchemaValidation
|
|
118
|
+
8. TechnicalFoundations
|
|
119
|
+
9. LlmstxtPlan
|
|
120
|
+
10. RemediationRoadmap
|
|
121
|
+
11. ClientProposal (if requested)
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Versioning Rules
|
|
126
|
+
|
|
127
|
+
| Scenario | Action |
|
|
128
|
+
|---|---|
|
|
129
|
+
| First audit for a client | All files at v1 |
|
|
130
|
+
| Rescore after remediation | Increment all files to v2 (or current version + 1) |
|
|
131
|
+
| Partial update (one artifact revised) | Increment only the revised artifact's version |
|
|
132
|
+
| Major scope change | Start new project-slug, all files at v1 |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## geo_score_data.json
|
|
137
|
+
|
|
138
|
+
This file must always be written to the output directory. It is the machine-readable record of the audit and is required for:
|
|
139
|
+
- PDF generation (`generate_pdf_report.py`)
|
|
140
|
+
- Rescore comparison (load v1 data, compare to v2)
|
|
141
|
+
- CRM dashboard import (`crm_dashboard.py`)
|
|
142
|
+
|
|
143
|
+
See `examples/pdf-report-sample.md` for the complete format.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Runtime Assumptions
|
|
2
|
+
|
|
3
|
+
**Frozen at kit creation: 2026-04-14. Update this file when upstream fork behavior changes.**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Execution Mode Overview
|
|
8
|
+
|
|
9
|
+
| Mode | Requirements | Fork Used? | Python Scripts? | PDF? | Accuracy |
|
|
10
|
+
|---|---|---|---|---|---|
|
|
11
|
+
| `local-fork` | Python 3.8+, Playwright, geo-seo-claude clone | Yes | Yes | Yes | Highest |
|
|
12
|
+
| `agent-only` | Nothing (Claude Code only) | No | No | No | Good |
|
|
13
|
+
| `hybrid` | ANTHROPIC_API_KEY + fork | Yes | Yes | Yes | Highest |
|
|
14
|
+
|
|
15
|
+
### Choosing a Mode
|
|
16
|
+
|
|
17
|
+
- **Use `local-fork`** when you need the most accurate citability scores (Python parser), real Playwright-rendered page content, or PDF output.
|
|
18
|
+
- **Use `agent-only`** when the fork is not installed or when speed matters more than exact precision. All outputs are still produced using the same templates and formulas.
|
|
19
|
+
- **Use `hybrid`** when you want agent reasoning layer on top of Python data collection — useful for complex competitor comparisons or detailed content rewrites.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## geo-seo-claude Upstream Assumptions
|
|
24
|
+
|
|
25
|
+
These are the assumptions frozen at kit creation time about the `geo-seo-claude` fork at https://github.com/zubair-trabzada/geo-seo-claude.
|
|
26
|
+
|
|
27
|
+
### Python Environment
|
|
28
|
+
|
|
29
|
+
| Requirement | Value | Notes |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Python version | 3.8+ | Tested on 3.10 and 3.11 |
|
|
32
|
+
| Package manager | pip | `pip install -r requirements.txt` |
|
|
33
|
+
| Key dependencies | BeautifulSoup4, Playwright, ReportLab, Flask, Rich, validators | See requirements.txt |
|
|
34
|
+
| Playwright browser | chromium | `playwright install chromium` |
|
|
35
|
+
|
|
36
|
+
### 14 CLI Skills (Commands)
|
|
37
|
+
|
|
38
|
+
All 14 `/geo` commands are available in `skills/` directory:
|
|
39
|
+
|
|
40
|
+
| Command | File | Status |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `/geo audit` | `skills/audit.md` | Available |
|
|
43
|
+
| `/geo citability` | `skills/citability.md` | Available |
|
|
44
|
+
| `/geo crawlers` | `skills/crawlers.md` | Available |
|
|
45
|
+
| `/geo brands` | `skills/brands.md` | Available |
|
|
46
|
+
| `/geo report` | `skills/report.md` | Available |
|
|
47
|
+
| `/geo report-pdf` | `skills/report-pdf.md` | Available |
|
|
48
|
+
| `/geo content` | `skills/content.md` | Available |
|
|
49
|
+
| `/geo schema` | `skills/schema.md` | Available |
|
|
50
|
+
| `/geo technical` | `skills/technical.md` | Available |
|
|
51
|
+
| `/geo llmstxt` | `skills/llmstxt.md` | Available |
|
|
52
|
+
| `/geo quick` | `skills/quick.md` | Available |
|
|
53
|
+
| `/geo proposal` | `skills/proposal.md` | Available |
|
|
54
|
+
| `/geo prospect` | `skills/prospect.md` | Available |
|
|
55
|
+
| `/geo compare` | `skills/compare.md` | Available |
|
|
56
|
+
|
|
57
|
+
### 5 Parallel Subagents
|
|
58
|
+
|
|
59
|
+
All 5 subagent definitions are in `agents/` directory:
|
|
60
|
+
|
|
61
|
+
| Subagent | File | Weight |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| geo-ai-visibility | `agents/geo-ai-visibility.md` | 25% |
|
|
64
|
+
| geo-content | `agents/geo-content.md` | 20% |
|
|
65
|
+
| geo-platform-analysis | `agents/geo-platform-analysis.md` | 10% |
|
|
66
|
+
| geo-schema | `agents/geo-schema.md` | 10% |
|
|
67
|
+
| geo-technical | `agents/geo-technical.md` | 15% |
|
|
68
|
+
|
|
69
|
+
### Key Python Scripts
|
|
70
|
+
|
|
71
|
+
| Script | Path in Fork | Purpose |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| fetch_page.py | `scripts/fetch_page.py` | Playwright-based page fetcher |
|
|
74
|
+
| citability_scorer.py | `scripts/citability_scorer.py` | 5-metric citability algorithm |
|
|
75
|
+
| brand_scanner.py | `scripts/brand_scanner.py` | 8-platform brand mention scanner |
|
|
76
|
+
| generate_pdf_report.py | `scripts/generate_pdf_report.py` | ReportLab PDF generator |
|
|
77
|
+
| llmstxt_generator.py | `scripts/llmstxt_generator.py` | llms.txt generator |
|
|
78
|
+
| crm_dashboard.py | `scripts/crm_dashboard.py` | Flask CRM dashboard |
|
|
79
|
+
|
|
80
|
+
### Schema Templates
|
|
81
|
+
|
|
82
|
+
6 JSON-LD templates in `schema/` directory:
|
|
83
|
+
|
|
84
|
+
| Template | Type |
|
|
85
|
+
|---|---|
|
|
86
|
+
| organization.json | Organization |
|
|
87
|
+
| article.json | Article |
|
|
88
|
+
| faqpage.json | FAQPage |
|
|
89
|
+
| product.json | Product |
|
|
90
|
+
| localbusiness.json | LocalBusiness |
|
|
91
|
+
| breadcrumblist.json | BreadcrumbList |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Execution Surface Flows
|
|
96
|
+
|
|
97
|
+
### Local-Fork Mode
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
User request → Environment gate (Step 0)
|
|
101
|
+
↓
|
|
102
|
+
Read skills.md + brand kit (Step 1)
|
|
103
|
+
↓
|
|
104
|
+
Read runtime docs (Step 2)
|
|
105
|
+
↓
|
|
106
|
+
Inspect fork: README, skills/, agents/, scripts/ (Step 3)
|
|
107
|
+
↓
|
|
108
|
+
3-question gate (Step 4)
|
|
109
|
+
↓
|
|
110
|
+
Select /geo command (Step 5)
|
|
111
|
+
↓
|
|
112
|
+
Phase 1: python fetch_page.py <url> → phase1_data.json (Step 6)
|
|
113
|
+
↓
|
|
114
|
+
Phase 2: 5 subagents in parallel → component scores (Step 7)
|
|
115
|
+
↓
|
|
116
|
+
GEO Score synthesis → composite score (Step 8)
|
|
117
|
+
↓
|
|
118
|
+
Artifact package: 9–11 Markdown files (Step 9)
|
|
119
|
+
↓ (if PDF requested)
|
|
120
|
+
python generate_pdf_report.py --input geo_score_data.json (Step 9)
|
|
121
|
+
↓
|
|
122
|
+
Log deliverable → brand kit DELIVERABLES LOG (Step 10)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Agent-Only Mode
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
User request → Environment gate (Step 0 — confirm agent-only)
|
|
129
|
+
↓
|
|
130
|
+
Read skills.md + brand kit (Step 1)
|
|
131
|
+
↓
|
|
132
|
+
Read runtime docs (Step 2)
|
|
133
|
+
↓
|
|
134
|
+
Skip fork inspection (Step 3 — N/A)
|
|
135
|
+
↓
|
|
136
|
+
3-question gate (Step 4)
|
|
137
|
+
↓
|
|
138
|
+
Select /geo command (Step 5)
|
|
139
|
+
↓
|
|
140
|
+
Phase 1: fetch page via Claude built-in fetch → parse manually (Step 6)
|
|
141
|
+
↓
|
|
142
|
+
Phase 2: 5 subagents via Claude reasoning → component scores (Step 7)
|
|
143
|
+
↓
|
|
144
|
+
GEO Score synthesis → composite score (Step 8)
|
|
145
|
+
↓
|
|
146
|
+
Artifact package: 9–11 Markdown files + geo_score_data.json (Step 9)
|
|
147
|
+
↓ (PDF not available — note Markdown equivalent)
|
|
148
|
+
Log deliverable → brand kit DELIVERABLES LOG (Step 10)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Output Assumption
|
|
154
|
+
|
|
155
|
+
All outputs are Markdown files written to:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
output/<client-slug>/<project-slug>/
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The operator does not write directly to client systems. Outputs are produced locally and then shared with clients via the agreed delivery channel.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Flask CRM Dashboard Assumption
|
|
166
|
+
|
|
167
|
+
The CRM dashboard (`crm_dashboard.py`) runs as a separate process. It is not started automatically during an audit session.
|
|
168
|
+
|
|
169
|
+
To launch manually from the fork directory:
|
|
170
|
+
```bash
|
|
171
|
+
python scripts/crm_dashboard.py
|
|
172
|
+
# Accessible at http://localhost:5000 (or FLASK_PORT if set)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The dashboard reads from the `output/` directory and displays audit history across all clients.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# check-deps.sh — Verify dependencies for geo-seo-claude local-fork workflows
|
|
3
|
+
# Usage: bash setup/check-deps.sh
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
PASS=0
|
|
7
|
+
FAIL=0
|
|
8
|
+
|
|
9
|
+
check() {
|
|
10
|
+
local name="$1" cmd="$2" hint="$3"
|
|
11
|
+
if command -v "$cmd" >/dev/null 2>&1; then
|
|
12
|
+
echo "OK $name ($(command -v $cmd))"
|
|
13
|
+
PASS=$((PASS+1))
|
|
14
|
+
else
|
|
15
|
+
echo "MISS $name — $hint"
|
|
16
|
+
FAIL=$((FAIL+1))
|
|
17
|
+
fi
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
echo "=== Growthub GEO SEO Studio — Dependency Check ==="
|
|
21
|
+
echo ""
|
|
22
|
+
|
|
23
|
+
check "python3" "python3" "https://python.org — install Python 3.8+"
|
|
24
|
+
check "pip" "pip" "Comes with Python — try: python3 -m pip"
|
|
25
|
+
check "playwright" "playwright" "pip install playwright && playwright install chromium"
|
|
26
|
+
check "git" "git" "https://git-scm.com"
|
|
27
|
+
check "node" "node" "https://nodejs.org — required for setup/verify-env.mjs"
|
|
28
|
+
|
|
29
|
+
echo ""
|
|
30
|
+
|
|
31
|
+
# Check Python version is 3.8+
|
|
32
|
+
if command -v python3 >/dev/null 2>&1; then
|
|
33
|
+
PY_VERSION=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
|
|
34
|
+
PY_MAJOR=$(python3 -c "import sys; print(sys.version_info.major)")
|
|
35
|
+
PY_MINOR=$(python3 -c "import sys; print(sys.version_info.minor)")
|
|
36
|
+
if [ "$PY_MAJOR" -ge 3 ] && [ "$PY_MINOR" -ge 8 ]; then
|
|
37
|
+
echo "OK Python version: $PY_VERSION (3.8+ required)"
|
|
38
|
+
PASS=$((PASS+1))
|
|
39
|
+
else
|
|
40
|
+
echo "MISS Python version: $PY_VERSION — geo-seo-claude requires Python 3.8+"
|
|
41
|
+
FAIL=$((FAIL+1))
|
|
42
|
+
fi
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# Check Playwright chromium is installed (not just the CLI)
|
|
46
|
+
if command -v playwright >/dev/null 2>&1; then
|
|
47
|
+
if playwright browsers 2>/dev/null | grep -q "chromium"; then
|
|
48
|
+
echo "OK Playwright chromium browser installed"
|
|
49
|
+
PASS=$((PASS+1))
|
|
50
|
+
else
|
|
51
|
+
echo "MISS Playwright chromium browser not found — run: playwright install chromium"
|
|
52
|
+
FAIL=$((FAIL+1))
|
|
53
|
+
fi
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
# Check for the fork directory
|
|
57
|
+
FORK_DIR="${GEO_SEO_FORK_PATH:-$HOME/geo-seo-claude}"
|
|
58
|
+
if [ -d "$FORK_DIR" ]; then
|
|
59
|
+
echo "OK geo-seo-claude fork at $FORK_DIR"
|
|
60
|
+
PASS=$((PASS+1))
|
|
61
|
+
else
|
|
62
|
+
echo "MISS geo-seo-claude fork not found at $FORK_DIR"
|
|
63
|
+
echo " Run: bash setup/clone-fork.sh"
|
|
64
|
+
echo " Or set GEO_SEO_FORK_PATH to your fork path in .env"
|
|
65
|
+
FAIL=$((FAIL+1))
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
echo ""
|
|
69
|
+
echo "Passed: $PASS | Missing: $FAIL"
|
|
70
|
+
|
|
71
|
+
if [ "$FAIL" -gt 0 ]; then
|
|
72
|
+
echo ""
|
|
73
|
+
echo "Install missing dependencies before running local-fork workflows."
|
|
74
|
+
echo "Agent-only mode (no fork required) is always available as a fallback."
|
|
75
|
+
exit 1
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
echo ""
|
|
79
|
+
echo "All dependencies present. Local-fork mode is ready."
|
|
80
|
+
echo "Next: node setup/verify-env.mjs"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# clone-fork.sh — Clone geo-seo-claude and install dependencies
|
|
3
|
+
# Usage: bash setup/clone-fork.sh
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
FORK_DIR="${GEO_SEO_FORK_PATH:-$HOME/geo-seo-claude}"
|
|
7
|
+
REPO_URL="https://github.com/zubair-trabzada/geo-seo-claude"
|
|
8
|
+
|
|
9
|
+
echo "=== Growthub GEO SEO Studio — Fork Setup ==="
|
|
10
|
+
echo ""
|
|
11
|
+
|
|
12
|
+
if [ -d "$FORK_DIR" ]; then
|
|
13
|
+
echo "Fork already exists at $FORK_DIR — skipping clone."
|
|
14
|
+
echo "To re-clone, remove the directory first: rm -rf $FORK_DIR"
|
|
15
|
+
else
|
|
16
|
+
echo "Cloning geo-seo-claude → $FORK_DIR"
|
|
17
|
+
git clone "$REPO_URL" "$FORK_DIR"
|
|
18
|
+
echo "Clone complete."
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo ""
|
|
22
|
+
echo "Installing Python dependencies..."
|
|
23
|
+
cd "$FORK_DIR"
|
|
24
|
+
pip install -r requirements.txt
|
|
25
|
+
echo "Python dependencies installed."
|
|
26
|
+
|
|
27
|
+
echo ""
|
|
28
|
+
echo "Installing Playwright browsers..."
|
|
29
|
+
playwright install chromium
|
|
30
|
+
echo "Playwright chromium installed."
|
|
31
|
+
|
|
32
|
+
echo ""
|
|
33
|
+
echo "Verifying key scripts..."
|
|
34
|
+
SCRIPTS_OK=0
|
|
35
|
+
for script in fetch_page.py citability_scorer.py brand_scanner.py generate_pdf_report.py llmstxt_generator.py; do
|
|
36
|
+
if [ -f "scripts/$script" ]; then
|
|
37
|
+
echo " OK scripts/$script"
|
|
38
|
+
else
|
|
39
|
+
echo " MISS scripts/$script — may not exist in this fork version"
|
|
40
|
+
SCRIPTS_OK=1
|
|
41
|
+
fi
|
|
42
|
+
done
|
|
43
|
+
|
|
44
|
+
echo ""
|
|
45
|
+
if [ "$SCRIPTS_OK" -eq 0 ]; then
|
|
46
|
+
echo "geo-seo-claude is ready at $FORK_DIR"
|
|
47
|
+
else
|
|
48
|
+
echo "geo-seo-claude cloned at $FORK_DIR — some scripts may be missing."
|
|
49
|
+
echo "Check the fork's README for the correct script paths."
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
echo ""
|
|
53
|
+
echo "Quick test:"
|
|
54
|
+
echo " python $FORK_DIR/scripts/fetch_page.py https://example.com"
|
|
55
|
+
echo ""
|
|
56
|
+
echo "Run the GEO audit operator by pointing Claude Code at this kit."
|