@silverassist/agents-toolkit 2.0.0 → 2.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.
- package/README.md +37 -2
- package/bin/cli.js +81 -29
- package/package.json +1 -1
- package/src/index.js +2 -1
- package/templates/shared/prompts/audit-ai-seo.prompt.md +107 -0
- package/templates/shared/skills/ai-seo-optimization/SKILL.md +354 -0
package/README.md
CHANGED
|
@@ -11,18 +11,25 @@ Reusable AI agent prompts for development workflows — supports **GitHub Copilo
|
|
|
11
11
|
- ✅ **Multi-Agent Support**: Works with GitHub Copilot, Claude Code, and Codex
|
|
12
12
|
- ✅ **Multi-Stack Filtering**: Install only React or WordPress content with `--stack`
|
|
13
13
|
- ✅ **Multi-Tracker Support**: Choose GitHub Issues or Jira workflows with `--tracker`
|
|
14
|
+
- ✅ **Global Install**: Install once for all projects with `--global`
|
|
14
15
|
- ✅ **Modular Partials**: Reusable prompt fragments
|
|
15
16
|
- ✅ **Customizable**: Easy to extend and modify
|
|
16
17
|
- ✅ **CLI Tool**: Quick installation in any project
|
|
17
18
|
|
|
18
19
|
## Installation
|
|
19
20
|
|
|
20
|
-
**For GitHub Copilot:**
|
|
21
|
+
**For GitHub Copilot (project):**
|
|
21
22
|
|
|
22
23
|
```bash
|
|
23
24
|
npx @silverassist/agents-toolkit@latest install
|
|
24
25
|
```
|
|
25
26
|
|
|
27
|
+
**For GitHub Copilot (global — all projects):**
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx @silverassist/agents-toolkit@latest install --global
|
|
31
|
+
```
|
|
32
|
+
|
|
26
33
|
**For Claude Code:**
|
|
27
34
|
|
|
28
35
|
```bash
|
|
@@ -141,6 +148,26 @@ AGENTS.md # Project instructions for Codex (project
|
|
|
141
148
|
└── testing-patterns/
|
|
142
149
|
```
|
|
143
150
|
|
|
151
|
+
### Global Install (Optional)
|
|
152
|
+
|
|
153
|
+
Install once and have instructions, prompts, and skills available across **all your projects** without running `install` in each one:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# Install everything to ~/.copilot/
|
|
157
|
+
npx @silverassist/agents-toolkit@latest install --global
|
|
158
|
+
|
|
159
|
+
# Filter by stack/tracker
|
|
160
|
+
npx @silverassist/agents-toolkit@latest install --global --stack wordpress
|
|
161
|
+
npx @silverassist/agents-toolkit@latest install --global --stack react --tracker github
|
|
162
|
+
|
|
163
|
+
# Update global install
|
|
164
|
+
npx @silverassist/agents-toolkit@latest update --global
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
This installs to `~/.copilot/` (instructions, prompts, skills) and creates `~/.agents-toolkit.json` as the global config. Project-level files (AGENTS.md, copilot-instructions.md) are skipped since they are project-specific.
|
|
168
|
+
|
|
169
|
+
> **Config resolution order:** CLI flags → project `.agents-toolkit.json` → global `~/.agents-toolkit.json` → defaults.
|
|
170
|
+
|
|
144
171
|
### Configure Project (Optional)
|
|
145
172
|
|
|
146
173
|
Update `.agents-toolkit.json` in your project root (created automatically):
|
|
@@ -218,6 +245,7 @@ npx @silverassist/agents-toolkit@latest install [options]
|
|
|
218
245
|
|
|
219
246
|
| Option | Description |
|
|
220
247
|
|--------|-------------|
|
|
248
|
+
| `--global`, `-g` | Install to `~/.copilot/` for all projects (user-level) |
|
|
221
249
|
| `--target <name>` | Target installer: `copilot`, `claude`, or `codex` |
|
|
222
250
|
| `--stack <name>` | Filter by tech stack: `react`, `wordpress`, or `all` (default) |
|
|
223
251
|
| `--tracker <name>` | Filter by issue tracker: `github`, `jira`, or `all` (default) |
|
|
@@ -269,6 +297,11 @@ npx @silverassist/agents-toolkit@latest install --tracker jira
|
|
|
269
297
|
# Combine stack + tracker
|
|
270
298
|
npx @silverassist/agents-toolkit@latest install --stack react --tracker github
|
|
271
299
|
npx @silverassist/agents-toolkit@latest install --stack wordpress --tracker jira --claude
|
|
300
|
+
|
|
301
|
+
# Global install (all projects, no per-project setup needed)
|
|
302
|
+
npx @silverassist/agents-toolkit@latest install --global
|
|
303
|
+
npx @silverassist/agents-toolkit@latest install --global --stack wordpress
|
|
304
|
+
npx @silverassist/agents-toolkit@latest update --global
|
|
272
305
|
```
|
|
273
306
|
|
|
274
307
|
### update
|
|
@@ -296,9 +329,11 @@ npx @silverassist/agents-toolkit@latest list
|
|
|
296
329
|
| Scenario | Command |
|
|
297
330
|
|----------|---------|
|
|
298
331
|
| First time installation (Copilot) | `install` |
|
|
299
|
-
| First time installation (Any target) | `install --target <copilot
|
|
332
|
+
| First time installation (Any target) | `install --target <copilot\|claude\|codex>` |
|
|
300
333
|
| First time installation (Claude) | `install --claude` |
|
|
301
334
|
| First time installation (Codex) | `install --codex` |
|
|
335
|
+
| Install once for all projects | `install --global` |
|
|
336
|
+
| Update global install | `update --global` |
|
|
302
337
|
| Add only new files (keep customizations) | `install` |
|
|
303
338
|
| Get latest version (discard customizations) | `update` |
|
|
304
339
|
| Update specific category only | `update --prompts-only` |
|
package/bin/cli.js
CHANGED
|
@@ -147,19 +147,35 @@ function info(message) {
|
|
|
147
147
|
log(`ℹ️ ${message}`, 'blue');
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
/**
|
|
151
|
+
* Get the user home directory
|
|
152
|
+
* @returns {string} Path to home directory
|
|
153
|
+
*/
|
|
154
|
+
function getHomeDir() {
|
|
155
|
+
return process.env.HOME || process.env.USERPROFILE || '';
|
|
156
|
+
}
|
|
157
|
+
|
|
150
158
|
/**
|
|
151
159
|
* Get the target directory for Copilot installation
|
|
152
|
-
* @
|
|
160
|
+
* @param {boolean} global - Install to user-level ~/.copilot/
|
|
161
|
+
* @returns {string} Path to .github or ~/.copilot directory
|
|
153
162
|
*/
|
|
154
|
-
function getTargetDir() {
|
|
163
|
+
function getTargetDir(global = false) {
|
|
164
|
+
if (global) {
|
|
165
|
+
return path.join(getHomeDir(), '.copilot');
|
|
166
|
+
}
|
|
155
167
|
return path.join(process.cwd(), '.github');
|
|
156
168
|
}
|
|
157
169
|
|
|
158
170
|
/**
|
|
159
171
|
* Get the target directory for Claude Code installation
|
|
172
|
+
* @param {boolean} global - Install to user-level ~/.claude/
|
|
160
173
|
* @returns {string} Path to .claude directory
|
|
161
174
|
*/
|
|
162
|
-
function getClaudeTargetDir() {
|
|
175
|
+
function getClaudeTargetDir(global = false) {
|
|
176
|
+
if (global) {
|
|
177
|
+
return path.join(getHomeDir(), '.claude');
|
|
178
|
+
}
|
|
163
179
|
return path.join(process.cwd(), '.claude');
|
|
164
180
|
}
|
|
165
181
|
|
|
@@ -285,20 +301,21 @@ function getChangeCount(result, dryRun) {
|
|
|
285
301
|
return dryRun ? result.planned : result.written;
|
|
286
302
|
}
|
|
287
303
|
|
|
288
|
-
function ensureConfigFile({ dryRun = false } = {}) {
|
|
289
|
-
const
|
|
304
|
+
function ensureConfigFile({ dryRun = false, global = false } = {}) {
|
|
305
|
+
const configDir = global ? getHomeDir() : process.cwd();
|
|
306
|
+
const configPath = path.join(configDir, '.agents-toolkit.json');
|
|
290
307
|
|
|
291
308
|
if (fs.existsSync(configPath)) {
|
|
292
309
|
return { written: 0, planned: 0 };
|
|
293
310
|
}
|
|
294
311
|
|
|
295
312
|
if (dryRun) {
|
|
296
|
-
info(
|
|
313
|
+
info(`Would create ${global ? '~' : '.'}/.agents-toolkit.json`);
|
|
297
314
|
return { written: 0, planned: 1 };
|
|
298
315
|
}
|
|
299
316
|
|
|
300
317
|
fs.writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2));
|
|
301
|
-
success(
|
|
318
|
+
success(`Created ${global ? '~' : '.'}/.agents-toolkit.json config file`);
|
|
302
319
|
return { written: 1, planned: 1 };
|
|
303
320
|
}
|
|
304
321
|
|
|
@@ -422,10 +439,11 @@ function installGitBasedTarget(options = {}, target = 'copilot') {
|
|
|
422
439
|
force = false,
|
|
423
440
|
append = false,
|
|
424
441
|
dryRun = false,
|
|
442
|
+
global: isGlobal = false,
|
|
425
443
|
filters = { stack: 'all', tracker: 'all' },
|
|
426
444
|
} = options;
|
|
427
445
|
const isCodex = target === 'codex';
|
|
428
|
-
const targetDir = getTargetDir();
|
|
446
|
+
const targetDir = getTargetDir(isGlobal);
|
|
429
447
|
const scope = getInstallScope(options);
|
|
430
448
|
let totalChanges = 0;
|
|
431
449
|
|
|
@@ -437,7 +455,11 @@ function installGitBasedTarget(options = {}, target = 'copilot') {
|
|
|
437
455
|
const promptsFilter = makeFilter('prompts');
|
|
438
456
|
const partialsFilter = makeFilter('partials');
|
|
439
457
|
|
|
440
|
-
log(isCodex ? '\n⚡ Codex Installer\n' : '\n📦 Agents Toolkit Installer\n', 'bright');
|
|
458
|
+
log(isCodex ? '\n⚡ Codex Installer\n' : isGlobal ? '\n🌐 Agents Toolkit Global Installer\n' : '\n📦 Agents Toolkit Installer\n', 'bright');
|
|
459
|
+
|
|
460
|
+
if (isGlobal) {
|
|
461
|
+
info(`Target: ${targetDir}\n`);
|
|
462
|
+
}
|
|
441
463
|
|
|
442
464
|
if (dryRun) {
|
|
443
465
|
info('Dry run mode - no files will be copied\n');
|
|
@@ -473,15 +495,15 @@ function installGitBasedTarget(options = {}, target = 'copilot') {
|
|
|
473
495
|
}
|
|
474
496
|
}
|
|
475
497
|
|
|
476
|
-
const configResult = ensureConfigFile({ dryRun });
|
|
498
|
+
const configResult = ensureConfigFile({ dryRun, global: isGlobal });
|
|
477
499
|
totalChanges += getChangeCount(configResult, dryRun);
|
|
478
500
|
|
|
479
|
-
if (scope.shouldInstallInstructions && !isCodex) {
|
|
501
|
+
if (!isGlobal && scope.shouldInstallInstructions && !isCodex) {
|
|
480
502
|
const copilotInstructionsResult = installCopilotInstructions({ targetDir, dryRun });
|
|
481
503
|
totalChanges += getChangeCount(copilotInstructionsResult, dryRun);
|
|
482
504
|
}
|
|
483
505
|
|
|
484
|
-
if (scope.shouldInstallInstructions) {
|
|
506
|
+
if (!isGlobal && scope.shouldInstallInstructions) {
|
|
485
507
|
const agentsTemplatePath = isCodex
|
|
486
508
|
? path.join(TEMPLATES_DIR, 'agents', 'AGENTS.codex.md')
|
|
487
509
|
: path.join(TEMPLATES_DIR, 'agents', 'AGENTS.md');
|
|
@@ -495,14 +517,20 @@ function installGitBasedTarget(options = {}, target = 'copilot') {
|
|
|
495
517
|
} else if (totalChanges > 0) {
|
|
496
518
|
success(`Installation complete! ${totalChanges} files installed.`);
|
|
497
519
|
console.log('');
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
console.log(' 2.
|
|
502
|
-
console.log(' 3. Run Codex from this project root');
|
|
520
|
+
if (isGlobal) {
|
|
521
|
+
info('Next steps:');
|
|
522
|
+
console.log(` 1. Update ~/.agents-toolkit.json with your defaults`);
|
|
523
|
+
console.log(' 2. Instructions/prompts/skills are now available globally in VS Code');
|
|
503
524
|
} else {
|
|
504
|
-
|
|
505
|
-
console.log('
|
|
525
|
+
info('Next steps:');
|
|
526
|
+
console.log(' 1. Update .agents-toolkit.json with your Jira project key');
|
|
527
|
+
if (isCodex) {
|
|
528
|
+
console.log(' 2. Review AGENTS.md in the project root');
|
|
529
|
+
console.log(' 3. Run Codex from this project root');
|
|
530
|
+
} else {
|
|
531
|
+
console.log(' 2. Configure Atlassian MCP in VS Code');
|
|
532
|
+
console.log(' 3. Run prompts via Command Palette > "GitHub Copilot: Run Prompt"');
|
|
533
|
+
}
|
|
506
534
|
}
|
|
507
535
|
} else {
|
|
508
536
|
warn('No new files installed. Use --force to overwrite existing files.');
|
|
@@ -531,10 +559,10 @@ function installCodex(options = {}) {
|
|
|
531
559
|
* @param {Object} options - Install options
|
|
532
560
|
*/
|
|
533
561
|
function installClaude(options = {}) {
|
|
534
|
-
const { force = false, dryRun = false, filters = { stack: 'all', tracker: 'all' } } = options;
|
|
562
|
+
const { force = false, dryRun = false, global: isGlobal = false, filters = { stack: 'all', tracker: 'all' } } = options;
|
|
535
563
|
const scope = getInstallScope(options);
|
|
536
|
-
const claudeDir = getClaudeTargetDir();
|
|
537
|
-
const githubDir = getTargetDir();
|
|
564
|
+
const claudeDir = getClaudeTargetDir(isGlobal);
|
|
565
|
+
const githubDir = getTargetDir(isGlobal);
|
|
538
566
|
let totalChanges = 0;
|
|
539
567
|
|
|
540
568
|
const makeFilter = (category) => (name) => {
|
|
@@ -588,7 +616,7 @@ function installClaude(options = {}) {
|
|
|
588
616
|
}
|
|
589
617
|
}
|
|
590
618
|
|
|
591
|
-
if (scope.shouldInstallInstructions) {
|
|
619
|
+
if (!isGlobal && scope.shouldInstallInstructions) {
|
|
592
620
|
const claudeMdPath = path.join(process.cwd(), 'CLAUDE.md');
|
|
593
621
|
const claudeMdTemplate = path.join(TEMPLATES_DIR, 'agents', 'CLAUDE.md');
|
|
594
622
|
|
|
@@ -608,7 +636,7 @@ function installClaude(options = {}) {
|
|
|
608
636
|
}
|
|
609
637
|
}
|
|
610
638
|
|
|
611
|
-
const configResult = ensureConfigFile({ dryRun });
|
|
639
|
+
const configResult = ensureConfigFile({ dryRun, global: isGlobal });
|
|
612
640
|
totalChanges += getChangeCount(configResult, dryRun);
|
|
613
641
|
|
|
614
642
|
console.log('');
|
|
@@ -617,10 +645,16 @@ function installClaude(options = {}) {
|
|
|
617
645
|
} else if (totalChanges > 0) {
|
|
618
646
|
success(`Installation complete! ${totalChanges} files installed.`);
|
|
619
647
|
console.log('');
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
648
|
+
if (isGlobal) {
|
|
649
|
+
info('Next steps:');
|
|
650
|
+
console.log(' 1. Update ~/.agents-toolkit.json with your defaults');
|
|
651
|
+
console.log(' 2. Claude commands are now available globally');
|
|
652
|
+
} else {
|
|
653
|
+
info('Next steps:');
|
|
654
|
+
console.log(' 1. Update .agents-toolkit.json with your Jira project key');
|
|
655
|
+
console.log(' 2. Configure Atlassian MCP in Claude Code settings');
|
|
656
|
+
console.log(' 3. Run slash commands with /analyze-ticket, /work-ticket, etc.');
|
|
657
|
+
}
|
|
624
658
|
} else {
|
|
625
659
|
warn('No new files installed. Use --force to overwrite existing files.');
|
|
626
660
|
}
|
|
@@ -700,6 +734,7 @@ function showHelp() {
|
|
|
700
734
|
console.log('');
|
|
701
735
|
log('Options:', 'cyan');
|
|
702
736
|
console.log(' --force, -f Overwrite existing files');
|
|
737
|
+
console.log(' --global, -g Install to ~/.copilot/ (user-level, all projects)');
|
|
703
738
|
console.log(' --target <name> Target installer: copilot | claude | codex');
|
|
704
739
|
console.log(' --stack <name> Filter by stack: react | wordpress | all (default: all)');
|
|
705
740
|
console.log(' --tracker <name> Filter by tracker: jira | github | all (default: all)');
|
|
@@ -714,7 +749,9 @@ function showHelp() {
|
|
|
714
749
|
|
|
715
750
|
console.log('');
|
|
716
751
|
log('Examples:', 'cyan');
|
|
717
|
-
console.log(' npx agents-toolkit install # All content');
|
|
752
|
+
console.log(' npx agents-toolkit install # All content to .github/');
|
|
753
|
+
console.log(' npx agents-toolkit install --global # All content to ~/.copilot/');
|
|
754
|
+
console.log(' npx agents-toolkit install --global --stack react # React only to ~/.copilot/');
|
|
718
755
|
console.log(' npx agents-toolkit install --stack react # React/TS only');
|
|
719
756
|
console.log(' npx agents-toolkit install --stack wordpress # PHP/WordPress only');
|
|
720
757
|
console.log(' npx agents-toolkit install --tracker github # GitHub Issues workflow');
|
|
@@ -779,6 +816,7 @@ function parseArgs() {
|
|
|
779
816
|
|
|
780
817
|
const options = {
|
|
781
818
|
force: flags.includes('--force') || flags.includes('-f'),
|
|
819
|
+
global: flags.includes('--global') || flags.includes('-g'),
|
|
782
820
|
promptsOnly: flags.includes('--prompts-only'),
|
|
783
821
|
partialsOnly: flags.includes('--partials-only'),
|
|
784
822
|
skillsOnly: flags.includes('--skills-only'),
|
|
@@ -841,6 +879,7 @@ function resolveInstallTarget(options = {}) {
|
|
|
841
879
|
|
|
842
880
|
/**
|
|
843
881
|
* Resolve stack and tracker filters from flags or config file
|
|
882
|
+
* Resolution order: CLI flags > project config > global config > defaults
|
|
844
883
|
* @param {Object} options - Parsed CLI options
|
|
845
884
|
* @returns {{ stack: string, tracker: string }} Resolved filters
|
|
846
885
|
*/
|
|
@@ -851,6 +890,19 @@ function resolveFilters(options = {}) {
|
|
|
851
890
|
let stack = 'all';
|
|
852
891
|
let tracker = 'all';
|
|
853
892
|
|
|
893
|
+
// Check global config first (~/.agents-toolkit.json)
|
|
894
|
+
const globalConfigPath = path.join(getHomeDir(), '.agents-toolkit.json');
|
|
895
|
+
if (fs.existsSync(globalConfigPath)) {
|
|
896
|
+
try {
|
|
897
|
+
const config = JSON.parse(fs.readFileSync(globalConfigPath, 'utf-8'));
|
|
898
|
+
if (config.stack) stack = config.stack;
|
|
899
|
+
if (config.tracker) tracker = config.tracker;
|
|
900
|
+
} catch {
|
|
901
|
+
// Ignore invalid config
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
// Project config overrides global
|
|
854
906
|
const configPath = path.join(process.cwd(), '.agents-toolkit.json');
|
|
855
907
|
if (fs.existsSync(configPath)) {
|
|
856
908
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@silverassist/agents-toolkit",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Reusable AI agent prompts for development workflows with Jira integration — supports GitHub Copilot, Claude Code, and Codex",
|
|
5
5
|
"author": "Santiago Ramirez",
|
|
6
6
|
"license": "PolyForm-Noncommercial-1.0.0",
|
package/src/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module @silverassist/agents-toolkit
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export const VERSION = "2.
|
|
6
|
+
export const VERSION = "2.2.0";
|
|
7
7
|
|
|
8
8
|
export const PROMPTS = {
|
|
9
9
|
workflow: [
|
|
@@ -37,6 +37,7 @@ export const SKILLS = [
|
|
|
37
37
|
"component-architecture",
|
|
38
38
|
"domain-driven-design",
|
|
39
39
|
"testing-patterns",
|
|
40
|
+
"ai-seo-optimization",
|
|
40
41
|
];
|
|
41
42
|
|
|
42
43
|
// Claude Code equivalents
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
agent: agent
|
|
3
|
+
description: Run a comprehensive AI SEO optimization audit on the current project. Checks agent-friendly UX, E-E-A-T signals, content quality, technical SEO, and structured data.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI SEO Optimization Audit
|
|
7
|
+
|
|
8
|
+
Run a comprehensive audit of this project for Google AI Search visibility and browser agent readiness.
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
Use the `ai-seo-optimization` skill as reference for all criteria. This audit follows Google's official AI Optimization Guide (May 2026).
|
|
13
|
+
|
|
14
|
+
## Audit Steps
|
|
15
|
+
|
|
16
|
+
### 1. Technical Baseline
|
|
17
|
+
|
|
18
|
+
> **Scope**: The checks below use Next.js App Router terminology (Server Components, `generateMetadata`). For non-Next.js projects, adapt to the equivalent patterns (e.g., SSR/SSG for content rendering, `<meta>` tags for metadata).
|
|
19
|
+
|
|
20
|
+
Check the following in the codebase:
|
|
21
|
+
|
|
22
|
+
- [ ] Pages use Server Components or SSR (content is rendered server-side, not client-only)
|
|
23
|
+
- [ ] No `nosnippet` or `data-nosnippet` on key content
|
|
24
|
+
- [ ] Metadata (title, description, OpenGraph) is set for all pages
|
|
25
|
+
- [ ] Canonical tags are properly set (no duplicates)
|
|
26
|
+
- [ ] XML sitemap exists and includes all valuable pages
|
|
27
|
+
- [ ] `robots.txt` doesn't block critical resources
|
|
28
|
+
|
|
29
|
+
### 2. Agent-Friendly UX
|
|
30
|
+
|
|
31
|
+
Audit components for:
|
|
32
|
+
|
|
33
|
+
- [ ] No `<div onClick>` patterns (must use `<button>` or `<a>`)
|
|
34
|
+
- [ ] All `<input>` elements have associated `<label htmlFor>`
|
|
35
|
+
- [ ] Heading hierarchy is correct (`h1` → `h2` → `h3`, no skips)
|
|
36
|
+
- [ ] Skip-to-content link exists as first focusable element
|
|
37
|
+
- [ ] Interactive elements have `cursor: pointer`
|
|
38
|
+
- [ ] No ghost overlays blocking interactive elements
|
|
39
|
+
- [ ] All interactive elements have accessible names
|
|
40
|
+
|
|
41
|
+
### 3. E-E-A-T Signals (YMYL Sites)
|
|
42
|
+
|
|
43
|
+
Check for existence of:
|
|
44
|
+
|
|
45
|
+
- [ ] Author pages with credentials and `Person` schema
|
|
46
|
+
- [ ] About/Mission page with team information
|
|
47
|
+
- [ ] Methodology or "How we rate" page
|
|
48
|
+
- [ ] Data source disclosures
|
|
49
|
+
- [ ] Contact information easily accessible
|
|
50
|
+
- [ ] Privacy policy and terms linked from all pages
|
|
51
|
+
- [ ] Content dates (published/modified) visible
|
|
52
|
+
|
|
53
|
+
### 4. Content Quality Assessment
|
|
54
|
+
|
|
55
|
+
Review top landing pages for:
|
|
56
|
+
|
|
57
|
+
- [ ] Unique data or insights not available elsewhere
|
|
58
|
+
- [ ] First-hand experience signals
|
|
59
|
+
- [ ] Expert commentary with attribution
|
|
60
|
+
- [ ] Interactive tools or calculators
|
|
61
|
+
- [ ] No thin/commodity content on indexed pages
|
|
62
|
+
|
|
63
|
+
### 5. Structured Data Validation
|
|
64
|
+
|
|
65
|
+
Check JSON-LD implementation:
|
|
66
|
+
|
|
67
|
+
- [ ] `LocalBusiness` on community/location pages (with address, geo, priceRange)
|
|
68
|
+
- [ ] `Person` on author pages (with knowsAbout, jobTitle)
|
|
69
|
+
- [ ] `Article` on blog posts (with author, datePublished, dateModified)
|
|
70
|
+
- [ ] `BreadcrumbList` on all pages
|
|
71
|
+
- [ ] `Organization` on homepage
|
|
72
|
+
- [ ] No validation errors (test with Rich Results Test)
|
|
73
|
+
|
|
74
|
+
### 6. Performance & Core Web Vitals
|
|
75
|
+
|
|
76
|
+
- [ ] LCP < 2.5s on key templates
|
|
77
|
+
- [ ] CLS < 0.1 (no layout shifts)
|
|
78
|
+
- [ ] INP < 200ms (responsive interactions)
|
|
79
|
+
- [ ] Images have explicit dimensions
|
|
80
|
+
- [ ] Fonts use `display: swap`
|
|
81
|
+
|
|
82
|
+
## Output Format
|
|
83
|
+
|
|
84
|
+
Provide results as:
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
## AI SEO Audit Results — [Project Name]
|
|
88
|
+
|
|
89
|
+
### Score Summary
|
|
90
|
+
| Area | Status | Score |
|
|
91
|
+
|------|--------|-------|
|
|
92
|
+
| Technical Baseline | 🟢/🟡/🔴 | X/Y |
|
|
93
|
+
| Agent-Friendly UX | 🟢/🟡/🔴 | X/Y |
|
|
94
|
+
| E-E-A-T Signals | 🟢/🟡/🔴 | X/Y |
|
|
95
|
+
| Content Quality | 🟢/🟡/🔴 | X/Y |
|
|
96
|
+
| Structured Data | 🟢/🟡/🔴 | X/Y |
|
|
97
|
+
| Performance | 🟢/🟡/🔴 | X/Y |
|
|
98
|
+
|
|
99
|
+
### Critical Issues (Fix Immediately)
|
|
100
|
+
- ...
|
|
101
|
+
|
|
102
|
+
### Improvements (High Impact)
|
|
103
|
+
- ...
|
|
104
|
+
|
|
105
|
+
### Recommendations (Nice to Have)
|
|
106
|
+
- ...
|
|
107
|
+
```
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai-seo-optimization
|
|
3
|
+
description: Optimize websites for Google's generative AI features and browser agents. Use when asked to "optimize for AI search", "AI overview", "agent-friendly audit", "E-E-A-T assessment", "AI SEO", "generative search optimization", or "audit accessibility for agents".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI SEO Optimization Skill
|
|
7
|
+
|
|
8
|
+
Comprehensive guide for optimizing Next.js sites for Google's generative AI features (AI Overviews, AI Mode) and emerging browser agent interactions.
|
|
9
|
+
|
|
10
|
+
> **Source**: [Google AI Optimization Guide](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) (May 2026)
|
|
11
|
+
> **Companion**: [Build Agent-Friendly Websites](https://web.dev/articles/ai-agent-site-ux) (April 2026)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Core Principle
|
|
16
|
+
|
|
17
|
+
**AI Search optimization IS SEO.** There is no separate "AEO" or "GEO" discipline. Google's AI features use the same Search index, the same ranking signals, and the same content quality assessments. If your page is well-optimized for Search, it's well-optimized for AI features.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. How Google's AI Features Discover Content
|
|
22
|
+
|
|
23
|
+
Google's generative AI features use **Retrieval-Augmented Generation (RAG)**:
|
|
24
|
+
|
|
25
|
+
1. User query triggers **query fan-out** (multiple sub-queries)
|
|
26
|
+
2. Each sub-query retrieves pages from the **existing Search index**
|
|
27
|
+
3. AI synthesizes answers from retrieved content
|
|
28
|
+
4. Citations link back to source pages
|
|
29
|
+
|
|
30
|
+
**Requirements for inclusion:**
|
|
31
|
+
- Page MUST be indexed (verify in Search Console)
|
|
32
|
+
- Page MUST allow snippets (no `nosnippet` meta directive)
|
|
33
|
+
- Content MUST be server-rendered (not client-only JavaScript)
|
|
34
|
+
- Content MUST be accessible to Googlebot (no login walls for indexed content)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 2. Agent-Friendly UX Audit Checklist
|
|
39
|
+
|
|
40
|
+
Browser agents (Google's Mariner, OpenAI's Operator, etc.) interact with sites through three channels:
|
|
41
|
+
|
|
42
|
+
1. **Screenshots** — Vision model identifies elements visually
|
|
43
|
+
2. **HTML/DOM** — Understands nesting, hierarchy, relationships
|
|
44
|
+
3. **Accessibility tree** — Roles, names, states of interactive elements
|
|
45
|
+
|
|
46
|
+
### Semantic HTML
|
|
47
|
+
|
|
48
|
+
- [ ] All clickable elements use `<button>` or `<a href>` (NEVER `<div onClick>` or `<span onClick>`)
|
|
49
|
+
- [ ] All form inputs have associated `<label htmlFor="id">` (not just placeholder text)
|
|
50
|
+
- [ ] Heading hierarchy is logical (`h1` > `h2` > `h3`, no skips)
|
|
51
|
+
- [ ] Lists use `<ul>`/`<ol>`/`<li>` (not styled divs)
|
|
52
|
+
- [ ] Tables use `<table>` with `<th>` headers for tabular data
|
|
53
|
+
- [ ] Navigation uses `<nav>` with proper `aria-label`
|
|
54
|
+
- [ ] Main content wrapped in `<main>`
|
|
55
|
+
- [ ] Sections use `<section>` or `<article>` with headings
|
|
56
|
+
|
|
57
|
+
### Accessibility Tree
|
|
58
|
+
|
|
59
|
+
- [ ] All interactive elements have accessible names (visible text, `aria-label`, or `aria-labelledby`)
|
|
60
|
+
- [ ] ARIA roles used ONLY when semantic HTML isn't available
|
|
61
|
+
- [ ] Skip-to-content link is first focusable element
|
|
62
|
+
- [ ] Focus order matches visual order (`tabindex` not misused)
|
|
63
|
+
- [ ] Modal dialogs use `<dialog>` or proper `role="dialog"` with focus trapping
|
|
64
|
+
- [ ] Dynamic content changes announced via `aria-live` regions
|
|
65
|
+
|
|
66
|
+
### Visual Stability
|
|
67
|
+
|
|
68
|
+
- [ ] No layout shifts after load (CLS < 0.1)
|
|
69
|
+
- [ ] Interactive elements have stable positions (no jumping during scroll)
|
|
70
|
+
- [ ] No transparent overlays blocking clickable elements (ghost overlays)
|
|
71
|
+
- [ ] All actionable elements meet minimum target size of 24×24 CSS px (WCAG 2.2 SC 2.5.8)
|
|
72
|
+
- [ ] Images have explicit `width` and `height` (prevent layout shift)
|
|
73
|
+
|
|
74
|
+
### CSS Signals for Agents
|
|
75
|
+
|
|
76
|
+
- [ ] `cursor: pointer` on all clickable elements (strong actionability signal)
|
|
77
|
+
- [ ] Focus indicators visible on keyboard navigation (`:focus-visible` styles)
|
|
78
|
+
- [ ] Interactive states are distinct (`:hover`, `:active`, `:focus`)
|
|
79
|
+
- [ ] Disabled elements have `pointer-events: none` and `opacity` reduction
|
|
80
|
+
- [ ] No `display: none` on elements that should be accessible to screen readers
|
|
81
|
+
|
|
82
|
+
### Form Accessibility (Critical for Agent Interactions)
|
|
83
|
+
|
|
84
|
+
- [ ] Every `<input>` has an associated `<label>` with `htmlFor`
|
|
85
|
+
- [ ] Required fields marked with `aria-required="true"` or `required` attribute
|
|
86
|
+
- [ ] Error messages linked with `aria-describedby`
|
|
87
|
+
- [ ] Form groups use `<fieldset>` with `<legend>`
|
|
88
|
+
- [ ] Submit buttons have clear text (not just icons)
|
|
89
|
+
- [ ] Autocomplete attributes set for common fields (`name`, `email`, `tel`, `address-*`)
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 3. E-E-A-T Assessment (Critical for YMYL Sites)
|
|
94
|
+
|
|
95
|
+
For sites dealing with health, finance, safety, or life decisions (Your Money or Your Life), E-E-A-T signals are critical for AI citation.
|
|
96
|
+
|
|
97
|
+
### Experience
|
|
98
|
+
|
|
99
|
+
- [ ] Content demonstrates first-hand knowledge (not aggregated summaries)
|
|
100
|
+
- [ ] Real user reviews and testimonials with attribution
|
|
101
|
+
- [ ] Case studies or examples from actual experience
|
|
102
|
+
- [ ] Visual evidence (photos, videos) of real experiences
|
|
103
|
+
|
|
104
|
+
### Expertise
|
|
105
|
+
|
|
106
|
+
- [ ] Author credentials displayed clearly (degrees, certifications, years of experience)
|
|
107
|
+
- [ ] Author pages exist with `Person` schema and `knowsAbout` properties
|
|
108
|
+
- [ ] Content reviewed by subject matter experts (editorial review notice)
|
|
109
|
+
- [ ] Specialized terminology used correctly with explanations for lay readers
|
|
110
|
+
|
|
111
|
+
### Authoritativeness
|
|
112
|
+
|
|
113
|
+
- [ ] About page with team credentials, methodology, and mission
|
|
114
|
+
- [ ] Clear data source disclosures ("Where our data comes from")
|
|
115
|
+
- [ ] "How we rate" or methodology explanation pages
|
|
116
|
+
- [ ] Institutional authority signals (partnerships, certifications, media mentions)
|
|
117
|
+
- [ ] Consistent NAP (Name, Address, Phone) across web presence
|
|
118
|
+
|
|
119
|
+
### Trustworthiness
|
|
120
|
+
|
|
121
|
+
- [ ] Contact information easily findable (not buried in footer only)
|
|
122
|
+
- [ ] Privacy policy and terms of service accessible from all pages
|
|
123
|
+
- [ ] Transparent pricing when applicable (no hidden fees)
|
|
124
|
+
- [ ] Content is accurate and up-to-date (publish/update dates visible)
|
|
125
|
+
- [ ] Corrections policy or update log for changed information
|
|
126
|
+
- [ ] HTTPS enforced, security headers properly configured
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 4. Non-Commodity Content Criteria
|
|
131
|
+
|
|
132
|
+
Google's AI features prefer content that provides unique value. Assess content against these criteria:
|
|
133
|
+
|
|
134
|
+
### Non-Commodity Content (Google Favors)
|
|
135
|
+
|
|
136
|
+
- **Unique data analysis** from proprietary sources (not publicly available datasets)
|
|
137
|
+
- **First-hand experiences** and detailed reviews with specific details
|
|
138
|
+
- **Expert-led insights** that go beyond commonly available information
|
|
139
|
+
- **Original research** with methodology and reproducible findings
|
|
140
|
+
- **Interactive tools** and calculators with unique logic
|
|
141
|
+
- **Comparison data** that requires effort to compile (pricing, availability)
|
|
142
|
+
- **Local knowledge** that can't be found without physical presence
|
|
143
|
+
|
|
144
|
+
### Commodity Content (Avoid or Upgrade)
|
|
145
|
+
|
|
146
|
+
- ❌ "X Tips for [topic]" without unique insights (generic listicles)
|
|
147
|
+
- ❌ Summaries of information freely available elsewhere
|
|
148
|
+
- ❌ Generic advice easily produced by any AI model
|
|
149
|
+
- ❌ Content created primarily for keyword targeting
|
|
150
|
+
- ❌ Thin pages with minimal original value
|
|
151
|
+
- ❌ Automatically generated content without expert review
|
|
152
|
+
|
|
153
|
+
### Content Upgrade Strategy
|
|
154
|
+
|
|
155
|
+
For existing commodity content, improve by adding:
|
|
156
|
+
1. **Unique data points** from proprietary sources
|
|
157
|
+
2. **Expert commentary** with attribution
|
|
158
|
+
3. **Real examples** with specifics (names, dates, outcomes)
|
|
159
|
+
4. **Interactive elements** (calculators, comparison tools)
|
|
160
|
+
5. **Original media** (photographs, diagrams, video)
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 5. Technical SEO for AI Discovery
|
|
165
|
+
|
|
166
|
+
### Indexing & Crawlability
|
|
167
|
+
|
|
168
|
+
- [ ] All key pages indexed (verify in Google Search Console)
|
|
169
|
+
- [ ] No accidental `noindex` directives on important pages
|
|
170
|
+
- [ ] No `nosnippet` or `data-nosnippet` blocking content extraction
|
|
171
|
+
- [ ] `robots.txt` doesn't block critical resources
|
|
172
|
+
- [ ] Crawl budget optimized (no low-value pages wasting crawl resources)
|
|
173
|
+
- [ ] XML sitemap includes all valuable pages (updated automatically)
|
|
174
|
+
|
|
175
|
+
### Server-Side Rendering
|
|
176
|
+
|
|
177
|
+
- [ ] Critical content renders on server (not client-only JavaScript)
|
|
178
|
+
- [ ] Dynamic content accessible without user interaction
|
|
179
|
+
- [ ] No infinite scroll hiding content from crawlers
|
|
180
|
+
- [ ] Metadata generated server-side (`generateMetadata` in Next.js)
|
|
181
|
+
|
|
182
|
+
### URL & Content Structure
|
|
183
|
+
|
|
184
|
+
- [ ] Canonical tags correctly set (prevent duplicate content confusion)
|
|
185
|
+
- [ ] Internal linking connects related content (topic clusters)
|
|
186
|
+
- [ ] Breadcrumb navigation with schema markup
|
|
187
|
+
- [ ] Clean URL structure reflecting content hierarchy
|
|
188
|
+
- [ ] Pagination handled with view-all option or clear next/previous links (note: `rel="next"`/`rel="prev"` is no longer used as a Google indexing signal)
|
|
189
|
+
|
|
190
|
+
### Performance & Page Experience
|
|
191
|
+
|
|
192
|
+
- [ ] Core Web Vitals in "Good" range (LCP < 2.5s, INP < 200ms, CLS < 0.1)
|
|
193
|
+
- [ ] HTTPS enforced with valid certificate
|
|
194
|
+
- [ ] No intrusive interstitials blocking content
|
|
195
|
+
- [ ] Mobile-friendly (responsive design)
|
|
196
|
+
- [ ] Font loading doesn't cause layout shift (`display: swap`)
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 6. Structured Data Patterns
|
|
201
|
+
|
|
202
|
+
Structured data helps Google understand content relationships. While NOT required for AI features, it improves overall search presence.
|
|
203
|
+
|
|
204
|
+
### LocalBusiness (Community/Location Pages)
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"@context": "https://schema.org",
|
|
209
|
+
"@type": "LocalBusiness",
|
|
210
|
+
"name": "Community Name",
|
|
211
|
+
"address": {
|
|
212
|
+
"@type": "PostalAddress",
|
|
213
|
+
"streetAddress": "123 Main St",
|
|
214
|
+
"addressLocality": "City",
|
|
215
|
+
"addressRegion": "FL",
|
|
216
|
+
"postalCode": "33101"
|
|
217
|
+
},
|
|
218
|
+
"geo": { "@type": "GeoCoordinates", "latitude": 25.76, "longitude": -80.19 },
|
|
219
|
+
"telephone": "+1-555-0100",
|
|
220
|
+
"priceRange": "$$-$$$",
|
|
221
|
+
"openingHours": "Mo-Su 00:00-24:00",
|
|
222
|
+
"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.5", "reviewCount": "28" },
|
|
223
|
+
"sameAs": ["https://g.page/community", "https://facebook.com/community"]
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Person (Author/Expert Pages)
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"@context": "https://schema.org",
|
|
232
|
+
"@type": "Person",
|
|
233
|
+
"name": "Author Name",
|
|
234
|
+
"jobTitle": "Senior Care Advisor",
|
|
235
|
+
"knowsAbout": ["Assisted Living", "Memory Care", "VA Benefits"],
|
|
236
|
+
"sameAs": ["https://linkedin.com/in/author"],
|
|
237
|
+
"worksFor": { "@type": "Organization", "name": "Company Name" }
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Article (Blog/Resource Posts)
|
|
242
|
+
|
|
243
|
+
```json
|
|
244
|
+
{
|
|
245
|
+
"@context": "https://schema.org",
|
|
246
|
+
"@type": "Article",
|
|
247
|
+
"headline": "Article Title",
|
|
248
|
+
"author": { "@type": "Person", "name": "Author", "url": "/about/authors/slug" },
|
|
249
|
+
"datePublished": "2026-01-15",
|
|
250
|
+
"dateModified": "2026-05-01",
|
|
251
|
+
"publisher": { "@type": "Organization", "name": "Site Name" }
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### FAQPage (FAQ Sections)
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{
|
|
259
|
+
"@type": "FAQPage",
|
|
260
|
+
"mainEntity": [
|
|
261
|
+
{
|
|
262
|
+
"@type": "Question",
|
|
263
|
+
"name": "What is the cost of assisted living?",
|
|
264
|
+
"acceptedAnswer": {
|
|
265
|
+
"@type": "Answer",
|
|
266
|
+
"text": "The average cost varies by state..."
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
]
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 7. What NOT to Do (Mythbusting)
|
|
276
|
+
|
|
277
|
+
These are explicitly confirmed as **unnecessary or harmful** by Google:
|
|
278
|
+
|
|
279
|
+
| ❌ Don't Do This | Why |
|
|
280
|
+
|------------------|-----|
|
|
281
|
+
| Create `llms.txt` files | Google doesn't treat them specially |
|
|
282
|
+
| "Chunk" content into tiny pieces | Google handles multi-topic pages fine |
|
|
283
|
+
| Rewrite content "for AI" (AEO/GEO) | AI understands synonyms and natural language |
|
|
284
|
+
| Seek inauthentic brand mentions | Spam systems detect and penalize this |
|
|
285
|
+
| Overfocus on structured data alone | Helpful but NOT required for AI features |
|
|
286
|
+
| Create separate pages for query variations | Violates scaled content abuse policy |
|
|
287
|
+
| Add special "AI-readable" Markdown files | Standard HTML is the input format |
|
|
288
|
+
| Use hidden text for AI consumption | Cloaking violation |
|
|
289
|
+
| Stuff keywords "for LLM training" | Spam — same old rules apply |
|
|
290
|
+
| Disallow AI crawlers (GPTBot, etc.) | Google uses Googlebot only — blocking others has no effect on Google AI |
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 8. Implementation Priorities
|
|
295
|
+
|
|
296
|
+
### Quick Wins (< 1 day each)
|
|
297
|
+
|
|
298
|
+
1. Add `cursor: pointer` CSS for all interactive elements
|
|
299
|
+
2. Add skip-to-content link to root layout
|
|
300
|
+
3. Verify no `nosnippet` directives on key pages
|
|
301
|
+
4. Check all forms have proper `<label>` associations
|
|
302
|
+
5. Verify heading hierarchy on top landing pages
|
|
303
|
+
|
|
304
|
+
### Medium Effort (1-3 days each)
|
|
305
|
+
|
|
306
|
+
1. Semantic HTML audit of all components (replace `<div onClick>`)
|
|
307
|
+
2. Author/expert page creation with Person schema
|
|
308
|
+
3. "About Our Data" / methodology page
|
|
309
|
+
4. Image alt text quality audit and improvement
|
|
310
|
+
5. Internal linking optimization
|
|
311
|
+
|
|
312
|
+
### High Effort (1+ week each)
|
|
313
|
+
|
|
314
|
+
1. Non-commodity content strategy and execution
|
|
315
|
+
2. Interactive tools (calculators, comparison widgets)
|
|
316
|
+
3. Comprehensive accessibility audit and remediation
|
|
317
|
+
4. E-E-A-T content enrichment across all page types
|
|
318
|
+
5. Video/media content creation
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## 9. Audit Workflow
|
|
323
|
+
|
|
324
|
+
When asked to audit a site for AI optimization, follow this order:
|
|
325
|
+
|
|
326
|
+
1. **Technical baseline** — Verify indexing, SSR, canonical tags, Core Web Vitals
|
|
327
|
+
2. **Agent-friendly audit** — Run through Section 2 checklist on key templates
|
|
328
|
+
3. **E-E-A-T assessment** — Evaluate Section 3 for YMYL compliance
|
|
329
|
+
4. **Content quality** — Assess top pages against Section 4 criteria
|
|
330
|
+
5. **Structured data** — Validate existing schema, identify gaps
|
|
331
|
+
6. **Recommendations** — Prioritize by impact/effort ratio
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## 10. Monitoring & Measurement
|
|
336
|
+
|
|
337
|
+
| Metric | Tool | What to Track |
|
|
338
|
+
|--------|------|---------------|
|
|
339
|
+
| AI Overview appearances | Google Search Console → Search Appearance | Citation frequency |
|
|
340
|
+
| Organic CTR from AI features | GSC filtered by AI appearance type | Click-through trends |
|
|
341
|
+
| Core Web Vitals | PageSpeed Insights / CrUX | All "Good" status |
|
|
342
|
+
| Structured data validity | Rich Results Test | 0 errors, 0 warnings |
|
|
343
|
+
| Accessibility score | Lighthouse CI | 95+ target |
|
|
344
|
+
| Index coverage | GSC → Indexing | No regressions |
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## References
|
|
349
|
+
|
|
350
|
+
- [Google AI Optimization Guide](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)
|
|
351
|
+
- [Build Agent-Friendly Websites](https://web.dev/articles/ai-agent-site-ux)
|
|
352
|
+
- [Creating Helpful, Reliable, People-First Content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)
|
|
353
|
+
- [Google Search Quality Rater Guidelines](https://services.google.com/fh/files/misc/hsw-sqrg.pdf)
|
|
354
|
+
- [Universal Commerce Protocol (UCP)](https://ucp.dev/latest/)
|