Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
279 changes: 61 additions & 218 deletions .claude/skills/upgrade-packages/SKILL.md

Large diffs are not rendered by default.

181 changes: 181 additions & 0 deletions .claude/skills/website-audit/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
---
name: website-audit
description: Audits a website for SEO, AI search performance, structured data, mobile usability, broken links, and social media cards. Fixes issues found. Use when the user mentions "audit website", "SEO", "fix search ranking", "AI search", "structured data", "social media cards", or "website performance".
---
<!-- agent-pmo:424c8f8 -->

# Website Audit

Performs a comprehensive website audit and fixes issues affecting search visibility and AI discoverability.

Copy this checklist and track your progress:

```
Audit Progress:
- [ ] Step 1: Read guidelines
- [ ] Step 2: Audit AI search readiness
- [ ] Step 3: Audit SEO and keywords
- [ ] Step 4: Audit crawling and indexing
- [ ] Step 5: Audit broken links and canonicalization
- [ ] Step 6: Audit mobile usability
- [ ] Step 7: Audit structured data
- [ ] Step 8: Audit social media cards
- [ ] Step 9: Audit For Unsubstantiated Claims
- [ ] Step 10: Audit Design Compliance
- [ ] Step 11: Test with Playwright
- [ ] Step 12: Report findings
```

- Check the outputted HTML/CSS/JavaScript AFTER the website is generated by the static content generator.
- Don't just check the static content before the website is generated.
- Fix issues at the core where the static content templates are stored - not in the outputted HTML (e.g. _site)
- Never manually edit the generated website content directly
- ENSURE THE FOOTER HAS A copyright link to nimblesite.co

## Step 1 — Read guidelines

Fetch and read each of these before auditing. These are the authoritative references for every step that follows.

