seo 0.13.2 → 0.14.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/PRIVACY.md +37 -8
- package/dist/cli.js +84 -80
- package/dist/cli.js.map +1 -1
- package/dist/{dist-BBszRLUG.js → dist-4Yam8ps7.js} +1 -1
- package/dist/dist-B_2zww72.js +427 -0
- package/dist/dist-B_2zww72.js.map +1 -0
- package/dist/{esm-Dmtr8qrP.js → esm-BmuxgZyN.js} +95 -188
- package/dist/{esm-Dmtr8qrP.js.map → esm-BmuxgZyN.js.map} +1 -1
- package/dist/index.d.ts +92 -406
- package/dist/index.js +1558 -646
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +0 -14
- package/dist/mcp.js +1130 -889
- package/dist/mcp.js.map +1 -1
- package/dist/provider-sdk.d.ts +0 -2
- package/dist/provider-sdk.js +1 -2
- package/package.json +6 -5
- package/site-kit/README.md +13 -0
- package/site-kit/guide/build.md +70 -0
- package/site-kit/guide/data.md +49 -0
- package/site-kit/guide/golden-page.md +50 -0
- package/site-kit/guide/grow.md +58 -0
- package/site-kit/guide/launch.md +55 -0
- package/site-kit/guide/market.md +57 -0
- package/site-kit/guide/plan.md +49 -0
- package/site-kit/guide/scale.md +41 -0
- package/site-kit/guide/setup.md +59 -0
- package/site-kit/guide/writing.md +55 -0
- package/site-kit/starter/.github/workflows/refresh-data.yml +88 -0
- package/site-kit/starter/.node-version +1 -0
- package/site-kit/starter/AGENTS.md +65 -0
- package/site-kit/starter/README.md +11 -0
- package/site-kit/starter/astro.config.mjs +31 -0
- package/site-kit/starter/gitignore +7 -0
- package/site-kit/starter/llms.config.mjs +38 -0
- package/site-kit/starter/package.json +31 -0
- package/site-kit/starter/pnpm-workspace.yaml +5 -0
- package/site-kit/starter/public/_headers +5 -0
- package/site-kit/starter/public/favicon.svg +1 -0
- package/site-kit/starter/public/fonts/InterLatinVF.woff2 +0 -0
- package/site-kit/starter/public/fonts/JetBrainsMonoLatinVF.woff2 +0 -0
- package/site-kit/starter/public/fonts/LICENSE-inter.txt +93 -0
- package/site-kit/starter/public/fonts/LICENSE-jetbrains-mono.txt +93 -0
- package/site-kit/starter/scripts/deploy.mjs +60 -0
- package/site-kit/starter/scripts/markdown-rewrites.mjs +33 -0
- package/site-kit/starter/scripts/refresh-data.mjs +60 -0
- package/site-kit/starter/scripts/validate-data.mjs +47 -0
- package/site-kit/starter/site.config.json +9 -0
- package/site-kit/starter/src/components/Breadcrumbs.astro +27 -0
- package/site-kit/starter/src/components/Button.astro +46 -0
- package/site-kit/starter/src/components/Card.astro +54 -0
- package/site-kit/starter/src/components/CodeBlock.astro +62 -0
- package/site-kit/starter/src/components/FactTable.astro +45 -0
- package/site-kit/starter/src/components/FaqAccordion.astro +143 -0
- package/site-kit/starter/src/components/Footer.astro +34 -0
- package/site-kit/starter/src/components/FormInput.astro +18 -0
- package/site-kit/starter/src/components/FormSelect.astro +34 -0
- package/site-kit/starter/src/components/Header.astro +17 -0
- package/site-kit/starter/src/components/HugeIcon.astro +36 -0
- package/site-kit/starter/src/components/Logo.astro +21 -0
- package/site-kit/starter/src/components/PageHeader.astro +33 -0
- package/site-kit/starter/src/components/SectionHeading.astro +18 -0
- package/site-kit/starter/src/components/ui/button.ts +51 -0
- package/site-kit/starter/src/data/parks.json +106 -0
- package/site-kit/starter/src/data/sources.json +11 -0
- package/site-kit/starter/src/integrations/og-images.ts +49 -0
- package/site-kit/starter/src/integrations/sitemaps.ts +104 -0
- package/site-kit/starter/src/layouts/Base.astro +69 -0
- package/site-kit/starter/src/lib/cn.ts +5 -0
- package/site-kit/starter/src/lib/narrative.ts +115 -0
- package/site-kit/starter/src/lib/og/card.ts +85 -0
- package/site-kit/starter/src/lib/og/path.ts +14 -0
- package/site-kit/starter/src/lib/og/render.ts +30 -0
- package/site-kit/starter/src/lib/parks.ts +84 -0
- package/site-kit/starter/src/lib/seo.ts +97 -0
- package/site-kit/starter/src/pages/404.astro +30 -0
- package/site-kit/starter/src/pages/about.astro +39 -0
- package/site-kit/starter/src/pages/index.astro +52 -0
- package/site-kit/starter/src/pages/parks/[slug].astro +95 -0
- package/site-kit/starter/src/pages/regions/[region].astro +58 -0
- package/site-kit/starter/src/pages/robots.txt.ts +16 -0
- package/site-kit/starter/src/site.ts +29 -0
- package/site-kit/starter/src/styles/globals.css +561 -0
- package/site-kit/starter/tsconfig.json +5 -0
- package/site-kit/starter/wrangler.jsonc +16 -0
- package/skills/seo/SKILL.md +19 -1
- package/dist/dist-7TxFytBp.js +0 -420
- package/dist/dist-7TxFytBp.js.map +0 -1
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
@import "tailwindcss" source("..");
|
|
2
|
+
|
|
3
|
+
/* The whole theme lives in this file. Inter for text, JetBrains Mono for
|
|
4
|
+
code, neutral oklch surfaces, one accent colour, soft muted panels
|
|
5
|
+
instead of borders and shadows, and automatic light and dark mode.
|
|
6
|
+
Pages and components use the token classes (bg-muted, text-foreground,
|
|
7
|
+
text-primary) and never a raw colour, so changing a value here restyles
|
|
8
|
+
the whole site. `seo site check` fails on raw colours and <style> blocks
|
|
9
|
+
anywhere else. */
|
|
10
|
+
|
|
11
|
+
/* Latin subsets of the variable fonts. The sharing images use the same
|
|
12
|
+
files. For a language with other letters, swap in the full fonts. */
|
|
13
|
+
@font-face {
|
|
14
|
+
font-family: "InterVariable";
|
|
15
|
+
src: url("/fonts/InterLatinVF.woff2") format("woff2");
|
|
16
|
+
font-display: swap;
|
|
17
|
+
font-style: normal;
|
|
18
|
+
font-weight: 100 900;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Arial scaled to Inter's width and line metrics, so text does not move
|
|
22
|
+
when Inter arrives after the first paint. */
|
|
23
|
+
@font-face {
|
|
24
|
+
font-family: "Inter fallback";
|
|
25
|
+
src: local("Arial"), local("ArialMT");
|
|
26
|
+
size-adjust: 107.12%;
|
|
27
|
+
ascent-override: 90.44%;
|
|
28
|
+
descent-override: 22.52%;
|
|
29
|
+
line-gap-override: 0%;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@font-face {
|
|
33
|
+
font-family: "JetBrains Mono";
|
|
34
|
+
src: url("/fonts/JetBrainsMonoLatinVF.woff2") format("woff2");
|
|
35
|
+
font-display: swap;
|
|
36
|
+
font-style: normal;
|
|
37
|
+
font-weight: 100 800;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@theme inline {
|
|
41
|
+
--color-background: var(--background);
|
|
42
|
+
--color-background-raised: var(--background-raised);
|
|
43
|
+
--color-background-subtle: var(--background-subtle);
|
|
44
|
+
--color-foreground: var(--foreground);
|
|
45
|
+
--color-foreground-muted: var(--foreground-muted);
|
|
46
|
+
--color-foreground-soft: var(--foreground-soft);
|
|
47
|
+
--color-border: var(--border);
|
|
48
|
+
--color-border-subtle: var(--border-subtle);
|
|
49
|
+
--color-border-strong: var(--border-strong);
|
|
50
|
+
--color-input: var(--input);
|
|
51
|
+
--color-ring: var(--ring);
|
|
52
|
+
--color-card: var(--card);
|
|
53
|
+
--color-card-foreground: var(--card-foreground);
|
|
54
|
+
--color-popover: var(--popover);
|
|
55
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
56
|
+
--color-primary: var(--primary);
|
|
57
|
+
--color-primary-soft: var(--primary-soft);
|
|
58
|
+
--color-primary-hover: var(--primary-hover);
|
|
59
|
+
--color-primary-active: var(--primary-active);
|
|
60
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
61
|
+
--color-secondary: var(--secondary);
|
|
62
|
+
--color-secondary-soft: var(--secondary-soft);
|
|
63
|
+
--color-secondary-hover: var(--secondary-hover);
|
|
64
|
+
--color-secondary-active: var(--secondary-active);
|
|
65
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
66
|
+
--color-muted: var(--muted);
|
|
67
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
68
|
+
--color-accent: var(--accent);
|
|
69
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
70
|
+
--color-destructive: var(--destructive);
|
|
71
|
+
--color-destructive-soft: var(--destructive-soft);
|
|
72
|
+
--color-destructive-hover: var(--destructive-hover);
|
|
73
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
74
|
+
--color-success: var(--success);
|
|
75
|
+
--color-success-soft: var(--success-soft);
|
|
76
|
+
--color-warning: var(--warning);
|
|
77
|
+
--color-warning-soft: var(--warning-soft);
|
|
78
|
+
--color-warning-foreground: var(--warning-foreground);
|
|
79
|
+
--color-info: var(--info);
|
|
80
|
+
--color-info-soft: var(--info-soft);
|
|
81
|
+
--color-overlay-scrim: var(--overlay-scrim);
|
|
82
|
+
--radius-xs: calc(var(--radius) - 6px);
|
|
83
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
84
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
85
|
+
--radius-lg: var(--radius);
|
|
86
|
+
--radius-xl: calc(var(--radius) + 2px);
|
|
87
|
+
--radius-2xl: calc(var(--radius) + 4px);
|
|
88
|
+
--font-sans:
|
|
89
|
+
"InterVariable", "Inter fallback", ui-sans-serif, system-ui, sans-serif;
|
|
90
|
+
--font-mono:
|
|
91
|
+
"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
|
|
92
|
+
monospace;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
:root {
|
|
96
|
+
color-scheme: light;
|
|
97
|
+
--radius: 0.625rem;
|
|
98
|
+
|
|
99
|
+
/* One value sets the page frame for every page, header and footer. */
|
|
100
|
+
--frame-max: 48rem;
|
|
101
|
+
|
|
102
|
+
--background: oklch(98.5% 0 0);
|
|
103
|
+
--background-raised: oklch(100% 0 0);
|
|
104
|
+
--background-subtle: oklch(96% 0 0);
|
|
105
|
+
--foreground: oklch(20.5% 0 0);
|
|
106
|
+
--foreground-muted: oklch(45% 0 0);
|
|
107
|
+
--foreground-soft: oklch(60% 0 0);
|
|
108
|
+
--border: oklch(92% 0 0);
|
|
109
|
+
--border-subtle: oklch(95% 0 0);
|
|
110
|
+
--border-strong: oklch(85% 0 0);
|
|
111
|
+
--input: oklch(92% 0 0);
|
|
112
|
+
--ring: oklch(54% 0.24 262);
|
|
113
|
+
|
|
114
|
+
--card: oklch(100% 0 0);
|
|
115
|
+
--card-foreground: var(--foreground);
|
|
116
|
+
--popover: oklch(100% 0 0);
|
|
117
|
+
--popover-foreground: var(--foreground);
|
|
118
|
+
|
|
119
|
+
--primary: oklch(54% 0.24 262);
|
|
120
|
+
--primary-soft: oklch(95% 0.035 262);
|
|
121
|
+
--primary-hover: oklch(48% 0.24 262);
|
|
122
|
+
--primary-active: oklch(43% 0.22 262);
|
|
123
|
+
--primary-foreground: oklch(98.5% 0 0);
|
|
124
|
+
|
|
125
|
+
--secondary: oklch(96% 0 0);
|
|
126
|
+
--secondary-soft: oklch(98% 0 0);
|
|
127
|
+
--secondary-hover: oklch(92% 0 0);
|
|
128
|
+
--secondary-active: oklch(88% 0 0);
|
|
129
|
+
--secondary-foreground: var(--foreground);
|
|
130
|
+
|
|
131
|
+
--muted: oklch(96% 0 0);
|
|
132
|
+
--muted-foreground: oklch(45% 0 0);
|
|
133
|
+
--accent: oklch(96% 0 0);
|
|
134
|
+
--accent-foreground: var(--foreground);
|
|
135
|
+
|
|
136
|
+
--destructive: oklch(57% 0.22 27);
|
|
137
|
+
--destructive-soft: oklch(95% 0.05 27);
|
|
138
|
+
--destructive-hover: oklch(50% 0.22 27);
|
|
139
|
+
--destructive-foreground: oklch(98.5% 0 0);
|
|
140
|
+
|
|
141
|
+
--success: oklch(60% 0.16 145);
|
|
142
|
+
--success-soft: oklch(95% 0.04 145);
|
|
143
|
+
--warning: oklch(75% 0.16 80);
|
|
144
|
+
--warning-soft: oklch(95% 0.05 80);
|
|
145
|
+
--warning-foreground: oklch(30% 0.06 80);
|
|
146
|
+
--info: oklch(60% 0.13 240);
|
|
147
|
+
--info-soft: oklch(95% 0.04 240);
|
|
148
|
+
|
|
149
|
+
--overlay-scrim: oklch(0% 0 0 / 0.5);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Dark mode follows the system unless a page sets data-theme on <html>. */
|
|
153
|
+
@media (prefers-color-scheme: dark) {
|
|
154
|
+
:root:not([data-theme="light"]) {
|
|
155
|
+
color-scheme: dark;
|
|
156
|
+
--background: oklch(20.5% 0 0);
|
|
157
|
+
--background-raised: oklch(24% 0 0);
|
|
158
|
+
--background-subtle: oklch(17% 0 0);
|
|
159
|
+
--foreground: oklch(98.5% 0 0);
|
|
160
|
+
--foreground-muted: oklch(72% 0 0);
|
|
161
|
+
--foreground-soft: oklch(55% 0 0);
|
|
162
|
+
--border: oklch(28% 0 0);
|
|
163
|
+
--border-subtle: oklch(24% 0 0);
|
|
164
|
+
--border-strong: oklch(38% 0 0);
|
|
165
|
+
--input: oklch(28% 0 0);
|
|
166
|
+
--ring: oklch(78.9% 0.154 211.53);
|
|
167
|
+
|
|
168
|
+
--card: oklch(24% 0 0);
|
|
169
|
+
--popover: oklch(24% 0 0);
|
|
170
|
+
|
|
171
|
+
--primary: oklch(78.9% 0.154 211.53);
|
|
172
|
+
--primary-soft: oklch(30% 0.07 211.53);
|
|
173
|
+
--primary-hover: oklch(72% 0.16 211.53);
|
|
174
|
+
--primary-active: oklch(65% 0.17 211.53);
|
|
175
|
+
--primary-foreground: oklch(15% 0.05 211.53);
|
|
176
|
+
|
|
177
|
+
--secondary: oklch(28% 0 0);
|
|
178
|
+
--secondary-soft: oklch(24% 0 0);
|
|
179
|
+
--secondary-hover: oklch(34% 0 0);
|
|
180
|
+
--secondary-active: oklch(40% 0 0);
|
|
181
|
+
|
|
182
|
+
--muted: oklch(28% 0 0);
|
|
183
|
+
--accent: oklch(28% 0 0);
|
|
184
|
+
|
|
185
|
+
--destructive: oklch(65% 0.22 27);
|
|
186
|
+
--destructive-soft: oklch(30% 0.1 27);
|
|
187
|
+
--destructive-hover: oklch(58% 0.22 27);
|
|
188
|
+
|
|
189
|
+
--success: oklch(70% 0.16 145);
|
|
190
|
+
--success-soft: oklch(28% 0.07 145);
|
|
191
|
+
--warning: oklch(80% 0.16 80);
|
|
192
|
+
--warning-soft: oklch(30% 0.08 80);
|
|
193
|
+
--info: oklch(72% 0.13 240);
|
|
194
|
+
--info-soft: oklch(28% 0.07 240);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
:root[data-theme="dark"] {
|
|
199
|
+
color-scheme: dark;
|
|
200
|
+
--background: oklch(20.5% 0 0);
|
|
201
|
+
--background-raised: oklch(24% 0 0);
|
|
202
|
+
--background-subtle: oklch(17% 0 0);
|
|
203
|
+
--foreground: oklch(98.5% 0 0);
|
|
204
|
+
--foreground-muted: oklch(72% 0 0);
|
|
205
|
+
--foreground-soft: oklch(55% 0 0);
|
|
206
|
+
--border: oklch(28% 0 0);
|
|
207
|
+
--border-subtle: oklch(24% 0 0);
|
|
208
|
+
--border-strong: oklch(38% 0 0);
|
|
209
|
+
--input: oklch(28% 0 0);
|
|
210
|
+
--ring: oklch(78.9% 0.154 211.53);
|
|
211
|
+
|
|
212
|
+
--card: oklch(24% 0 0);
|
|
213
|
+
--popover: oklch(24% 0 0);
|
|
214
|
+
|
|
215
|
+
--primary: oklch(78.9% 0.154 211.53);
|
|
216
|
+
--primary-soft: oklch(30% 0.07 211.53);
|
|
217
|
+
--primary-hover: oklch(72% 0.16 211.53);
|
|
218
|
+
--primary-active: oklch(65% 0.17 211.53);
|
|
219
|
+
--primary-foreground: oklch(15% 0.05 211.53);
|
|
220
|
+
|
|
221
|
+
--secondary: oklch(28% 0 0);
|
|
222
|
+
--secondary-soft: oklch(24% 0 0);
|
|
223
|
+
--secondary-hover: oklch(34% 0 0);
|
|
224
|
+
--secondary-active: oklch(40% 0 0);
|
|
225
|
+
|
|
226
|
+
--muted: oklch(28% 0 0);
|
|
227
|
+
--accent: oklch(28% 0 0);
|
|
228
|
+
|
|
229
|
+
--destructive: oklch(65% 0.22 27);
|
|
230
|
+
--destructive-soft: oklch(30% 0.1 27);
|
|
231
|
+
--destructive-hover: oklch(58% 0.22 27);
|
|
232
|
+
|
|
233
|
+
--success: oklch(70% 0.16 145);
|
|
234
|
+
--success-soft: oklch(28% 0.07 145);
|
|
235
|
+
--warning: oklch(80% 0.16 80);
|
|
236
|
+
--warning-soft: oklch(30% 0.08 80);
|
|
237
|
+
--info: oklch(72% 0.13 240);
|
|
238
|
+
--info-soft: oklch(28% 0.07 240);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
@layer base {
|
|
242
|
+
body {
|
|
243
|
+
font-size: 0.9375rem;
|
|
244
|
+
line-height: 1.5;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
h1,
|
|
248
|
+
h2,
|
|
249
|
+
h3,
|
|
250
|
+
h4,
|
|
251
|
+
h5,
|
|
252
|
+
h6 {
|
|
253
|
+
font-weight: 550;
|
|
254
|
+
letter-spacing: 0;
|
|
255
|
+
font-variation-settings: "opsz" 32;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
code,
|
|
259
|
+
pre {
|
|
260
|
+
font-family:
|
|
261
|
+
"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo,
|
|
262
|
+
Consolas, monospace;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
button:not(:disabled),
|
|
266
|
+
[role="button"] {
|
|
267
|
+
cursor: pointer;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* Inputs show exactly what was typed, with no ligatures. */
|
|
271
|
+
input,
|
|
272
|
+
textarea {
|
|
273
|
+
font-variant-ligatures: none;
|
|
274
|
+
font-feature-settings: "liga" 0, "clig" 0, "calt" 0;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.site-prose > :first-child {
|
|
278
|
+
margin-top: 0;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.site-prose > h1 {
|
|
282
|
+
margin-bottom: 1.5rem;
|
|
283
|
+
color: var(--foreground);
|
|
284
|
+
font-weight: 500;
|
|
285
|
+
font-size: 1.875rem;
|
|
286
|
+
line-height: 2.25rem;
|
|
287
|
+
text-wrap: pretty;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.site-prose > h2 {
|
|
291
|
+
margin-top: 3rem;
|
|
292
|
+
color: var(--foreground);
|
|
293
|
+
font-weight: 500;
|
|
294
|
+
font-size: 1.25rem;
|
|
295
|
+
line-height: 1.75rem;
|
|
296
|
+
letter-spacing: 0;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.site-prose > h3 {
|
|
300
|
+
margin-top: 2rem;
|
|
301
|
+
color: var(--foreground);
|
|
302
|
+
font-weight: 500;
|
|
303
|
+
font-size: 1.125rem;
|
|
304
|
+
line-height: 1.75rem;
|
|
305
|
+
letter-spacing: 0;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.site-prose > h4 {
|
|
309
|
+
margin-top: 1.5rem;
|
|
310
|
+
color: var(--foreground);
|
|
311
|
+
font-weight: 500;
|
|
312
|
+
font-size: 1rem;
|
|
313
|
+
line-height: 1.5rem;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.site-prose > p {
|
|
317
|
+
margin-top: 0.75rem;
|
|
318
|
+
color: var(--foreground-muted);
|
|
319
|
+
font-size: 1rem;
|
|
320
|
+
line-height: 1.5rem;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.site-prose > ul,
|
|
324
|
+
.site-prose > ol {
|
|
325
|
+
margin-top: 0.75rem;
|
|
326
|
+
padding-left: 1.25rem;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.site-prose > ul {
|
|
330
|
+
list-style: disc;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.site-prose > ol {
|
|
334
|
+
list-style: decimal;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.site-prose > ul li,
|
|
338
|
+
.site-prose > ol li {
|
|
339
|
+
color: var(--foreground-muted);
|
|
340
|
+
font-size: 1rem;
|
|
341
|
+
line-height: 1.5rem;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.site-prose > ul li + li,
|
|
345
|
+
.site-prose > ol li + li {
|
|
346
|
+
margin-top: 0.375rem;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.site-prose > ul li::marker,
|
|
350
|
+
.site-prose > ol li::marker {
|
|
351
|
+
color: var(--foreground-soft);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.site-prose > p strong,
|
|
355
|
+
.site-prose > ul strong,
|
|
356
|
+
.site-prose > ol strong {
|
|
357
|
+
color: var(--foreground);
|
|
358
|
+
font-weight: 500;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.site-prose > p a,
|
|
362
|
+
.site-prose > ul a,
|
|
363
|
+
.site-prose > ol a,
|
|
364
|
+
.site-prose td a {
|
|
365
|
+
color: var(--primary);
|
|
366
|
+
text-decoration-line: underline;
|
|
367
|
+
text-decoration-color: var(--primary);
|
|
368
|
+
text-underline-offset: 4px;
|
|
369
|
+
transition:
|
|
370
|
+
color 150ms,
|
|
371
|
+
text-decoration-color 150ms;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.site-prose > p a:hover,
|
|
375
|
+
.site-prose > ul a:hover,
|
|
376
|
+
.site-prose > ol a:hover,
|
|
377
|
+
.site-prose td a:hover {
|
|
378
|
+
color: var(--primary-hover);
|
|
379
|
+
text-decoration-color: var(--primary-hover);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.site-prose > p code,
|
|
383
|
+
.site-prose > ul code,
|
|
384
|
+
.site-prose > ol code,
|
|
385
|
+
.site-prose > h2 code,
|
|
386
|
+
.site-prose > h3 code,
|
|
387
|
+
.site-prose td code {
|
|
388
|
+
border-radius: 0.375rem;
|
|
389
|
+
background-color: var(--muted);
|
|
390
|
+
padding: 0.125rem 0.375rem;
|
|
391
|
+
font-size: 0.85em;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
.site-prose > blockquote {
|
|
395
|
+
margin-top: 1.25rem;
|
|
396
|
+
border-radius: 0.5rem;
|
|
397
|
+
background: var(--muted);
|
|
398
|
+
padding: 1rem 1.25rem;
|
|
399
|
+
color: var(--foreground-muted);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
.site-prose > hr {
|
|
403
|
+
margin-top: 2rem;
|
|
404
|
+
border-color: var(--border);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.site-prose pre {
|
|
408
|
+
margin-top: 1.25rem;
|
|
409
|
+
overflow-x: auto;
|
|
410
|
+
border-radius: 0.5rem;
|
|
411
|
+
background: var(--muted) !important;
|
|
412
|
+
padding: 1rem;
|
|
413
|
+
color: var(--foreground);
|
|
414
|
+
font-size: 0.875rem;
|
|
415
|
+
line-height: 1.5rem;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
.site-prose pre code {
|
|
419
|
+
border-radius: 0;
|
|
420
|
+
background-color: transparent;
|
|
421
|
+
padding: 0;
|
|
422
|
+
color: var(--foreground);
|
|
423
|
+
font-size: inherit;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.site-prose pre span {
|
|
427
|
+
color: var(--foreground) !important;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.code-frame {
|
|
431
|
+
position: relative;
|
|
432
|
+
margin-top: 1.25rem;
|
|
433
|
+
min-width: 0;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.site-prose .code-frame pre {
|
|
437
|
+
margin-top: 0;
|
|
438
|
+
padding-right: 3.25rem;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.code-copy-strip {
|
|
442
|
+
position: absolute;
|
|
443
|
+
top: 0;
|
|
444
|
+
right: 0;
|
|
445
|
+
bottom: 0;
|
|
446
|
+
display: flex;
|
|
447
|
+
align-items: flex-start;
|
|
448
|
+
border-radius: 0 0.5rem 0.5rem 0;
|
|
449
|
+
background: var(--muted);
|
|
450
|
+
padding: 0.45rem 0.45rem 0 1.75rem;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.code-copy-button {
|
|
454
|
+
display: inline-flex;
|
|
455
|
+
width: 2rem;
|
|
456
|
+
height: 2rem;
|
|
457
|
+
align-items: center;
|
|
458
|
+
justify-content: center;
|
|
459
|
+
border-radius: 0.375rem;
|
|
460
|
+
background: var(--muted);
|
|
461
|
+
color: var(--foreground-muted);
|
|
462
|
+
transition: color 150ms;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
.code-copy-button:hover {
|
|
466
|
+
color: var(--foreground);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.code-copy-icon {
|
|
470
|
+
width: 1rem;
|
|
471
|
+
height: 1rem;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.code-copy-icon.hidden {
|
|
475
|
+
display: none;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.site-prose table {
|
|
479
|
+
margin-top: 1.25rem;
|
|
480
|
+
width: 100%;
|
|
481
|
+
border-collapse: collapse;
|
|
482
|
+
font-size: 0.9375rem;
|
|
483
|
+
line-height: 1.5rem;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.site-prose th {
|
|
487
|
+
border-bottom: 1px solid var(--border);
|
|
488
|
+
padding: 0.5rem 0.75rem 0.5rem 0;
|
|
489
|
+
color: var(--foreground);
|
|
490
|
+
font-weight: 500;
|
|
491
|
+
text-align: left;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
.site-prose td {
|
|
495
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
496
|
+
padding: 0.5rem 0.75rem 0.5rem 0;
|
|
497
|
+
color: var(--foreground-muted);
|
|
498
|
+
vertical-align: top;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
.site-prose th.text-right,
|
|
502
|
+
.site-prose td.text-right {
|
|
503
|
+
text-align: right;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
.table-frame {
|
|
507
|
+
margin-top: 1.25rem;
|
|
508
|
+
overflow-x: auto;
|
|
509
|
+
overscroll-behavior-inline: contain;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
.table-frame > table {
|
|
513
|
+
margin-top: 0;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
@media (max-width: 40rem) {
|
|
517
|
+
.site-prose > table {
|
|
518
|
+
display: block;
|
|
519
|
+
overflow-x: auto;
|
|
520
|
+
overscroll-behavior-inline: contain;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.site-prose th,
|
|
524
|
+
.site-prose td {
|
|
525
|
+
min-width: 9rem;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
@layer components {
|
|
531
|
+
/* The shared page frame: centred, full width up to --frame-max, with the
|
|
532
|
+
standard gutter. The header, footer and every page use it. */
|
|
533
|
+
.site-frame {
|
|
534
|
+
margin-inline: auto;
|
|
535
|
+
width: 100%;
|
|
536
|
+
max-width: var(--frame-max);
|
|
537
|
+
padding-inline: 1.5rem;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/* The FAQ accordion opens by growing its row from nothing. */
|
|
541
|
+
.faq-content {
|
|
542
|
+
grid-template-rows: 0fr;
|
|
543
|
+
transition: grid-template-rows 200ms ease-out;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
.faq-content[data-state="open"] {
|
|
547
|
+
grid-template-rows: 1fr;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
@media (prefers-reduced-motion: reduce) {
|
|
551
|
+
.faq-content {
|
|
552
|
+
transition: none;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
@media (width >= 64rem) {
|
|
557
|
+
.site-frame {
|
|
558
|
+
padding-inline: 2.5rem;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "node_modules/wrangler/config-schema.json",
|
|
3
|
+
// A static site on Workers static assets. No Worker code runs for pages,
|
|
4
|
+
// so bots cost nothing. Add "main" and run_worker_first: ["/api/*"] only
|
|
5
|
+
// when a route really needs the server, and never for Markdown copies:
|
|
6
|
+
// Cloudflare URL rewrite rules serve those (pnpm rewrites prints them).
|
|
7
|
+
"name": "example-site",
|
|
8
|
+
"compatibility_date": "2026-10-01",
|
|
9
|
+
"assets": {
|
|
10
|
+
"directory": "./dist",
|
|
11
|
+
"html_handling": "drop-trailing-slash",
|
|
12
|
+
"not_found_handling": "404-page"
|
|
13
|
+
},
|
|
14
|
+
"preview_urls": true,
|
|
15
|
+
"observability": { "enabled": false }
|
|
16
|
+
}
|
package/skills/seo/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: seo
|
|
3
|
-
description: Free Google Search Console MCP server and CLI for AI agents. Reads your real Search Console, Google Analytics, Bing Webmaster Tools and Clicky data, plus DataForSEO and Ahrefs keyword research. Use it for any SEO question - why Google traffic or clicks dropped, organic traffic decline, quick wins, low CTR, striking distance keywords, content decay and declining pages, keyword cannibalization, indexing and URL inspection, one page's queries, Google update impact, the questions people ask AI that show in Search Console, competitor keywords, backlinks, technical SEO crawls, redirects, internal links and
|
|
3
|
+
description: Free Google Search Console MCP server and CLI for AI agents. Reads your real Search Console, Google Analytics, Bing Webmaster Tools and Clicky data, plus DataForSEO and Ahrefs keyword research. Use it for any SEO question - why Google traffic or clicks dropped, organic traffic decline, quick wins, low CTR, striking distance keywords, content decay and declining pages, keyword cannibalization, indexing and URL inspection, one page's queries, Google update impact, the questions people ask AI that show in Search Console, competitor keywords, backlinks, technical SEO crawls, redirects, internal links, client SEO reports and building a new programmatic SEO site. Returns facts from your own data, never guesses.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# seo
|
|
@@ -28,11 +28,29 @@ link for them to approve, then run it again.
|
|
|
28
28
|
| `seo crawl --url <url>` | `seo_crawl` | Technical issues across a site |
|
|
29
29
|
| `seo internal-links --site <site>` or `--url <url>` | `seo_internal_links` | Links to add across a site, or to one page |
|
|
30
30
|
| `seo sites` | `seo_sites` | The properties the person can read |
|
|
31
|
+
| `seo site new <folder>`, then `seo site guide <step>` | CLI only | Build a new data-driven site on Astro and Cloudflare, one step at a time. Its build runs `seo site check` |
|
|
31
32
|
|
|
32
33
|
Each result ends with the command to run next. Start small and ask for more:
|
|
33
34
|
a site, then a `--section` (`section`), then `--detail rows` or `full`.
|
|
34
35
|
`seo <command> --help` shows the options.
|
|
35
36
|
|
|
37
|
+
## Issues kept between sessions
|
|
38
|
+
|
|
39
|
+
`seo report --site <site> --section issues` (`section "issues"`) checks the
|
|
40
|
+
site again and keeps a list of what it found, each with an id, the latest
|
|
41
|
+
check (found, not found or not checked) and what the person marked it. When
|
|
42
|
+
the person says they fixed an issue or want it left alone, record it:
|
|
43
|
+
`--mark fixed` or `--mark ignored` with `--issues <id>,<id>` (`mark`,
|
|
44
|
+
`issues`, optional `note`). Read the list at the start of a session instead
|
|
45
|
+
of reporting old issues as new. "Fixed" is the person's word; the list says
|
|
46
|
+
when the check still finds it. The CLI and local MCP keep the list in
|
|
47
|
+
`issues.json`; the hosted server keeps it only for sites in the weekly site
|
|
48
|
+
audit. For any other site the result says the server is not storing it and
|
|
49
|
+
ends with the list as JSON (`{"version":1,"sites":{"<site>":[...]}}`, the
|
|
50
|
+
`issues.json` shape): save it in the person's project, such as
|
|
51
|
+
`.seo/issues.json`, and pass its contents as `saved` with the next `issues`
|
|
52
|
+
or `mark` call so marks carry over.
|
|
53
|
+
|
|
36
54
|
## Indexing reasons each week
|
|
37
55
|
|
|
38
56
|
`seo index` inspects known URLs in a fixed order (lost-click pages, Search
|