@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 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|claude|codex>` |
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
- * @returns {string} Path to .github directory
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 configPath = path.join(process.cwd(), '.agents-toolkit.json');
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('Would create .agents-toolkit.json');
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('Created .agents-toolkit.json config file');
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
- info('Next steps:');
499
- console.log(' 1. Update .agents-toolkit.json with your Jira project key');
500
- if (isCodex) {
501
- console.log(' 2. Review AGENTS.md in the project root');
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
- console.log(' 2. Configure Atlassian MCP in VS Code');
505
- console.log(' 3. Run prompts via Command Palette > "GitHub Copilot: Run Prompt"');
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
- info('Next steps:');
621
- console.log(' 1. Update .agents-toolkit.json with your Jira project key');
622
- console.log(' 2. Configure Atlassian MCP in Claude Code settings');
623
- console.log(' 3. Run slash commands with /analyze-ticket, /work-ticket, etc.');
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.0.0",
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.0.0";
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/)