seo 0.0.15 → 0.2.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.
Files changed (93) hide show
  1. package/LICENSE +201 -0
  2. package/PRIVACY.md +95 -0
  3. package/README.md +431 -35
  4. package/SECURITY.md +55 -0
  5. package/TERMS.md +94 -0
  6. package/TRADEMARKS.md +31 -0
  7. package/dist/cli.js +141 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/dist-6bK_8r5M.js +713 -0
  10. package/dist/dist-6bK_8r5M.js.map +1 -0
  11. package/dist/dist-vRmqfhR4.js +3 -0
  12. package/dist/index.d.ts +18013 -0
  13. package/dist/index.js +27197 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/mcp.d.ts +74 -0
  16. package/dist/mcp.js +28611 -0
  17. package/dist/mcp.js.map +1 -0
  18. package/dist/package-7aT8_Xp0.js +23818 -0
  19. package/dist/package-7aT8_Xp0.js.map +1 -0
  20. package/evals/README.md +117 -0
  21. package/evals/affected-urls.json +57 -0
  22. package/evals/ai-readiness.json +84 -0
  23. package/evals/ai-referrals.json +71 -0
  24. package/evals/ai-search-scorecard.json +70 -0
  25. package/evals/audit-page.json +57 -0
  26. package/evals/audit-urls.json +58 -0
  27. package/evals/cannibalisation.json +57 -0
  28. package/evals/community-intent.json +57 -0
  29. package/evals/compare-crawls.json +56 -0
  30. package/evals/content-optimization.json +57 -0
  31. package/evals/crawl-diff.json +58 -0
  32. package/evals/crawl-history.json +44 -0
  33. package/evals/crawl-report.json +44 -0
  34. package/evals/crawler-rules.json +44 -0
  35. package/evals/ctr-underperformers.json +57 -0
  36. package/evals/decaying-pages.json +57 -0
  37. package/evals/entity-readiness.json +57 -0
  38. package/evals/explain-crawl-issue.json +44 -0
  39. package/evals/generate-llms-txt.json +44 -0
  40. package/evals/geo-gaps.json +57 -0
  41. package/evals/index-coverage-plan.json +58 -0
  42. package/evals/index-coverage.json +70 -0
  43. package/evals/index-monitor.json +58 -0
  44. package/evals/index-watch.json +68 -0
  45. package/evals/internal-links.json +57 -0
  46. package/evals/link-recovery.json +58 -0
  47. package/evals/llms-txt-audit.json +44 -0
  48. package/evals/measure-change.json +58 -0
  49. package/evals/monthly-action-plan.json +56 -0
  50. package/evals/monthly-report.json +58 -0
  51. package/evals/narrative-report.json +58 -0
  52. package/evals/okf-build.json +44 -0
  53. package/evals/okf-validate.json +44 -0
  54. package/evals/page-opportunities.json +57 -0
  55. package/evals/performance-audit.json +57 -0
  56. package/evals/pseo-audit.json +84 -0
  57. package/evals/query-clusters.json +57 -0
  58. package/evals/quick-wins.json +86 -0
  59. package/evals/redirect-trace.json +57 -0
  60. package/evals/refresh-priorities.json +57 -0
  61. package/evals/search-performance-overview.json +86 -0
  62. package/evals/second-page.json +58 -0
  63. package/evals/segment-impact.json +57 -0
  64. package/evals/seo-fix-queue.json +85 -0
  65. package/evals/seo-geo-readiness.json +84 -0
  66. package/evals/seo-site-audit.json +85 -0
  67. package/evals/seo-to-ai-query.json +57 -0
  68. package/evals/seo.json +87 -0
  69. package/evals/setup-check.json +56 -0
  70. package/evals/site-crawl.json +44 -0
  71. package/evals/striking-distance.json +85 -0
  72. package/evals/technical-watch.json +57 -0
  73. package/evals/top-fixes.json +44 -0
  74. package/evals/traffic-anomaly.json +57 -0
  75. package/evals/update-correlation.json +57 -0
  76. package/evals/update-postmortem.json +57 -0
  77. package/package.json +103 -23
  78. package/skills/README.md +68 -0
  79. package/skills/seo/SKILL.md +99 -0
  80. package/skills/seo/agents/openai.yaml +4 -0
  81. package/.jshintrc +0 -18
  82. package/.npmignore +0 -3
  83. package/.travis.yml +0 -3
  84. package/Makefile +0 -10
  85. package/index.js +0 -2
  86. package/lib/middleware.js +0 -159
  87. package/lib/seo.js +0 -32
  88. package/test/init.js +0 -43
  89. package/test/middleware.test.js +0 -111
  90. package/test/seo-page-result.html +0 -9
  91. package/test/seo-page.html +0 -9
  92. package/test/seo-routes.js +0 -5
  93. package/test/vendor/jquery-1.11.1.min.js +0 -4
