antigravity-seo-kit 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/agent.md +96 -0
- package/.agent/skills/seo/SKILL.md +153 -0
- package/.agent/skills/seo/references/cwv-thresholds.md +108 -0
- package/.agent/skills/seo/references/eeat-framework.md +214 -0
- package/.agent/skills/seo/references/local-schema-types.md +230 -0
- package/.agent/skills/seo/references/local-seo-signals.md +218 -0
- package/.agent/skills/seo/references/maps-api-endpoints.md +160 -0
- package/.agent/skills/seo/references/maps-free-apis.md +176 -0
- package/.agent/skills/seo/references/maps-gbp-checklist.md +150 -0
- package/.agent/skills/seo/references/maps-geo-grid.md +154 -0
- package/.agent/skills/seo/references/quality-gates.md +155 -0
- package/.agent/skills/seo/references/schema-types.md +118 -0
- package/.agent/skills/seo/schema/templates.json +213 -0
- package/.agent/skills/seo/scripts/analyze_visual.py +217 -0
- package/.agent/skills/seo/scripts/capture_screenshot.py +181 -0
- package/.agent/skills/seo/scripts/fetch_page.py +196 -0
- package/.agent/skills/seo/scripts/parse_html.py +201 -0
- package/.agent/skills/seo-audit/SKILL.md +278 -0
- package/.agent/skills/seo-competitor-pages/SKILL.md +212 -0
- package/.agent/skills/seo-content/SKILL.md +230 -0
- package/.agent/skills/seo-dataforseo/SKILL.md +418 -0
- package/.agent/skills/seo-geo/SKILL.md +305 -0
- package/.agent/skills/seo-google/SKILL.md +405 -0
- package/.agent/skills/seo-google/assets/templates/cwv-audit-report.md +48 -0
- package/.agent/skills/seo-google/assets/templates/gsc-performance-report.md +44 -0
- package/.agent/skills/seo-google/assets/templates/indexation-status-report.md +43 -0
- package/.agent/skills/seo-google/references/auth-setup.md +154 -0
- package/.agent/skills/seo-google/references/ga4-data-api.md +184 -0
- package/.agent/skills/seo-google/references/indexing-api.md +107 -0
- package/.agent/skills/seo-google/references/keyword-planner-api.md +66 -0
- package/.agent/skills/seo-google/references/nlp-api.md +55 -0
- package/.agent/skills/seo-google/references/pagespeed-crux-api.md +204 -0
- package/.agent/skills/seo-google/references/rate-limits-quotas.md +75 -0
- package/.agent/skills/seo-google/references/search-console-api.md +156 -0
- package/.agent/skills/seo-google/references/supplementary-apis.md +99 -0
- package/.agent/skills/seo-google/references/youtube-api.md +49 -0
- package/.agent/skills/seo-google/scripts/crux_history.py +321 -0
- package/.agent/skills/seo-google/scripts/ga4_report.py +478 -0
- package/.agent/skills/seo-google/scripts/google_auth.py +795 -0
- package/.agent/skills/seo-google/scripts/google_report.py +2273 -0
- package/.agent/skills/seo-google/scripts/gsc_inspect.py +340 -0
- package/.agent/skills/seo-google/scripts/gsc_query.py +378 -0
- package/.agent/skills/seo-google/scripts/indexing_notify.py +313 -0
- package/.agent/skills/seo-google/scripts/keyword_planner.py +297 -0
- package/.agent/skills/seo-google/scripts/nlp_analyze.py +309 -0
- package/.agent/skills/seo-google/scripts/pagespeed_check.py +649 -0
- package/.agent/skills/seo-google/scripts/youtube_search.py +355 -0
- package/.agent/skills/seo-hreflang/SKILL.md +192 -0
- package/.agent/skills/seo-image-gen/SKILL.md +211 -0
- package/.agent/skills/seo-image-gen/references/cost-tracking.md +47 -0
- package/.agent/skills/seo-image-gen/references/gemini-models.md +200 -0
- package/.agent/skills/seo-image-gen/references/mcp-tools.md +115 -0
- package/.agent/skills/seo-image-gen/references/post-processing.md +192 -0
- package/.agent/skills/seo-image-gen/references/presets.md +69 -0
- package/.agent/skills/seo-image-gen/references/prompt-engineering.md +411 -0
- package/.agent/skills/seo-image-gen/references/seo-image-presets.md +137 -0
- package/.agent/skills/seo-image-gen/scripts/batch.py +97 -0
- package/.agent/skills/seo-image-gen/scripts/cost_tracker.py +191 -0
- package/.agent/skills/seo-image-gen/scripts/edit.py +141 -0
- package/.agent/skills/seo-image-gen/scripts/generate.py +149 -0
- package/.agent/skills/seo-image-gen/scripts/presets.py +153 -0
- package/.agent/skills/seo-image-gen/scripts/setup_mcp.py +151 -0
- package/.agent/skills/seo-image-gen/scripts/validate_setup.py +133 -0
- package/.agent/skills/seo-images/SKILL.md +176 -0
- package/.agent/skills/seo-local/SKILL.md +381 -0
- package/.agent/skills/seo-maps/SKILL.md +328 -0
- package/.agent/skills/seo-page/SKILL.md +86 -0
- package/.agent/skills/seo-plan/SKILL.md +118 -0
- package/.agent/skills/seo-plan/assets/agency.md +175 -0
- package/.agent/skills/seo-plan/assets/ecommerce.md +167 -0
- package/.agent/skills/seo-plan/assets/generic.md +144 -0
- package/.agent/skills/seo-plan/assets/local-service.md +160 -0
- package/.agent/skills/seo-plan/assets/publisher.md +153 -0
- package/.agent/skills/seo-plan/assets/saas.md +135 -0
- package/.agent/skills/seo-programmatic/SKILL.md +171 -0
- package/.agent/skills/seo-schema/SKILL.md +223 -0
- package/.agent/skills/seo-sitemap/SKILL.md +180 -0
- package/.agent/skills/seo-technical/SKILL.md +211 -0
- package/.agent/workflows/seo-audit.md +17 -0
- package/.agent/workflows/seo-competitor-pages.md +12 -0
- package/.agent/workflows/seo-content.md +14 -0
- package/.agent/workflows/seo-geo.md +12 -0
- package/.agent/workflows/seo-google.md +12 -0
- package/.agent/workflows/seo-hreflang.md +12 -0
- package/.agent/workflows/seo-images.md +13 -0
- package/.agent/workflows/seo-local.md +12 -0
- package/.agent/workflows/seo-maps.md +11 -0
- package/.agent/workflows/seo-page.md +13 -0
- package/.agent/workflows/seo-plan.md +13 -0
- package/.agent/workflows/seo-programmatic.md +12 -0
- package/.agent/workflows/seo-schema.md +11 -0
- package/.agent/workflows/seo-sitemap.md +9 -0
- package/.agent/workflows/seo-technical.md +18 -0
- package/LICENSE +88 -0
- package/README.md +122 -0
- package/bin/cli.js +117 -0
- package/docs/ARCHITECTURE.md +218 -0
- package/docs/COMMANDS.md +184 -0
- package/docs/INSTALLATION.md +100 -0
- package/docs/MCP-INTEGRATION.md +153 -0
- package/docs/TROUBLESHOOTING.md +151 -0
- package/docs/superpowers/plans/2026-03-13-github-audit-fixes.md +511 -0
- package/extensions/banana/README.md +95 -0
- package/extensions/banana/docs/BANANA-SETUP.md +86 -0
- package/extensions/banana/install.sh +170 -0
- package/extensions/banana/references/cost-tracking.md +47 -0
- package/extensions/banana/references/gemini-models.md +200 -0
- package/extensions/banana/references/mcp-tools.md +115 -0
- package/extensions/banana/references/post-processing.md +192 -0
- package/extensions/banana/references/presets.md +69 -0
- package/extensions/banana/references/prompt-engineering.md +411 -0
- package/extensions/banana/references/seo-image-presets.md +137 -0
- package/extensions/banana/scripts/batch.py +97 -0
- package/extensions/banana/scripts/cost_tracker.py +191 -0
- package/extensions/banana/scripts/edit.py +141 -0
- package/extensions/banana/scripts/generate.py +149 -0
- package/extensions/banana/scripts/presets.py +153 -0
- package/extensions/banana/scripts/setup_mcp.py +151 -0
- package/extensions/banana/scripts/validate_setup.py +133 -0
- package/extensions/banana/uninstall.sh +43 -0
- package/extensions/dataforseo/README.md +169 -0
- package/extensions/dataforseo/docs/DATAFORSEO-SETUP.md +74 -0
- package/extensions/dataforseo/field-config.json +280 -0
- package/extensions/dataforseo/install.ps1 +110 -0
- package/extensions/dataforseo/install.sh +161 -0
- package/extensions/dataforseo/uninstall.ps1 +35 -0
- package/extensions/dataforseo/uninstall.sh +39 -0
- package/lib/api.js +190 -0
- package/lib/fingerprint.js +68 -0
- package/lib/installer.js +486 -0
- package/lib/utils.js +254 -0
- package/package.json +40 -0
- package/pyproject.toml +11 -0
- package/requirements-google.txt +15 -0
- package/requirements.txt +11 -0
package/lib/utils.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
// ─── ANSI Colors ────────────────────────────────────────────────────────────
|
|
7
|
+
|
|
8
|
+
const SUPPORTS_COLOR = process.stdout.isTTY && !process.env.NO_COLOR;
|
|
9
|
+
|
|
10
|
+
const colors = {
|
|
11
|
+
reset: SUPPORTS_COLOR ? '\x1b[0m' : '',
|
|
12
|
+
bold: SUPPORTS_COLOR ? '\x1b[1m' : '',
|
|
13
|
+
dim: SUPPORTS_COLOR ? '\x1b[2m' : '',
|
|
14
|
+
red: SUPPORTS_COLOR ? '\x1b[31m' : '',
|
|
15
|
+
green: SUPPORTS_COLOR ? '\x1b[32m' : '',
|
|
16
|
+
yellow: SUPPORTS_COLOR ? '\x1b[33m' : '',
|
|
17
|
+
blue: SUPPORTS_COLOR ? '\x1b[34m' : '',
|
|
18
|
+
magenta: SUPPORTS_COLOR ? '\x1b[35m' : '',
|
|
19
|
+
cyan: SUPPORTS_COLOR ? '\x1b[36m' : '',
|
|
20
|
+
white: SUPPORTS_COLOR ? '\x1b[37m' : '',
|
|
21
|
+
gray: SUPPORTS_COLOR ? '\x1b[90m' : '',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
function colorize(color, text) {
|
|
25
|
+
return `${colors[color]}${text}${colors.reset}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ─── Formatted Output ───────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
function success(msg) { console.log(`${colorize('green', '✅')} ${msg}`); }
|
|
31
|
+
function error(msg) { console.error(`${colorize('red', '❌')} ${msg}`); }
|
|
32
|
+
function warn(msg) { console.log(`${colorize('yellow', '⚠️')} ${msg}`); }
|
|
33
|
+
function info(msg) { console.log(`${colorize('cyan', 'ℹ️')} ${msg}`); }
|
|
34
|
+
function step(msg) { console.log(`${colorize('blue', '→')} ${msg}`); }
|
|
35
|
+
function file(msg) { console.log(` ${colorize('dim', '📄')} ${colorize('gray', msg)}`); }
|
|
36
|
+
function dir(msg) { console.log(` ${colorize('dim', '📁')} ${colorize('gray', msg)}`); }
|
|
37
|
+
|
|
38
|
+
// ─── Spinner ────────────────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
41
|
+
|
|
42
|
+
class Spinner {
|
|
43
|
+
constructor(message) {
|
|
44
|
+
this.message = message;
|
|
45
|
+
this.frameIndex = 0;
|
|
46
|
+
this.interval = null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
start() {
|
|
50
|
+
if (!SUPPORTS_COLOR) {
|
|
51
|
+
console.log(`⏳ ${this.message}`);
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
process.stdout.write('\x1b[?25l'); // hide cursor
|
|
55
|
+
this.interval = setInterval(() => {
|
|
56
|
+
const frame = SPINNER_FRAMES[this.frameIndex % SPINNER_FRAMES.length];
|
|
57
|
+
process.stdout.write(`\r${colorize('cyan', frame)} ${this.message}`);
|
|
58
|
+
this.frameIndex++;
|
|
59
|
+
}, 80);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
succeed(msg) {
|
|
64
|
+
this._stop();
|
|
65
|
+
success(msg || this.message);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fail(msg) {
|
|
69
|
+
this._stop();
|
|
70
|
+
error(msg || this.message);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
_stop() {
|
|
74
|
+
if (this.interval) {
|
|
75
|
+
clearInterval(this.interval);
|
|
76
|
+
this.interval = null;
|
|
77
|
+
}
|
|
78
|
+
if (SUPPORTS_COLOR) {
|
|
79
|
+
process.stdout.write('\r\x1b[K'); // clear line
|
|
80
|
+
process.stdout.write('\x1b[?25h'); // show cursor
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function spinner(message) {
|
|
86
|
+
return new Spinner(message);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ─── File Operations ────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Recursively copy a directory, merging with existing content.
|
|
93
|
+
* Does not overwrite existing files unless `overwrite` is true.
|
|
94
|
+
*/
|
|
95
|
+
function copyRecursive(src, dest, { overwrite = false, fileCallback = null } = {}) {
|
|
96
|
+
if (!fs.existsSync(src)) return 0;
|
|
97
|
+
|
|
98
|
+
let count = 0;
|
|
99
|
+
|
|
100
|
+
if (fs.statSync(src).isDirectory()) {
|
|
101
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
102
|
+
const entries = fs.readdirSync(src);
|
|
103
|
+
for (const entry of entries) {
|
|
104
|
+
count += copyRecursive(
|
|
105
|
+
path.join(src, entry),
|
|
106
|
+
path.join(dest, entry),
|
|
107
|
+
{ overwrite, fileCallback }
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
112
|
+
if (overwrite || !fs.existsSync(dest)) {
|
|
113
|
+
fs.copyFileSync(src, dest);
|
|
114
|
+
count = 1;
|
|
115
|
+
if (fileCallback) fileCallback(dest);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return count;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Recursively remove a directory and all its contents.
|
|
124
|
+
*/
|
|
125
|
+
function removeRecursive(target) {
|
|
126
|
+
if (!fs.existsSync(target)) return 0;
|
|
127
|
+
|
|
128
|
+
let count = 0;
|
|
129
|
+
|
|
130
|
+
if (fs.statSync(target).isDirectory()) {
|
|
131
|
+
const entries = fs.readdirSync(target);
|
|
132
|
+
for (const entry of entries) {
|
|
133
|
+
count += removeRecursive(path.join(target, entry));
|
|
134
|
+
}
|
|
135
|
+
fs.rmdirSync(target);
|
|
136
|
+
} else {
|
|
137
|
+
fs.unlinkSync(target);
|
|
138
|
+
count = 1;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return count;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Count files in a directory recursively.
|
|
146
|
+
*/
|
|
147
|
+
function countFiles(dir) {
|
|
148
|
+
if (!fs.existsSync(dir)) return 0;
|
|
149
|
+
let count = 0;
|
|
150
|
+
if (fs.statSync(dir).isDirectory()) {
|
|
151
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
152
|
+
count += countFiles(path.join(dir, entry));
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
count = 1;
|
|
156
|
+
}
|
|
157
|
+
return count;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ─── License Key Validation ────────────────────────────────────────────────
|
|
161
|
+
|
|
162
|
+
const LICENSE_KEY_REGEX = /^SK-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$/;
|
|
163
|
+
|
|
164
|
+
function isValidKeyFormat(key) {
|
|
165
|
+
return LICENSE_KEY_REGEX.test(key);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ─── Banner ─────────────────────────────────────────────────────────────────
|
|
169
|
+
|
|
170
|
+
const BANNER = `
|
|
171
|
+
${colorize('cyan', '╔═══════════════════════════════════════════════════════╗')}
|
|
172
|
+
${colorize('cyan', '║')} ${colorize('bold', '🔍 SEO Kit for Google Antigravity')} ${colorize('cyan', '║')}
|
|
173
|
+
${colorize('cyan', '║')} ${colorize('dim', 'v2.0.0 — Professional SEO Analysis Toolkit')} ${colorize('cyan', '║')}
|
|
174
|
+
${colorize('cyan', '╚═══════════════════════════════════════════════════════╝')}
|
|
175
|
+
`;
|
|
176
|
+
|
|
177
|
+
function showBanner() {
|
|
178
|
+
console.log(BANNER);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ─── Help ───────────────────────────────────────────────────────────────────
|
|
182
|
+
|
|
183
|
+
function showHelp() {
|
|
184
|
+
showBanner();
|
|
185
|
+
console.log(`${colorize('bold', 'Usage:')} npx antigravity-seo-kit <command> [options]`);
|
|
186
|
+
console.log('');
|
|
187
|
+
console.log(`${colorize('bold', 'Commands:')}`);
|
|
188
|
+
console.log(` ${colorize('green', 'install')} --key=SK-XXXX-XXXX-XXXX Install SEO Kit into current workspace`);
|
|
189
|
+
console.log(` ${colorize('green', 'update')} Update to latest version`);
|
|
190
|
+
console.log(` ${colorize('green', 'uninstall')} Remove SEO Kit from workspace`);
|
|
191
|
+
console.log(` ${colorize('green', 'status')} Show license & installation info`);
|
|
192
|
+
console.log(` ${colorize('green', 'devices')} List activated devices`);
|
|
193
|
+
console.log(` ${colorize('green', 'devices remove')} <deviceId> Remove a device from license`);
|
|
194
|
+
console.log('');
|
|
195
|
+
console.log(`${colorize('bold', 'Examples:')}`);
|
|
196
|
+
console.log(` ${colorize('gray', 'npx antigravity-seo-kit install --key=SK-A1B2-C3D4-E5F6')}`);
|
|
197
|
+
console.log(` ${colorize('gray', 'npx antigravity-seo-kit devices')}`);
|
|
198
|
+
console.log(` ${colorize('gray', 'npx antigravity-seo-kit devices remove a1b2c3d4')}`);
|
|
199
|
+
console.log('');
|
|
200
|
+
console.log(`${colorize('bold', 'Purchase:')} https://github.com/nguyendev/seo-kit`);
|
|
201
|
+
console.log('');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ─── Config File ────────────────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
const LICENSE_FILE = '.seo-kit-license';
|
|
207
|
+
|
|
208
|
+
function readLicenseFile(cwd) {
|
|
209
|
+
const licensePath = path.join(cwd, LICENSE_FILE);
|
|
210
|
+
if (!fs.existsSync(licensePath)) return null;
|
|
211
|
+
try {
|
|
212
|
+
return JSON.parse(fs.readFileSync(licensePath, 'utf-8'));
|
|
213
|
+
} catch {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function writeLicenseFile(cwd, data) {
|
|
219
|
+
const licensePath = path.join(cwd, LICENSE_FILE);
|
|
220
|
+
fs.writeFileSync(licensePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function removeLicenseFile(cwd) {
|
|
224
|
+
const licensePath = path.join(cwd, LICENSE_FILE);
|
|
225
|
+
if (fs.existsSync(licensePath)) {
|
|
226
|
+
fs.unlinkSync(licensePath);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
231
|
+
|
|
232
|
+
module.exports = {
|
|
233
|
+
colors,
|
|
234
|
+
colorize,
|
|
235
|
+
success,
|
|
236
|
+
error,
|
|
237
|
+
warn,
|
|
238
|
+
info,
|
|
239
|
+
step,
|
|
240
|
+
file,
|
|
241
|
+
dir,
|
|
242
|
+
spinner,
|
|
243
|
+
copyRecursive,
|
|
244
|
+
removeRecursive,
|
|
245
|
+
countFiles,
|
|
246
|
+
isValidKeyFormat,
|
|
247
|
+
showBanner,
|
|
248
|
+
showHelp,
|
|
249
|
+
readLicenseFile,
|
|
250
|
+
writeLicenseFile,
|
|
251
|
+
removeLicenseFile,
|
|
252
|
+
LICENSE_FILE,
|
|
253
|
+
PACKAGE_VERSION: '2.0.0',
|
|
254
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "antigravity-seo-kit",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Professional SEO Analysis Toolkit for Google Antigravity AI Agent — 18 specialized skills covering technical audit, E-E-A-T, schema, GEO, local SEO & more",
|
|
5
|
+
"bin": {
|
|
6
|
+
"antigravity-seo-kit": "./bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"lib/",
|
|
11
|
+
".agent/",
|
|
12
|
+
"extensions/",
|
|
13
|
+
"docs/",
|
|
14
|
+
"requirements.txt",
|
|
15
|
+
"requirements-google.txt",
|
|
16
|
+
"pyproject.toml"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"seo",
|
|
20
|
+
"antigravity",
|
|
21
|
+
"google-antigravity",
|
|
22
|
+
"ai-agent",
|
|
23
|
+
"seo-audit",
|
|
24
|
+
"seo-toolkit",
|
|
25
|
+
"agent-skills",
|
|
26
|
+
"seo-analysis",
|
|
27
|
+
"technical-seo",
|
|
28
|
+
"eeat"
|
|
29
|
+
],
|
|
30
|
+
"author": "nguyendev",
|
|
31
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/nguyendev/seo-kit"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/nguyendev/seo-kit",
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18"
|
|
39
|
+
}
|
|
40
|
+
}
|
package/pyproject.toml
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "seo-kit"
|
|
3
|
+
version = "2.0.0"
|
|
4
|
+
description = "Comprehensive SEO analysis skill for AI coding agents (Antigravity compatible)"
|
|
5
|
+
requires-python = ">=3.11"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
readme = "README.md"
|
|
8
|
+
|
|
9
|
+
[project.urls]
|
|
10
|
+
Homepage = "https://github.com/AgriciDaniel/claude-seo"
|
|
11
|
+
Repository = "https://github.com/AgriciDaniel/claude-seo"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# SEO Kit - Google API Dependencies (Optional)
|
|
2
|
+
# Install: pip install -r requirements-google.txt
|
|
3
|
+
# Required for: seo-google skill (Google SEO APIs)
|
|
4
|
+
# Last updated: March 28, 2026
|
|
5
|
+
|
|
6
|
+
# Report generation (for PDF reports with charts)
|
|
7
|
+
matplotlib>=3.8.0,<4.0.0 # No known CVEs
|
|
8
|
+
weasyprint>=61.0,<70.0 # No known CVEs
|
|
9
|
+
|
|
10
|
+
# Google API dependencies
|
|
11
|
+
google-api-python-client>=2.100.0,<3.0.0 # No known CVEs
|
|
12
|
+
google-auth>=2.20.0,<3.0.0 # No known CVEs
|
|
13
|
+
google-auth-oauthlib>=1.0.0,<2.0.0 # No known CVEs
|
|
14
|
+
google-auth-httplib2>=0.2.0,<1.0.0 # No known CVEs
|
|
15
|
+
google-analytics-data>=0.18.0,<1.0.0 # No known CVEs
|
package/requirements.txt
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Claude SEO - Python Dependencies
|
|
2
|
+
# Bounded version pinning with security-conscious minimums
|
|
3
|
+
# Last updated: February 7, 2026
|
|
4
|
+
|
|
5
|
+
beautifulsoup4>=4.12.0,<5.0.0 # No known CVEs
|
|
6
|
+
requests>=2.32.4,<3.0.0 # CVE-2024-47081, CVE-2024-35195 fixes
|
|
7
|
+
lxml>=6.0.2,<7.0.0 # CVE-2025-24928 + additional libxml2 security patches
|
|
8
|
+
playwright>=1.56.0,<2.0.0 # CVE-2025-59288 fix (macOS)
|
|
9
|
+
Pillow>=12.1.0,<13.0.0 # CVE-2025-48379 fix
|
|
10
|
+
urllib3>=2.6.3,<3.0.0 # CRITICAL: CVE-2026-21441 (CVSS 8.9), CVE-2025-66418
|
|
11
|
+
validators>=0.22.0,<1.0.0 # No known CVEs
|