- [Google's guidance on using generative AI content](https://developers.google.com/search/docs/fundamentals/using-gen-ai-content)
- [Top ways to ensure content performs well in Google's AI experiences](https://developers.google.com/search/blog/2025/05/succeeding-in-ai-search)
- [SEO Starter Guide](https://developers.google.com/search/docs/fundamentals/seo-starter-guide)

If the repo has a business plan doc, take it into account

Identify the website source files in the repo. Determine the framework (static site generator, Next.js, Hugo, etc.) so you know where to find templates, metadata, and content.

## Step 2 — Audit AI search readiness

Apply the guidance from the AI search article. Check:

1. **Content quality** — Is content original, expert-level, and comprehensive? Flag thin or duplicated pages.
2. **Clear structure** — Do pages use descriptive headings, lists, and concise answers to likely questions?
3. **Entity clarity** — Are key terms, products, and concepts defined clearly so AI can extract them?
4. **Freshness signals** — Are dates, update timestamps, and authorship present?

Fix issues directly in the source files. For each fix, note what changed and why.

## Step 3 — Audit SEO and keywords

1. Search [Google Trends](https://trends.google.com/home) for trending keywords related to the website's content.
2. Review each page's `<title>`, `<meta name="description">`, and `<h1>` tags.
3. Check for keyword opportunities — can trending terms be naturally inserted into headings, descriptions, or body content?
4. Verify each page has a unique, descriptive title (50-60 chars) and meta description (150-160 chars).
5. Check image `alt` attributes describe the image content and include relevant keywords where natural.

Apply the [SEO Starter Guide](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) principles. Fix issues directly.

## Step 4 — Audit crawling and indexing

Reference: [Overview of crawling and indexing topics](https://developers.google.com/search/docs/crawling-indexing)

1. **robots.txt** — Locate and review it. Verify it doesn't block important pages. Reference: [robots.txt spec](https://developers.google.com/search/docs/crawling-indexing/robots-txt)
2. **Sitemap** — Locate the sitemap (or sitemap index). Verify all important pages are listed and no dead URLs are included. Reference: [Sitemap guidelines](https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps)
3. **Meta robots tags** — Check for unintended `noindex` or `nofollow` directives on pages that should be indexed.

Note: robots.txt and sitemaps are often auto-generated. If so, check the generator config rather than the output file.

## Step 5 — Audit broken links and canonicalization

Reference: [What is canonicalization](https://developers.google.com/search/docs/crawling-indexing/canonicalization)

1. Check all internal links resolve to valid pages (no 404s).
2. Verify `<link rel="canonical">` tags are present and point to the correct URL.
3. Check for duplicate content accessible via multiple URLs (with/without trailing slash, www vs non-www).
4. Verify redirects use 301 (permanent) not 302 (temporary) where appropriate.

## Step 6 — Audit mobile usability

Reference: [Mobile-first indexing best practices](https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing)

1. Verify the `<meta name="viewport">` tag is present and correctly configured.
2. Check that content is identical between mobile and desktop (mobile-first indexing requires this).
3. Verify touch targets are adequately sized (min 48x48px).
4. Check font sizes are readable without zooming (min 16px body text).

## Step 7 — Audit structured data

Reference: [Structured data guidelines](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)

1. Check for existing JSON-LD `<script type="application/ld+json">` blocks.
2. Verify the structured data matches the page content (no misleading markup).
3. Add missing structured data where appropriate:
- **Organization/Person** on the homepage
- **Article/BlogPosting** on blog posts (with author, datePublished, dateModified)
- **BreadcrumbList** for navigation
- **FAQ** for pages with question/answer content
4. Validate JSON-LD syntax is correct.

## Step 8 — Audit social media cards

Reference: [Implementing Social Media Preview Cards](https://documentation.platformos.com/use-cases/implementing-social-media-preview-cards)

Check every page template includes:

**Open Graph (Facebook/LinkedIn):**
- `og:title`, `og:description`, `og:image`, `og:url`, `og:type`

**Twitter Card:**
- `twitter:card`, `twitter:title`, `twitter:description`, `twitter:image`

Verify `og:image` dimensions are at least 1200x630px. Fix missing or incomplete tags.

## Step 9 - Audit For Unsubstantiated Claims

Ensure that all claims are backed up with a link to a reputable source. As an example, this claim isn't valid as content unless it links to an authority that found this through research

> Research shows teams with strong DevEx perform 4-5x better across speed, quality, and engagement

Search for the authoritative URL and add a link to the URL. If it is not available, change the claim to something that can be substatiated.

## Step 10 — Audit Design Compliance

Read the design system docs and view the design screens in the designsystem folder.

## Step 11 — Test with Playwright

Build and run the website locally using `make website-run` (or the project's equivalent dev server command).

**Desktop tests (1280x720):**

1. Navigate to the homepage — take a screenshot.
2. Navigate to each major section — verify pages load without errors.
3. Check the browser console for JavaScript errors.
4. Verify all navigation links work.

**Mobile tests (375x667, iPhone SE):**

1. Resize the browser to mobile dimensions.
2. Navigate to the homepage — take a screenshot.
3. Verify the layout is responsive (no horizontal overflow, readable text).
4. Test navigation menu (hamburger menu if applicable).

If any page fails to load or has console errors, fix the issue and retest.

## Step 12 — Report findings

Summarize the audit results:

```
## Website Audit Report

### Fixed
- [List each issue fixed with file and line reference]

### Warnings (manual review needed)
- [Issues that need human judgment]

### Passed
- [Areas that passed audit with no issues]

### Screenshots
- [Reference Playwright screenshots taken]
```

## Rules

- **Fix issues directly** — don't just report them. Only flag issues as warnings when they require human judgment (e.g., content tone, keyword selection).
- **One step at a time** — complete each step before moving to the next.
- **Preserve existing content** — improve structure and metadata without rewriting the author's voice.
- **No keyword stuffing** — keywords must read naturally in context.
- **Respect the framework** — edit templates/configs, not generated output files.
1 change: 1 addition & 0 deletions .codex/skills/ci-prep
1 change: 1 addition & 0 deletions .codex/skills/code-dedup
1 change: 1 addition & 0 deletions .codex/skills/fix-bug
1 change: 1 addition & 0 deletions .codex/skills/spec-check
1 change: 1 addition & 0 deletions .codex/skills/submit-pr
1 change: 1 addition & 0 deletions .codex/skills/upgrade-packages
1 change: 1 addition & 0 deletions .codex/skills/website-audit
14 changes: 8 additions & 6 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# TLDR;
<!-- agent-pmo:f481f8d -->
## TLDR
<!-- One sentence: what does this PR do? -->

## Details
<!-- New functionality, new files, new dependencies. What changed? -->

# Details


# How do the tests prove the change works

## How Do The Automated Tests Prove It Works?
<!-- Name specific tests or describe what the test output demonstrates. -->
<!-- "Tests pass" is not acceptable. Be specific. -->
5 changes: 1 addition & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,4 @@ build/
# =============================================================================
.venv/
website/_site/
test-results/


.claude/skills/website-audit/SKILL.md
test-results/
82 changes: 42 additions & 40 deletions .vscode-test.mjs
Original file line number Diff line number Diff line change
@@ -1,48 +1,50 @@
import { defineConfig } from '@vscode/test-cli';
import { cpSync, mkdtempSync } from 'fs';
import { tmpdir } from 'os';
import { join, resolve } from 'path';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
import { defineConfig } from "@vscode/test-cli";
import { cpSync, mkdtempSync } from "fs";
import { tmpdir } from "os";
import { join, resolve } from "path";
import { fileURLToPath } from "url";
import { dirname } from "path";

const __dirname = dirname(fileURLToPath(import.meta.url));

// Copy fixtures to a temp directory so tests run in full isolation
const testWorkspace = mkdtempSync(join(tmpdir(), 'commandtree-test-'));
cpSync('./src/test/fixtures/workspace', testWorkspace, { recursive: true });
const testWorkspace = mkdtempSync(join(tmpdir(), "commandtree-test-"));
cpSync("./src/test/fixtures/workspace", testWorkspace, { recursive: true });

const userDataDir = resolve(__dirname, '.vscode-test/user-data');
const userDataDir = resolve(__dirname, ".vscode-test/user-data");

export default defineConfig({
tests: [{
files: ['out/test/e2e/**/*.test.js', 'out/test/providers/**/*.test.js'],
version: 'stable',
workspaceFolder: testWorkspace,
extensionDevelopmentPath: './',
srcDir: __dirname,
mocha: {
ui: 'tdd',
timeout: 60000,
color: true,
slow: 10000
},
launchArgs: [
'--user-data-dir', userDataDir
]
}],
coverage: {
includeAll: true,
// @vscode/test-cli sets report.exclude.relativePath = false, which
// makes test-exclude match against absolute paths. Patterns must
// start with **/ so minimatch can match any prefix.
include: ['**/out/**/*.js'],
exclude: [
'**/out/test/**',
'**/out/semantic/summariser.js', // requires Copilot auth, not available in CI
'**/out/semantic/summaryPipeline.js', // requires Copilot auth, not available in CI
'**/out/semantic/vscodeAdapters.js', // requires Copilot auth, not available in CI
],
reporter: ['text', 'lcov', 'html', 'json-summary'],
output: './coverage'
}
tests: [
{
files: ["out/test/e2e/**/*.test.js", "out/test/providers/**/*.test.js", "out/test/unit/**/*.test.js"],
version: "stable",
workspaceFolder: testWorkspace,
extensionDevelopmentPath: "./",
srcDir: __dirname,
mocha: {
ui: "tdd",
bail: true,
timeout: 60000,
color: true,
slow: 10000,
},
launchArgs: ["--user-data-dir", userDataDir],
},
],
coverage: {
includeAll: true,
// @vscode/test-cli sets report.exclude.relativePath = false, which
// makes test-exclude match against absolute paths. Patterns must
// start with **/ so minimatch can match any prefix.
include: ["**/out/**/*.js"],
exclude: [
"**/out/test/**",
"**/out/semantic/summariser.js", // requires Copilot auth, not available in CI
"**/out/semantic/summaryPipeline.js", // requires Copilot auth, not available in CI
"**/out/semantic/vscodeAdapters.js", // requires Copilot auth, not available in CI
"**/out/semantic/adapters.js", // type-only interfaces, no runtime behavior
],
reporter: ["text", "lcov", "html", "json-summary"],
output: "./coverage",
},
});
2 changes: 1 addition & 1 deletion .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_agent_pmo": "424c8f8",
"_agent_pmo": "f481f8d",
"recommendations": [
"nimblesite.commandtree",
"nimblesite.too-many-cooks",
Expand Down
24 changes: 24 additions & 0 deletions .vscodeignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
.vscode/**
.vscode-test/**
.venv/**
.cache/**
.clinerules/**
.commandtree/**
.codex/**
.cursorrules
.mcp.json
.nyc_output/**
.playwright-mcp/**
.windsurfrules
build/**
dist/**
src/**
test-fixtures/**
out/test/**
Expand All @@ -10,16 +21,29 @@ tools/**
.too_many_cooks/**
.claude/**
.github/**
.vscodeignore
.prettierrc*
.gitignore
.mocharc.json
.vscode-test.mjs
cspell.json
tsconfig.json
eslint.config*
Agents.md
AGENTS.md
icon.svg
CLAUDE.md
Claude.md
SPEC.md
Makefile
coverage/**
coverage-thresholds.json
docs/**
dotnet-tools.json
logs/**
opencode.json
scratch/**
test-results/**
**/*.map
**/*.ts
**/*.bak
Expand Down
4 changes: 2 additions & 2 deletions Agents.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
<!-- agent-pmo:424c8f8 -->
@CLAUDE.md
<!-- agent-pmo:f481f8d -->
Read and follow all instructions in CLAUDE.md before writing any code.
Loading
Loading