package/README.md CHANGED
@@ -1,51 +1,447 @@
1
- # node-seo [![Build Status](https://travis-ci.org/saschagehlich/node-seo.svg?branch=master)](https://travis-ci.org/saschagehlich/node-seo)
1
+ <p align="center">
2
+ <img src="apps/web/public/favicon.svg" alt="SEO Skill" width="72" height="72">
3
+ </p>
2
4
 
3
- node-seo is a connect middleware that can generate, cache and serve HTML
4
- snapshots of single page web apps for search bots. Uses [PhantomJS](http://phantomjs.org/)
5
- for generating snapshots.
5
+ <h1 align="center">SEO Skill</h1>
6
6
 
7
- ## Installation
7
+ <p align="center">
8
+ The only SEO skill your agent needs. 50+ SEO audit tools through a local CLI and MCP server, using your own crawl, Search Console, and GA4 data.
9
+ </p>
8
10
 
9
- via npm:
11
+ <p align="center">
12
+ <a href="#quick-start">Get started</a>
13
+ ·
14
+ <a href="https://seoskill.dev/docs">Documentation</a>
15
+ ·
16
+ <a href="https://www.npmjs.com/package/seo">npm</a>
17
+ ·
18
+ <a href="https://github.com/iannuttall/seo/issues">Questions</a>
19
+ ·
20
+ <a href="https://seoskill.dev/privacy">Privacy</a>
21
+ ·
22
+ <a href="SECURITY.md">Security</a>
23
+ ·
24
+ <a href="LICENSE">License</a>
25
+ ·
26
+ <a href="AGENTS.md">Agent notes</a>
27
+ </p>
10
28
 
11
- ```bash
12
- $ npm install seo
29
+ <p align="center">
30
+ <a href="https://github.com/iannuttall/seo/actions/workflows/ci.yml"><img alt="Checks" src="https://img.shields.io/github/actions/workflow/status/iannuttall/seo/ci.yml?branch=main&label=checks&style=flat-square"></a>
31
+ <a href="https://www.npmjs.com/package/seo"><img alt="npm version" src="https://img.shields.io/npm/v/seo?style=flat-square"></a>
32
+ <a href="https://www.npmjs.com/package/seo"><img alt="npm downloads" src="https://img.shields.io/npm/dm/seo?style=flat-square"></a>
33
+ <img alt="Node 22 or newer" src="https://img.shields.io/badge/Node-22%2B-339933?style=flat-square">
34
+ <img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-ready-3178c6?style=flat-square">
35
+ <a href="LICENSE"><img alt="Apache 2.0 license" src="https://img.shields.io/badge/license-Apache--2.0-lightgrey?style=flat-square"></a>
36
+ </p>
37
+
38
+ The `seo` command runs a full SEO audit from your terminal, turning a local
39
+ crawl and your own search data into work you can inspect and ship. Find
40
+ technical blockers, recover search demand, improve pages already close to more
41
+ clicks, and catch regressions after a release.
42
+
43
+ ## Who this is for
44
+
45
+ - People running their own sites who want a clear audit and a ranked list of
46
+ fixes, without learning a heavy dashboard.
47
+ - AI agents that need real crawl, Search Console, and GA4 evidence through MCP
48
+ and one packaged SEO skill instead of screenshots or guesses.
49
+ - Developers who want to embed the same report engine in a script, a CI job, or
50
+ a TypeScript app.
51
+
52
+ ## Quick start
53
+
54
+ Requires Node 22 or newer.
55
+
56
+ ```sh
57
+ npm i -g seo
58
+ seo start
59
+ seo report
60
+ ```
61
+
62
+ The setup walks you through Google sign-in, your Search Console property, an
63
+ optional GA4 property, and a local project profile. Public releases can include
64
+ the shared Google app. If it is unavailable in your build, setup guides you
65
+ through adding your own desktop OAuth client.
66
+
67
+ That is the normal path. The `seo` command is then available in every terminal,
68
+ script, CI job, and local MCP client on the machine.
69
+
70
+ The main report uses the evidence you have, explains what it could not check,
71
+ and recommends a short list of follow-up commands. You can start with a local
72
+ technical report before connecting Google.
73
+
74
+ Running `seo help` shows the shape of the tool:
75
+
76
+ ```txt
77
+ seo v0.2.0
78
+
79
+ Human-friendly SEO reports first, power tools when you need them.
80
+
81
+ Start here
82
+ seo start Connect Google and save a project profile
83
+ seo report Run the main SEO report for the default project
84
+ seo report --site sc-domain:example.com Run without a profile
85
+ seo report --url https://example.com Start with a local technical report
86
+
87
+ Projects
88
+ seo projects list List saved project profiles
89
+ seo projects add Create or update a project profile
90
+ seo sites List Search Console properties
91
+ seo doctor Check local auth and config
92
+
93
+ Act on a report
94
+ seo refresh-priorities Rank the next best SEO actions
95
+ seo quick-wins Find ranking 4-10 low-CTR wins
96
+ seo second-page Investigate URLs averaging positions 10-20
97
+ seo technical-watch Crawl and index-monitor a site
98
+
99
+ Agent and power tools
100
+ seo report --json Run the main report as structured JSON
101
+ seo export diagnose Export report data to CSV
102
+ seo mcp install Install SEO tools into MCP clients
103
+ seo skill list Show the packaged SEO skill
104
+ seo reports list Discover every structured report
105
+
106
+ Use `seo help <command>` or `seo <command> --help` for command help.
107
+ Use `seo help all` for the longer command list.
108
+ ```
109
+
110
+ ## What you get
111
+
112
+ - Find technical blockers across metadata, links, indexability, canonicals,
113
+ structured data, performance, security, mobile, international SEO, and
114
+ social previews.
115
+ - Rank the work using affected URLs, rule severity, search visibility, and
116
+ analytics value instead of treating every warning equally.
117
+ - See why a finding matters, what evidence supports it, how to fix it, and how
118
+ to verify the change.
119
+ - Save and compare crawl reports without running the same crawl again.
120
+ - Measure SEO changes with matched before and after Search Console windows.
121
+ - Give scripts and agents deterministic JSON, Markdown, stable rule IDs, and a
122
+ compact local MCP surface.
123
+
124
+ ## How the reports stay honest
125
+
126
+ The point of a report is to be defensible, so the design keeps a few rules:
127
+
128
+ - Observed evidence stays separate from derived findings and recommended
129
+ actions. You can always see the crawl row or provider row behind a claim.
130
+ - Partial data is never reported as a zero. A capped, filtered, or sampled
131
+ source says so, and it cannot support a definitive all-clear.
132
+ - Heuristics are labeled as heuristics. A convention or threshold is not
133
+ presented as a search-engine rule.
134
+ - Each recommendation comes with a way to check that the fix worked, rather than
135
+ a promise about rankings or traffic.
136
+
137
+ ## Everyday use
138
+
139
+ `seo start` can save a project profile, which is a local shortcut for a site,
140
+ Search Console property, GA4 property, and brand terms. If you have one default
141
+ project, most commands need no flags.
142
+
143
+ ```sh
144
+ seo report
145
+ seo refresh-priorities
146
+ seo quick-wins
147
+ seo second-page
148
+ seo technical-watch
149
+ ```
150
+
151
+ Use `--project` when you have more than one:
152
+
153
+ ```sh
154
+ seo report --project example
155
+ seo projects list
156
+ ```
157
+
158
+ You can also work without a saved profile:
159
+
160
+ ```sh
161
+ seo report --site sc-domain:example.com
162
+ seo report --url https://example.com
163
+ seo crawl https://example.com
164
+ seo audit-page --url https://example.com/pricing
165
+ ```
166
+
167
+ `seo report --url` crawls the site and saves technical evidence. It does not
168
+ pretend to know traffic, queries, or rankings until you add a Search Console
169
+ property with `seo start`.
170
+
171
+ Run `seo help` for the short path or `seo help all` for the full command list.
172
+
173
+ ## Crawl a site
174
+
175
+ Run a readable technical crawl, the base of any technical SEO audit:
176
+
177
+ ```sh
178
+ seo crawl https://example.com --format pretty
179
+ ```
180
+
181
+ Save it, export it, or compare it with an earlier crawl:
182
+
183
+ ```sh
184
+ seo crawl https://example.com --save
185
+ seo crawl https://example.com --format html --output report.html
186
+ seo crawl-reports
187
+ seo crawl-reports --compare latest --against previous
188
+ ```
189
+
190
+ Useful crawl controls include `--max-pages`, `--max-depth`, `--include`,
191
+ `--exclude`, `--no-sitemap`, `--no-external`, and `--fail-on` for CI.
192
+
193
+ ## Use it in CI and scripts
194
+
195
+ JSON mode never prompts. Pass the site or project explicitly in unattended
196
+ runs.
197
+
198
+ ```sh
199
+ seo report --project example --json
200
+ seo crawl https://example.com --json --output crawl.json
201
+ seo crawl https://example.com --fail-on high --json
202
+ ```
203
+
204
+ Reports keep observed data, derived findings, skipped sections, limits, and
205
+ provider errors separate so automation can make decisions without parsing
206
+ terminal prose.
207
+
208
+ `seo report --json` returns a compact summary, action queue, and bounded crawl
209
+ evidence so an agent can choose its next call without loading every raw report.
210
+ Use `--full` only when a script needs the complete report object.
211
+
212
+ When a CI job needs Search Console or GA4 data, give it a Google service
213
+ account JSON key through its secret store. The service account needs access to
214
+ the exact properties it will query. This GitHub Actions step runs without a
215
+ browser or a copied local token:
216
+
217
+ ```yaml
218
+ - name: Run the SEO report
219
+ run: |
220
+ npm i -g seo
221
+ seo report --site sc-domain:example.com --json > seo-report.json
222
+ env:
223
+ SEO_GOOGLE_SERVICE_ACCOUNT_JSON: ${{ secrets.SEO_GOOGLE_SERVICE_ACCOUNT_JSON }}
224
+ ```
225
+
226
+ The [Google data guide](https://seoskill.dev/docs/google) covers Search
227
+ Console and GA4 permissions, mounted secret files, and how to check the active
228
+ identity safely.
229
+
230
+ Agents can discover and run the same report catalog as MCP without starting a
231
+ server:
232
+
233
+ ```sh
234
+ seo reports list --category crawl --json
235
+ seo reports describe audit-page --json
236
+ seo reports run audit-page --params '{"url":"https://example.com"}' --json
237
+ ```
238
+
239
+ Always describe a report before constructing its parameters. The CLI and MCP
240
+ surfaces read from the same registry, so their ids and JSON Schemas cannot
241
+ drift.
242
+
243
+ ## Use it with AI agents
244
+
245
+ Your agent carries one short SEO skill, and the CLI and MCP server do the
246
+ heavy lifting. The skill teaches an agent how to discover the 50+ audit and
247
+ report tools at runtime, and the agent asks the CLI for the detail on each
248
+ tool only when it is about to run it. You get the whole toolkit without fifty
249
+ skill files sitting in the context window on every session.
250
+
251
+ `seo start` offers to install the SEO skill during setup. In an agent-managed
252
+ environment, add it yourself with the standard installer:
253
+
254
+ ```sh
255
+ npm i -g seo
256
+ npx skills add iannuttall/seo
257
+ ```
258
+
259
+ Then install the local stdio MCP server into a supported client:
260
+
261
+ ```sh
262
+ seo mcp install
263
+ ```
264
+
265
+ The prompt detects installed clients. Scripts can choose one or more explicitly:
266
+
267
+ ```sh
268
+ seo mcp install --codex
269
+ seo mcp install --claude-code
270
+ seo mcp install --cursor
271
+ seo mcp install --claude-desktop
272
+ ```
273
+
274
+ Your client starts the server when it needs it. Run it directly only for manual
275
+ configuration or testing:
276
+
277
+ ```sh
278
+ seo mcp serve
13
279
  ```
14
280
 
15
- ## Configuration
281
+ The repository ships one skill under `skills/seo`. It is a router: it teaches an
282
+ agent to discover reports, describe one to load its depth at runtime, inspect
283
+ the evidence, and request a smaller follow-up instead of loading a giant result
284
+ into context. Per-report guidance lives in the registry and is fetched with
285
+ `seo reports describe <id> --json`, so it never drifts from the skill.
286
+
287
+ The npm package includes the same file for local inspection:
288
+
289
+ ```sh
290
+ seo skill list
291
+ seo skill path seo
292
+ ```
293
+
294
+ Agents can also discover the canonical skill from
295
+ `https://seoskill.dev/.well-known/agent-skills/index.json`. The entry links to
296
+ the canonical skill instructions and includes a content digest for verification.
297
+
298
+ See [MCP and agents](https://seoskill.dev/docs/agents) for setup and tool
299
+ details.
16
300
 
17
- node-seo can be used as a middleware for connect/express, like this:
301
+ ## Use it as a library
18
302
 
19
- ```js
20
- var express = require('express');
21
- var seo = require('seo');
22
- var app = express();
303
+ Install the same unscoped package in any Node 22 or newer project:
23
304
 
24
- app.use(new seo({
25
- cacheDirectory: path.resolve(process.cwd(), '.seo-cache'),
26
- routes: require('./seo-routes'),
27
- requestURL: 'http://localhost:8080',
28
- pageModifier: function (page, callback) {
29
- // This function can be used to modify a page before it is cached
30
- // `page` is an instance of PhantomJS's Page object. For an example
31
- // see `test/middleware.test.js`
32
- }
33
- }).init());
305
+ ```sh
306
+ npm install seo
307
+ ```
308
+
309
+ Run any public report by id with the same definition, input schema, and
310
+ evidence used by the CLI and MCP server:
311
+
312
+ ```ts
313
+ import { describeReport, executeReport } from 'seo/mcp'
314
+
315
+ const description = describeReport('quick-wins')
316
+ const result = await executeReport('quick-wins', {
317
+ site: 'sc-domain:example.com',
318
+ days: 90,
319
+ })
34
320
 
35
- app.listen(8080);
321
+ console.log(description.inputSchema)
322
+ console.log(result)
36
323
  ```
37
324
 
38
- In this case, node-seo will use `seo-routes.js` to check whether it should
39
- create a snapshot for the current path. This file should export a function that
40
- returns a boolean. The first parameter is the current request:
325
+ Or call typed analysis functions directly when your app already knows the job
326
+ it needs to run:
327
+
328
+ ```ts
329
+ import { auditPage, crawlSite } from 'seo'
330
+
331
+ const page = await auditPage({
332
+ url: 'https://example.com/pricing',
333
+ })
334
+
335
+ const crawl = await crawlSite({
336
+ url: 'https://example.com',
337
+ maxPages: 100,
338
+ maxDepth: 4,
339
+ })
41
340
 
42
- ```js
43
- module.exports = function (request) {
44
- if (request.path === '/') return true;
45
- return false;
46
- }
341
+ console.log(page.issues)
342
+ console.log(crawl.summary, crawl.issueGroups)
47
343
  ```
48
344
 
49
- ## Todo
345
+ The main `seo` export contains the report, provider, crawler, storage, and
346
+ rendering APIs. `seo/mcp` exposes report discovery, report execution, and the
347
+ embeddable MCP server. See the [TypeScript library
348
+ guide](https://seoskill.dev/docs/library) for structured error handling,
349
+ local Google access, and more examples.
350
+
351
+ ## Local data and Google access
352
+
353
+ Google OAuth tokens use your system keychain when it is available. On a
354
+ headless machine or a locked keychain, the CLI falls back to a private
355
+ `0600` file in your user config directory. Project profiles, crawl reports, and
356
+ provider caches are also local. Use these commands to inspect or remove them:
357
+
358
+ ```sh
359
+ seo privacy
360
+ seo doctor
361
+ seo auth logout
362
+ seo reset
363
+ ```
364
+
365
+ `seo auth status` shows the active storage mode. Power users can choose it with
366
+ `seo auth storage --keychain` or `seo auth storage --file`.
367
+
368
+ Power users can bring their own Google OAuth client. See
369
+ [getting started](https://seoskill.dev/docs/getting-started) for the available
370
+ auth paths.
371
+
372
+ ## Common questions
373
+
374
+ ### Does my site data stay on my machine?
375
+
376
+ Yes. Reports, project profiles, Google tokens, crawls, and caches stay in your
377
+ local config directory. The CLI only makes the network requests needed to fetch
378
+ your site and call the Google APIs you connect. There is no hosted backend,
379
+ account, or telemetry service.
380
+
381
+ ### Do I need a Google API key?
382
+
383
+ No. `seo start` uses a normal Google sign-in for read-only Search Console and
384
+ GA4 access. Public releases can include a shared desktop OAuth client, and if
385
+ your build does not have one, setup helps you add your own. You can also run a
386
+ local technical crawl with no Google connection at all.
387
+
388
+ ### What does it cost?
389
+
390
+ The `seo` package is free and open source under Apache-2.0. It calls Google APIs
391
+ you already have access to, so there is no separate subscription. Your own API
392
+ quotas still apply.
393
+
394
+ ### How is this different from a paid SEO tool?
395
+
396
+ A hosted SEO tool keeps your data on its servers and shows you a dashboard. This
397
+ runs on your machine, works from your own crawl and Google data, and returns
398
+ structured evidence your agent can read and act on. Every finding shows the
399
+ evidence behind it and a way to verify a fix, so you are not trusting a score
400
+ you cannot inspect.
401
+
402
+ ## Documentation
403
+
404
+ Questions, bug reports, and feature requests go through
405
+ [GitHub Issues](https://github.com/iannuttall/seo/issues). Report suspected
406
+ vulnerabilities privately through the process in [SECURITY.md](SECURITY.md).
407
+
408
+ - [Getting started](https://seoskill.dev/docs/getting-started)
409
+ - [CLI commands](https://seoskill.dev/docs/cli)
410
+ - [Crawler](https://seoskill.dev/docs/crawler)
411
+ - [Reports and data](https://seoskill.dev/docs/reports)
412
+ - [MCP and agents](https://seoskill.dev/docs/agents)
413
+ - [AI-search evidence](https://seoskill.dev/docs/ai-search)
414
+ - [Privacy policy](https://seoskill.dev/privacy)
415
+ - [Terms of use](https://seoskill.dev/terms)
416
+ - [Security policy](https://seoskill.dev/security)
417
+ - [Contributing](CONTRIBUTING.md)
418
+ - [Trademark and brand policy](TRADEMARKS.md)
419
+
420
+ ## Develop locally
421
+
422
+ Most users do not need the source checkout. If you want to contribute:
423
+
424
+ ```sh
425
+ git clone https://github.com/iannuttall/seo.git
426
+ cd seo
427
+ pnpm install
428
+ pnpm build
429
+ node dist/cli.js start --dry-run
430
+ ```
431
+
432
+ Run the full quality gate before opening a pull request:
433
+
434
+ ```sh
435
+ pnpm build
436
+ pnpm typecheck
437
+ pnpm test
438
+ pnpm lint
439
+ pnpm pack --dry-run
440
+ ```
441
+
442
+ Contributor architecture and report-quality rules live in [AGENTS.md](AGENTS.md).
443
+
444
+ ## License
50
445
 
51
- * Ability to pre-render (initial rendering can take some time and we don't want to affect our search engine ranking by slow rendering times)
446
+ The code is available under [Apache-2.0](LICENSE). Project names and artwork are
447
+ covered separately by the [trademark and brand policy](TRADEMARKS.md).
package/SECURITY.md ADDED
@@ -0,0 +1,55 @@
1
+ # Security
2
+
3
+ ## Report a vulnerability
4
+
5
+ Do not open a public issue for a suspected vulnerability.
6
+
7
+ Use GitHub's private vulnerability reporting flow:
8
+
9
+ ```txt
10
+ https://github.com/iannuttall/seo/security/advisories/new
11
+ ```
12
+
13
+ Include the affected command, package, or workflow, clear reproduction steps,
14
+ and the practical impact. Remove Google tokens, API keys, account identifiers,
15
+ analytics data, private URLs, and client data from every example.
16
+
17
+ Use [GitHub Issues](https://github.com/iannuttall/seo/issues) for ordinary
18
+ questions and non-sensitive bugs.
19
+
20
+ ## Local data and credentials
21
+
22
+ `seo` is local-first. Project profiles, Google OAuth metadata, crawl reports,
23
+ and caches stay on the machine running the command. Access and refresh tokens
24
+ use the operating-system keychain when enabled; fallback token files and local
25
+ credential files use private file permissions.
26
+
27
+ Desktop OAuth client credentials are not confidential secrets. User tokens,
28
+ provider API keys, and analytics data are confidential and must never be
29
+ committed, pasted into issues, or included in fixtures.
30
+
31
+ Use `seo privacy` to inspect local storage and `seo reset --yes` to remove it.
32
+ Google grants can also be revoked at
33
+ <https://myaccount.google.com/connections>.
34
+
35
+ ## Maintainer checks
36
+
37
+ Before a public release or a change to auth, storage, crawling, or provider
38
+ boundaries, run:
39
+
40
+ ```sh
41
+ pnpm build
42
+ pnpm typecheck
43
+ pnpm test
44
+ pnpm lint
45
+ pnpm security:check
46
+ pnpm pack --dry-run
47
+ ```
48
+
49
+ The shared desktop OAuth client values are release build inputs. Store them as
50
+ GitHub Actions secrets so they are injected only into the release build.
51
+ Checked-in generated OAuth files must contain placeholders only.
52
+
53
+ `pnpm security:check` runs the dependency audit and gitleaks. On macOS the
54
+ helper installs gitleaks with Homebrew when it is missing. Other platforms must
55
+ install gitleaks first.
package/TERMS.md ADDED
@@ -0,0 +1,94 @@
1
+ # Terms of use
2
+
3
+ Last updated: 10 July 2026
4
+
5
+ These terms cover the official `seo` command-line tool, library, MCP server,
6
+ documentation, and seoskill.dev website.
7
+
8
+ ## Open source licence
9
+
10
+ The software is licensed under the [Apache License
11
+ 2.0](https://github.com/iannuttall/seo/blob/main/LICENSE). That licence controls
12
+ your right to use, copy, modify, and distribute the code. Third-party packages
13
+ keep their own licences.
14
+
15
+ These terms do not take away rights granted by an applicable open source
16
+ licence. They cover use of the official website, documentation, name, Google
17
+ integration, and distributed project services that sit outside the source-code
18
+ licence.
19
+
20
+ ## Use the tool responsibly
21
+
22
+ You are responsible for the commands you run and the sites, accounts, and data
23
+ you use with them. Only crawl, inspect, or analyse a site when you are allowed
24
+ to do so. Follow applicable laws, access controls, robots policies, provider
25
+ terms, and reasonable rate limits.
26
+
27
+ Do not use the project to gain unauthorised access, disrupt a service, evade a
28
+ technical restriction, expose another person's data, or carry out unlawful
29
+ activity.
30
+
31
+ ## Google and other third-party services
32
+
33
+ Google Search Console and Google Analytics access is optional and read-only.
34
+ Your use of Google APIs is also subject to Google's terms and policies. Google
35
+ can change API behaviour, quotas, scopes, or availability without notice to
36
+ this project.
37
+
38
+ The software can request public websites, run browser tooling, and use package
39
+ registries or operating system services. Those products are controlled by
40
+ their respective operators. The project is not responsible for their content,
41
+ availability, security, or data practices.
42
+
43
+ ## Reports are evidence, not a guarantee
44
+
45
+ SEO reports can be incomplete because websites change, providers retain or cap
46
+ data, crawls stop, and search systems do not publish every ranking signal. The
47
+ software is designed to show those limits, but bugs and incorrect findings are
48
+ still possible.
49
+
50
+ Reports are general technical information. They do not promise rankings,
51
+ traffic, revenue, indexing, rich results, AI citations, or any other outcome.
52
+ Check important findings against the live site and the relevant provider before
53
+ making a consequential change.
54
+
55
+ ## Your local data
56
+
57
+ You are responsible for protecting local tokens, configuration, caches,
58
+ reports, exports, backups, and environment variables. Keep secrets out of
59
+ public issues, logs, screenshots, repositories, and shared report files.
60
+
61
+ The [privacy policy](https://seoskill.dev/privacy) explains what the software
62
+ stores and how to remove it.
63
+
64
+ ## Availability and changes
65
+
66
+ The project may change commands, reports, integrations, or documentation in a
67
+ future release. A feature can be fixed, replaced, or removed when needed for
68
+ security, correctness, provider policy, or maintainability.
69
+
70
+ There is no promise that the website, package registry, Google integration, or
71
+ project support will always be available.
72
+
73
+ ## Warranty and liability
74
+
75
+ The software and website are provided without warranties or guarantees. The
76
+ Apache License 2.0 contains the warranty and liability terms for the licensed
77
+ software.
78
+
79
+ To the fullest extent allowed by applicable law, the project maintainer is not
80
+ liable for indirect, incidental, special, consequential, or business losses
81
+ arising from use of the software, website, reports, or third-party services.
82
+ Nothing in these terms excludes liability that cannot legally be excluded.
83
+
84
+ ## Changes to these terms
85
+
86
+ The date at the top will be updated when these terms change. Earlier versions
87
+ remain available in the public Git history. Continued use after a change means
88
+ the new terms apply to later use.
89
+
90
+ ## Questions about these terms
91
+
92
+ Open an issue in the [public GitHub repository](https://github.com/iannuttall/seo/issues).
93
+ Do not include OAuth tokens, private reports, personal data, or other secrets in
94
+ a public issue.
package/TRADEMARKS.md ADDED
@@ -0,0 +1,31 @@
1
+ # Trademark and brand policy
2
+
3
+ The source code is available under Apache-2.0. That license does not grant a
4
+ right to present another product or service as the official `seo` project.
5
+
6
+ This policy covers this project's identity: the name `seo` when it refers to
7
+ this specific package and project, the tagline "The SEO command for AI agents",
8
+ the logo and project artwork, and seoskill.dev.
9
+
10
+ "seo" is a generic term for search engine optimization. This policy claims no
11
+ rights over that generic use. It covers only the project's name in context, its
12
+ logo, its branding, and its tagline.
13
+
14
+ ## Uses that are fine
15
+
16
+ - Truthfully saying that software uses, supports, or is based on `seo`.
17
+ - Linking to the official repository or seoskill.dev.
18
+ - Keeping required attribution and notices in copies or forks.
19
+ - Describing a fork as an unofficial fork, provided the distinction is clear.
20
+
21
+ ## Ask first
22
+
23
+ Open a [GitHub Issue](https://github.com/iannuttall/seo/issues) before using the
24
+ project name or artwork as the main identity of a product, company, hosted
25
+ service, domain, package, event, or merchandise.
26
+
27
+ Do not imply endorsement, partnership, or official status. Forks and hosted
28
+ versions must use a distinct name and visual identity, and must not create
29
+ confusion with the npm package, repository, or seoskill.dev.
30
+
31
+ Nominative and other uses allowed by applicable law remain allowed.