@lv24/seo 0.0.0-stage → 0.1.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/README.md CHANGED
@@ -1,3 +1,50 @@
1
- # Temporary Holding Version
1
+ # @lv24/seo
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ `npx` launcher for the Python package [`lv24-seo`](https://pypi.org/project/lv24-seo/) —
4
+ a free-first SEO control plane for humans and AI agents (Google Search Console, Yandex Webmaster,
5
+ Yandex Metrika, Bing/IndexNow, CrUX, PageSpeed Insights, a 30-rule technical crawl, scheduled
6
+ email/Telegram reports, an MCP server and agent skills).
7
+
8
+ This npm package contains **no SEO logic**. It forwards every argument to
9
+ `uvx --from lv24-seo lv24-seo …` (or to a `lv24-seo` binary already on `PATH`), so the CLI, its
10
+ `--json` envelope and the documented exit codes behave exactly as in the Python package.
11
+
12
+ ## Requirements
13
+
14
+ * [uv](https://docs.astral.sh/uv/) (recommended) **or** an installed `lv24-seo` binary
15
+ (`pipx install lv24-seo` / `uv tool install lv24-seo`). Python itself does not need to be installed
16
+ when uv is present — uv downloads the right interpreter.
17
+
18
+ ## Usage
19
+
20
+ ```bash
21
+ npx @lv24/seo doctor --json
22
+ npx @lv24/seo init --property https://example.com
23
+ npx @lv24/seo auth set --provider gsc --stdin
24
+ npx @lv24/seo report weekly --json --out reports/
25
+ npx @lv24/seo mcp serve # stdio MCP server for Claude/OpenCode/Cursor
26
+ ```
27
+
28
+ The first run may take a few seconds while uv resolves and caches the Python package.
29
+
30
+ ## Configuration
31
+
32
+ Tokens are read from the keychain (set them with `lv24-seo auth set`) or from `LV24_SEO_*`
33
+ environment variables. Nothing is written by this wrapper.
34
+
35
+ If auto-detection picks the wrong binary, point it explicitly:
36
+
37
+ ```bash
38
+ LV24_SEO_BIN=/usr/local/bin/lv24-seo npx @lv24/seo doctor
39
+ ```
40
+
41
+ ## Links
42
+
43
+ * Documentation: <https://github.com/LevapVeeskela/lv24-seo-optimizer>
44
+ * MCP tools and skills: see `docs/mcp.md` and `skills/` in the repository
45
+ * Issues: <https://github.com/LevapVeeskela/lv24-seo-optimizer/issues>
46
+
47
+ ## License
48
+
49
+ Apache-2.0. Not affiliated with Google, Yandex or Microsoft; provider data belongs to the property
50
+ owner and is never resold.
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Thin launcher for the Python package `lv24-seo`.
4
+ *
5
+ * `npx @lv24/seo …` is a convenience entry point, not a second implementation: it forwards every
6
+ * argument to `uvx --from lv24-seo lv24-seo …` (or to an already installed `lv24-seo` binary).
7
+ * Exit code, stdout and stderr are passed through unchanged so agents can rely on `--json` and the
8
+ * documented exit codes.
9
+ */
10
+ 'use strict';
11
+
12
+ const { spawn } = require('node:child_process');
13
+
14
+ const PACKAGE = 'lv24-seo';
15
+ const args = process.argv.slice(2);
16
+
17
+ function candidates() {
18
+ const override = process.env.LV24_SEO_BIN;
19
+ if (override) {
20
+ return [{ command: override, prefix: [] }];
21
+ }
22
+ return [
23
+ { command: 'uvx', prefix: ['--from', PACKAGE, PACKAGE] },
24
+ { command: PACKAGE, prefix: [] },
25
+ ];
26
+ }
27
+
28
+ function hint() {
29
+ return [
30
+ 'lv24-seo needs uv (recommended) or an installed lv24-seo binary.',
31
+ '',
32
+ ' Install uv: https://docs.astral.sh/uv/getting-started/installation/',
33
+ ' Or install the CLI directly:',
34
+ ' pipx install lv24-seo (or: uv tool install lv24-seo)',
35
+ '',
36
+ 'Set LV24_SEO_BIN=/absolute/path/to/lv24-seo to bypass auto-detection.',
37
+ ].join('\n');
38
+ }
39
+
40
+ function run(list, index) {
41
+ if (index >= list.length) {
42
+ process.stderr.write(hint() + '\n');
43
+ process.exit(127);
44
+ }
45
+
46
+ const current = list[index];
47
+ const child = spawn(current.command, [...current.prefix, ...args], {
48
+ stdio: 'inherit',
49
+ env: process.env,
50
+ shell: false,
51
+ });
52
+
53
+ let started = false;
54
+ child.on('spawn', () => {
55
+ started = true;
56
+ });
57
+ child.on('error', (error) => {
58
+ if (!started && error && error.code === 'ENOENT') {
59
+ run(list, index + 1);
60
+ return;
61
+ }
62
+ process.stderr.write(`lv24-seo launcher: ${error.message}\n`);
63
+ process.exit(1);
64
+ });
65
+ child.on('exit', (code, signal) => {
66
+ if (signal) {
67
+ process.kill(process.pid, signal);
68
+ return;
69
+ }
70
+ process.exit(code === null ? 1 : code);
71
+ });
72
+ }
73
+
74
+ run(candidates(), 0);
package/package.json CHANGED
@@ -1,6 +1,42 @@
1
1
  {
2
2
  "name": "@lv24/seo",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Free-first SEO control plane for humans and AI agents — npx launcher for the Python package lv24-seo (GSC, Yandex Webmaster/Metrika, Bing, CrUX, PSI, crawl, reports, MCP).",
5
+ "keywords": [
6
+ "seo",
7
+ "mcp",
8
+ "model-context-protocol",
9
+ "google-search-console",
10
+ "yandex-webmaster",
11
+ "yandex-metrika",
12
+ "bing-webmaster",
13
+ "indexnow",
14
+ "core-web-vitals",
15
+ "ai-agents",
16
+ "cli"
17
+ ],
18
+ "homepage": "https://github.com/LevapVeeskela/lv24-seo-optimizer",
19
+ "bugs": {
20
+ "url": "https://github.com/LevapVeeskela/lv24-seo-optimizer/issues"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/LevapVeeskela/lv24-seo-optimizer.git",
25
+ "directory": "packages/npm"
26
+ },
27
+ "license": "Apache-2.0",
28
+ "author": "LV24 <paulalexeev10@gmail.com>",
29
+ "bin": {
30
+ "lv24-seo": "bin/lv24-seo.js"
31
+ },
32
+ "files": [
33
+ "bin/lv24-seo.js",
34
+ "README.md"
35
+ ],
36
+ "engines": {
37
+ "node": ">=18"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ }
42
+ }