dfseo 1.0.0__tar.gz
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.
- dfseo-1.0.0/.github/workflows/publish.yml +21 -0
- dfseo-1.0.0/.gitignore +9 -0
- dfseo-1.0.0/Dfseo-CLI-openclaw-skill.md +524 -0
- dfseo-1.0.0/Dfseo-agent-plan.md +457 -0
- dfseo-1.0.0/LICENSE +21 -0
- dfseo-1.0.0/MANIFEST.in +8 -0
- dfseo-1.0.0/PKG-INFO +252 -0
- dfseo-1.0.0/PYPI-TODO.md +108 -0
- dfseo-1.0.0/README.md +214 -0
- dfseo-1.0.0/SKILL.md +656 -0
- dfseo-1.0.0/dfseo-CLI spec.md +560 -0
- dfseo-1.0.0/dfseo-CLI-landing-brief.md +557 -0
- dfseo-1.0.0/dfseo-CLI-pypi-brief.md +347 -0
- dfseo-1.0.0/dfseo-CLI-spec-v1.1.md +750 -0
- dfseo-1.0.0/dfseo-CLI-spec-v1.2.md +804 -0
- dfseo-1.0.0/dfseo-CLI-spec-v1.3.md +745 -0
- dfseo-1.0.0/pyproject.toml +82 -0
- dfseo-1.0.0/src/dfseo/__init__.py +3 -0
- dfseo-1.0.0/src/dfseo/banner.py +85 -0
- dfseo-1.0.0/src/dfseo/cli.py +81 -0
- dfseo-1.0.0/src/dfseo/client.py +466 -0
- dfseo-1.0.0/src/dfseo/commands/__init__.py +1 -0
- dfseo-1.0.0/src/dfseo/commands/auth.py +86 -0
- dfseo-1.0.0/src/dfseo/commands/backlinks.py +1661 -0
- dfseo-1.0.0/src/dfseo/commands/backlinks.py.bak +1450 -0
- dfseo-1.0.0/src/dfseo/commands/config.py +90 -0
- dfseo-1.0.0/src/dfseo/commands/describe.py +629 -0
- dfseo-1.0.0/src/dfseo/commands/keywords.py +1862 -0
- dfseo-1.0.0/src/dfseo/commands/keywords.py.bak +1631 -0
- dfseo-1.0.0/src/dfseo/commands/serp.py +546 -0
- dfseo-1.0.0/src/dfseo/commands/site.py +2085 -0
- dfseo-1.0.0/src/dfseo/commands/site.py.bak +2012 -0
- dfseo-1.0.0/src/dfseo/config.py +198 -0
- dfseo-1.0.0/src/dfseo/models.py +105 -0
- dfseo-1.0.0/src/dfseo/output.py +409 -0
- dfseo-1.0.0/src/dfseo/polling.py +245 -0
- dfseo-1.0.0/src/dfseo/pricing.py +125 -0
- dfseo-1.0.0/src/dfseo/validation.py +240 -0
- dfseo-1.0.0/tests/__init__.py +1 -0
- dfseo-1.0.0/tests/fixtures/auth_error_response.json +10 -0
- dfseo-1.0.0/tests/fixtures/bing_serp_response.json +101 -0
- dfseo-1.0.0/tests/fixtures/google_ads_suggestions_response.json +51 -0
- dfseo-1.0.0/tests/fixtures/google_ads_volume_response.json +57 -0
- dfseo-1.0.0/tests/fixtures/google_serp_response.json +206 -0
- dfseo-1.0.0/tests/fixtures/insufficient_balance_response.json +10 -0
- dfseo-1.0.0/tests/fixtures/keyword_difficulty_response.json +49 -0
- dfseo-1.0.0/tests/fixtures/keyword_suggestions_response.json +86 -0
- dfseo-1.0.0/tests/fixtures/keyword_volume_response.json +86 -0
- dfseo-1.0.0/tests/fixtures/keywords_for_site_response.json +58 -0
- dfseo-1.0.0/tests/fixtures/languages_response.json +91 -0
- dfseo-1.0.0/tests/fixtures/locations_response.json +136 -0
- dfseo-1.0.0/tests/fixtures/rate_limit_response.json +10 -0
- dfseo-1.0.0/tests/fixtures/search_intent_response.json +55 -0
- dfseo-1.0.0/tests/fixtures/user_data_response.json +50 -0
- dfseo-1.0.0/tests/fixtures/youtube_serp_response.json +87 -0
- dfseo-1.0.0/tests/test_backlinks.py +259 -0
- dfseo-1.0.0/tests/test_client.py +462 -0
- dfseo-1.0.0/tests/test_keywords.py +661 -0
- dfseo-1.0.0/tests/test_serp.py +508 -0
- dfseo-1.0.0/tests/test_site.py +273 -0
- dfseo-1.0.0/uv.lock +1023 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
id-token: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
publish:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
environment: pypi
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
- run: pip install build
|
|
20
|
+
- run: python -m build
|
|
21
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
dfseo-1.0.0/.gitignore
ADDED
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
# dfseo-cli β OpenClaw Skill Integration Brief
|
|
2
|
+
|
|
3
|
+
> Brief per Claude Code β Pubblicazione come skill OpenClaw
|
|
4
|
+
> Autore: Ricc | Data: Marzo 2026
|
|
5
|
+
> Prerequisito: dfseo-cli installato e funzionante
|
|
6
|
+
|
|
7
|
+
-----
|
|
8
|
+
|
|
9
|
+
## Obiettivo
|
|
10
|
+
|
|
11
|
+
Creare una skill OpenClaw completa per `dfseo-cli` che permetta a qualsiasi agente OpenClaw di fare SEO research, keyword analysis, site audit e backlink analysis in autonomia.
|
|
12
|
+
|
|
13
|
+
La skill deve essere:
|
|
14
|
+
|
|
15
|
+
1. Installabile da ClawHub (`clawhub install dfseo`)
|
|
16
|
+
1. Installabile manualmente copiando la cartella in `~/.openclaw/skills/`
|
|
17
|
+
1. Completa di riferimenti per ogni command group
|
|
18
|
+
|
|
19
|
+
-----
|
|
20
|
+
|
|
21
|
+
## Struttura cartella skill
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
dfseo/
|
|
25
|
+
βββ SKILL.md # Main skill file (frontmatter + istruzioni)
|
|
26
|
+
βββ references/
|
|
27
|
+
β βββ serp.md # Reference completo comandi SERP
|
|
28
|
+
β βββ keywords.md # Reference completo comandi Keywords
|
|
29
|
+
β βββ site.md # Reference completo comandi Site Audit
|
|
30
|
+
β βββ backlinks.md # Reference completo comandi Backlinks
|
|
31
|
+
βββ examples/
|
|
32
|
+
β βββ keyword-research.md # Workflow: keyword research completo
|
|
33
|
+
β βββ competitor-audit.md # Workflow: audit competitor
|
|
34
|
+
β βββ link-building.md # Workflow: trovare opportunitΓ link building
|
|
35
|
+
βββ scripts/
|
|
36
|
+
βββ install.sh # Script di installazione (pip install dfseo)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
-----
|
|
40
|
+
|
|
41
|
+
## SKILL.md β File principale
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
---
|
|
45
|
+
name: dfseo
|
|
46
|
+
description: "SEO data from the terminal using DataForSEO APIs. Use when the user asks to check keyword rankings, analyze SERPs, run site audits, check backlink profiles, find keyword opportunities, compare competitors, do link gap analysis, check keyword difficulty or search volume, audit on-page SEO, or get Lighthouse scores. Triggers on: 'SEO', 'SERP', 'keyword research', 'backlinks', 'site audit', 'keyword difficulty', 'search volume', 'link building', 'competitor analysis', 'on-page SEO', 'Lighthouse', 'keyword ranking', 'referring domains', 'anchor text'."
|
|
47
|
+
metadata:
|
|
48
|
+
openclaw:
|
|
49
|
+
emoji: "π"
|
|
50
|
+
requires:
|
|
51
|
+
bins:
|
|
52
|
+
- dfseo
|
|
53
|
+
env:
|
|
54
|
+
- DATAFORSEO_LOGIN
|
|
55
|
+
- DATAFORSEO_PASSWORD
|
|
56
|
+
install:
|
|
57
|
+
- id: pip
|
|
58
|
+
kind: pip
|
|
59
|
+
package: dfseo
|
|
60
|
+
bins:
|
|
61
|
+
- dfseo
|
|
62
|
+
label: "Install dfseo CLI (pip)"
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
# dfseo-cli β SEO Data from Your Terminal
|
|
66
|
+
|
|
67
|
+
A CLI tool wrapping DataForSEO APIs. 43 commands for SERP analysis, keyword research, site audits, and backlink analysis. All output is JSON by default (machine-readable). Add `--output table` for human-readable format.
|
|
68
|
+
|
|
69
|
+
## Authentication
|
|
70
|
+
|
|
71
|
+
Requires DataForSEO API credentials. Set them as environment variables:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
export DATAFORSEO_LOGIN="your@email.com"
|
|
75
|
+
export DATAFORSEO_PASSWORD="your_api_password"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Or run `dfseo auth setup` for interactive configuration (saves to `~/.config/dfseo/config.toml`).
|
|
79
|
+
|
|
80
|
+
Verify with: `dfseo auth status`
|
|
81
|
+
|
|
82
|
+
## Quick Reference
|
|
83
|
+
|
|
84
|
+
### SERP Analysis
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Google SERP for any keyword + location
|
|
88
|
+
dfseo serp google "keyword" --location "Country" --language "Language"
|
|
89
|
+
|
|
90
|
+
# Compare Google vs Bing
|
|
91
|
+
dfseo serp compare "keyword" --engines google,bing
|
|
92
|
+
|
|
93
|
+
# YouTube results
|
|
94
|
+
dfseo serp youtube "keyword"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Keyword Research
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Volume, CPC, difficulty, search intent
|
|
101
|
+
dfseo keywords volume "kw1" "kw2" --location "Country" --include-serp-info
|
|
102
|
+
|
|
103
|
+
# Long-tail suggestions
|
|
104
|
+
dfseo keywords suggestions "seed keyword" --min-volume 100 --max-difficulty 40
|
|
105
|
+
|
|
106
|
+
# Semantically related keywords
|
|
107
|
+
dfseo keywords ideas "seed1" "seed2" --limit 100
|
|
108
|
+
|
|
109
|
+
# Bulk difficulty check (up to 1000)
|
|
110
|
+
dfseo keywords difficulty "kw1" "kw2" "kw3"
|
|
111
|
+
# Or from file:
|
|
112
|
+
dfseo keywords difficulty --from-file keywords.txt
|
|
113
|
+
|
|
114
|
+
# Keywords a domain ranks for
|
|
115
|
+
dfseo keywords for-site "domain.com" --min-volume 50 --sort volume
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Site Audit
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Full audit (crawl + wait + summary)
|
|
122
|
+
dfseo site audit "domain.com" --max-pages 100 --wait
|
|
123
|
+
|
|
124
|
+
# Quick single-page check
|
|
125
|
+
dfseo site audit "https://domain.com/page" --max-pages 1
|
|
126
|
+
|
|
127
|
+
# Drill down after audit
|
|
128
|
+
dfseo site pages "$TASK_ID" --errors-only
|
|
129
|
+
dfseo site links "$TASK_ID" --type broken
|
|
130
|
+
dfseo site duplicates "$TASK_ID" --type title
|
|
131
|
+
|
|
132
|
+
# Lighthouse performance
|
|
133
|
+
dfseo site lighthouse "https://domain.com" --categories performance --wait
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Backlink Analysis
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Backlink profile summary
|
|
140
|
+
dfseo backlinks summary "domain.com"
|
|
141
|
+
|
|
142
|
+
# List backlinks (new, lost, broken)
|
|
143
|
+
dfseo backlinks list "domain.com" --dofollow-only --sort rank
|
|
144
|
+
dfseo backlinks list "domain.com" --status new
|
|
145
|
+
dfseo backlinks list "domain.com" --status lost
|
|
146
|
+
|
|
147
|
+
# Anchor text analysis
|
|
148
|
+
dfseo backlinks anchors "domain.com" --search "brand" --sort backlinks
|
|
149
|
+
|
|
150
|
+
# Link gap: who links to competitors but not to you
|
|
151
|
+
dfseo backlinks gap "your-site.com" "competitor1.com" "competitor2.com"
|
|
152
|
+
|
|
153
|
+
# Bulk rank comparison (up to 1000 domains)
|
|
154
|
+
dfseo backlinks bulk ranks "site1.com" "site2.com" "site3.com"
|
|
155
|
+
dfseo backlinks bulk ranks --from-file domains.txt
|
|
156
|
+
|
|
157
|
+
# Historical backlink data (since 2019)
|
|
158
|
+
dfseo backlinks history "domain.com" --from 2024-01 --to 2026-03
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Output Conventions
|
|
162
|
+
|
|
163
|
+
- **Default output: JSON on stdout** β always parseable, no decorative text
|
|
164
|
+
- **Errors and progress: stderr** β never mixed with results
|
|
165
|
+
- **`--output table`** β human-readable formatted tables
|
|
166
|
+
- **`--output csv`** β for spreadsheets and data pipelines
|
|
167
|
+
- **`-q` / `--quiet`** β suppress everything except the result
|
|
168
|
+
|
|
169
|
+
Exit codes: 0 = success, 1 = error, 2 = auth failed, 3 = rate limited, 4 = bad params, 5 = insufficient funds.
|
|
170
|
+
|
|
171
|
+
## Common Patterns
|
|
172
|
+
|
|
173
|
+
### Keyword research workflow
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# 1. Get seed keyword data
|
|
177
|
+
dfseo keywords volume "email hosting" --location "Italy" --language "Italian" --include-serp-info
|
|
178
|
+
|
|
179
|
+
# 2. Expand with suggestions
|
|
180
|
+
dfseo keywords suggestions "email hosting" --min-volume 50 --max-difficulty 40 --limit 50
|
|
181
|
+
|
|
182
|
+
# 3. Check difficulty for best candidates
|
|
183
|
+
dfseo keywords difficulty "email hosting professionale" "hosting email aziendale" --location "Italy"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Competitor analysis workflow
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# 1. Check competitor SERP presence
|
|
190
|
+
dfseo serp google "target keyword" --location "Italy" --depth 100
|
|
191
|
+
|
|
192
|
+
# 2. Find their keywords
|
|
193
|
+
dfseo keywords for-site "competitor.com" --location "Italy" --min-volume 100
|
|
194
|
+
|
|
195
|
+
# 3. Analyze their backlinks
|
|
196
|
+
dfseo backlinks summary "competitor.com"
|
|
197
|
+
|
|
198
|
+
# 4. Find link gap opportunities
|
|
199
|
+
dfseo backlinks gap "your-site.com" "competitor.com" --min-rank 200
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Site health check
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
# 1. Full audit
|
|
206
|
+
dfseo site audit "domain.com" --max-pages 200 --wait
|
|
207
|
+
|
|
208
|
+
# 2. Performance check
|
|
209
|
+
dfseo site lighthouse "https://domain.com" --wait
|
|
210
|
+
|
|
211
|
+
# 3. Check for broken links
|
|
212
|
+
dfseo site links "$TASK_ID" --type broken
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Service References
|
|
216
|
+
|
|
217
|
+
For detailed command documentation, load the specific reference file:
|
|
218
|
+
|
|
219
|
+
- **SERP commands** β See <references/serp.md>
|
|
220
|
+
- **Keywords commands** β See <references/keywords.md>
|
|
221
|
+
- **Site Audit commands** β See <references/site.md>
|
|
222
|
+
- **Backlinks commands** β See <references/backlinks.md>
|
|
223
|
+
|
|
224
|
+
## Important Notes
|
|
225
|
+
|
|
226
|
+
- Site audits are async: `dfseo site audit` with `--wait` blocks until crawl completes. Without `--wait`, it returns a task_id for later retrieval.
|
|
227
|
+
- Google Ads endpoints (`keywords ads-volume`, `keywords ads-suggestions`) have a 12 req/min rate limit.
|
|
228
|
+
- Backlinks API requires a $100/month minimum DataForSEO commitment.
|
|
229
|
+
- The `--from-file` flag accepts text files with one item per line (# comments and blank lines ignored).
|
|
230
|
+
- All location/language defaults can be set globally via `dfseo config set location "Italy"`.
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Reference Files
|
|
236
|
+
|
|
237
|
+
### references/serp.md
|
|
238
|
+
|
|
239
|
+
Deve contenere per ogni comando SERP:
|
|
240
|
+
- Sintassi completa con tutti i flag
|
|
241
|
+
- Descrizione di ogni flag
|
|
242
|
+
- Un esempio di comando
|
|
243
|
+
- Un esempio di output JSON (abbreviato)
|
|
244
|
+
|
|
245
|
+
Comandi da documentare:
|
|
246
|
+
- `dfseo serp google`
|
|
247
|
+
- `dfseo serp bing`
|
|
248
|
+
- `dfseo serp youtube`
|
|
249
|
+
- `dfseo serp compare`
|
|
250
|
+
- `dfseo serp locations`
|
|
251
|
+
- `dfseo serp languages`
|
|
252
|
+
- `dfseo auth setup`
|
|
253
|
+
- `dfseo auth status`
|
|
254
|
+
- `dfseo config set` / `dfseo config show`
|
|
255
|
+
|
|
256
|
+
### references/keywords.md
|
|
257
|
+
|
|
258
|
+
Comandi da documentare:
|
|
259
|
+
- `dfseo keywords volume`
|
|
260
|
+
- `dfseo keywords suggestions`
|
|
261
|
+
- `dfseo keywords ideas`
|
|
262
|
+
- `dfseo keywords difficulty`
|
|
263
|
+
- `dfseo keywords search-intent`
|
|
264
|
+
- `dfseo keywords for-site`
|
|
265
|
+
- `dfseo keywords ads-volume`
|
|
266
|
+
- `dfseo keywords ads-suggestions`
|
|
267
|
+
|
|
268
|
+
### references/site.md
|
|
269
|
+
|
|
270
|
+
Comandi da documentare:
|
|
271
|
+
- `dfseo site audit`
|
|
272
|
+
- `dfseo site crawl`
|
|
273
|
+
- `dfseo site summary`
|
|
274
|
+
- `dfseo site pages`
|
|
275
|
+
- `dfseo site links`
|
|
276
|
+
- `dfseo site duplicates`
|
|
277
|
+
- `dfseo site redirects`
|
|
278
|
+
- `dfseo site non-indexable`
|
|
279
|
+
- `dfseo site resources`
|
|
280
|
+
- `dfseo site lighthouse`
|
|
281
|
+
- `dfseo site tasks`
|
|
282
|
+
|
|
283
|
+
### references/backlinks.md
|
|
284
|
+
|
|
285
|
+
Comandi da documentare:
|
|
286
|
+
- `dfseo backlinks summary`
|
|
287
|
+
- `dfseo backlinks list`
|
|
288
|
+
- `dfseo backlinks anchors`
|
|
289
|
+
- `dfseo backlinks referring-domains`
|
|
290
|
+
- `dfseo backlinks history`
|
|
291
|
+
- `dfseo backlinks competitors`
|
|
292
|
+
- `dfseo backlinks gap`
|
|
293
|
+
- `dfseo backlinks pages`
|
|
294
|
+
- `dfseo backlinks bulk ranks`
|
|
295
|
+
- `dfseo backlinks bulk backlinks`
|
|
296
|
+
- `dfseo backlinks bulk spam-score`
|
|
297
|
+
- `dfseo backlinks bulk referring-domains`
|
|
298
|
+
- `dfseo backlinks bulk new-lost`
|
|
299
|
+
|
|
300
|
+
**Per ogni reference file:** genera il contenuto usando l'output di `dfseo <command> --help` come fonte primaria. Non inventare flag β leggi l'help reale.
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Example Files
|
|
305
|
+
|
|
306
|
+
### examples/keyword-research.md
|
|
307
|
+
|
|
308
|
+
```markdown
|
|
309
|
+
# Keyword Research Workflow
|
|
310
|
+
|
|
311
|
+
Complete workflow for finding and evaluating keyword opportunities.
|
|
312
|
+
|
|
313
|
+
## Step 1: Explore seed keywords
|
|
314
|
+
Run volume check for your initial ideas:
|
|
315
|
+
\`\`\`bash
|
|
316
|
+
dfseo keywords volume "email hosting" "smtp service" "business email" \
|
|
317
|
+
--location "Italy" --language "Italian" --include-serp-info
|
|
318
|
+
\`\`\`
|
|
319
|
+
Look for: high volume, low-medium difficulty, commercial/transactional intent.
|
|
320
|
+
|
|
321
|
+
## Step 2: Expand with suggestions
|
|
322
|
+
\`\`\`bash
|
|
323
|
+
dfseo keywords suggestions "email hosting" \
|
|
324
|
+
--location "Italy" --language "Italian" \
|
|
325
|
+
--min-volume 50 --max-difficulty 40 --limit 100
|
|
326
|
+
\`\`\`
|
|
327
|
+
|
|
328
|
+
## Step 3: Find related ideas
|
|
329
|
+
\`\`\`bash
|
|
330
|
+
dfseo keywords ideas "email hosting" "smtp service" \
|
|
331
|
+
--location "Italy" --limit 100
|
|
332
|
+
\`\`\`
|
|
333
|
+
|
|
334
|
+
## Step 4: Bulk difficulty check
|
|
335
|
+
Save best candidates to a file and check difficulty:
|
|
336
|
+
\`\`\`bash
|
|
337
|
+
dfseo keywords difficulty --from-file candidates.txt --location "Italy"
|
|
338
|
+
\`\`\`
|
|
339
|
+
|
|
340
|
+
## Step 5: Check SERP landscape
|
|
341
|
+
For top candidates, check what's currently ranking:
|
|
342
|
+
\`\`\`bash
|
|
343
|
+
dfseo serp google "best keyword" --location "Italy" --depth 20
|
|
344
|
+
\`\`\`
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### examples/competitor-audit.md
|
|
348
|
+
|
|
349
|
+
```markdown
|
|
350
|
+
# Competitor Audit Workflow
|
|
351
|
+
|
|
352
|
+
Comprehensive competitor analysis: keywords, backlinks, on-page.
|
|
353
|
+
|
|
354
|
+
## Step 1: Find competitor keywords
|
|
355
|
+
\`\`\`bash
|
|
356
|
+
dfseo keywords for-site "competitor.com" \
|
|
357
|
+
--location "Italy" --min-volume 100 --sort volume --limit 200
|
|
358
|
+
\`\`\`
|
|
359
|
+
|
|
360
|
+
## Step 2: Backlink profile
|
|
361
|
+
\`\`\`bash
|
|
362
|
+
dfseo backlinks summary "competitor.com"
|
|
363
|
+
\`\`\`
|
|
364
|
+
|
|
365
|
+
## Step 3: Top referring domains
|
|
366
|
+
\`\`\`bash
|
|
367
|
+
dfseo backlinks referring-domains "competitor.com" \
|
|
368
|
+
--sort rank --limit 50 --exclude-internal
|
|
369
|
+
\`\`\`
|
|
370
|
+
|
|
371
|
+
## Step 4: Link gap (find their backlinks you don't have)
|
|
372
|
+
\`\`\`bash
|
|
373
|
+
dfseo backlinks gap "your-site.com" "competitor.com" --min-rank 200
|
|
374
|
+
\`\`\`
|
|
375
|
+
|
|
376
|
+
## Step 5: On-page audit comparison
|
|
377
|
+
\`\`\`bash
|
|
378
|
+
dfseo site audit "competitor.com" --max-pages 50 --wait
|
|
379
|
+
\`\`\`
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### examples/link-building.md
|
|
383
|
+
|
|
384
|
+
```markdown
|
|
385
|
+
# Link Building Workflow
|
|
386
|
+
|
|
387
|
+
Find link building opportunities using backlink gap analysis.
|
|
388
|
+
|
|
389
|
+
## Step 1: Identify competitors
|
|
390
|
+
\`\`\`bash
|
|
391
|
+
dfseo backlinks competitors "your-site.com" --sort rank --limit 20
|
|
392
|
+
\`\`\`
|
|
393
|
+
|
|
394
|
+
## Step 2: Run link gap analysis
|
|
395
|
+
\`\`\`bash
|
|
396
|
+
dfseo backlinks gap "your-site.com" "competitor1.com" "competitor2.com" "competitor3.com" \
|
|
397
|
+
--min-rank 200 --dofollow-only --limit 100
|
|
398
|
+
\`\`\`
|
|
399
|
+
|
|
400
|
+
## Step 3: Analyze top opportunities
|
|
401
|
+
For each high-rank domain from the gap:
|
|
402
|
+
\`\`\`bash
|
|
403
|
+
dfseo backlinks list "your-site.com" --from-domain "opportunity-domain.com"
|
|
404
|
+
\`\`\`
|
|
405
|
+
|
|
406
|
+
## Step 4: Check anchor text distribution
|
|
407
|
+
\`\`\`bash
|
|
408
|
+
dfseo backlinks anchors "your-site.com" --sort backlinks
|
|
409
|
+
\`\`\`
|
|
410
|
+
Healthy profile: branded anchors > exact-match keyword anchors.
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
-----
|
|
414
|
+
|
|
415
|
+
## scripts/install.sh
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
#!/usr/bin/env bash
|
|
419
|
+
set -euo pipefail
|
|
420
|
+
|
|
421
|
+
echo "Installing dfseo-cli..."
|
|
422
|
+
|
|
423
|
+
if command -v pip &> /dev/null; then
|
|
424
|
+
pip install dfseo
|
|
425
|
+
elif command -v pip3 &> /dev/null; then
|
|
426
|
+
pip3 install dfseo
|
|
427
|
+
else
|
|
428
|
+
echo "Error: pip not found. Install Python 3.11+ first." >&2
|
|
429
|
+
exit 1
|
|
430
|
+
fi
|
|
431
|
+
|
|
432
|
+
if command -v dfseo &> /dev/null; then
|
|
433
|
+
echo "β dfseo-cli installed successfully"
|
|
434
|
+
dfseo --version
|
|
435
|
+
else
|
|
436
|
+
echo "Error: dfseo command not found after installation." >&2
|
|
437
|
+
echo "Make sure ~/.local/bin is in your PATH." >&2
|
|
438
|
+
exit 1
|
|
439
|
+
fi
|
|
440
|
+
|
|
441
|
+
echo ""
|
|
442
|
+
echo "Next steps:"
|
|
443
|
+
echo " 1. Set credentials:"
|
|
444
|
+
echo " export DATAFORSEO_LOGIN='your@email.com'"
|
|
445
|
+
echo " export DATAFORSEO_PASSWORD='your_api_password'"
|
|
446
|
+
echo " 2. Verify: dfseo auth status"
|
|
447
|
+
echo " 3. Try: dfseo serp google 'test keyword'"
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
-----
|
|
451
|
+
|
|
452
|
+
## Pubblicazione su ClawHub
|
|
453
|
+
|
|
454
|
+
### Step 1: Verifica la skill localmente
|
|
455
|
+
|
|
456
|
+
```bash
|
|
457
|
+
# Copia la skill nella cartella locale
|
|
458
|
+
cp -r dfseo/ ~/.openclaw/skills/dfseo/
|
|
459
|
+
|
|
460
|
+
# Apri OpenClaw e verifica che la skill appaia
|
|
461
|
+
# L'emoji π dovrebbe essere visibile nella lista skill
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Step 2: Pubblica su ClawHub
|
|
465
|
+
|
|
466
|
+
```bash
|
|
467
|
+
# Installa clawhub CLI se non presente
|
|
468
|
+
npm install -g clawhub
|
|
469
|
+
|
|
470
|
+
# Pubblica
|
|
471
|
+
clawhub publish ./dfseo/
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### Step 3: Includi nel repo GitHub
|
|
475
|
+
|
|
476
|
+
Aggiungi la cartella `skill/` (o `openclaw-skill/`) nella root del repo `dfseo-cli` su GitHub, così chi clona il repo ha già la skill pronta:
|
|
477
|
+
|
|
478
|
+
```
|
|
479
|
+
dfseo-cli/
|
|
480
|
+
βββ src/
|
|
481
|
+
βββ tests/
|
|
482
|
+
βββ skill/ # OpenClaw skill
|
|
483
|
+
β βββ SKILL.md
|
|
484
|
+
β βββ references/
|
|
485
|
+
β βββ examples/
|
|
486
|
+
β βββ scripts/
|
|
487
|
+
βββ SKILL.md # Copia semplificata nella root (per Claude Code e altri agent)
|
|
488
|
+
βββ pyproject.toml
|
|
489
|
+
βββ README.md
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
La `SKILL.md` nella root Γ¨ la versione compatta (giΓ presente dalla v1.0). La cartella `skill/` Γ¨ la versione completa per OpenClaw con reference files ed esempi.
|
|
493
|
+
|
|
494
|
+
-----
|
|
495
|
+
|
|
496
|
+
## Istruzioni per Claude Code
|
|
497
|
+
|
|
498
|
+
### Cosa fare
|
|
499
|
+
|
|
500
|
+
1. **Crea la struttura cartella** `skill/` con tutti i file
|
|
501
|
+
1. **Genera il SKILL.md** con il frontmatter esatto indicato sopra β il campo `description` Γ¨ critico per il triggering automatico
|
|
502
|
+
1. **Genera i 4 reference files** usando `dfseo <command> --help` come fonte per ogni comando. Esegui i comandi help reali, non inventare flag
|
|
503
|
+
1. **Crea i 3 example files** con workflow completi e realistici
|
|
504
|
+
1. **Crea install.sh** e rendilo eseguibile (`chmod +x`)
|
|
505
|
+
1. **Testa localmente** copiando in `~/.openclaw/skills/` e verificando che OpenClaw la carichi
|
|
506
|
+
1. **Pubblica su ClawHub** con `clawhub publish`
|
|
507
|
+
|
|
508
|
+
### Cosa NON fare
|
|
509
|
+
|
|
510
|
+
- Non inventare flag o comandi β tutto deve corrispondere al CLI reale
|
|
511
|
+
- Non mettere troppo testo nel SKILL.md principale β gli agenti hanno context window limitati. I dettagli vanno nei reference files
|
|
512
|
+
- Non usare `metadata.clawdbot` β usa `metadata.openclaw` (il formato corrente)
|
|
513
|
+
- Non dimenticare il campo `requires.bins` β senza questo OpenClaw non sa che serve `dfseo` installato
|
|
514
|
+
- Non dimenticare `requires.env` β senza questo lβagente non chiederΓ le credenziali
|
|
515
|
+
|
|
516
|
+
-----
|
|
517
|
+
|
|
518
|
+
## Riferimenti
|
|
519
|
+
|
|
520
|
+
- OpenClaw Skills Docs: https://docs.openclaw.ai/tools/skills
|
|
521
|
+
- ClawHub (registry): https://github.com/openclaw/clawhub
|
|
522
|
+
- Skill format reference: https://github.com/openclaw/clawhub/blob/main/docs/skill-format.md
|
|
523
|
+
- Example skills: https://github.com/VoltAgent/awesome-openclaw-skills
|
|
524
|
+
- gogcli skill (ispirazione): https://lobehub.com/skills/ninehills-skills-gogcli
|