From 14ced893e32e0c1c5e36f5e986c9b4013415009d Mon Sep 17 00:00:00 2001 From: Paul Keen Date: Tue, 7 Jul 2026 22:57:11 -0400 Subject: [PATCH 1/6] feat(apm): add Agent Package Manager configuration for reproducible AI tooling Add apm.yml manifest (jetthoughts/site@0.1.0) as producer package with: - 5 instructions (project-rules, voice-guide, icp-target, tdd-enforcement, css-consolidation) - 3 prompts (blog-pipeline, cover-image, research) - 18 agents across core/content/ruby/validation - 5 skills (blog-post-pipeline, css-bem-migration, visual-regression-testing, cover-image-generation, content-voice-enforcement) - 10 MCP servers (claude-context, context7, brave-search, lean-ctx, chrome-devtools, package-search, github-mcp-server, searxng, ollama, milvus) - 8 APM targets: claude, copilot, codex, cursor, gemini, opencode, windsurf, kiro Add compose.mcp.yml + Makefile for per-repo Docker MCP services. Update Brewfile for ollama, add Makefile for mcp-up/mcp-down/mcp-status. Refactor thin wrappers (GEMINI.md, QWEN.md, AGENTS.md, .junie/AGENTS.md) to point to .apm/instructions/ as canonical source. Commit apm.lock.yaml for reproducible installs. Add APM getting-started section to README. --- .agents/skills/blog-post-pipeline/SKILL.md | 41 ++ .../skills/content-voice-enforcement/SKILL.md | 37 ++ .../skills/cover-image-generation/SKILL.md | 32 ++ .agents/skills/css-bem-migration/SKILL.md | 49 +++ .../skills/visual-regression-testing/SKILL.md | 41 ++ .apm/agents/build-monitor.agent.md | 18 + .apm/agents/content/content-creator.agent.md | 20 + .apm/agents/content/content-marketer.agent.md | 10 + .apm/agents/content/seo-specialist.agent.md | 21 + .../agents/content/tutorial-engineer.agent.md | 10 + .apm/agents/core/analyst.agent.md | 15 + .apm/agents/core/coder.agent.md | 26 ++ .apm/agents/core/planner.agent.md | 9 + .apm/agents/core/researcher.agent.md | 10 + .apm/agents/core/reviewer.agent.md | 17 + .apm/agents/core/screenshot-guardian.agent.md | 15 + .apm/agents/core/tester.agent.md | 25 ++ .apm/agents/hugo-expert.agent.md | 25 ++ .apm/agents/ruby/ruby-coder.agent.md | 15 + .apm/agents/ruby/ruby-reviewer.agent.md | 14 + .../validation/qa-browser-tester.agent.md | 16 + .../validation/ui-problem-diagnosis.agent.md | 10 + .../validation/ux-browser-validator.agent.md | 14 + .../css-consolidation.instructions.md | 30 ++ .apm/instructions/icp-target.instructions.md | 46 ++ .../project-rules.instructions.md | 79 ++++ .../tdd-enforcement.instructions.md | 62 +++ .apm/instructions/voice-guide.instructions.md | 68 +++ .apm/prompts/blog-pipeline.prompt.md | 75 ++++ .apm/prompts/cover-image.prompt.md | 19 + .apm/prompts/research.prompt.md | 26 ++ .apm/skills/blog-post-pipeline/SKILL.md | 41 ++ .../skills/content-voice-enforcement/SKILL.md | 37 ++ .apm/skills/cover-image-generation/SKILL.md | 32 ++ .apm/skills/css-bem-migration/SKILL.md | 49 +++ .../skills/visual-regression-testing/SKILL.md | 41 ++ .claude/agents/analyst.md | 15 + .claude/agents/coder.md | 26 ++ .claude/agents/content-marketer.md | 10 + .claude/agents/planner.md | 9 + .claude/agents/qa-browser-tester.md | 16 + .claude/agents/researcher.md | 10 + .claude/agents/reviewer.md | 17 + .claude/agents/ruby-coder.md | 15 + .claude/agents/ruby-reviewer.md | 14 + .claude/agents/screenshot-guardian.md | 15 + .claude/agents/tester.md | 25 ++ .claude/agents/tutorial-engineer.md | 10 + .claude/agents/ui-problem-diagnosis.md | 10 + .claude/agents/ux-browser-validator.md | 14 + .claude/commands/blog-pipeline.md | 79 ++++ .claude/commands/cover-image.md | 23 + .claude/commands/research.md | 30 ++ .claude/rules/css-consolidation.md | 30 ++ .claude/rules/icp-target.md | 46 ++ .claude/rules/project-rules.md | 79 ++++ .claude/rules/tdd-enforcement.md | 62 +++ .claude/rules/voice-guide.md | 68 +++ .claude/skills/blog-post-pipeline/SKILL.md | 41 ++ .../skills/content-voice-enforcement/SKILL.md | 37 ++ .../skills/cover-image-generation/SKILL.md | 32 ++ .claude/skills/css-bem-migration/SKILL.md | 49 +++ .../skills/visual-regression-testing/SKILL.md | 41 ++ .codex/agents/analyst.toml | 3 + .codex/agents/build-monitor.toml | 3 + .codex/agents/coder.toml | 3 + .codex/agents/content-creator.toml | 3 + .codex/agents/content-marketer.toml | 3 + .codex/agents/hugo-expert.toml | 3 + .codex/agents/planner.toml | 3 + .codex/agents/qa-browser-tester.toml | 3 + .codex/agents/researcher.toml | 3 + .codex/agents/reviewer.toml | 3 + .codex/agents/ruby-coder.toml | 3 + .codex/agents/ruby-reviewer.toml | 3 + .codex/agents/screenshot-guardian.toml | 3 + .codex/agents/seo-specialist.toml | 3 + .codex/agents/tester.toml | 3 + .codex/agents/tutorial-engineer.toml | 3 + .codex/agents/ui-problem-diagnosis.toml | 3 + .codex/agents/ux-browser-validator.toml | 3 + .codex/config.toml | 50 +++ .cursor/agents/analyst.md | 15 + .cursor/agents/build-monitor.md | 18 + .cursor/agents/coder.md | 26 ++ .cursor/agents/content-creator.md | 20 + .cursor/agents/content-marketer.md | 10 + .cursor/agents/hugo-expert.md | 25 ++ .cursor/agents/planner.md | 9 + .cursor/agents/qa-browser-tester.md | 16 + .cursor/agents/researcher.md | 10 + .cursor/agents/reviewer.md | 17 + .cursor/agents/ruby-coder.md | 15 + .cursor/agents/ruby-reviewer.md | 14 + .cursor/agents/screenshot-guardian.md | 15 + .cursor/agents/seo-specialist.md | 21 + .cursor/agents/tester.md | 25 ++ .cursor/agents/tutorial-engineer.md | 10 + .cursor/agents/ui-problem-diagnosis.md | 10 + .cursor/agents/ux-browser-validator.md | 14 + .cursor/commands/blog-pipeline.md | 79 ++++ .cursor/commands/cover-image.md | 23 + .cursor/commands/research.md | 30 ++ .cursor/mcp.json | 78 ++++ .cursor/rules/css-consolidation.mdc | 34 ++ .cursor/rules/icp-target.mdc | 50 +++ .cursor/rules/project-rules.mdc | 83 ++++ .cursor/rules/tdd-enforcement.mdc | 66 +++ .cursor/rules/voice-guide.mdc | 72 ++++ .gemini/commands/blog-pipeline.toml | 1 + .gemini/commands/cover-image.toml | 1 + .gemini/commands/research.toml | 1 + .gemini/settings.json | 68 +++ .github/agents/analyst.agent.md | 15 + .github/agents/build-monitor.agent.md | 18 + .github/agents/coder.agent.md | 26 ++ .github/agents/content-creator.agent.md | 20 + .github/agents/content-marketer.agent.md | 10 + .github/agents/hugo-expert.agent.md | 25 ++ .github/agents/planner.agent.md | 9 + .github/agents/qa-browser-tester.agent.md | 16 + .github/agents/researcher.agent.md | 10 + .github/agents/reviewer.agent.md | 17 + .github/agents/ruby-coder.agent.md | 15 + .github/agents/ruby-reviewer.agent.md | 14 + .github/agents/screenshot-guardian.agent.md | 15 + .github/agents/seo-specialist.agent.md | 21 + .github/agents/tester.agent.md | 25 ++ .github/agents/tutorial-engineer.agent.md | 10 + .github/agents/ui-problem-diagnosis.agent.md | 10 + .github/agents/ux-browser-validator.agent.md | 14 + .../css-consolidation.instructions.md | 30 ++ .../instructions/icp-target.instructions.md | 46 ++ .../project-rules.instructions.md | 79 ++++ .../tdd-enforcement.instructions.md | 62 +++ .../instructions/voice-guide.instructions.md | 68 +++ .github/prompts/blog-pipeline.prompt.md | 75 ++++ .github/prompts/cover-image.prompt.md | 19 + .github/prompts/research.prompt.md | 26 ++ .gitignore | 49 ++- .junie/AGENTS.md | 26 +- .kiro/settings/mcp.json | 68 +++ .kiro/skills/blog-post-pipeline/SKILL.md | 41 ++ .../skills/content-voice-enforcement/SKILL.md | 37 ++ .kiro/skills/cover-image-generation/SKILL.md | 32 ++ .kiro/skills/css-bem-migration/SKILL.md | 49 +++ .../skills/visual-regression-testing/SKILL.md | 41 ++ .kiro/steering/css-consolidation.md | 34 ++ .kiro/steering/icp-target.md | 50 +++ .kiro/steering/project-rules.md | 83 ++++ .kiro/steering/tdd-enforcement.md | 66 +++ .kiro/steering/voice-guide.md | 72 ++++ .opencode/agents/analyst.md | 15 + .opencode/agents/build-monitor.md | 18 + .opencode/agents/coder.md | 26 ++ .opencode/agents/content-creator.md | 20 + .opencode/agents/content-marketer.md | 10 + .opencode/agents/hugo-expert.md | 25 ++ .opencode/agents/planner.md | 9 + .opencode/agents/qa-browser-tester.md | 16 + .opencode/agents/researcher.md | 10 + .opencode/agents/reviewer.md | 17 + .opencode/agents/ruby-coder.md | 15 + .opencode/agents/ruby-reviewer.md | 14 + .opencode/agents/screenshot-guardian.md | 15 + .opencode/agents/seo-specialist.md | 21 + .opencode/agents/tester.md | 25 ++ .opencode/agents/tutorial-engineer.md | 10 + .opencode/agents/ui-problem-diagnosis.md | 10 + .opencode/agents/ux-browser-validator.md | 14 + .opencode/commands/blog-pipeline.md | 79 ++++ .opencode/commands/cover-image.md | 23 + .opencode/commands/research.md | 30 ++ .windsurf/rules/css-consolidation.md | 34 ++ .windsurf/rules/icp-target.md | 50 +++ .windsurf/rules/project-rules.md | 83 ++++ .windsurf/rules/tdd-enforcement.md | 66 +++ .windsurf/rules/voice-guide.md | 72 ++++ .windsurf/workflows/blog-pipeline.md | 79 ++++ .windsurf/workflows/cover-image.md | 23 + .windsurf/workflows/research.md | 30 ++ AGENTS.md | 29 +- Brewfile | 3 + GEMINI.md | 26 +- Makefile | 52 +++ QWEN.md | 30 +- README.md | 55 +++ apm.lock.yaml | 395 ++++++++++++++++++ apm.yml | 135 ++++++ compose.mcp.yml | 67 +++ docs/mcp-user-setup.md | 40 ++ opencode.json | 88 ++++ 192 files changed, 5933 insertions(+), 87 deletions(-) create mode 100644 .agents/skills/blog-post-pipeline/SKILL.md create mode 100644 .agents/skills/content-voice-enforcement/SKILL.md create mode 100644 .agents/skills/cover-image-generation/SKILL.md create mode 100644 .agents/skills/css-bem-migration/SKILL.md create mode 100644 .agents/skills/visual-regression-testing/SKILL.md create mode 100644 .apm/agents/build-monitor.agent.md create mode 100644 .apm/agents/content/content-creator.agent.md create mode 100644 .apm/agents/content/content-marketer.agent.md create mode 100644 .apm/agents/content/seo-specialist.agent.md create mode 100644 .apm/agents/content/tutorial-engineer.agent.md create mode 100644 .apm/agents/core/analyst.agent.md create mode 100644 .apm/agents/core/coder.agent.md create mode 100644 .apm/agents/core/planner.agent.md create mode 100644 .apm/agents/core/researcher.agent.md create mode 100644 .apm/agents/core/reviewer.agent.md create mode 100644 .apm/agents/core/screenshot-guardian.agent.md create mode 100644 .apm/agents/core/tester.agent.md create mode 100644 .apm/agents/hugo-expert.agent.md create mode 100644 .apm/agents/ruby/ruby-coder.agent.md create mode 100644 .apm/agents/ruby/ruby-reviewer.agent.md create mode 100644 .apm/agents/validation/qa-browser-tester.agent.md create mode 100644 .apm/agents/validation/ui-problem-diagnosis.agent.md create mode 100644 .apm/agents/validation/ux-browser-validator.agent.md create mode 100644 .apm/instructions/css-consolidation.instructions.md create mode 100644 .apm/instructions/icp-target.instructions.md create mode 100644 .apm/instructions/project-rules.instructions.md create mode 100644 .apm/instructions/tdd-enforcement.instructions.md create mode 100644 .apm/instructions/voice-guide.instructions.md create mode 100644 .apm/prompts/blog-pipeline.prompt.md create mode 100644 .apm/prompts/cover-image.prompt.md create mode 100644 .apm/prompts/research.prompt.md create mode 100644 .apm/skills/blog-post-pipeline/SKILL.md create mode 100644 .apm/skills/content-voice-enforcement/SKILL.md create mode 100644 .apm/skills/cover-image-generation/SKILL.md create mode 100644 .apm/skills/css-bem-migration/SKILL.md create mode 100644 .apm/skills/visual-regression-testing/SKILL.md create mode 100644 .claude/agents/analyst.md create mode 100644 .claude/agents/coder.md create mode 100644 .claude/agents/content-marketer.md create mode 100644 .claude/agents/planner.md create mode 100644 .claude/agents/qa-browser-tester.md create mode 100644 .claude/agents/researcher.md create mode 100644 .claude/agents/reviewer.md create mode 100644 .claude/agents/ruby-coder.md create mode 100644 .claude/agents/ruby-reviewer.md create mode 100644 .claude/agents/screenshot-guardian.md create mode 100644 .claude/agents/tester.md create mode 100644 .claude/agents/tutorial-engineer.md create mode 100644 .claude/agents/ui-problem-diagnosis.md create mode 100644 .claude/agents/ux-browser-validator.md create mode 100644 .claude/commands/blog-pipeline.md create mode 100644 .claude/commands/cover-image.md create mode 100644 .claude/commands/research.md create mode 100644 .claude/rules/css-consolidation.md create mode 100644 .claude/rules/icp-target.md create mode 100644 .claude/rules/project-rules.md create mode 100644 .claude/rules/tdd-enforcement.md create mode 100644 .claude/rules/voice-guide.md create mode 100644 .claude/skills/blog-post-pipeline/SKILL.md create mode 100644 .claude/skills/content-voice-enforcement/SKILL.md create mode 100644 .claude/skills/cover-image-generation/SKILL.md create mode 100644 .claude/skills/css-bem-migration/SKILL.md create mode 100644 .claude/skills/visual-regression-testing/SKILL.md create mode 100644 .codex/agents/analyst.toml create mode 100644 .codex/agents/build-monitor.toml create mode 100644 .codex/agents/coder.toml create mode 100644 .codex/agents/content-creator.toml create mode 100644 .codex/agents/content-marketer.toml create mode 100644 .codex/agents/hugo-expert.toml create mode 100644 .codex/agents/planner.toml create mode 100644 .codex/agents/qa-browser-tester.toml create mode 100644 .codex/agents/researcher.toml create mode 100644 .codex/agents/reviewer.toml create mode 100644 .codex/agents/ruby-coder.toml create mode 100644 .codex/agents/ruby-reviewer.toml create mode 100644 .codex/agents/screenshot-guardian.toml create mode 100644 .codex/agents/seo-specialist.toml create mode 100644 .codex/agents/tester.toml create mode 100644 .codex/agents/tutorial-engineer.toml create mode 100644 .codex/agents/ui-problem-diagnosis.toml create mode 100644 .codex/agents/ux-browser-validator.toml create mode 100644 .codex/config.toml create mode 100644 .cursor/agents/analyst.md create mode 100644 .cursor/agents/build-monitor.md create mode 100644 .cursor/agents/coder.md create mode 100644 .cursor/agents/content-creator.md create mode 100644 .cursor/agents/content-marketer.md create mode 100644 .cursor/agents/hugo-expert.md create mode 100644 .cursor/agents/planner.md create mode 100644 .cursor/agents/qa-browser-tester.md create mode 100644 .cursor/agents/researcher.md create mode 100644 .cursor/agents/reviewer.md create mode 100644 .cursor/agents/ruby-coder.md create mode 100644 .cursor/agents/ruby-reviewer.md create mode 100644 .cursor/agents/screenshot-guardian.md create mode 100644 .cursor/agents/seo-specialist.md create mode 100644 .cursor/agents/tester.md create mode 100644 .cursor/agents/tutorial-engineer.md create mode 100644 .cursor/agents/ui-problem-diagnosis.md create mode 100644 .cursor/agents/ux-browser-validator.md create mode 100644 .cursor/commands/blog-pipeline.md create mode 100644 .cursor/commands/cover-image.md create mode 100644 .cursor/commands/research.md create mode 100644 .cursor/mcp.json create mode 100644 .cursor/rules/css-consolidation.mdc create mode 100644 .cursor/rules/icp-target.mdc create mode 100644 .cursor/rules/project-rules.mdc create mode 100644 .cursor/rules/tdd-enforcement.mdc create mode 100644 .cursor/rules/voice-guide.mdc create mode 100644 .gemini/commands/blog-pipeline.toml create mode 100644 .gemini/commands/cover-image.toml create mode 100644 .gemini/commands/research.toml create mode 100644 .gemini/settings.json create mode 100644 .github/agents/analyst.agent.md create mode 100644 .github/agents/build-monitor.agent.md create mode 100644 .github/agents/coder.agent.md create mode 100644 .github/agents/content-creator.agent.md create mode 100644 .github/agents/content-marketer.agent.md create mode 100644 .github/agents/hugo-expert.agent.md create mode 100644 .github/agents/planner.agent.md create mode 100644 .github/agents/qa-browser-tester.agent.md create mode 100644 .github/agents/researcher.agent.md create mode 100644 .github/agents/reviewer.agent.md create mode 100644 .github/agents/ruby-coder.agent.md create mode 100644 .github/agents/ruby-reviewer.agent.md create mode 100644 .github/agents/screenshot-guardian.agent.md create mode 100644 .github/agents/seo-specialist.agent.md create mode 100644 .github/agents/tester.agent.md create mode 100644 .github/agents/tutorial-engineer.agent.md create mode 100644 .github/agents/ui-problem-diagnosis.agent.md create mode 100644 .github/agents/ux-browser-validator.agent.md create mode 100644 .github/instructions/css-consolidation.instructions.md create mode 100644 .github/instructions/icp-target.instructions.md create mode 100644 .github/instructions/project-rules.instructions.md create mode 100644 .github/instructions/tdd-enforcement.instructions.md create mode 100644 .github/instructions/voice-guide.instructions.md create mode 100644 .github/prompts/blog-pipeline.prompt.md create mode 100644 .github/prompts/cover-image.prompt.md create mode 100644 .github/prompts/research.prompt.md create mode 100644 .kiro/settings/mcp.json create mode 100644 .kiro/skills/blog-post-pipeline/SKILL.md create mode 100644 .kiro/skills/content-voice-enforcement/SKILL.md create mode 100644 .kiro/skills/cover-image-generation/SKILL.md create mode 100644 .kiro/skills/css-bem-migration/SKILL.md create mode 100644 .kiro/skills/visual-regression-testing/SKILL.md create mode 100644 .kiro/steering/css-consolidation.md create mode 100644 .kiro/steering/icp-target.md create mode 100644 .kiro/steering/project-rules.md create mode 100644 .kiro/steering/tdd-enforcement.md create mode 100644 .kiro/steering/voice-guide.md create mode 100644 .opencode/agents/analyst.md create mode 100644 .opencode/agents/build-monitor.md create mode 100644 .opencode/agents/coder.md create mode 100644 .opencode/agents/content-creator.md create mode 100644 .opencode/agents/content-marketer.md create mode 100644 .opencode/agents/hugo-expert.md create mode 100644 .opencode/agents/planner.md create mode 100644 .opencode/agents/qa-browser-tester.md create mode 100644 .opencode/agents/researcher.md create mode 100644 .opencode/agents/reviewer.md create mode 100644 .opencode/agents/ruby-coder.md create mode 100644 .opencode/agents/ruby-reviewer.md create mode 100644 .opencode/agents/screenshot-guardian.md create mode 100644 .opencode/agents/seo-specialist.md create mode 100644 .opencode/agents/tester.md create mode 100644 .opencode/agents/tutorial-engineer.md create mode 100644 .opencode/agents/ui-problem-diagnosis.md create mode 100644 .opencode/agents/ux-browser-validator.md create mode 100644 .opencode/commands/blog-pipeline.md create mode 100644 .opencode/commands/cover-image.md create mode 100644 .opencode/commands/research.md create mode 100644 .windsurf/rules/css-consolidation.md create mode 100644 .windsurf/rules/icp-target.md create mode 100644 .windsurf/rules/project-rules.md create mode 100644 .windsurf/rules/tdd-enforcement.md create mode 100644 .windsurf/rules/voice-guide.md create mode 100644 .windsurf/workflows/blog-pipeline.md create mode 100644 .windsurf/workflows/cover-image.md create mode 100644 .windsurf/workflows/research.md create mode 100644 Makefile create mode 100644 apm.lock.yaml create mode 100644 apm.yml create mode 100644 compose.mcp.yml create mode 100644 docs/mcp-user-setup.md create mode 100644 opencode.json diff --git a/.agents/skills/blog-post-pipeline/SKILL.md b/.agents/skills/blog-post-pipeline/SKILL.md new file mode 100644 index 000000000..5f2324f46 --- /dev/null +++ b/.agents/skills/blog-post-pipeline/SKILL.md @@ -0,0 +1,41 @@ +# Blog Post Pipeline Skill +# +# Reusable 9-phase autonomous content pipeline for Hugo-based blogs. +# This is a PRODUCER skill — published by jetthoughts/site for other repos. + +## Overview +End-to-end pipeline from topic selection to published post with automated +quality gates, multi-critic review, and cover image generation. + +## Phases +1. Pick topic from content plan +2. Read context (ICP, voice guide, brief) +3. Research (5+ authoritative sources) +4. Draft with voice enforcement + cadence quotas +5. Review loop (3 parallel critic agents: founder, SEO/slop, editor) +5c. Cold-eyes gate (9 explicit checks) +6. Cover image (6-slot HTML → chrome-devtools render → lanczos downsample) +7. Validate (Hugo build + Chrome DevTools) +8. Update content plan +9. Commit + +## Dependencies +### MCP Servers +- claude-context — semantic codebase search for existing posts +- brave-search / searxng — web research +- chrome-devtools — cover image rendering, validation + +### Other Skills +- content-voice-enforcement — voice guide compliance +- cover-image-generation — 6-slot layout rendering + +### Agents +- content-creator — drafting +- seo-specialist — SEO compliance +- reviewer — quality gates + +## Trigger +@.apm/prompts/blog-pipeline.prompt.md + +## Full Documentation +docs/workflows/blog-pipeline.md diff --git a/.agents/skills/content-voice-enforcement/SKILL.md b/.agents/skills/content-voice-enforcement/SKILL.md new file mode 100644 index 000000000..df01df43f --- /dev/null +++ b/.agents/skills/content-voice-enforcement/SKILL.md @@ -0,0 +1,37 @@ +# Content Voice Enforcement Skill +# +# Reusable voice enforcement for JetThoughts content — blog posts, LinkedIn, +# and marketing copy targeting the ICP-E audience (non-technical founder +# burned by a devshop). + +## Overview +Enforces the JetThoughts voice guide, banned word list, structural patterns, +cadence quotas, and quality tests on all content. + +## Voice Guide +See .apm/instructions/voice-guide.instructions.md for the full compiled extract. +Canonical source: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md + +## Two Voices +- **Founder posts**: Rob Walling directness + Rand Fishkin vulnerability +- **Tech posts**: Thoughtbot style (tension-first, opinionated, code as evidence) + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: ≥90% educational, ≤10% promotional +- **"Trade-off" test**: acknowledged what the solution fails to do? +- **"Practitioner" test**: replace generalizations with specific incidents + +## Slop Detector + Cold-Eyes Gate +- Run slop-detector on all drafts +- Run humanizer pass if flagged +- Cold-eyes gate (9 checks) mandatory before publishing +- See docs/workflows/blog-pipeline.md STEP 5a + STEP 5c + +## Full Documentation +.apm/instructions/voice-guide.instructions.md +.apm/instructions/icp-target.instructions.md +docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.agents/skills/cover-image-generation/SKILL.md b/.agents/skills/cover-image-generation/SKILL.md new file mode 100644 index 000000000..a367207dc --- /dev/null +++ b/.agents/skills/cover-image-generation/SKILL.md @@ -0,0 +1,32 @@ +# Cover Image Generation Skill +# +# Reusable skill for generating blog post cover images using the +# JetVelocity 6-slot design system. + +## Overview +Generates 2400×1260 cover images for blog posts using a 6-slot HTML layout +rendered via chrome-devtools. + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — canonical spec in .stitch/design.md + +## Workflow +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png +6. Set frontmatter: cover_image: cover.png, cover_image_alt: descriptive alt text + +## Dependencies +### MCP +- chrome-devtools — rendering + +### System +- ImageMagick (magick CLI) — downsampling + +## Full Documentation +.stitch/design.md (canonical 6-slot spec) +docs/workflows/cover-images.md diff --git a/.agents/skills/css-bem-migration/SKILL.md b/.agents/skills/css-bem-migration/SKILL.md new file mode 100644 index 000000000..9fcd1046f --- /dev/null +++ b/.agents/skills/css-bem-migration/SKILL.md @@ -0,0 +1,49 @@ +# CSS BEM Migration Skill +# +# Reusable methodology for migrating from FL-Builder (Beaver Builder) +# auto-generated classes to BEM component architecture. + +## Overview +TDD-driven FL-node extraction: add BEM classes → verify visual fidelity → +remove FL-nodes → retest. Micro-commits on every green test. + +## Pattern +1. RED: Identify FL-node CSS dependencies +2. GREEN: Add BEM classes to HTML, consolidate CSS +3. REFACTOR: Remove duplicate FL-node CSS, cleanup +4. TEST: `env PRECOMPILED_ASSETS=false bin/rake test:critical` +5. COMMIT: Micro-commit on green tests + +## BEM Component Structure +```html + +
+ + +
+ + +
+``` + +## CSS Consolidation Pattern +```css +/* Before: 3 separate FL-node selectors */ +.fl-node-yx43bujcaiqn { width: 32%; margin-right: 30px; } +.fl-node-ktz4ipj39vd6 { width: 36%; margin: 0 30px; } +.fl-node-m39uvorzy5g8 { width: 32%; margin-left: 30px; } + +/* After: DRY BEM pattern */ +.c-feature-card { width: 32%; margin-right: 30px; } +.c-feature-card--second { width: 36%; margin: 0 30px; } +.c-feature-card--third { margin-right: 0; } +``` + +## Constraints +- Never modify vendor files or dynamic templates +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- Run BOTH bin/test (macOS) AND bin/dtest (Linux Docker) before commit + +## Full Documentation +docs/workflows/css-consolidation.md +docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.agents/skills/visual-regression-testing/SKILL.md b/.agents/skills/visual-regression-testing/SKILL.md new file mode 100644 index 000000000..ff12576f9 --- /dev/null +++ b/.agents/skills/visual-regression-testing/SKILL.md @@ -0,0 +1,41 @@ +# Visual Regression Testing Skill +# +# Reusable visual regression testing protocol for Hugo static sites. + +## Overview +Screenshot comparison-based visual testing using capybara-screenshot-diff. +Blocks commits on any visual regression during refactoring. + +## Protocol +1. Capture baseline screenshots BEFORE changes +2. Make CSS/HTML changes +3. Capture comparison screenshots AFTER changes +4. Compare with tolerance: + - 0.0 for refactoring (zero visual changes) + - ≤0.03 for new features only +5. Block commit on any difference > tolerance + +## Test Pattern +```ruby +def test_hero_section_visual_consistency + visit "/services/fractional-cto/" + screenshot_path = take_screenshot("fractional_cto_hero") + assert_visual_match(screenshot_path, "baseline/fractional_cto_hero.png", + tolerance: 0.03) +end +``` + +## Prohibited Patterns (ZERO TOLERANCE) +- CSS class existence testing +- HTML structure counting +- Framework-generated selector usage +- Method existence testing + +## Commands +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker, CI parity) +- BOTH must pass before commit for HTML/CSS changes + +## Full Documentation +.apm/instructions/tdd-enforcement.instructions.md +docs/60.03-tdd-quality-enforcement.md diff --git a/.apm/agents/build-monitor.agent.md b/.apm/agents/build-monitor.agent.md new file mode 100644 index 000000000..2bb9c0910 --- /dev/null +++ b/.apm/agents/build-monitor.agent.md @@ -0,0 +1,18 @@ +# build-monitor.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/build-monitor.md + +## Role +Build monitoring agent. Validates Hugo builds, CI/CD pipelines, and performance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- `bin/hugo-build` must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s +- `bin/rake test:critical` green on every commit + +## CI/CD +- GitHub Actions → GitHub Pages +- Workflows: .github/workflows/publish.yml, test.yml, sync-and-publish.yml diff --git a/.apm/agents/content/content-creator.agent.md b/.apm/agents/content/content-creator.agent.md new file mode 100644 index 000000000..e6c244ca8 --- /dev/null +++ b/.apm/agents/content/content-creator.agent.md @@ -0,0 +1,20 @@ +# content-creator.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/voice-guide.instructions.md +# Full agent definitions: .claude/agents/content-creator.md + +## Role +Content creation agent. Writes blog posts, LinkedIn posts, and marketing copy. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md +- @docs/workflows/blog-pipeline.md +- @docs/workflows/linkedin-post-pipeline.md + +## Constraints +- Zero generic AI language — run slop-detector + humanizer pass +- Cold-eyes gate (9 checks) mandatory before publishing +- Every sentence needs a person doing something +- Banned words: unlock, harness, leverage, dive in, game-changer, etc. +- Use `-` not `—` for all dashes diff --git a/.apm/agents/content/content-marketer.agent.md b/.apm/agents/content/content-marketer.agent.md new file mode 100644 index 000000000..053ecd0a7 --- /dev/null +++ b/.apm/agents/content/content-marketer.agent.md @@ -0,0 +1,10 @@ +# content-marketer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/content-marketer.md + +## Role +Content marketing agent. Plans content calendars, researches topics, audits SEO performance. + +## Instructions +- @.apm/instructions/icp-target.instructions.md +- @docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md diff --git a/.apm/agents/content/seo-specialist.agent.md b/.apm/agents/content/seo-specialist.agent.md new file mode 100644 index 000000000..328a80718 --- /dev/null +++ b/.apm/agents/content/seo-specialist.agent.md @@ -0,0 +1,21 @@ +# seo-specialist.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/seo-specialist.md + +## Role +SEO optimization agent. Handles keyword research, meta tags, schema, and content optimization. + +## Instructions +- @docs/90-99-content-strategy/seo-optimization/ +- @docs/90-99-content-strategy/strategy-analysis/ + +## Key Files +- `themes/beaver/layouts/partials/seo/enhanced-meta-tags.html` — SEO/og:image template +- `themes/beaver/layouts/partials/seo/article-schema.html` — JSON-LD schema +- `config/_default/hugo.toml` — Hugo config (permalinks, sitemap) + +## Constraints +- Title ≤45 chars, description 150-160 chars +- Primary keyword in first 100 words +- 4+ internal links, 5+ external citations +- No keyword stuffing diff --git a/.apm/agents/content/tutorial-engineer.agent.md b/.apm/agents/content/tutorial-engineer.agent.md new file mode 100644 index 000000000..14374cb5e --- /dev/null +++ b/.apm/agents/content/tutorial-engineer.agent.md @@ -0,0 +1,10 @@ +# tutorial-engineer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/tutorial-engineer.md + +## Role +Tutorial engineer. Creates step-by-step how-to content, validates code examples, and ensures copy-paste-ability. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md diff --git a/.apm/agents/core/analyst.agent.md b/.apm/agents/core/analyst.agent.md new file mode 100644 index 000000000..dfa4ca692 --- /dev/null +++ b/.apm/agents/core/analyst.agent.md @@ -0,0 +1,15 @@ +# analyst.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/analyst.md + +## Role +Analysis agent. Performs research, root-cause analysis, and pattern discovery. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md + +## Research Protocol (MANDATORY) +1. claude-context search FIRST +2. Verify with rg/ls +3. Read docs/workflows/BASE_HANDBOOK.md diff --git a/.apm/agents/core/coder.agent.md b/.apm/agents/core/coder.agent.md new file mode 100644 index 000000000..7c8b2615e --- /dev/null +++ b/.apm/agents/core/coder.agent.md @@ -0,0 +1,26 @@ +# coder.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/coder.md +# +# APM compiles this agent for all target tools. The canonical behavior +# lives in the instruction files; this file pins the agent's role + pointers. + +## Role +Primary implementation agent. Writes code following TDD cycle (RED → GREEN → REFACTOR). + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## For CSS/HTML work +- @.apm/instructions/css-consolidation.instructions.md + +## For Ruby work +- @docs/workflows/ruby.md + +## Constraints +- Behavior-focused tests ONLY — reject structural/CSS class tests +- Run `bin/rake test:critical` after every micro-change +- Never use `npm` — use `bun` +- Never create ad hoc `*.sh` test scripts diff --git a/.apm/agents/core/planner.agent.md b/.apm/agents/core/planner.agent.md new file mode 100644 index 000000000..837cedb13 --- /dev/null +++ b/.apm/agents/core/planner.agent.md @@ -0,0 +1,9 @@ +# planner.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/planner.md + +## Role +Planning agent. Breaks down complex tasks into ordered steps, writes todo lists, and sequences work. + +## Instructions +- @.apm/instructions/project-rules.instructions.md diff --git a/.apm/agents/core/researcher.agent.md b/.apm/agents/core/researcher.agent.md new file mode 100644 index 000000000..5d953465d --- /dev/null +++ b/.apm/agents/core/researcher.agent.md @@ -0,0 +1,10 @@ +# researcher.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/researcher.md + +## Role +Research agent. Discovers existing patterns, framework docs, and best practices before implementation. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md diff --git a/.apm/agents/core/reviewer.agent.md b/.apm/agents/core/reviewer.agent.md new file mode 100644 index 000000000..989624346 --- /dev/null +++ b/.apm/agents/core/reviewer.agent.md @@ -0,0 +1,17 @@ +# reviewer.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/reviewer.md + +## Role +Code review agent. Validates correctness, adherence to project rules, and TDD compliance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Zero structural test patterns (CSS class testing, HTML counting) +- Visual regression tolerance verified +- Four-eyes principle enforced for all critical changes +- Feature branch + PR pattern for HTML/CSS/template changes diff --git a/.apm/agents/core/screenshot-guardian.agent.md b/.apm/agents/core/screenshot-guardian.agent.md new file mode 100644 index 000000000..f160b3b75 --- /dev/null +++ b/.apm/agents/core/screenshot-guardian.agent.md @@ -0,0 +1,15 @@ +# screenshot-guardian.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/screenshot-guardian.md + +## Role +Visual regression guardian. Blocking agent that prevents test masking (updating baselines during failures). + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md +- @.claude/hooks/pre-commit-screenshot-validation.md + +## Gates +- ZERO tolerance: screenshot updates during visual test failures +- Tolerance: 0.0 for refactors, ≤0.03 for new features +- Both bin/test AND bin/dtest must pass before commit diff --git a/.apm/agents/core/tester.agent.md b/.apm/agents/core/tester.agent.md new file mode 100644 index 000000000..8bc5f213b --- /dev/null +++ b/.apm/agents/core/tester.agent.md @@ -0,0 +1,25 @@ +# tester.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/tester.md + +## Role +Test agent. Writes and runs tests following TDD methodology. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Framework +- Minitest (test/system/, test/unit/) +- capybara-screenshot-diff for visual regression + +## Commands +- `bin/rake test:critical` — critical tests +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker) + +## Constraints +- Behavior-focused tests ONLY +- Assert shape, not config values +- Run both bin/test AND bin/dtest before commit for HTML/CSS changes diff --git a/.apm/agents/hugo-expert.agent.md b/.apm/agents/hugo-expert.agent.md new file mode 100644 index 000000000..24fe61525 --- /dev/null +++ b/.apm/agents/hugo-expert.agent.md @@ -0,0 +1,25 @@ +# hugo-expert.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/hugo-expert.md + +## Role +Hugo static site generator expert. Handles templates, shortcodes, content structure, and build optimization. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @docs/workflows/css-consolidation.md + +## Key Files +- `config/_default/hugo.toml` — Hugo configuration +- `themes/beaver/layouts/` — Templates +- `themes/beaver/assets/css/` — CSS (PostCSS pipeline) +- `content/` — Content files (Markdown + Hugo frontmatter) + +## Commands +- `bin/hugo-build` — Build + validate +- `hugo server -D` — Dev server + +## Constraints +- Never modify vendor CSS files +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- BEM methodology for all new CSS diff --git a/.apm/agents/ruby/ruby-coder.agent.md b/.apm/agents/ruby/ruby-coder.agent.md new file mode 100644 index 000000000..510d186df --- /dev/null +++ b/.apm/agents/ruby/ruby-coder.agent.md @@ -0,0 +1,15 @@ +# ruby-coder.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-coder.md + +## Role +Ruby implementation agent. Writes Ruby code (tests, sync scripts, lib/) following TDD. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md +- @docs/workflows/ruby.md + +## Commands +- `bin/rake test:critical` +- `bundle exec standardrb --fix` diff --git a/.apm/agents/ruby/ruby-reviewer.agent.md b/.apm/agents/ruby/ruby-reviewer.agent.md new file mode 100644 index 000000000..bdfcf27b8 --- /dev/null +++ b/.apm/agents/ruby/ruby-reviewer.agent.md @@ -0,0 +1,14 @@ +# ruby-reviewer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-reviewer.md + +## Role +Ruby code reviewer. Validates Ruby code quality, TDD compliance, and Minitest patterns. + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md + +## Constraints +- Behavior-focused tests ONLY — reject structural testing +- StandardRB compliance +- No ad hoc test scripts diff --git a/.apm/agents/validation/qa-browser-tester.agent.md b/.apm/agents/validation/qa-browser-tester.agent.md new file mode 100644 index 000000000..3a18ca639 --- /dev/null +++ b/.apm/agents/validation/qa-browser-tester.agent.md @@ -0,0 +1,16 @@ +# qa-browser-tester.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/qa-browser-tester.md + +## Role +QA browser tester. Runs Chrome DevTools validation after HTML/CSS/JS changes. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Console: ZERO JS errors +- Network: ZERO 404s for assets +- Capture desktop + mobile screenshots +- All gates pass → commit diff --git a/.apm/agents/validation/ui-problem-diagnosis.agent.md b/.apm/agents/validation/ui-problem-diagnosis.agent.md new file mode 100644 index 000000000..9f88e69ee --- /dev/null +++ b/.apm/agents/validation/ui-problem-diagnosis.agent.md @@ -0,0 +1,10 @@ +# ui-problem-diagnosis.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ui-problem-diagnosis-specialist.md + +## Role +UI problem diagnosis specialist. Investigates visual regressions, cross-browser issues, and CSS bugs. + +## Instructions +- @.apm/instructions/css-consolidation.instructions.md +- @docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.apm/agents/validation/ux-browser-validator.agent.md b/.apm/agents/validation/ux-browser-validator.agent.md new file mode 100644 index 000000000..118ea4ffa --- /dev/null +++ b/.apm/agents/validation/ux-browser-validator.agent.md @@ -0,0 +1,14 @@ +# ux-browser-validator.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ux-browser-validator.md + +## Role +UX browser validator. Validates UX interactions, accessibility, and cross-browser behavior. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- WCAG 2.1 AA accessibility compliance +- Semantic HTML elements (h1, button, main, nav) +- Responsive design: desktop + mobile verification diff --git a/.apm/instructions/css-consolidation.instructions.md b/.apm/instructions/css-consolidation.instructions.md new file mode 100644 index 000000000..0f1faae2d --- /dev/null +++ b/.apm/instructions/css-consolidation.instructions.md @@ -0,0 +1,30 @@ +# CSS Consolidation Rules — JetThoughts Site +# +# MANDATORY for all CSS/HTML template changes. +# Full docs: docs/workflows/css-consolidation.md +# Project: docs/projects/2509-css-migration/css-loading-order-analysis.md + +## Architecture +- **Methodology**: BEM (Block__Element--Modifier) +- **Pipeline**: PostCSS (import, mixins, nested, autoprefixer, cssnano, purgecss) +- **Cascade order**: Critical → Layout → Component → Theme → Footer + +## Rules +- Never modify vendor files (`css/vendors/*.min.css`) or dynamic templates (`css/dynamic-*.css`) +- Preserve cascade order in all changes +- Extract whole rule sets; keep page-specific `.fl-node-{hash}` in original files +- Run `bin/rake test:critical` after each extraction + +## FL-Node Extraction (Beaver Builder → BEM) +- **Phase**: TDD RED-GREEN-REFACTOR cycle +- **Validation**: `env PRECOMPILED_ASSETS=false bin/rake test:critical` after each change +- **Pattern**: Add BEM classes first → verify visual fidelity → remove FL-nodes → retest +- **Commit**: micro-commit on green tests only + +## Visual Regression +- Tolerance: 0.0 for refactoring (zero visual changes) +- Tolerance: ≤0.03 for new features only +- Run BOTH `bin/test` and `bin/dtest` before commit +- Visual failures are commit blockers, not warnings + +@see docs/workflows/css-consolidation.md diff --git a/.apm/instructions/icp-target.instructions.md b/.apm/instructions/icp-target.instructions.md new file mode 100644 index 000000000..e9457d522 --- /dev/null +++ b/.apm/instructions/icp-target.instructions.md @@ -0,0 +1,46 @@ +# ICP Target — JetThoughts Primary Website Audience +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before content, design, marketing, or blog work. +# Compiled by APM into every AI tool's context. + +## ICP-E: Non-Technical Founder Burned by a Devshop + +### Who They Are +- 35-50 years old +- Non-technical or semi-technical +- Raised funding ($500K–$2M seed) +- Hired a dev shop or freelancers +- Missed deadlines, buggy product, mounting technical debt +- Starting to question: "Is it me? Is it them? How do I know?" + +### Their Pain +- Can't evaluate code quality themselves +- Dev shop says "almost done" for months +- Every new feature breaks something else +- No tests, no documentation, no deploy pipeline +- Starting to lose investor confidence + +### What They Need +- Someone who speaks plain English, not jargon +- Proof that the problem is real and solvable (specific stories, not vague promises) +- A clear path out: audit → stabilize → build right +- Trust signals: named clients, specific results, honest trade-offs + +### What Resonates +- Stories of other founders in the same situation +- Specific numbers: "$40K wasted," "11-minute outage," "84 support tickets" +- Honest acknowledgment that rescue is hard and expensive +- The idea that good engineering is a competitive advantage +- "You're not crazy — this IS what bad engineering looks like" + +### What Alienates +- jargon-dense technical explanations before establishing trust +- "We're the best" claims without evidence +- Generic consulting language ("partner with you," "drive outcomes") +- Ignoring the emotional reality (shame, frustration, fear of looking stupid) + +@see docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.apm/instructions/project-rules.instructions.md b/.apm/instructions/project-rules.instructions.md new file mode 100644 index 000000000..deb7313e4 --- /dev/null +++ b/.apm/instructions/project-rules.instructions.md @@ -0,0 +1,79 @@ +# JetThoughts Site — Project Rules +# +# This is the SINGLE SOURCE for AI agent instructions across all tools. +# APM compiles this to each tool's expected path (CLAUDE.md, .github/ +# copilot-instructions.md, etc.). Edit here, not in tool-specific files. +# +# CANONICAL SOURCE: THIS FILE. The existing CLAUDE.md is a Claude-specific +# superset; over time CLI tool instructions converge here. Voice, ICP, TDD, +# and CSS rules are split into separate instruction files for modularity. +# +# Full workflow docs: docs/workflows/ +# Full content docs: docs/90-99-content-strategy/ + +## Stack +- **Site**: Hugo 0.147.9 Extended static site generator +- **Theme**: Custom "Beaver" theme (BEM + PostCSS) +- **Tests**: Ruby 3.4, Minitest, Capybara, Selenium WebDriver +- **CSS**: PostCSS pipeline (autoprefixer, cssnano, purgecss) +- **Package managers**: Bun (JS, NOT npm), Bundler (Ruby) +- **CI/CD**: GitHub Actions → GitHub Pages + +## Build & Test Commands +- Build: `bin/hugo-build` +- Test (critical): `bin/rake test:critical` +- Test (visual/macOS): `bin/test` +- Test (visual/Linux Docker): `bin/dtest` +- Lint Ruby: `bundle exec standardrb --fix` + +## Research Protocol (MANDATORY — before any change) +1. Search codebase with `claude-context` MCP FIRST +2. Verify exact filenames with `rg`/`ls` as fallback +3. Read `docs/workflows/BASE_HANDBOOK.md` at session start +4. Read `docs/workflows/flow-router.md` to route to correct workflow +5. For blog content: find existing posts via `docs/blog-post-index.md` +6. Never guess slugs — verify with `ls content/blog//index.md` + +## Non-Negotiables +- **Zero generic AI language** in content — all AI-sounding phrases rejected +- **Zero Hugo build breaks** — `bin/hugo-build` must pass for content changes +- **Zero unsupported claims** — all assertions must have citations +- **No ad hoc test scripts** — use `bin/rake test:critical` and `bin/test` +- **No Python for analysis** — prefer `rg`, `sed`, `awk`, shell tools +- **No duplicate throwaway files** — no `*_refactored.*`, `*_new.*`, `*_backup.*` +- **New docs only under `docs/workflows/`** — else edit existing files +- **Never commit coordinator/verification reports** — write to `/tmp/` instead + +## Content Work (Blog Posts, LinkedIn, Pages) +- **BEFORE writing**: Read voice guide + ICP target (see instructions/voice-guide, instructions/icp-target) +- **Blog posts**: Follow `docs/workflows/blog-pipeline.md` end-to-end +- **LinkedIn**: Follow `docs/workflows/linkedin-post-pipeline.md` +- **Cover images**: Follow `docs/workflows/cover-images.md` + `.stitch/design.md` +- Run slop-detector + humanizer pass on all drafts +- Cold-eyes gate (9 checks) mandatory before publishing + +## CSS / HTML Changes +- **BEM methodology** mandatory for all new CSS +- **FL-node extraction**: TDD cycle — RED → GREEN → REFACTOR → TEST +- **Visual regression tolerance**: 0.0 for refactors, ≤0.03 for new features +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- **Feature branches**: HTML/CSS/template changes → feature branch → one PR per sprint +- Zero tolerance: CSS class existence testing, framework selector usage in tests + +## TDD & Testing +- **Cycle**: RED → GREEN → REFACTOR +- **Framework**: Minitest (test/system/, test/unit/) +- **Behavior-focused tests ONLY** — reject implementation/existence/config tests +- **Avoid fragile config assertions** — assert shape, not tunable values +- **Visual regression**: screenshot comparison, 0.0 tolerance for refactoring +- Run `bin/rake test:critical` after every micro-change (<10 lines) +- Chrome DevTools validation after HTML/CSS/JS changes: zero console errors, zero 404s + +## Behavioral Constraints +- **User says "code is bad" or "over-engineered"**: HALT, 5-Why analysis, fix config, proceed +- **Reflection triggers**: zero-defect tracking, test masking detection +- **Four-eyes principle**: paired agents for all critical changes +- **Direct-to-master only for**: content-only blog edits, commit fixes, docs, CLAUDE.md policy updates + +@see docs/workflows/ for full workflow documentation +@see docs/90-99-content-strategy/ for content strategy diff --git a/.apm/instructions/tdd-enforcement.instructions.md b/.apm/instructions/tdd-enforcement.instructions.md new file mode 100644 index 000000000..a532cfa19 --- /dev/null +++ b/.apm/instructions/tdd-enforcement.instructions.md @@ -0,0 +1,62 @@ +# TDD Enforcement — JetThoughts Site +# +# MANDATORY for all code changes. Extracted from CLAUDE.md TDD section. +# Full docs: docs/60.03-tdd-quality-enforcement.md, docs/60.04-four-eyes-principle.md + +## TDD Cycle +1. **RED**: Write a failing test that validates BEHAVIOR (not implementation) +2. **GREEN**: Minimal code to make the test pass +3. **REFACTOR**: Clean up while tests stay green +4. **COMMIT**: Micro-commit on green tests + +## Test Quality Rules (ZERO TOLERANCE) + +### Prohibited Test Patterns — Agent MUST Reject +- ❌ CSS class existence testing (`.fl-node-*`, `.has_css?(".px-4")`) +- ❌ HTML structure counting (`page.all("div").count`) +- ❌ Framework-generated selector usage (FL-Builder, Tailwind utility classes) +- ❌ Method existence testing (`assert SomeClass.method_defined?`) +- ❌ Config value assertions (hardcoded `q=90`, exact file sizes, specific dimensions) +- ❌ Implementation detail testing + +### Required Test Patterns +- ✅ Visual regression: `take_screenshot` → `assert_visual_match` with tolerance +- ✅ User-visible content: `assert page.has_content?("text")` +- ✅ Semantic elements: `assert page.has_css?("h1", text: "...")` +- ✅ User interaction: `click_button` → `assert_current_path` +- ✅ Shape assertions: `q=\d+`, `src contains wsrv.nl`, not `q=90`, not exact URLs + +### Avoid Fragile Config Assertions +Don't hardcode tunable values. Assert the *shape*, not the configuration: +- Bad: `assert_match /q=90/, src` +- Good: `assert_match /q=\d+/, src` +- Bad: `assert_match /w=360/, src` +- Good: `assert has_css?("picture source")` + +## Visual Regression Gates (BLOCKING for HTML/CSS changes) +- **Tolerance**: 0.0 for refactoring, ≤0.03 for new features +- **Protocol**: Capture baseline BEFORE changes → compare AFTER → block on any diff >0% +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- Visual regression failures are COMMIT BLOCKERS, not warnings + +## Test Runner +- Framework: Minitest +- Critical tests: `bin/rake test:critical` (after every micro-change <10 lines) +- Visual macOS: `bin/test` +- Visual Linux/Docker: `bin/dtest` +- NEVER create ad hoc `*.sh` test scripts + +## Chrome DevTools Validation (MANDATORY after HTML/CSS/JS) +1. Start Hugo dev server, open page in Chrome DevTools +2. Console: ZERO JS errors +3. Network: ZERO 404s +4. Capture desktop + mobile screenshots +5. All gates pass → commit. Any gate fails → fix, repeat + +## Feature Branch + PR (HTML/CSS/template changes) +1. `git checkout -b ` +2. Multiple related commits on branch +3. Both test gates green on each commit +4. `git push -u origin ` +5. ONE PR per sprint via `gh pr create` +6. Direct-to-master only for: content-only blog edits, commit fixes, docs, CLAUDE.md updates diff --git a/.apm/instructions/voice-guide.instructions.md b/.apm/instructions/voice-guide.instructions.md new file mode 100644 index 000000000..97aeec148 --- /dev/null +++ b/.apm/instructions/voice-guide.instructions.md @@ -0,0 +1,68 @@ +# Voice Guide — JetThoughts Content +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before writing ANY blog post, LinkedIn post, or marketing copy. +# Compiled by APM into every AI tool's context. + +## Two Voices + +### Founder Posts (Paul Keen / JT leadership) +- **Rob Walling directness** + **Rand Fishkin vulnerability** +- Plain English, empathy, specific numbers +- Talk to a non-technical founder burned by a devshop +- "Been there" energy — practitioner not vendor +- Trade-offs acknowledged honestly + +### Tech Posts (engineering team) +- **Thoughtbot style**: open with tension, not features +- Own your opinions — no "it depends" hedging +- Code as narrative evidence, not decoration +- Honest trade-offs: what does this solution fail to do? + +## Banned Words +unlock, harness, leverage, dive in, game-changer, journey, seamless, robust, +supercharge, revolutionize, embark, delve, discover, blast radius, suspect list + +## Banned Structural Patterns +- Rule of three (parallel triads) +- Signposting ("This post is about...", "Here's what you need to know") +- Bold inline-header lists +- Triple rhetorical questions +- Slogany parallel closings ("X is A. Y is B.") +- Therapist voice ("That's the hardest part") +- Copula avoidance ("serves as" → use "is") +- Impersonal fragment stacking — every sentence needs a human subject +- Sustained staccato (3+ consecutive short fragments or uniform-length sentences) +- Command structure repetition (3+ paragraphs starting with imperatives) +- Apologetic caveats ("every project is different") +- Telling instead of showing — replace adjectives with concrete mechanics +- Fake authority generalizations ("We've seen this on every codebase") +- Timeline fabrication — verify technology release dates before using "last year" +- Use `-` not `—` for all dashes + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? If subject is a thing, rewrite with a person +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: is ≥90% educational? Is promotion ≤10%? +- **"Trade-off" test**: did I acknowledge what the solution fails to do? +- **"Practitioner" test**: replace generalized scenarios with specific incidents + +## Mannerism Noun Cap +discipline, cycle, pattern, canonical, workflow, framework, cadence, rhythm, +contract, gate, gatekeeper, layer, round, review, pass +→ Max 5 occurrences total per post. Vary to the concrete thing happening. + +## Cadence Quotas (per H2 section) +- At least one sentence <9 words AND one >22 words +- No 3 consecutive sentences within 3 words of each other +- One single-sentence paragraph per H2 +- Max 3 sentences / 70 words per paragraph +- No two sentences in same paragraph starting with same first word +- "The..." paragraph openers: <20% of total paragraphs +- "We..." paragraph openers: <15% of total paragraphs + +@see docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md diff --git a/.apm/prompts/blog-pipeline.prompt.md b/.apm/prompts/blog-pipeline.prompt.md new file mode 100644 index 000000000..9ad0669b1 --- /dev/null +++ b/.apm/prompts/blog-pipeline.prompt.md @@ -0,0 +1,75 @@ +# Blog Post Pipeline — Trigger Prompt +# +# Copy this prompt to write the next blog post from the content plan. +# Full pipeline: docs/workflows/blog-pipeline.md +# +# This is a reusable PROMPT — APM compiles it to slash-commands for +# each AI tool (e.g., /blog-post in Claude, #blog-post in Copilot). + +Write the next blog post following the full pipeline. + +## STEP 1 — Pick Topic +Read the content plan: docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md +Find the next 🔲 Planned topic. Confirm slug, primary keyword, target publish date. + +## STEP 2 — Read Context (mandatory, do not skip) +- ICP: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +- Voice guide: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +- Content plan brief: read the topic's brief section +- Design spec: .stitch/design.md + +## STEP 3 — Research +- Web search for 5+ authoritative sources +- Check existing posts for duplication: ls content/blog/ | grep -iE "" +- Verify every statistic has a citable source + +## STEP 3b — Find Internal Posts to Reference +- Use claude-context MCP search FIRST +- For tag/slug lookups: docs/blog-post-index.md +- Verify each slug: ls content/blog//index.md +- Collect at least 4 verified slugs before drafting + +## STEP 4 — Draft +Create content/blog//index.md with: +- Frontmatter: title ≤45 chars, description 150-160 chars, date, slug, keywords, tags +- Voice: plain English, empathy first, founder-to-founder tone +- Structure: punchy hook → keyword in first 100 words → numbered H2s → "When NOT to" → JT proof → CTA → related reading → further reading +- 4+ internal links in body, 5+ external citations +- Paragraphs ≤3 sentences +- Cut test: "what does the reader DO differently?" — delete if answer is "nothing new" + +## STEP 5 — Review Loop +Spawn 3 parallel critic agents: +1. Founder persona (Alex, burned CEO) — ≥8/10 +2. SEO/slop detector — ≥8/10 humanization +3. Senior copy editor — "publish as-is" or "minor edits" + +## STEP 5c — Cold-Eyes Gate (mandatory) +Spawn fresh-context reviewer with 9 explicit checks: +1. Frontmatter vs body consistency +2. Fluffy AI narration detection +3. Fake authority stamps +4. Timeline fabrication +5. "Not X but Y" patterns +6. Em dashes → hyphens +7. Rule-of-three modifiers +8. Cross-section template repetition +9. Impersonal fragment stacking + +## STEP 6 — Cover Image +- Read .stitch/design.md (6-slot layout) +- Duplicate existing HTML from .stitch/designs/ +- Render: chrome-devtools → viewport 2400×1260×2 → screenshot +- Downsample: magick → 2400×1260 → content/blog//cover.png + +## STEP 7 — Validate +- bin/hugo-build must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s, og:image resolves + +## STEP 8 — Update Content Plan +- Change topic status: 🔲 Planned → ✅ Published +- Add commit SHA + changelog + +## STEP 9 — Commit +- Stage: post directory + cover HTML + content plan update +- Commit format: feat(content): add post diff --git a/.apm/prompts/cover-image.prompt.md b/.apm/prompts/cover-image.prompt.md new file mode 100644 index 000000000..2f53b5b4b --- /dev/null +++ b/.apm/prompts/cover-image.prompt.md @@ -0,0 +1,19 @@ +# Cover Image Generation — Trigger Prompt +# +# Reusable prompt for generating blog post cover images via Stitch design system. +# Full spec: .stitch/design.md (canonical 6-slot layout) +# Full workflow: docs/workflows/cover-images.md + +Generate a cover image for a blog post. + +## Steps +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ (e.g., rails-8-1-active-job-continuations-cover.html) +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — see .stitch/design.md for exact positioning diff --git a/.apm/prompts/research.prompt.md b/.apm/prompts/research.prompt.md new file mode 100644 index 000000000..76d9c1507 --- /dev/null +++ b/.apm/prompts/research.prompt.md @@ -0,0 +1,26 @@ +# Research Protocol — Trigger Prompt +# +# Reusable prompt for research-first development. +# MANDATORY sequence before any implementation. + +Research this topic before implementing: {TOPIC} + +## Research Sequence +1. **Handbook search**: Search claude-context for existing patterns in /knowledge/ and docs/ +2. **Codebase search**: Search claude-context for similar implementations in this repo +3. **Framework docs**: context7 for official documentation (Hugo, PostCSS, Ruby, etc.) +4. **Package analysis**: package-search for dependency research (if using new packages) +5. **Web search**: brave-search / searxng for current best practices (2025-2026) + +## Output Requirements +- 5+ authoritative sources +- Existing patterns found (or confirmation of none) +- Framework documentation citations +- Dependency evaluation (if applicable) +- Recommendation with trade-offs + +## Anti-Patterns (BLOCKED) +- Implementation before research +- Single-source decisions +- Dependencies installed without package-search verification +- Slugs guessed without ls content/blog/ verification diff --git a/.apm/skills/blog-post-pipeline/SKILL.md b/.apm/skills/blog-post-pipeline/SKILL.md new file mode 100644 index 000000000..5f2324f46 --- /dev/null +++ b/.apm/skills/blog-post-pipeline/SKILL.md @@ -0,0 +1,41 @@ +# Blog Post Pipeline Skill +# +# Reusable 9-phase autonomous content pipeline for Hugo-based blogs. +# This is a PRODUCER skill — published by jetthoughts/site for other repos. + +## Overview +End-to-end pipeline from topic selection to published post with automated +quality gates, multi-critic review, and cover image generation. + +## Phases +1. Pick topic from content plan +2. Read context (ICP, voice guide, brief) +3. Research (5+ authoritative sources) +4. Draft with voice enforcement + cadence quotas +5. Review loop (3 parallel critic agents: founder, SEO/slop, editor) +5c. Cold-eyes gate (9 explicit checks) +6. Cover image (6-slot HTML → chrome-devtools render → lanczos downsample) +7. Validate (Hugo build + Chrome DevTools) +8. Update content plan +9. Commit + +## Dependencies +### MCP Servers +- claude-context — semantic codebase search for existing posts +- brave-search / searxng — web research +- chrome-devtools — cover image rendering, validation + +### Other Skills +- content-voice-enforcement — voice guide compliance +- cover-image-generation — 6-slot layout rendering + +### Agents +- content-creator — drafting +- seo-specialist — SEO compliance +- reviewer — quality gates + +## Trigger +@.apm/prompts/blog-pipeline.prompt.md + +## Full Documentation +docs/workflows/blog-pipeline.md diff --git a/.apm/skills/content-voice-enforcement/SKILL.md b/.apm/skills/content-voice-enforcement/SKILL.md new file mode 100644 index 000000000..df01df43f --- /dev/null +++ b/.apm/skills/content-voice-enforcement/SKILL.md @@ -0,0 +1,37 @@ +# Content Voice Enforcement Skill +# +# Reusable voice enforcement for JetThoughts content — blog posts, LinkedIn, +# and marketing copy targeting the ICP-E audience (non-technical founder +# burned by a devshop). + +## Overview +Enforces the JetThoughts voice guide, banned word list, structural patterns, +cadence quotas, and quality tests on all content. + +## Voice Guide +See .apm/instructions/voice-guide.instructions.md for the full compiled extract. +Canonical source: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md + +## Two Voices +- **Founder posts**: Rob Walling directness + Rand Fishkin vulnerability +- **Tech posts**: Thoughtbot style (tension-first, opinionated, code as evidence) + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: ≥90% educational, ≤10% promotional +- **"Trade-off" test**: acknowledged what the solution fails to do? +- **"Practitioner" test**: replace generalizations with specific incidents + +## Slop Detector + Cold-Eyes Gate +- Run slop-detector on all drafts +- Run humanizer pass if flagged +- Cold-eyes gate (9 checks) mandatory before publishing +- See docs/workflows/blog-pipeline.md STEP 5a + STEP 5c + +## Full Documentation +.apm/instructions/voice-guide.instructions.md +.apm/instructions/icp-target.instructions.md +docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.apm/skills/cover-image-generation/SKILL.md b/.apm/skills/cover-image-generation/SKILL.md new file mode 100644 index 000000000..a367207dc --- /dev/null +++ b/.apm/skills/cover-image-generation/SKILL.md @@ -0,0 +1,32 @@ +# Cover Image Generation Skill +# +# Reusable skill for generating blog post cover images using the +# JetVelocity 6-slot design system. + +## Overview +Generates 2400×1260 cover images for blog posts using a 6-slot HTML layout +rendered via chrome-devtools. + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — canonical spec in .stitch/design.md + +## Workflow +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png +6. Set frontmatter: cover_image: cover.png, cover_image_alt: descriptive alt text + +## Dependencies +### MCP +- chrome-devtools — rendering + +### System +- ImageMagick (magick CLI) — downsampling + +## Full Documentation +.stitch/design.md (canonical 6-slot spec) +docs/workflows/cover-images.md diff --git a/.apm/skills/css-bem-migration/SKILL.md b/.apm/skills/css-bem-migration/SKILL.md new file mode 100644 index 000000000..9fcd1046f --- /dev/null +++ b/.apm/skills/css-bem-migration/SKILL.md @@ -0,0 +1,49 @@ +# CSS BEM Migration Skill +# +# Reusable methodology for migrating from FL-Builder (Beaver Builder) +# auto-generated classes to BEM component architecture. + +## Overview +TDD-driven FL-node extraction: add BEM classes → verify visual fidelity → +remove FL-nodes → retest. Micro-commits on every green test. + +## Pattern +1. RED: Identify FL-node CSS dependencies +2. GREEN: Add BEM classes to HTML, consolidate CSS +3. REFACTOR: Remove duplicate FL-node CSS, cleanup +4. TEST: `env PRECOMPILED_ASSETS=false bin/rake test:critical` +5. COMMIT: Micro-commit on green tests + +## BEM Component Structure +```html + +
+ + +
+ + +
+``` + +## CSS Consolidation Pattern +```css +/* Before: 3 separate FL-node selectors */ +.fl-node-yx43bujcaiqn { width: 32%; margin-right: 30px; } +.fl-node-ktz4ipj39vd6 { width: 36%; margin: 0 30px; } +.fl-node-m39uvorzy5g8 { width: 32%; margin-left: 30px; } + +/* After: DRY BEM pattern */ +.c-feature-card { width: 32%; margin-right: 30px; } +.c-feature-card--second { width: 36%; margin: 0 30px; } +.c-feature-card--third { margin-right: 0; } +``` + +## Constraints +- Never modify vendor files or dynamic templates +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- Run BOTH bin/test (macOS) AND bin/dtest (Linux Docker) before commit + +## Full Documentation +docs/workflows/css-consolidation.md +docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.apm/skills/visual-regression-testing/SKILL.md b/.apm/skills/visual-regression-testing/SKILL.md new file mode 100644 index 000000000..ff12576f9 --- /dev/null +++ b/.apm/skills/visual-regression-testing/SKILL.md @@ -0,0 +1,41 @@ +# Visual Regression Testing Skill +# +# Reusable visual regression testing protocol for Hugo static sites. + +## Overview +Screenshot comparison-based visual testing using capybara-screenshot-diff. +Blocks commits on any visual regression during refactoring. + +## Protocol +1. Capture baseline screenshots BEFORE changes +2. Make CSS/HTML changes +3. Capture comparison screenshots AFTER changes +4. Compare with tolerance: + - 0.0 for refactoring (zero visual changes) + - ≤0.03 for new features only +5. Block commit on any difference > tolerance + +## Test Pattern +```ruby +def test_hero_section_visual_consistency + visit "/services/fractional-cto/" + screenshot_path = take_screenshot("fractional_cto_hero") + assert_visual_match(screenshot_path, "baseline/fractional_cto_hero.png", + tolerance: 0.03) +end +``` + +## Prohibited Patterns (ZERO TOLERANCE) +- CSS class existence testing +- HTML structure counting +- Framework-generated selector usage +- Method existence testing + +## Commands +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker, CI parity) +- BOTH must pass before commit for HTML/CSS changes + +## Full Documentation +.apm/instructions/tdd-enforcement.instructions.md +docs/60.03-tdd-quality-enforcement.md diff --git a/.claude/agents/analyst.md b/.claude/agents/analyst.md new file mode 100644 index 000000000..dfa4ca692 --- /dev/null +++ b/.claude/agents/analyst.md @@ -0,0 +1,15 @@ +# analyst.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/analyst.md + +## Role +Analysis agent. Performs research, root-cause analysis, and pattern discovery. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md + +## Research Protocol (MANDATORY) +1. claude-context search FIRST +2. Verify with rg/ls +3. Read docs/workflows/BASE_HANDBOOK.md diff --git a/.claude/agents/coder.md b/.claude/agents/coder.md new file mode 100644 index 000000000..7c8b2615e --- /dev/null +++ b/.claude/agents/coder.md @@ -0,0 +1,26 @@ +# coder.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/coder.md +# +# APM compiles this agent for all target tools. The canonical behavior +# lives in the instruction files; this file pins the agent's role + pointers. + +## Role +Primary implementation agent. Writes code following TDD cycle (RED → GREEN → REFACTOR). + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## For CSS/HTML work +- @.apm/instructions/css-consolidation.instructions.md + +## For Ruby work +- @docs/workflows/ruby.md + +## Constraints +- Behavior-focused tests ONLY — reject structural/CSS class tests +- Run `bin/rake test:critical` after every micro-change +- Never use `npm` — use `bun` +- Never create ad hoc `*.sh` test scripts diff --git a/.claude/agents/content-marketer.md b/.claude/agents/content-marketer.md new file mode 100644 index 000000000..053ecd0a7 --- /dev/null +++ b/.claude/agents/content-marketer.md @@ -0,0 +1,10 @@ +# content-marketer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/content-marketer.md + +## Role +Content marketing agent. Plans content calendars, researches topics, audits SEO performance. + +## Instructions +- @.apm/instructions/icp-target.instructions.md +- @docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md diff --git a/.claude/agents/planner.md b/.claude/agents/planner.md new file mode 100644 index 000000000..837cedb13 --- /dev/null +++ b/.claude/agents/planner.md @@ -0,0 +1,9 @@ +# planner.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/planner.md + +## Role +Planning agent. Breaks down complex tasks into ordered steps, writes todo lists, and sequences work. + +## Instructions +- @.apm/instructions/project-rules.instructions.md diff --git a/.claude/agents/qa-browser-tester.md b/.claude/agents/qa-browser-tester.md new file mode 100644 index 000000000..3a18ca639 --- /dev/null +++ b/.claude/agents/qa-browser-tester.md @@ -0,0 +1,16 @@ +# qa-browser-tester.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/qa-browser-tester.md + +## Role +QA browser tester. Runs Chrome DevTools validation after HTML/CSS/JS changes. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Console: ZERO JS errors +- Network: ZERO 404s for assets +- Capture desktop + mobile screenshots +- All gates pass → commit diff --git a/.claude/agents/researcher.md b/.claude/agents/researcher.md new file mode 100644 index 000000000..5d953465d --- /dev/null +++ b/.claude/agents/researcher.md @@ -0,0 +1,10 @@ +# researcher.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/researcher.md + +## Role +Research agent. Discovers existing patterns, framework docs, and best practices before implementation. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md diff --git a/.claude/agents/reviewer.md b/.claude/agents/reviewer.md new file mode 100644 index 000000000..989624346 --- /dev/null +++ b/.claude/agents/reviewer.md @@ -0,0 +1,17 @@ +# reviewer.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/reviewer.md + +## Role +Code review agent. Validates correctness, adherence to project rules, and TDD compliance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Zero structural test patterns (CSS class testing, HTML counting) +- Visual regression tolerance verified +- Four-eyes principle enforced for all critical changes +- Feature branch + PR pattern for HTML/CSS/template changes diff --git a/.claude/agents/ruby-coder.md b/.claude/agents/ruby-coder.md new file mode 100644 index 000000000..510d186df --- /dev/null +++ b/.claude/agents/ruby-coder.md @@ -0,0 +1,15 @@ +# ruby-coder.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-coder.md + +## Role +Ruby implementation agent. Writes Ruby code (tests, sync scripts, lib/) following TDD. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md +- @docs/workflows/ruby.md + +## Commands +- `bin/rake test:critical` +- `bundle exec standardrb --fix` diff --git a/.claude/agents/ruby-reviewer.md b/.claude/agents/ruby-reviewer.md new file mode 100644 index 000000000..bdfcf27b8 --- /dev/null +++ b/.claude/agents/ruby-reviewer.md @@ -0,0 +1,14 @@ +# ruby-reviewer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-reviewer.md + +## Role +Ruby code reviewer. Validates Ruby code quality, TDD compliance, and Minitest patterns. + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md + +## Constraints +- Behavior-focused tests ONLY — reject structural testing +- StandardRB compliance +- No ad hoc test scripts diff --git a/.claude/agents/screenshot-guardian.md b/.claude/agents/screenshot-guardian.md new file mode 100644 index 000000000..f160b3b75 --- /dev/null +++ b/.claude/agents/screenshot-guardian.md @@ -0,0 +1,15 @@ +# screenshot-guardian.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/screenshot-guardian.md + +## Role +Visual regression guardian. Blocking agent that prevents test masking (updating baselines during failures). + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md +- @.claude/hooks/pre-commit-screenshot-validation.md + +## Gates +- ZERO tolerance: screenshot updates during visual test failures +- Tolerance: 0.0 for refactors, ≤0.03 for new features +- Both bin/test AND bin/dtest must pass before commit diff --git a/.claude/agents/tester.md b/.claude/agents/tester.md new file mode 100644 index 000000000..8bc5f213b --- /dev/null +++ b/.claude/agents/tester.md @@ -0,0 +1,25 @@ +# tester.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/tester.md + +## Role +Test agent. Writes and runs tests following TDD methodology. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Framework +- Minitest (test/system/, test/unit/) +- capybara-screenshot-diff for visual regression + +## Commands +- `bin/rake test:critical` — critical tests +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker) + +## Constraints +- Behavior-focused tests ONLY +- Assert shape, not config values +- Run both bin/test AND bin/dtest before commit for HTML/CSS changes diff --git a/.claude/agents/tutorial-engineer.md b/.claude/agents/tutorial-engineer.md new file mode 100644 index 000000000..14374cb5e --- /dev/null +++ b/.claude/agents/tutorial-engineer.md @@ -0,0 +1,10 @@ +# tutorial-engineer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/tutorial-engineer.md + +## Role +Tutorial engineer. Creates step-by-step how-to content, validates code examples, and ensures copy-paste-ability. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md diff --git a/.claude/agents/ui-problem-diagnosis.md b/.claude/agents/ui-problem-diagnosis.md new file mode 100644 index 000000000..9f88e69ee --- /dev/null +++ b/.claude/agents/ui-problem-diagnosis.md @@ -0,0 +1,10 @@ +# ui-problem-diagnosis.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ui-problem-diagnosis-specialist.md + +## Role +UI problem diagnosis specialist. Investigates visual regressions, cross-browser issues, and CSS bugs. + +## Instructions +- @.apm/instructions/css-consolidation.instructions.md +- @docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.claude/agents/ux-browser-validator.md b/.claude/agents/ux-browser-validator.md new file mode 100644 index 000000000..118ea4ffa --- /dev/null +++ b/.claude/agents/ux-browser-validator.md @@ -0,0 +1,14 @@ +# ux-browser-validator.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ux-browser-validator.md + +## Role +UX browser validator. Validates UX interactions, accessibility, and cross-browser behavior. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- WCAG 2.1 AA accessibility compliance +- Semantic HTML elements (h1, button, main, nav) +- Responsive design: desktop + mobile verification diff --git a/.claude/commands/blog-pipeline.md b/.claude/commands/blog-pipeline.md new file mode 100644 index 000000000..5c9dae536 --- /dev/null +++ b/.claude/commands/blog-pipeline.md @@ -0,0 +1,79 @@ +--- +{} +--- + +# Blog Post Pipeline — Trigger Prompt +# +# Copy this prompt to write the next blog post from the content plan. +# Full pipeline: docs/workflows/blog-pipeline.md +# +# This is a reusable PROMPT — APM compiles it to slash-commands for +# each AI tool (e.g., /blog-post in Claude, #blog-post in Copilot). + +Write the next blog post following the full pipeline. + +## STEP 1 — Pick Topic +Read the content plan: docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md +Find the next 🔲 Planned topic. Confirm slug, primary keyword, target publish date. + +## STEP 2 — Read Context (mandatory, do not skip) +- ICP: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +- Voice guide: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +- Content plan brief: read the topic's brief section +- Design spec: .stitch/design.md + +## STEP 3 — Research +- Web search for 5+ authoritative sources +- Check existing posts for duplication: ls content/blog/ | grep -iE "" +- Verify every statistic has a citable source + +## STEP 3b — Find Internal Posts to Reference +- Use claude-context MCP search FIRST +- For tag/slug lookups: docs/blog-post-index.md +- Verify each slug: ls content/blog//index.md +- Collect at least 4 verified slugs before drafting + +## STEP 4 — Draft +Create content/blog//index.md with: +- Frontmatter: title ≤45 chars, description 150-160 chars, date, slug, keywords, tags +- Voice: plain English, empathy first, founder-to-founder tone +- Structure: punchy hook → keyword in first 100 words → numbered H2s → "When NOT to" → JT proof → CTA → related reading → further reading +- 4+ internal links in body, 5+ external citations +- Paragraphs ≤3 sentences +- Cut test: "what does the reader DO differently?" — delete if answer is "nothing new" + +## STEP 5 — Review Loop +Spawn 3 parallel critic agents: +1. Founder persona (Alex, burned CEO) — ≥8/10 +2. SEO/slop detector — ≥8/10 humanization +3. Senior copy editor — "publish as-is" or "minor edits" + +## STEP 5c — Cold-Eyes Gate (mandatory) +Spawn fresh-context reviewer with 9 explicit checks: +1. Frontmatter vs body consistency +2. Fluffy AI narration detection +3. Fake authority stamps +4. Timeline fabrication +5. "Not X but Y" patterns +6. Em dashes → hyphens +7. Rule-of-three modifiers +8. Cross-section template repetition +9. Impersonal fragment stacking + +## STEP 6 — Cover Image +- Read .stitch/design.md (6-slot layout) +- Duplicate existing HTML from .stitch/designs/ +- Render: chrome-devtools → viewport 2400×1260×2 → screenshot +- Downsample: magick → 2400×1260 → content/blog//cover.png + +## STEP 7 — Validate +- bin/hugo-build must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s, og:image resolves + +## STEP 8 — Update Content Plan +- Change topic status: 🔲 Planned → ✅ Published +- Add commit SHA + changelog + +## STEP 9 — Commit +- Stage: post directory + cover HTML + content plan update +- Commit format: feat(content): add post \ No newline at end of file diff --git a/.claude/commands/cover-image.md b/.claude/commands/cover-image.md new file mode 100644 index 000000000..024cd8573 --- /dev/null +++ b/.claude/commands/cover-image.md @@ -0,0 +1,23 @@ +--- +{} +--- + +# Cover Image Generation — Trigger Prompt +# +# Reusable prompt for generating blog post cover images via Stitch design system. +# Full spec: .stitch/design.md (canonical 6-slot layout) +# Full workflow: docs/workflows/cover-images.md + +Generate a cover image for a blog post. + +## Steps +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ (e.g., rails-8-1-active-job-continuations-cover.html) +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — see .stitch/design.md for exact positioning \ No newline at end of file diff --git a/.claude/commands/research.md b/.claude/commands/research.md new file mode 100644 index 000000000..59101394b --- /dev/null +++ b/.claude/commands/research.md @@ -0,0 +1,30 @@ +--- +{} +--- + +# Research Protocol — Trigger Prompt +# +# Reusable prompt for research-first development. +# MANDATORY sequence before any implementation. + +Research this topic before implementing: {TOPIC} + +## Research Sequence +1. **Handbook search**: Search claude-context for existing patterns in /knowledge/ and docs/ +2. **Codebase search**: Search claude-context for similar implementations in this repo +3. **Framework docs**: context7 for official documentation (Hugo, PostCSS, Ruby, etc.) +4. **Package analysis**: package-search for dependency research (if using new packages) +5. **Web search**: brave-search / searxng for current best practices (2025-2026) + +## Output Requirements +- 5+ authoritative sources +- Existing patterns found (or confirmation of none) +- Framework documentation citations +- Dependency evaluation (if applicable) +- Recommendation with trade-offs + +## Anti-Patterns (BLOCKED) +- Implementation before research +- Single-source decisions +- Dependencies installed without package-search verification +- Slugs guessed without ls content/blog/ verification \ No newline at end of file diff --git a/.claude/rules/css-consolidation.md b/.claude/rules/css-consolidation.md new file mode 100644 index 000000000..0f1faae2d --- /dev/null +++ b/.claude/rules/css-consolidation.md @@ -0,0 +1,30 @@ +# CSS Consolidation Rules — JetThoughts Site +# +# MANDATORY for all CSS/HTML template changes. +# Full docs: docs/workflows/css-consolidation.md +# Project: docs/projects/2509-css-migration/css-loading-order-analysis.md + +## Architecture +- **Methodology**: BEM (Block__Element--Modifier) +- **Pipeline**: PostCSS (import, mixins, nested, autoprefixer, cssnano, purgecss) +- **Cascade order**: Critical → Layout → Component → Theme → Footer + +## Rules +- Never modify vendor files (`css/vendors/*.min.css`) or dynamic templates (`css/dynamic-*.css`) +- Preserve cascade order in all changes +- Extract whole rule sets; keep page-specific `.fl-node-{hash}` in original files +- Run `bin/rake test:critical` after each extraction + +## FL-Node Extraction (Beaver Builder → BEM) +- **Phase**: TDD RED-GREEN-REFACTOR cycle +- **Validation**: `env PRECOMPILED_ASSETS=false bin/rake test:critical` after each change +- **Pattern**: Add BEM classes first → verify visual fidelity → remove FL-nodes → retest +- **Commit**: micro-commit on green tests only + +## Visual Regression +- Tolerance: 0.0 for refactoring (zero visual changes) +- Tolerance: ≤0.03 for new features only +- Run BOTH `bin/test` and `bin/dtest` before commit +- Visual failures are commit blockers, not warnings + +@see docs/workflows/css-consolidation.md diff --git a/.claude/rules/icp-target.md b/.claude/rules/icp-target.md new file mode 100644 index 000000000..e9457d522 --- /dev/null +++ b/.claude/rules/icp-target.md @@ -0,0 +1,46 @@ +# ICP Target — JetThoughts Primary Website Audience +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before content, design, marketing, or blog work. +# Compiled by APM into every AI tool's context. + +## ICP-E: Non-Technical Founder Burned by a Devshop + +### Who They Are +- 35-50 years old +- Non-technical or semi-technical +- Raised funding ($500K–$2M seed) +- Hired a dev shop or freelancers +- Missed deadlines, buggy product, mounting technical debt +- Starting to question: "Is it me? Is it them? How do I know?" + +### Their Pain +- Can't evaluate code quality themselves +- Dev shop says "almost done" for months +- Every new feature breaks something else +- No tests, no documentation, no deploy pipeline +- Starting to lose investor confidence + +### What They Need +- Someone who speaks plain English, not jargon +- Proof that the problem is real and solvable (specific stories, not vague promises) +- A clear path out: audit → stabilize → build right +- Trust signals: named clients, specific results, honest trade-offs + +### What Resonates +- Stories of other founders in the same situation +- Specific numbers: "$40K wasted," "11-minute outage," "84 support tickets" +- Honest acknowledgment that rescue is hard and expensive +- The idea that good engineering is a competitive advantage +- "You're not crazy — this IS what bad engineering looks like" + +### What Alienates +- jargon-dense technical explanations before establishing trust +- "We're the best" claims without evidence +- Generic consulting language ("partner with you," "drive outcomes") +- Ignoring the emotional reality (shame, frustration, fear of looking stupid) + +@see docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.claude/rules/project-rules.md b/.claude/rules/project-rules.md new file mode 100644 index 000000000..deb7313e4 --- /dev/null +++ b/.claude/rules/project-rules.md @@ -0,0 +1,79 @@ +# JetThoughts Site — Project Rules +# +# This is the SINGLE SOURCE for AI agent instructions across all tools. +# APM compiles this to each tool's expected path (CLAUDE.md, .github/ +# copilot-instructions.md, etc.). Edit here, not in tool-specific files. +# +# CANONICAL SOURCE: THIS FILE. The existing CLAUDE.md is a Claude-specific +# superset; over time CLI tool instructions converge here. Voice, ICP, TDD, +# and CSS rules are split into separate instruction files for modularity. +# +# Full workflow docs: docs/workflows/ +# Full content docs: docs/90-99-content-strategy/ + +## Stack +- **Site**: Hugo 0.147.9 Extended static site generator +- **Theme**: Custom "Beaver" theme (BEM + PostCSS) +- **Tests**: Ruby 3.4, Minitest, Capybara, Selenium WebDriver +- **CSS**: PostCSS pipeline (autoprefixer, cssnano, purgecss) +- **Package managers**: Bun (JS, NOT npm), Bundler (Ruby) +- **CI/CD**: GitHub Actions → GitHub Pages + +## Build & Test Commands +- Build: `bin/hugo-build` +- Test (critical): `bin/rake test:critical` +- Test (visual/macOS): `bin/test` +- Test (visual/Linux Docker): `bin/dtest` +- Lint Ruby: `bundle exec standardrb --fix` + +## Research Protocol (MANDATORY — before any change) +1. Search codebase with `claude-context` MCP FIRST +2. Verify exact filenames with `rg`/`ls` as fallback +3. Read `docs/workflows/BASE_HANDBOOK.md` at session start +4. Read `docs/workflows/flow-router.md` to route to correct workflow +5. For blog content: find existing posts via `docs/blog-post-index.md` +6. Never guess slugs — verify with `ls content/blog//index.md` + +## Non-Negotiables +- **Zero generic AI language** in content — all AI-sounding phrases rejected +- **Zero Hugo build breaks** — `bin/hugo-build` must pass for content changes +- **Zero unsupported claims** — all assertions must have citations +- **No ad hoc test scripts** — use `bin/rake test:critical` and `bin/test` +- **No Python for analysis** — prefer `rg`, `sed`, `awk`, shell tools +- **No duplicate throwaway files** — no `*_refactored.*`, `*_new.*`, `*_backup.*` +- **New docs only under `docs/workflows/`** — else edit existing files +- **Never commit coordinator/verification reports** — write to `/tmp/` instead + +## Content Work (Blog Posts, LinkedIn, Pages) +- **BEFORE writing**: Read voice guide + ICP target (see instructions/voice-guide, instructions/icp-target) +- **Blog posts**: Follow `docs/workflows/blog-pipeline.md` end-to-end +- **LinkedIn**: Follow `docs/workflows/linkedin-post-pipeline.md` +- **Cover images**: Follow `docs/workflows/cover-images.md` + `.stitch/design.md` +- Run slop-detector + humanizer pass on all drafts +- Cold-eyes gate (9 checks) mandatory before publishing + +## CSS / HTML Changes +- **BEM methodology** mandatory for all new CSS +- **FL-node extraction**: TDD cycle — RED → GREEN → REFACTOR → TEST +- **Visual regression tolerance**: 0.0 for refactors, ≤0.03 for new features +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- **Feature branches**: HTML/CSS/template changes → feature branch → one PR per sprint +- Zero tolerance: CSS class existence testing, framework selector usage in tests + +## TDD & Testing +- **Cycle**: RED → GREEN → REFACTOR +- **Framework**: Minitest (test/system/, test/unit/) +- **Behavior-focused tests ONLY** — reject implementation/existence/config tests +- **Avoid fragile config assertions** — assert shape, not tunable values +- **Visual regression**: screenshot comparison, 0.0 tolerance for refactoring +- Run `bin/rake test:critical` after every micro-change (<10 lines) +- Chrome DevTools validation after HTML/CSS/JS changes: zero console errors, zero 404s + +## Behavioral Constraints +- **User says "code is bad" or "over-engineered"**: HALT, 5-Why analysis, fix config, proceed +- **Reflection triggers**: zero-defect tracking, test masking detection +- **Four-eyes principle**: paired agents for all critical changes +- **Direct-to-master only for**: content-only blog edits, commit fixes, docs, CLAUDE.md policy updates + +@see docs/workflows/ for full workflow documentation +@see docs/90-99-content-strategy/ for content strategy diff --git a/.claude/rules/tdd-enforcement.md b/.claude/rules/tdd-enforcement.md new file mode 100644 index 000000000..a532cfa19 --- /dev/null +++ b/.claude/rules/tdd-enforcement.md @@ -0,0 +1,62 @@ +# TDD Enforcement — JetThoughts Site +# +# MANDATORY for all code changes. Extracted from CLAUDE.md TDD section. +# Full docs: docs/60.03-tdd-quality-enforcement.md, docs/60.04-four-eyes-principle.md + +## TDD Cycle +1. **RED**: Write a failing test that validates BEHAVIOR (not implementation) +2. **GREEN**: Minimal code to make the test pass +3. **REFACTOR**: Clean up while tests stay green +4. **COMMIT**: Micro-commit on green tests + +## Test Quality Rules (ZERO TOLERANCE) + +### Prohibited Test Patterns — Agent MUST Reject +- ❌ CSS class existence testing (`.fl-node-*`, `.has_css?(".px-4")`) +- ❌ HTML structure counting (`page.all("div").count`) +- ❌ Framework-generated selector usage (FL-Builder, Tailwind utility classes) +- ❌ Method existence testing (`assert SomeClass.method_defined?`) +- ❌ Config value assertions (hardcoded `q=90`, exact file sizes, specific dimensions) +- ❌ Implementation detail testing + +### Required Test Patterns +- ✅ Visual regression: `take_screenshot` → `assert_visual_match` with tolerance +- ✅ User-visible content: `assert page.has_content?("text")` +- ✅ Semantic elements: `assert page.has_css?("h1", text: "...")` +- ✅ User interaction: `click_button` → `assert_current_path` +- ✅ Shape assertions: `q=\d+`, `src contains wsrv.nl`, not `q=90`, not exact URLs + +### Avoid Fragile Config Assertions +Don't hardcode tunable values. Assert the *shape*, not the configuration: +- Bad: `assert_match /q=90/, src` +- Good: `assert_match /q=\d+/, src` +- Bad: `assert_match /w=360/, src` +- Good: `assert has_css?("picture source")` + +## Visual Regression Gates (BLOCKING for HTML/CSS changes) +- **Tolerance**: 0.0 for refactoring, ≤0.03 for new features +- **Protocol**: Capture baseline BEFORE changes → compare AFTER → block on any diff >0% +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- Visual regression failures are COMMIT BLOCKERS, not warnings + +## Test Runner +- Framework: Minitest +- Critical tests: `bin/rake test:critical` (after every micro-change <10 lines) +- Visual macOS: `bin/test` +- Visual Linux/Docker: `bin/dtest` +- NEVER create ad hoc `*.sh` test scripts + +## Chrome DevTools Validation (MANDATORY after HTML/CSS/JS) +1. Start Hugo dev server, open page in Chrome DevTools +2. Console: ZERO JS errors +3. Network: ZERO 404s +4. Capture desktop + mobile screenshots +5. All gates pass → commit. Any gate fails → fix, repeat + +## Feature Branch + PR (HTML/CSS/template changes) +1. `git checkout -b ` +2. Multiple related commits on branch +3. Both test gates green on each commit +4. `git push -u origin ` +5. ONE PR per sprint via `gh pr create` +6. Direct-to-master only for: content-only blog edits, commit fixes, docs, CLAUDE.md updates diff --git a/.claude/rules/voice-guide.md b/.claude/rules/voice-guide.md new file mode 100644 index 000000000..97aeec148 --- /dev/null +++ b/.claude/rules/voice-guide.md @@ -0,0 +1,68 @@ +# Voice Guide — JetThoughts Content +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before writing ANY blog post, LinkedIn post, or marketing copy. +# Compiled by APM into every AI tool's context. + +## Two Voices + +### Founder Posts (Paul Keen / JT leadership) +- **Rob Walling directness** + **Rand Fishkin vulnerability** +- Plain English, empathy, specific numbers +- Talk to a non-technical founder burned by a devshop +- "Been there" energy — practitioner not vendor +- Trade-offs acknowledged honestly + +### Tech Posts (engineering team) +- **Thoughtbot style**: open with tension, not features +- Own your opinions — no "it depends" hedging +- Code as narrative evidence, not decoration +- Honest trade-offs: what does this solution fail to do? + +## Banned Words +unlock, harness, leverage, dive in, game-changer, journey, seamless, robust, +supercharge, revolutionize, embark, delve, discover, blast radius, suspect list + +## Banned Structural Patterns +- Rule of three (parallel triads) +- Signposting ("This post is about...", "Here's what you need to know") +- Bold inline-header lists +- Triple rhetorical questions +- Slogany parallel closings ("X is A. Y is B.") +- Therapist voice ("That's the hardest part") +- Copula avoidance ("serves as" → use "is") +- Impersonal fragment stacking — every sentence needs a human subject +- Sustained staccato (3+ consecutive short fragments or uniform-length sentences) +- Command structure repetition (3+ paragraphs starting with imperatives) +- Apologetic caveats ("every project is different") +- Telling instead of showing — replace adjectives with concrete mechanics +- Fake authority generalizations ("We've seen this on every codebase") +- Timeline fabrication — verify technology release dates before using "last year" +- Use `-` not `—` for all dashes + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? If subject is a thing, rewrite with a person +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: is ≥90% educational? Is promotion ≤10%? +- **"Trade-off" test**: did I acknowledge what the solution fails to do? +- **"Practitioner" test**: replace generalized scenarios with specific incidents + +## Mannerism Noun Cap +discipline, cycle, pattern, canonical, workflow, framework, cadence, rhythm, +contract, gate, gatekeeper, layer, round, review, pass +→ Max 5 occurrences total per post. Vary to the concrete thing happening. + +## Cadence Quotas (per H2 section) +- At least one sentence <9 words AND one >22 words +- No 3 consecutive sentences within 3 words of each other +- One single-sentence paragraph per H2 +- Max 3 sentences / 70 words per paragraph +- No two sentences in same paragraph starting with same first word +- "The..." paragraph openers: <20% of total paragraphs +- "We..." paragraph openers: <15% of total paragraphs + +@see docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md diff --git a/.claude/skills/blog-post-pipeline/SKILL.md b/.claude/skills/blog-post-pipeline/SKILL.md new file mode 100644 index 000000000..5f2324f46 --- /dev/null +++ b/.claude/skills/blog-post-pipeline/SKILL.md @@ -0,0 +1,41 @@ +# Blog Post Pipeline Skill +# +# Reusable 9-phase autonomous content pipeline for Hugo-based blogs. +# This is a PRODUCER skill — published by jetthoughts/site for other repos. + +## Overview +End-to-end pipeline from topic selection to published post with automated +quality gates, multi-critic review, and cover image generation. + +## Phases +1. Pick topic from content plan +2. Read context (ICP, voice guide, brief) +3. Research (5+ authoritative sources) +4. Draft with voice enforcement + cadence quotas +5. Review loop (3 parallel critic agents: founder, SEO/slop, editor) +5c. Cold-eyes gate (9 explicit checks) +6. Cover image (6-slot HTML → chrome-devtools render → lanczos downsample) +7. Validate (Hugo build + Chrome DevTools) +8. Update content plan +9. Commit + +## Dependencies +### MCP Servers +- claude-context — semantic codebase search for existing posts +- brave-search / searxng — web research +- chrome-devtools — cover image rendering, validation + +### Other Skills +- content-voice-enforcement — voice guide compliance +- cover-image-generation — 6-slot layout rendering + +### Agents +- content-creator — drafting +- seo-specialist — SEO compliance +- reviewer — quality gates + +## Trigger +@.apm/prompts/blog-pipeline.prompt.md + +## Full Documentation +docs/workflows/blog-pipeline.md diff --git a/.claude/skills/content-voice-enforcement/SKILL.md b/.claude/skills/content-voice-enforcement/SKILL.md new file mode 100644 index 000000000..df01df43f --- /dev/null +++ b/.claude/skills/content-voice-enforcement/SKILL.md @@ -0,0 +1,37 @@ +# Content Voice Enforcement Skill +# +# Reusable voice enforcement for JetThoughts content — blog posts, LinkedIn, +# and marketing copy targeting the ICP-E audience (non-technical founder +# burned by a devshop). + +## Overview +Enforces the JetThoughts voice guide, banned word list, structural patterns, +cadence quotas, and quality tests on all content. + +## Voice Guide +See .apm/instructions/voice-guide.instructions.md for the full compiled extract. +Canonical source: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md + +## Two Voices +- **Founder posts**: Rob Walling directness + Rand Fishkin vulnerability +- **Tech posts**: Thoughtbot style (tension-first, opinionated, code as evidence) + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: ≥90% educational, ≤10% promotional +- **"Trade-off" test**: acknowledged what the solution fails to do? +- **"Practitioner" test**: replace generalizations with specific incidents + +## Slop Detector + Cold-Eyes Gate +- Run slop-detector on all drafts +- Run humanizer pass if flagged +- Cold-eyes gate (9 checks) mandatory before publishing +- See docs/workflows/blog-pipeline.md STEP 5a + STEP 5c + +## Full Documentation +.apm/instructions/voice-guide.instructions.md +.apm/instructions/icp-target.instructions.md +docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.claude/skills/cover-image-generation/SKILL.md b/.claude/skills/cover-image-generation/SKILL.md new file mode 100644 index 000000000..a367207dc --- /dev/null +++ b/.claude/skills/cover-image-generation/SKILL.md @@ -0,0 +1,32 @@ +# Cover Image Generation Skill +# +# Reusable skill for generating blog post cover images using the +# JetVelocity 6-slot design system. + +## Overview +Generates 2400×1260 cover images for blog posts using a 6-slot HTML layout +rendered via chrome-devtools. + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — canonical spec in .stitch/design.md + +## Workflow +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png +6. Set frontmatter: cover_image: cover.png, cover_image_alt: descriptive alt text + +## Dependencies +### MCP +- chrome-devtools — rendering + +### System +- ImageMagick (magick CLI) — downsampling + +## Full Documentation +.stitch/design.md (canonical 6-slot spec) +docs/workflows/cover-images.md diff --git a/.claude/skills/css-bem-migration/SKILL.md b/.claude/skills/css-bem-migration/SKILL.md new file mode 100644 index 000000000..9fcd1046f --- /dev/null +++ b/.claude/skills/css-bem-migration/SKILL.md @@ -0,0 +1,49 @@ +# CSS BEM Migration Skill +# +# Reusable methodology for migrating from FL-Builder (Beaver Builder) +# auto-generated classes to BEM component architecture. + +## Overview +TDD-driven FL-node extraction: add BEM classes → verify visual fidelity → +remove FL-nodes → retest. Micro-commits on every green test. + +## Pattern +1. RED: Identify FL-node CSS dependencies +2. GREEN: Add BEM classes to HTML, consolidate CSS +3. REFACTOR: Remove duplicate FL-node CSS, cleanup +4. TEST: `env PRECOMPILED_ASSETS=false bin/rake test:critical` +5. COMMIT: Micro-commit on green tests + +## BEM Component Structure +```html + +
+ + +
+ + +
+``` + +## CSS Consolidation Pattern +```css +/* Before: 3 separate FL-node selectors */ +.fl-node-yx43bujcaiqn { width: 32%; margin-right: 30px; } +.fl-node-ktz4ipj39vd6 { width: 36%; margin: 0 30px; } +.fl-node-m39uvorzy5g8 { width: 32%; margin-left: 30px; } + +/* After: DRY BEM pattern */ +.c-feature-card { width: 32%; margin-right: 30px; } +.c-feature-card--second { width: 36%; margin: 0 30px; } +.c-feature-card--third { margin-right: 0; } +``` + +## Constraints +- Never modify vendor files or dynamic templates +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- Run BOTH bin/test (macOS) AND bin/dtest (Linux Docker) before commit + +## Full Documentation +docs/workflows/css-consolidation.md +docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.claude/skills/visual-regression-testing/SKILL.md b/.claude/skills/visual-regression-testing/SKILL.md new file mode 100644 index 000000000..ff12576f9 --- /dev/null +++ b/.claude/skills/visual-regression-testing/SKILL.md @@ -0,0 +1,41 @@ +# Visual Regression Testing Skill +# +# Reusable visual regression testing protocol for Hugo static sites. + +## Overview +Screenshot comparison-based visual testing using capybara-screenshot-diff. +Blocks commits on any visual regression during refactoring. + +## Protocol +1. Capture baseline screenshots BEFORE changes +2. Make CSS/HTML changes +3. Capture comparison screenshots AFTER changes +4. Compare with tolerance: + - 0.0 for refactoring (zero visual changes) + - ≤0.03 for new features only +5. Block commit on any difference > tolerance + +## Test Pattern +```ruby +def test_hero_section_visual_consistency + visit "/services/fractional-cto/" + screenshot_path = take_screenshot("fractional_cto_hero") + assert_visual_match(screenshot_path, "baseline/fractional_cto_hero.png", + tolerance: 0.03) +end +``` + +## Prohibited Patterns (ZERO TOLERANCE) +- CSS class existence testing +- HTML structure counting +- Framework-generated selector usage +- Method existence testing + +## Commands +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker, CI parity) +- BOTH must pass before commit for HTML/CSS changes + +## Full Documentation +.apm/instructions/tdd-enforcement.instructions.md +docs/60.03-tdd-quality-enforcement.md diff --git a/.codex/agents/analyst.toml b/.codex/agents/analyst.toml new file mode 100644 index 000000000..bdee948dd --- /dev/null +++ b/.codex/agents/analyst.toml @@ -0,0 +1,3 @@ +name = "analyst" +description = "" +developer_instructions = "# analyst.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/core/analyst.md\n\n## Role\nAnalysis agent. Performs research, root-cause analysis, and pattern discovery.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @.apm/prompts/research.prompt.md\n\n## Research Protocol (MANDATORY)\n1. claude-context search FIRST\n2. Verify with rg/ls\n3. Read docs/workflows/BASE_HANDBOOK.md" diff --git a/.codex/agents/build-monitor.toml b/.codex/agents/build-monitor.toml new file mode 100644 index 000000000..aea366de9 --- /dev/null +++ b/.codex/agents/build-monitor.toml @@ -0,0 +1,3 @@ +name = "build-monitor" +description = "" +developer_instructions = "# build-monitor.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/build-monitor.md\n\n## Role\nBuild monitoring agent. Validates Hugo builds, CI/CD pipelines, and performance.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n\n## Gates\n- `bin/hugo-build` must pass (zero errors)\n- Chrome DevTools: zero console errors, zero 404s\n- `bin/rake test:critical` green on every commit\n\n## CI/CD\n- GitHub Actions → GitHub Pages\n- Workflows: .github/workflows/publish.yml, test.yml, sync-and-publish.yml" diff --git a/.codex/agents/coder.toml b/.codex/agents/coder.toml new file mode 100644 index 000000000..4ce6b3ebf --- /dev/null +++ b/.codex/agents/coder.toml @@ -0,0 +1,3 @@ +name = "coder" +description = "" +developer_instructions = "# coder.agent.md — Thin Wrapper\n#\n# Canonical instructions: .apm/instructions/project-rules.instructions.md\n# Full agent definitions: .claude/agents/core/coder.md\n# \n# APM compiles this agent for all target tools. The canonical behavior\n# lives in the instruction files; this file pins the agent's role + pointers.\n\n## Role\nPrimary implementation agent. Writes code following TDD cycle (RED → GREEN → REFACTOR).\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @.apm/instructions/tdd-enforcement.instructions.md\n\n## For CSS/HTML work\n- @.apm/instructions/css-consolidation.instructions.md\n\n## For Ruby work\n- @docs/workflows/ruby.md\n\n## Constraints\n- Behavior-focused tests ONLY — reject structural/CSS class tests\n- Run `bin/rake test:critical` after every micro-change\n- Never use `npm` — use `bun`\n- Never create ad hoc `*.sh` test scripts" diff --git a/.codex/agents/content-creator.toml b/.codex/agents/content-creator.toml new file mode 100644 index 000000000..e9cb82791 --- /dev/null +++ b/.codex/agents/content-creator.toml @@ -0,0 +1,3 @@ +name = "content-creator" +description = "" +developer_instructions = "# content-creator.agent.md — Thin Wrapper\n#\n# Canonical instructions: .apm/instructions/voice-guide.instructions.md\n# Full agent definitions: .claude/agents/content-creator.md\n\n## Role\nContent creation agent. Writes blog posts, LinkedIn posts, and marketing copy.\n\n## Instructions\n- @.apm/instructions/voice-guide.instructions.md\n- @.apm/instructions/icp-target.instructions.md\n- @docs/workflows/blog-pipeline.md\n- @docs/workflows/linkedin-post-pipeline.md\n\n## Constraints\n- Zero generic AI language — run slop-detector + humanizer pass\n- Cold-eyes gate (9 checks) mandatory before publishing\n- Every sentence needs a person doing something\n- Banned words: unlock, harness, leverage, dive in, game-changer, etc.\n- Use `-` not `—` for all dashes" diff --git a/.codex/agents/content-marketer.toml b/.codex/agents/content-marketer.toml new file mode 100644 index 000000000..86d1e1cf5 --- /dev/null +++ b/.codex/agents/content-marketer.toml @@ -0,0 +1,3 @@ +name = "content-marketer" +description = "" +developer_instructions = "# content-marketer.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/content/content-marketer.md\n\n## Role\nContent marketing agent. Plans content calendars, researches topics, audits SEO performance.\n\n## Instructions\n- @.apm/instructions/icp-target.instructions.md\n- @docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md" diff --git a/.codex/agents/hugo-expert.toml b/.codex/agents/hugo-expert.toml new file mode 100644 index 000000000..e0413ba38 --- /dev/null +++ b/.codex/agents/hugo-expert.toml @@ -0,0 +1,3 @@ +name = "hugo-expert" +description = "" +developer_instructions = "# hugo-expert.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/hugo-expert.md\n\n## Role\nHugo static site generator expert. Handles templates, shortcodes, content structure, and build optimization.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @docs/workflows/css-consolidation.md\n\n## Key Files\n- `config/_default/hugo.toml` — Hugo configuration\n- `themes/beaver/layouts/` — Templates\n- `themes/beaver/assets/css/` — CSS (PostCSS pipeline)\n- `content/` — Content files (Markdown + Hugo frontmatter)\n\n## Commands\n- `bin/hugo-build` — Build + validate\n- `hugo server -D` — Dev server\n\n## Constraints\n- Never modify vendor CSS files\n- Preserve cascade order: Critical → Layout → Component → Theme → Footer\n- BEM methodology for all new CSS" diff --git a/.codex/agents/planner.toml b/.codex/agents/planner.toml new file mode 100644 index 000000000..aae008394 --- /dev/null +++ b/.codex/agents/planner.toml @@ -0,0 +1,3 @@ +name = "planner" +description = "" +developer_instructions = "# planner.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/core/planner.md\n\n## Role\nPlanning agent. Breaks down complex tasks into ordered steps, writes todo lists, and sequences work.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md" diff --git a/.codex/agents/qa-browser-tester.toml b/.codex/agents/qa-browser-tester.toml new file mode 100644 index 000000000..ed5c842a2 --- /dev/null +++ b/.codex/agents/qa-browser-tester.toml @@ -0,0 +1,3 @@ +name = "qa-browser-tester" +description = "" +developer_instructions = "# qa-browser-tester.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/validation/qa-browser-tester.md\n\n## Role\nQA browser tester. Runs Chrome DevTools validation after HTML/CSS/JS changes.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @.apm/instructions/tdd-enforcement.instructions.md\n\n## Gates\n- Console: ZERO JS errors\n- Network: ZERO 404s for assets\n- Capture desktop + mobile screenshots\n- All gates pass → commit" diff --git a/.codex/agents/researcher.toml b/.codex/agents/researcher.toml new file mode 100644 index 000000000..facca9c49 --- /dev/null +++ b/.codex/agents/researcher.toml @@ -0,0 +1,3 @@ +name = "researcher" +description = "" +developer_instructions = "# researcher.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/core/researcher.md\n\n## Role\nResearch agent. Discovers existing patterns, framework docs, and best practices before implementation.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @.apm/prompts/research.prompt.md" diff --git a/.codex/agents/reviewer.toml b/.codex/agents/reviewer.toml new file mode 100644 index 000000000..efe0f338d --- /dev/null +++ b/.codex/agents/reviewer.toml @@ -0,0 +1,3 @@ +name = "reviewer" +description = "" +developer_instructions = "# reviewer.agent.md — Thin Wrapper\n#\n# Canonical instructions: .apm/instructions/project-rules.instructions.md\n# Full agent definitions: .claude/agents/core/reviewer.md\n\n## Role\nCode review agent. Validates correctness, adherence to project rules, and TDD compliance.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @.apm/instructions/tdd-enforcement.instructions.md\n\n## Gates\n- Zero structural test patterns (CSS class testing, HTML counting)\n- Visual regression tolerance verified\n- Four-eyes principle enforced for all critical changes\n- Feature branch + PR pattern for HTML/CSS/template changes" diff --git a/.codex/agents/ruby-coder.toml b/.codex/agents/ruby-coder.toml new file mode 100644 index 000000000..b3791acf4 --- /dev/null +++ b/.codex/agents/ruby-coder.toml @@ -0,0 +1,3 @@ +name = "ruby-coder" +description = "" +developer_instructions = "# ruby-coder.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/ruby/ruby-coder.md\n\n## Role\nRuby implementation agent. Writes Ruby code (tests, sync scripts, lib/) following TDD.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @.apm/instructions/tdd-enforcement.instructions.md\n- @docs/workflows/ruby.md\n\n## Commands\n- `bin/rake test:critical`\n- `bundle exec standardrb --fix`" diff --git a/.codex/agents/ruby-reviewer.toml b/.codex/agents/ruby-reviewer.toml new file mode 100644 index 000000000..4d9683359 --- /dev/null +++ b/.codex/agents/ruby-reviewer.toml @@ -0,0 +1,3 @@ +name = "ruby-reviewer" +description = "" +developer_instructions = "# ruby-reviewer.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/ruby/ruby-reviewer.md\n\n## Role\nRuby code reviewer. Validates Ruby code quality, TDD compliance, and Minitest patterns.\n\n## Instructions\n- @.apm/instructions/tdd-enforcement.instructions.md\n\n## Constraints\n- Behavior-focused tests ONLY — reject structural testing\n- StandardRB compliance\n- No ad hoc test scripts" diff --git a/.codex/agents/screenshot-guardian.toml b/.codex/agents/screenshot-guardian.toml new file mode 100644 index 000000000..7102da53f --- /dev/null +++ b/.codex/agents/screenshot-guardian.toml @@ -0,0 +1,3 @@ +name = "screenshot-guardian" +description = "" +developer_instructions = "# screenshot-guardian.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/core/screenshot-guardian.md\n\n## Role\nVisual regression guardian. Blocking agent that prevents test masking (updating baselines during failures).\n\n## Instructions\n- @.apm/instructions/tdd-enforcement.instructions.md\n- @.claude/hooks/pre-commit-screenshot-validation.md\n\n## Gates\n- ZERO tolerance: screenshot updates during visual test failures\n- Tolerance: 0.0 for refactors, ≤0.03 for new features\n- Both bin/test AND bin/dtest must pass before commit" diff --git a/.codex/agents/seo-specialist.toml b/.codex/agents/seo-specialist.toml new file mode 100644 index 000000000..b49ca6465 --- /dev/null +++ b/.codex/agents/seo-specialist.toml @@ -0,0 +1,3 @@ +name = "seo-specialist" +description = "" +developer_instructions = "# seo-specialist.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/seo-specialist.md\n\n## Role\nSEO optimization agent. Handles keyword research, meta tags, schema, and content optimization.\n\n## Instructions\n- @docs/90-99-content-strategy/seo-optimization/\n- @docs/90-99-content-strategy/strategy-analysis/\n\n## Key Files\n- `themes/beaver/layouts/partials/seo/enhanced-meta-tags.html` — SEO/og:image template\n- `themes/beaver/layouts/partials/seo/article-schema.html` — JSON-LD schema\n- `config/_default/hugo.toml` — Hugo config (permalinks, sitemap)\n\n## Constraints\n- Title ≤45 chars, description 150-160 chars\n- Primary keyword in first 100 words\n- 4+ internal links, 5+ external citations\n- No keyword stuffing" diff --git a/.codex/agents/tester.toml b/.codex/agents/tester.toml new file mode 100644 index 000000000..39033b406 --- /dev/null +++ b/.codex/agents/tester.toml @@ -0,0 +1,3 @@ +name = "tester" +description = "" +developer_instructions = "# tester.agent.md — Thin Wrapper\n#\n# Canonical instructions: .apm/instructions/project-rules.instructions.md\n# Full agent definitions: .claude/agents/core/tester.md\n\n## Role\nTest agent. Writes and runs tests following TDD methodology.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n- @.apm/instructions/tdd-enforcement.instructions.md\n\n## Framework\n- Minitest (test/system/, test/unit/)\n- capybara-screenshot-diff for visual regression\n\n## Commands\n- `bin/rake test:critical` — critical tests\n- `bin/test` — visual regression (macOS)\n- `bin/dtest` — visual regression (Linux/Docker)\n\n## Constraints\n- Behavior-focused tests ONLY\n- Assert shape, not config values\n- Run both bin/test AND bin/dtest before commit for HTML/CSS changes" diff --git a/.codex/agents/tutorial-engineer.toml b/.codex/agents/tutorial-engineer.toml new file mode 100644 index 000000000..0557214e1 --- /dev/null +++ b/.codex/agents/tutorial-engineer.toml @@ -0,0 +1,3 @@ +name = "tutorial-engineer" +description = "" +developer_instructions = "# tutorial-engineer.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/content/tutorial-engineer.md\n\n## Role\nTutorial engineer. Creates step-by-step how-to content, validates code examples, and ensures copy-paste-ability.\n\n## Instructions\n- @.apm/instructions/voice-guide.instructions.md\n- @.apm/instructions/icp-target.instructions.md" diff --git a/.codex/agents/ui-problem-diagnosis.toml b/.codex/agents/ui-problem-diagnosis.toml new file mode 100644 index 000000000..2e3643400 --- /dev/null +++ b/.codex/agents/ui-problem-diagnosis.toml @@ -0,0 +1,3 @@ +name = "ui-problem-diagnosis" +description = "" +developer_instructions = "# ui-problem-diagnosis.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/validation/ui-problem-diagnosis-specialist.md\n\n## Role\nUI problem diagnosis specialist. Investigates visual regressions, cross-browser issues, and CSS bugs.\n\n## Instructions\n- @.apm/instructions/css-consolidation.instructions.md\n- @docs/projects/2509-css-migration/css-loading-order-analysis.md" diff --git a/.codex/agents/ux-browser-validator.toml b/.codex/agents/ux-browser-validator.toml new file mode 100644 index 000000000..0a5eac942 --- /dev/null +++ b/.codex/agents/ux-browser-validator.toml @@ -0,0 +1,3 @@ +name = "ux-browser-validator" +description = "" +developer_instructions = "# ux-browser-validator.agent.md — Thin Wrapper\n#\n# Full agent definitions: .claude/agents/validation/ux-browser-validator.md\n\n## Role\nUX browser validator. Validates UX interactions, accessibility, and cross-browser behavior.\n\n## Instructions\n- @.apm/instructions/project-rules.instructions.md\n\n## Gates\n- WCAG 2.1 AA accessibility compliance\n- Semantic HTML elements (h1, button, main, nav)\n- Responsive design: desktop + mobile verification" diff --git a/.codex/config.toml b/.codex/config.toml new file mode 100644 index 000000000..be084c500 --- /dev/null +++ b/.codex/config.toml @@ -0,0 +1,50 @@ +[mcp_servers.claude-context] +command = "npx" +args = [ "-y", "@anthropic/claude-context",] +id = "" + +[mcp_servers.context7] +command = "npx" +args = [ "-y", "@upstash/context7-mcp",] +id = "" + +[mcp_servers.brave-search] +command = "npx" +args = [ "-y", "@anthropic/brave-search-mcp",] +id = "" + +[mcp_servers.lean-ctx] +command = "npx" +args = [ "-y", "lean-ctx-mcp",] +id = "" + +[mcp_servers.chrome-devtools] +command = "npx" +args = [ "-y", "@anthropic/chrome-devtools-mcp",] +id = "" + +[mcp_servers.package-search] +command = "npx" +args = [ "-y", "package-search-mcp",] +id = "" + +[mcp_servers.github-mcp-server] +command = "npx" +args = [ "-y", "@anthropic/github-mcp-server",] +id = "" + +[mcp_servers.claude-context.env] + +[mcp_servers.context7.env] + +[mcp_servers.brave-search.env] +BRAVE_API_KEY = "${BRAVE_API_KEY}" + +[mcp_servers.lean-ctx.env] + +[mcp_servers.chrome-devtools.env] + +[mcp_servers.package-search.env] + +[mcp_servers.github-mcp-server.env] +GITHUB_TOKEN = "${GITHUB_TOKEN}" diff --git a/.cursor/agents/analyst.md b/.cursor/agents/analyst.md new file mode 100644 index 000000000..dfa4ca692 --- /dev/null +++ b/.cursor/agents/analyst.md @@ -0,0 +1,15 @@ +# analyst.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/analyst.md + +## Role +Analysis agent. Performs research, root-cause analysis, and pattern discovery. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md + +## Research Protocol (MANDATORY) +1. claude-context search FIRST +2. Verify with rg/ls +3. Read docs/workflows/BASE_HANDBOOK.md diff --git a/.cursor/agents/build-monitor.md b/.cursor/agents/build-monitor.md new file mode 100644 index 000000000..2bb9c0910 --- /dev/null +++ b/.cursor/agents/build-monitor.md @@ -0,0 +1,18 @@ +# build-monitor.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/build-monitor.md + +## Role +Build monitoring agent. Validates Hugo builds, CI/CD pipelines, and performance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- `bin/hugo-build` must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s +- `bin/rake test:critical` green on every commit + +## CI/CD +- GitHub Actions → GitHub Pages +- Workflows: .github/workflows/publish.yml, test.yml, sync-and-publish.yml diff --git a/.cursor/agents/coder.md b/.cursor/agents/coder.md new file mode 100644 index 000000000..7c8b2615e --- /dev/null +++ b/.cursor/agents/coder.md @@ -0,0 +1,26 @@ +# coder.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/coder.md +# +# APM compiles this agent for all target tools. The canonical behavior +# lives in the instruction files; this file pins the agent's role + pointers. + +## Role +Primary implementation agent. Writes code following TDD cycle (RED → GREEN → REFACTOR). + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## For CSS/HTML work +- @.apm/instructions/css-consolidation.instructions.md + +## For Ruby work +- @docs/workflows/ruby.md + +## Constraints +- Behavior-focused tests ONLY — reject structural/CSS class tests +- Run `bin/rake test:critical` after every micro-change +- Never use `npm` — use `bun` +- Never create ad hoc `*.sh` test scripts diff --git a/.cursor/agents/content-creator.md b/.cursor/agents/content-creator.md new file mode 100644 index 000000000..e6c244ca8 --- /dev/null +++ b/.cursor/agents/content-creator.md @@ -0,0 +1,20 @@ +# content-creator.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/voice-guide.instructions.md +# Full agent definitions: .claude/agents/content-creator.md + +## Role +Content creation agent. Writes blog posts, LinkedIn posts, and marketing copy. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md +- @docs/workflows/blog-pipeline.md +- @docs/workflows/linkedin-post-pipeline.md + +## Constraints +- Zero generic AI language — run slop-detector + humanizer pass +- Cold-eyes gate (9 checks) mandatory before publishing +- Every sentence needs a person doing something +- Banned words: unlock, harness, leverage, dive in, game-changer, etc. +- Use `-` not `—` for all dashes diff --git a/.cursor/agents/content-marketer.md b/.cursor/agents/content-marketer.md new file mode 100644 index 000000000..053ecd0a7 --- /dev/null +++ b/.cursor/agents/content-marketer.md @@ -0,0 +1,10 @@ +# content-marketer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/content-marketer.md + +## Role +Content marketing agent. Plans content calendars, researches topics, audits SEO performance. + +## Instructions +- @.apm/instructions/icp-target.instructions.md +- @docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md diff --git a/.cursor/agents/hugo-expert.md b/.cursor/agents/hugo-expert.md new file mode 100644 index 000000000..24fe61525 --- /dev/null +++ b/.cursor/agents/hugo-expert.md @@ -0,0 +1,25 @@ +# hugo-expert.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/hugo-expert.md + +## Role +Hugo static site generator expert. Handles templates, shortcodes, content structure, and build optimization. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @docs/workflows/css-consolidation.md + +## Key Files +- `config/_default/hugo.toml` — Hugo configuration +- `themes/beaver/layouts/` — Templates +- `themes/beaver/assets/css/` — CSS (PostCSS pipeline) +- `content/` — Content files (Markdown + Hugo frontmatter) + +## Commands +- `bin/hugo-build` — Build + validate +- `hugo server -D` — Dev server + +## Constraints +- Never modify vendor CSS files +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- BEM methodology for all new CSS diff --git a/.cursor/agents/planner.md b/.cursor/agents/planner.md new file mode 100644 index 000000000..837cedb13 --- /dev/null +++ b/.cursor/agents/planner.md @@ -0,0 +1,9 @@ +# planner.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/planner.md + +## Role +Planning agent. Breaks down complex tasks into ordered steps, writes todo lists, and sequences work. + +## Instructions +- @.apm/instructions/project-rules.instructions.md diff --git a/.cursor/agents/qa-browser-tester.md b/.cursor/agents/qa-browser-tester.md new file mode 100644 index 000000000..3a18ca639 --- /dev/null +++ b/.cursor/agents/qa-browser-tester.md @@ -0,0 +1,16 @@ +# qa-browser-tester.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/qa-browser-tester.md + +## Role +QA browser tester. Runs Chrome DevTools validation after HTML/CSS/JS changes. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Console: ZERO JS errors +- Network: ZERO 404s for assets +- Capture desktop + mobile screenshots +- All gates pass → commit diff --git a/.cursor/agents/researcher.md b/.cursor/agents/researcher.md new file mode 100644 index 000000000..5d953465d --- /dev/null +++ b/.cursor/agents/researcher.md @@ -0,0 +1,10 @@ +# researcher.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/researcher.md + +## Role +Research agent. Discovers existing patterns, framework docs, and best practices before implementation. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md diff --git a/.cursor/agents/reviewer.md b/.cursor/agents/reviewer.md new file mode 100644 index 000000000..989624346 --- /dev/null +++ b/.cursor/agents/reviewer.md @@ -0,0 +1,17 @@ +# reviewer.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/reviewer.md + +## Role +Code review agent. Validates correctness, adherence to project rules, and TDD compliance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Zero structural test patterns (CSS class testing, HTML counting) +- Visual regression tolerance verified +- Four-eyes principle enforced for all critical changes +- Feature branch + PR pattern for HTML/CSS/template changes diff --git a/.cursor/agents/ruby-coder.md b/.cursor/agents/ruby-coder.md new file mode 100644 index 000000000..510d186df --- /dev/null +++ b/.cursor/agents/ruby-coder.md @@ -0,0 +1,15 @@ +# ruby-coder.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-coder.md + +## Role +Ruby implementation agent. Writes Ruby code (tests, sync scripts, lib/) following TDD. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md +- @docs/workflows/ruby.md + +## Commands +- `bin/rake test:critical` +- `bundle exec standardrb --fix` diff --git a/.cursor/agents/ruby-reviewer.md b/.cursor/agents/ruby-reviewer.md new file mode 100644 index 000000000..bdfcf27b8 --- /dev/null +++ b/.cursor/agents/ruby-reviewer.md @@ -0,0 +1,14 @@ +# ruby-reviewer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-reviewer.md + +## Role +Ruby code reviewer. Validates Ruby code quality, TDD compliance, and Minitest patterns. + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md + +## Constraints +- Behavior-focused tests ONLY — reject structural testing +- StandardRB compliance +- No ad hoc test scripts diff --git a/.cursor/agents/screenshot-guardian.md b/.cursor/agents/screenshot-guardian.md new file mode 100644 index 000000000..f160b3b75 --- /dev/null +++ b/.cursor/agents/screenshot-guardian.md @@ -0,0 +1,15 @@ +# screenshot-guardian.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/screenshot-guardian.md + +## Role +Visual regression guardian. Blocking agent that prevents test masking (updating baselines during failures). + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md +- @.claude/hooks/pre-commit-screenshot-validation.md + +## Gates +- ZERO tolerance: screenshot updates during visual test failures +- Tolerance: 0.0 for refactors, ≤0.03 for new features +- Both bin/test AND bin/dtest must pass before commit diff --git a/.cursor/agents/seo-specialist.md b/.cursor/agents/seo-specialist.md new file mode 100644 index 000000000..328a80718 --- /dev/null +++ b/.cursor/agents/seo-specialist.md @@ -0,0 +1,21 @@ +# seo-specialist.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/seo-specialist.md + +## Role +SEO optimization agent. Handles keyword research, meta tags, schema, and content optimization. + +## Instructions +- @docs/90-99-content-strategy/seo-optimization/ +- @docs/90-99-content-strategy/strategy-analysis/ + +## Key Files +- `themes/beaver/layouts/partials/seo/enhanced-meta-tags.html` — SEO/og:image template +- `themes/beaver/layouts/partials/seo/article-schema.html` — JSON-LD schema +- `config/_default/hugo.toml` — Hugo config (permalinks, sitemap) + +## Constraints +- Title ≤45 chars, description 150-160 chars +- Primary keyword in first 100 words +- 4+ internal links, 5+ external citations +- No keyword stuffing diff --git a/.cursor/agents/tester.md b/.cursor/agents/tester.md new file mode 100644 index 000000000..8bc5f213b --- /dev/null +++ b/.cursor/agents/tester.md @@ -0,0 +1,25 @@ +# tester.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/tester.md + +## Role +Test agent. Writes and runs tests following TDD methodology. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Framework +- Minitest (test/system/, test/unit/) +- capybara-screenshot-diff for visual regression + +## Commands +- `bin/rake test:critical` — critical tests +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker) + +## Constraints +- Behavior-focused tests ONLY +- Assert shape, not config values +- Run both bin/test AND bin/dtest before commit for HTML/CSS changes diff --git a/.cursor/agents/tutorial-engineer.md b/.cursor/agents/tutorial-engineer.md new file mode 100644 index 000000000..14374cb5e --- /dev/null +++ b/.cursor/agents/tutorial-engineer.md @@ -0,0 +1,10 @@ +# tutorial-engineer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/tutorial-engineer.md + +## Role +Tutorial engineer. Creates step-by-step how-to content, validates code examples, and ensures copy-paste-ability. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md diff --git a/.cursor/agents/ui-problem-diagnosis.md b/.cursor/agents/ui-problem-diagnosis.md new file mode 100644 index 000000000..9f88e69ee --- /dev/null +++ b/.cursor/agents/ui-problem-diagnosis.md @@ -0,0 +1,10 @@ +# ui-problem-diagnosis.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ui-problem-diagnosis-specialist.md + +## Role +UI problem diagnosis specialist. Investigates visual regressions, cross-browser issues, and CSS bugs. + +## Instructions +- @.apm/instructions/css-consolidation.instructions.md +- @docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.cursor/agents/ux-browser-validator.md b/.cursor/agents/ux-browser-validator.md new file mode 100644 index 000000000..118ea4ffa --- /dev/null +++ b/.cursor/agents/ux-browser-validator.md @@ -0,0 +1,14 @@ +# ux-browser-validator.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ux-browser-validator.md + +## Role +UX browser validator. Validates UX interactions, accessibility, and cross-browser behavior. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- WCAG 2.1 AA accessibility compliance +- Semantic HTML elements (h1, button, main, nav) +- Responsive design: desktop + mobile verification diff --git a/.cursor/commands/blog-pipeline.md b/.cursor/commands/blog-pipeline.md new file mode 100644 index 000000000..5c9dae536 --- /dev/null +++ b/.cursor/commands/blog-pipeline.md @@ -0,0 +1,79 @@ +--- +{} +--- + +# Blog Post Pipeline — Trigger Prompt +# +# Copy this prompt to write the next blog post from the content plan. +# Full pipeline: docs/workflows/blog-pipeline.md +# +# This is a reusable PROMPT — APM compiles it to slash-commands for +# each AI tool (e.g., /blog-post in Claude, #blog-post in Copilot). + +Write the next blog post following the full pipeline. + +## STEP 1 — Pick Topic +Read the content plan: docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md +Find the next 🔲 Planned topic. Confirm slug, primary keyword, target publish date. + +## STEP 2 — Read Context (mandatory, do not skip) +- ICP: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +- Voice guide: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +- Content plan brief: read the topic's brief section +- Design spec: .stitch/design.md + +## STEP 3 — Research +- Web search for 5+ authoritative sources +- Check existing posts for duplication: ls content/blog/ | grep -iE "" +- Verify every statistic has a citable source + +## STEP 3b — Find Internal Posts to Reference +- Use claude-context MCP search FIRST +- For tag/slug lookups: docs/blog-post-index.md +- Verify each slug: ls content/blog//index.md +- Collect at least 4 verified slugs before drafting + +## STEP 4 — Draft +Create content/blog//index.md with: +- Frontmatter: title ≤45 chars, description 150-160 chars, date, slug, keywords, tags +- Voice: plain English, empathy first, founder-to-founder tone +- Structure: punchy hook → keyword in first 100 words → numbered H2s → "When NOT to" → JT proof → CTA → related reading → further reading +- 4+ internal links in body, 5+ external citations +- Paragraphs ≤3 sentences +- Cut test: "what does the reader DO differently?" — delete if answer is "nothing new" + +## STEP 5 — Review Loop +Spawn 3 parallel critic agents: +1. Founder persona (Alex, burned CEO) — ≥8/10 +2. SEO/slop detector — ≥8/10 humanization +3. Senior copy editor — "publish as-is" or "minor edits" + +## STEP 5c — Cold-Eyes Gate (mandatory) +Spawn fresh-context reviewer with 9 explicit checks: +1. Frontmatter vs body consistency +2. Fluffy AI narration detection +3. Fake authority stamps +4. Timeline fabrication +5. "Not X but Y" patterns +6. Em dashes → hyphens +7. Rule-of-three modifiers +8. Cross-section template repetition +9. Impersonal fragment stacking + +## STEP 6 — Cover Image +- Read .stitch/design.md (6-slot layout) +- Duplicate existing HTML from .stitch/designs/ +- Render: chrome-devtools → viewport 2400×1260×2 → screenshot +- Downsample: magick → 2400×1260 → content/blog//cover.png + +## STEP 7 — Validate +- bin/hugo-build must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s, og:image resolves + +## STEP 8 — Update Content Plan +- Change topic status: 🔲 Planned → ✅ Published +- Add commit SHA + changelog + +## STEP 9 — Commit +- Stage: post directory + cover HTML + content plan update +- Commit format: feat(content): add post \ No newline at end of file diff --git a/.cursor/commands/cover-image.md b/.cursor/commands/cover-image.md new file mode 100644 index 000000000..024cd8573 --- /dev/null +++ b/.cursor/commands/cover-image.md @@ -0,0 +1,23 @@ +--- +{} +--- + +# Cover Image Generation — Trigger Prompt +# +# Reusable prompt for generating blog post cover images via Stitch design system. +# Full spec: .stitch/design.md (canonical 6-slot layout) +# Full workflow: docs/workflows/cover-images.md + +Generate a cover image for a blog post. + +## Steps +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ (e.g., rails-8-1-active-job-continuations-cover.html) +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — see .stitch/design.md for exact positioning \ No newline at end of file diff --git a/.cursor/commands/research.md b/.cursor/commands/research.md new file mode 100644 index 000000000..59101394b --- /dev/null +++ b/.cursor/commands/research.md @@ -0,0 +1,30 @@ +--- +{} +--- + +# Research Protocol — Trigger Prompt +# +# Reusable prompt for research-first development. +# MANDATORY sequence before any implementation. + +Research this topic before implementing: {TOPIC} + +## Research Sequence +1. **Handbook search**: Search claude-context for existing patterns in /knowledge/ and docs/ +2. **Codebase search**: Search claude-context for similar implementations in this repo +3. **Framework docs**: context7 for official documentation (Hugo, PostCSS, Ruby, etc.) +4. **Package analysis**: package-search for dependency research (if using new packages) +5. **Web search**: brave-search / searxng for current best practices (2025-2026) + +## Output Requirements +- 5+ authoritative sources +- Existing patterns found (or confirmation of none) +- Framework documentation citations +- Dependency evaluation (if applicable) +- Recommendation with trade-offs + +## Anti-Patterns (BLOCKED) +- Implementation before research +- Single-source decisions +- Dependencies installed without package-search verification +- Slugs guessed without ls content/blog/ verification \ No newline at end of file diff --git a/.cursor/mcp.json b/.cursor/mcp.json new file mode 100644 index 000000000..7d37ea206 --- /dev/null +++ b/.cursor/mcp.json @@ -0,0 +1,78 @@ +{ + "mcpServers": { + "claude-context": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@anthropic/claude-context" + ] + }, + "context7": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@upstash/context7-mcp" + ] + }, + "brave-search": { + "type": "stdio", + "command": "npx", + "env": { + "BRAVE_API_KEY": "${BRAVE_API_KEY}" + }, + "args": [ + "-y", + "@anthropic/brave-search-mcp" + ] + }, + "lean-ctx": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "lean-ctx-mcp" + ] + }, + "chrome-devtools": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@anthropic/chrome-devtools-mcp" + ] + }, + "package-search": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "package-search-mcp" + ] + }, + "github-mcp-server": { + "type": "stdio", + "command": "npx", + "env": { + "GITHUB_TOKEN": "${GITHUB_TOKEN}" + }, + "args": [ + "-y", + "@anthropic/github-mcp-server" + ] + }, + "searxng": { + "type": "http", + "url": "http://localhost:8080" + }, + "ollama": { + "type": "http", + "url": "http://localhost:11434" + }, + "milvus": { + "type": "http", + "url": "http://localhost:19530" + } + } +} \ No newline at end of file diff --git a/.cursor/rules/css-consolidation.mdc b/.cursor/rules/css-consolidation.mdc new file mode 100644 index 000000000..c011f6ced --- /dev/null +++ b/.cursor/rules/css-consolidation.mdc @@ -0,0 +1,34 @@ +--- +description: CSS Consolidation Rules — JetThoughts Site +--- + +# CSS Consolidation Rules — JetThoughts Site +# +# MANDATORY for all CSS/HTML template changes. +# Full docs: docs/workflows/css-consolidation.md +# Project: docs/projects/2509-css-migration/css-loading-order-analysis.md + +## Architecture +- **Methodology**: BEM (Block__Element--Modifier) +- **Pipeline**: PostCSS (import, mixins, nested, autoprefixer, cssnano, purgecss) +- **Cascade order**: Critical → Layout → Component → Theme → Footer + +## Rules +- Never modify vendor files (`css/vendors/*.min.css`) or dynamic templates (`css/dynamic-*.css`) +- Preserve cascade order in all changes +- Extract whole rule sets; keep page-specific `.fl-node-{hash}` in original files +- Run `bin/rake test:critical` after each extraction + +## FL-Node Extraction (Beaver Builder → BEM) +- **Phase**: TDD RED-GREEN-REFACTOR cycle +- **Validation**: `env PRECOMPILED_ASSETS=false bin/rake test:critical` after each change +- **Pattern**: Add BEM classes first → verify visual fidelity → remove FL-nodes → retest +- **Commit**: micro-commit on green tests only + +## Visual Regression +- Tolerance: 0.0 for refactoring (zero visual changes) +- Tolerance: ≤0.03 for new features only +- Run BOTH `bin/test` and `bin/dtest` before commit +- Visual failures are commit blockers, not warnings + +@see docs/workflows/css-consolidation.md diff --git a/.cursor/rules/icp-target.mdc b/.cursor/rules/icp-target.mdc new file mode 100644 index 000000000..4c8fe7487 --- /dev/null +++ b/.cursor/rules/icp-target.mdc @@ -0,0 +1,50 @@ +--- +description: ICP Target — JetThoughts Primary Website Audience +--- + +# ICP Target — JetThoughts Primary Website Audience +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before content, design, marketing, or blog work. +# Compiled by APM into every AI tool's context. + +## ICP-E: Non-Technical Founder Burned by a Devshop + +### Who They Are +- 35-50 years old +- Non-technical or semi-technical +- Raised funding ($500K–$2M seed) +- Hired a dev shop or freelancers +- Missed deadlines, buggy product, mounting technical debt +- Starting to question: "Is it me? Is it them? How do I know?" + +### Their Pain +- Can't evaluate code quality themselves +- Dev shop says "almost done" for months +- Every new feature breaks something else +- No tests, no documentation, no deploy pipeline +- Starting to lose investor confidence + +### What They Need +- Someone who speaks plain English, not jargon +- Proof that the problem is real and solvable (specific stories, not vague promises) +- A clear path out: audit → stabilize → build right +- Trust signals: named clients, specific results, honest trade-offs + +### What Resonates +- Stories of other founders in the same situation +- Specific numbers: "$40K wasted," "11-minute outage," "84 support tickets" +- Honest acknowledgment that rescue is hard and expensive +- The idea that good engineering is a competitive advantage +- "You're not crazy — this IS what bad engineering looks like" + +### What Alienates +- jargon-dense technical explanations before establishing trust +- "We're the best" claims without evidence +- Generic consulting language ("partner with you," "drive outcomes") +- Ignoring the emotional reality (shame, frustration, fear of looking stupid) + +@see docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.cursor/rules/project-rules.mdc b/.cursor/rules/project-rules.mdc new file mode 100644 index 000000000..bf8184fd1 --- /dev/null +++ b/.cursor/rules/project-rules.mdc @@ -0,0 +1,83 @@ +--- +description: JetThoughts Site — Project Rules +--- + +# JetThoughts Site — Project Rules +# +# This is the SINGLE SOURCE for AI agent instructions across all tools. +# APM compiles this to each tool's expected path (CLAUDE.md, .github/ +# copilot-instructions.md, etc.). Edit here, not in tool-specific files. +# +# CANONICAL SOURCE: THIS FILE. The existing CLAUDE.md is a Claude-specific +# superset; over time CLI tool instructions converge here. Voice, ICP, TDD, +# and CSS rules are split into separate instruction files for modularity. +# +# Full workflow docs: docs/workflows/ +# Full content docs: docs/90-99-content-strategy/ + +## Stack +- **Site**: Hugo 0.147.9 Extended static site generator +- **Theme**: Custom "Beaver" theme (BEM + PostCSS) +- **Tests**: Ruby 3.4, Minitest, Capybara, Selenium WebDriver +- **CSS**: PostCSS pipeline (autoprefixer, cssnano, purgecss) +- **Package managers**: Bun (JS, NOT npm), Bundler (Ruby) +- **CI/CD**: GitHub Actions → GitHub Pages + +## Build & Test Commands +- Build: `bin/hugo-build` +- Test (critical): `bin/rake test:critical` +- Test (visual/macOS): `bin/test` +- Test (visual/Linux Docker): `bin/dtest` +- Lint Ruby: `bundle exec standardrb --fix` + +## Research Protocol (MANDATORY — before any change) +1. Search codebase with `claude-context` MCP FIRST +2. Verify exact filenames with `rg`/`ls` as fallback +3. Read `docs/workflows/BASE_HANDBOOK.md` at session start +4. Read `docs/workflows/flow-router.md` to route to correct workflow +5. For blog content: find existing posts via `docs/blog-post-index.md` +6. Never guess slugs — verify with `ls content/blog//index.md` + +## Non-Negotiables +- **Zero generic AI language** in content — all AI-sounding phrases rejected +- **Zero Hugo build breaks** — `bin/hugo-build` must pass for content changes +- **Zero unsupported claims** — all assertions must have citations +- **No ad hoc test scripts** — use `bin/rake test:critical` and `bin/test` +- **No Python for analysis** — prefer `rg`, `sed`, `awk`, shell tools +- **No duplicate throwaway files** — no `*_refactored.*`, `*_new.*`, `*_backup.*` +- **New docs only under `docs/workflows/`** — else edit existing files +- **Never commit coordinator/verification reports** — write to `/tmp/` instead + +## Content Work (Blog Posts, LinkedIn, Pages) +- **BEFORE writing**: Read voice guide + ICP target (see instructions/voice-guide, instructions/icp-target) +- **Blog posts**: Follow `docs/workflows/blog-pipeline.md` end-to-end +- **LinkedIn**: Follow `docs/workflows/linkedin-post-pipeline.md` +- **Cover images**: Follow `docs/workflows/cover-images.md` + `.stitch/design.md` +- Run slop-detector + humanizer pass on all drafts +- Cold-eyes gate (9 checks) mandatory before publishing + +## CSS / HTML Changes +- **BEM methodology** mandatory for all new CSS +- **FL-node extraction**: TDD cycle — RED → GREEN → REFACTOR → TEST +- **Visual regression tolerance**: 0.0 for refactors, ≤0.03 for new features +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- **Feature branches**: HTML/CSS/template changes → feature branch → one PR per sprint +- Zero tolerance: CSS class existence testing, framework selector usage in tests + +## TDD & Testing +- **Cycle**: RED → GREEN → REFACTOR +- **Framework**: Minitest (test/system/, test/unit/) +- **Behavior-focused tests ONLY** — reject implementation/existence/config tests +- **Avoid fragile config assertions** — assert shape, not tunable values +- **Visual regression**: screenshot comparison, 0.0 tolerance for refactoring +- Run `bin/rake test:critical` after every micro-change (<10 lines) +- Chrome DevTools validation after HTML/CSS/JS changes: zero console errors, zero 404s + +## Behavioral Constraints +- **User says "code is bad" or "over-engineered"**: HALT, 5-Why analysis, fix config, proceed +- **Reflection triggers**: zero-defect tracking, test masking detection +- **Four-eyes principle**: paired agents for all critical changes +- **Direct-to-master only for**: content-only blog edits, commit fixes, docs, CLAUDE.md policy updates + +@see docs/workflows/ for full workflow documentation +@see docs/90-99-content-strategy/ for content strategy diff --git a/.cursor/rules/tdd-enforcement.mdc b/.cursor/rules/tdd-enforcement.mdc new file mode 100644 index 000000000..941d9f481 --- /dev/null +++ b/.cursor/rules/tdd-enforcement.mdc @@ -0,0 +1,66 @@ +--- +description: TDD Enforcement — JetThoughts Site +--- + +# TDD Enforcement — JetThoughts Site +# +# MANDATORY for all code changes. Extracted from CLAUDE.md TDD section. +# Full docs: docs/60.03-tdd-quality-enforcement.md, docs/60.04-four-eyes-principle.md + +## TDD Cycle +1. **RED**: Write a failing test that validates BEHAVIOR (not implementation) +2. **GREEN**: Minimal code to make the test pass +3. **REFACTOR**: Clean up while tests stay green +4. **COMMIT**: Micro-commit on green tests + +## Test Quality Rules (ZERO TOLERANCE) + +### Prohibited Test Patterns — Agent MUST Reject +- ❌ CSS class existence testing (`.fl-node-*`, `.has_css?(".px-4")`) +- ❌ HTML structure counting (`page.all("div").count`) +- ❌ Framework-generated selector usage (FL-Builder, Tailwind utility classes) +- ❌ Method existence testing (`assert SomeClass.method_defined?`) +- ❌ Config value assertions (hardcoded `q=90`, exact file sizes, specific dimensions) +- ❌ Implementation detail testing + +### Required Test Patterns +- ✅ Visual regression: `take_screenshot` → `assert_visual_match` with tolerance +- ✅ User-visible content: `assert page.has_content?("text")` +- ✅ Semantic elements: `assert page.has_css?("h1", text: "...")` +- ✅ User interaction: `click_button` → `assert_current_path` +- ✅ Shape assertions: `q=\d+`, `src contains wsrv.nl`, not `q=90`, not exact URLs + +### Avoid Fragile Config Assertions +Don't hardcode tunable values. Assert the *shape*, not the configuration: +- Bad: `assert_match /q=90/, src` +- Good: `assert_match /q=\d+/, src` +- Bad: `assert_match /w=360/, src` +- Good: `assert has_css?("picture source")` + +## Visual Regression Gates (BLOCKING for HTML/CSS changes) +- **Tolerance**: 0.0 for refactoring, ≤0.03 for new features +- **Protocol**: Capture baseline BEFORE changes → compare AFTER → block on any diff >0% +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- Visual regression failures are COMMIT BLOCKERS, not warnings + +## Test Runner +- Framework: Minitest +- Critical tests: `bin/rake test:critical` (after every micro-change <10 lines) +- Visual macOS: `bin/test` +- Visual Linux/Docker: `bin/dtest` +- NEVER create ad hoc `*.sh` test scripts + +## Chrome DevTools Validation (MANDATORY after HTML/CSS/JS) +1. Start Hugo dev server, open page in Chrome DevTools +2. Console: ZERO JS errors +3. Network: ZERO 404s +4. Capture desktop + mobile screenshots +5. All gates pass → commit. Any gate fails → fix, repeat + +## Feature Branch + PR (HTML/CSS/template changes) +1. `git checkout -b ` +2. Multiple related commits on branch +3. Both test gates green on each commit +4. `git push -u origin ` +5. ONE PR per sprint via `gh pr create` +6. Direct-to-master only for: content-only blog edits, commit fixes, docs, CLAUDE.md updates diff --git a/.cursor/rules/voice-guide.mdc b/.cursor/rules/voice-guide.mdc new file mode 100644 index 000000000..5ef863934 --- /dev/null +++ b/.cursor/rules/voice-guide.mdc @@ -0,0 +1,72 @@ +--- +description: Voice Guide — JetThoughts Content +--- + +# Voice Guide — JetThoughts Content +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before writing ANY blog post, LinkedIn post, or marketing copy. +# Compiled by APM into every AI tool's context. + +## Two Voices + +### Founder Posts (Paul Keen / JT leadership) +- **Rob Walling directness** + **Rand Fishkin vulnerability** +- Plain English, empathy, specific numbers +- Talk to a non-technical founder burned by a devshop +- "Been there" energy — practitioner not vendor +- Trade-offs acknowledged honestly + +### Tech Posts (engineering team) +- **Thoughtbot style**: open with tension, not features +- Own your opinions — no "it depends" hedging +- Code as narrative evidence, not decoration +- Honest trade-offs: what does this solution fail to do? + +## Banned Words +unlock, harness, leverage, dive in, game-changer, journey, seamless, robust, +supercharge, revolutionize, embark, delve, discover, blast radius, suspect list + +## Banned Structural Patterns +- Rule of three (parallel triads) +- Signposting ("This post is about...", "Here's what you need to know") +- Bold inline-header lists +- Triple rhetorical questions +- Slogany parallel closings ("X is A. Y is B.") +- Therapist voice ("That's the hardest part") +- Copula avoidance ("serves as" → use "is") +- Impersonal fragment stacking — every sentence needs a human subject +- Sustained staccato (3+ consecutive short fragments or uniform-length sentences) +- Command structure repetition (3+ paragraphs starting with imperatives) +- Apologetic caveats ("every project is different") +- Telling instead of showing — replace adjectives with concrete mechanics +- Fake authority generalizations ("We've seen this on every codebase") +- Timeline fabrication — verify technology release dates before using "last year" +- Use `-` not `—` for all dashes + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? If subject is a thing, rewrite with a person +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: is ≥90% educational? Is promotion ≤10%? +- **"Trade-off" test**: did I acknowledge what the solution fails to do? +- **"Practitioner" test**: replace generalized scenarios with specific incidents + +## Mannerism Noun Cap +discipline, cycle, pattern, canonical, workflow, framework, cadence, rhythm, +contract, gate, gatekeeper, layer, round, review, pass +→ Max 5 occurrences total per post. Vary to the concrete thing happening. + +## Cadence Quotas (per H2 section) +- At least one sentence <9 words AND one >22 words +- No 3 consecutive sentences within 3 words of each other +- One single-sentence paragraph per H2 +- Max 3 sentences / 70 words per paragraph +- No two sentences in same paragraph starting with same first word +- "The..." paragraph openers: <20% of total paragraphs +- "We..." paragraph openers: <15% of total paragraphs + +@see docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md diff --git a/.gemini/commands/blog-pipeline.toml b/.gemini/commands/blog-pipeline.toml new file mode 100644 index 000000000..60750cf6c --- /dev/null +++ b/.gemini/commands/blog-pipeline.toml @@ -0,0 +1 @@ +prompt = "# Blog Post Pipeline — Trigger Prompt\n#\n# Copy this prompt to write the next blog post from the content plan.\n# Full pipeline: docs/workflows/blog-pipeline.md\n#\n# This is a reusable PROMPT — APM compiles it to slash-commands for\n# each AI tool (e.g., /blog-post in Claude, #blog-post in Copilot).\n\nWrite the next blog post following the full pipeline.\n\n## STEP 1 — Pick Topic\nRead the content plan: docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md\nFind the next 🔲 Planned topic. Confirm slug, primary keyword, target publish date.\n\n## STEP 2 — Read Context (mandatory, do not skip)\n- ICP: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md\n- Voice guide: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md\n- Content plan brief: read the topic's brief section\n- Design spec: .stitch/design.md\n\n## STEP 3 — Research\n- Web search for 5+ authoritative sources\n- Check existing posts for duplication: ls content/blog/ | grep -iE \"\"\n- Verify every statistic has a citable source\n\n## STEP 3b — Find Internal Posts to Reference\n- Use claude-context MCP search FIRST\n- For tag/slug lookups: docs/blog-post-index.md\n- Verify each slug: ls content/blog//index.md\n- Collect at least 4 verified slugs before drafting\n\n## STEP 4 — Draft\nCreate content/blog//index.md with:\n- Frontmatter: title ≤45 chars, description 150-160 chars, date, slug, keywords, tags\n- Voice: plain English, empathy first, founder-to-founder tone\n- Structure: punchy hook → keyword in first 100 words → numbered H2s → \"When NOT to\" → JT proof → CTA → related reading → further reading\n- 4+ internal links in body, 5+ external citations\n- Paragraphs ≤3 sentences\n- Cut test: \"what does the reader DO differently?\" — delete if answer is \"nothing new\"\n\n## STEP 5 — Review Loop\nSpawn 3 parallel critic agents:\n1. Founder persona (Alex, burned CEO) — ≥8/10\n2. SEO/slop detector — ≥8/10 humanization\n3. Senior copy editor — \"publish as-is\" or \"minor edits\"\n\n## STEP 5c — Cold-Eyes Gate (mandatory)\nSpawn fresh-context reviewer with 9 explicit checks:\n1. Frontmatter vs body consistency\n2. Fluffy AI narration detection\n3. Fake authority stamps\n4. Timeline fabrication\n5. \"Not X but Y\" patterns\n6. Em dashes → hyphens\n7. Rule-of-three modifiers\n8. Cross-section template repetition\n9. Impersonal fragment stacking\n\n## STEP 6 — Cover Image\n- Read .stitch/design.md (6-slot layout)\n- Duplicate existing HTML from .stitch/designs/\n- Render: chrome-devtools → viewport 2400×1260×2 → screenshot\n- Downsample: magick → 2400×1260 → content/blog//cover.png\n\n## STEP 7 — Validate\n- bin/hugo-build must pass (zero errors)\n- Chrome DevTools: zero console errors, zero 404s, og:image resolves\n\n## STEP 8 — Update Content Plan\n- Change topic status: 🔲 Planned → ✅ Published\n- Add commit SHA + changelog\n\n## STEP 9 — Commit\n- Stage: post directory + cover HTML + content plan update\n- Commit format: feat(content): add post" diff --git a/.gemini/commands/cover-image.toml b/.gemini/commands/cover-image.toml new file mode 100644 index 000000000..54ad707dd --- /dev/null +++ b/.gemini/commands/cover-image.toml @@ -0,0 +1 @@ +prompt = "# Cover Image Generation — Trigger Prompt\n#\n# Reusable prompt for generating blog post cover images via Stitch design system.\n# Full spec: .stitch/design.md (canonical 6-slot layout)\n# Full workflow: docs/workflows/cover-images.md\n\nGenerate a cover image for a blog post.\n\n## Steps\n1. Read .stitch/design.md for the 6-slot layout specification\n2. Duplicate an existing HTML from .stitch/designs/ (e.g., rails-8-1-active-job-continuations-cover.html)\n3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text\n4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot\n5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png\n\n## Design System\n- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7)\n- Font: Inter (headlines), JetBrains Mono (code/metrics)\n- 6-slot grid layout — see .stitch/design.md for exact positioning" diff --git a/.gemini/commands/research.toml b/.gemini/commands/research.toml new file mode 100644 index 000000000..0947dd016 --- /dev/null +++ b/.gemini/commands/research.toml @@ -0,0 +1 @@ +prompt = "# Research Protocol — Trigger Prompt\n#\n# Reusable prompt for research-first development.\n# MANDATORY sequence before any implementation.\n\nResearch this topic before implementing: {TOPIC}\n\n## Research Sequence\n1. **Handbook search**: Search claude-context for existing patterns in /knowledge/ and docs/\n2. **Codebase search**: Search claude-context for similar implementations in this repo\n3. **Framework docs**: context7 for official documentation (Hugo, PostCSS, Ruby, etc.)\n4. **Package analysis**: package-search for dependency research (if using new packages)\n5. **Web search**: brave-search / searxng for current best practices (2025-2026)\n\n## Output Requirements\n- 5+ authoritative sources\n- Existing patterns found (or confirmation of none)\n- Framework documentation citations\n- Dependency evaluation (if applicable)\n- Recommendation with trade-offs\n\n## Anti-Patterns (BLOCKED)\n- Implementation before research\n- Single-source decisions\n- Dependencies installed without package-search verification\n- Slugs guessed without ls content/blog/ verification" diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 000000000..46037b8c2 --- /dev/null +++ b/.gemini/settings.json @@ -0,0 +1,68 @@ +{ + "mcpServers": { + "claude-context": { + "command": "npx", + "args": [ + "-y", + "@anthropic/claude-context" + ] + }, + "context7": { + "command": "npx", + "args": [ + "-y", + "@upstash/context7-mcp" + ] + }, + "brave-search": { + "command": "npx", + "env": { + "BRAVE_API_KEY": "${BRAVE_API_KEY}" + }, + "args": [ + "-y", + "@anthropic/brave-search-mcp" + ] + }, + "lean-ctx": { + "command": "npx", + "args": [ + "-y", + "lean-ctx-mcp" + ] + }, + "chrome-devtools": { + "command": "npx", + "args": [ + "-y", + "@anthropic/chrome-devtools-mcp" + ] + }, + "package-search": { + "command": "npx", + "args": [ + "-y", + "package-search-mcp" + ] + }, + "github-mcp-server": { + "command": "npx", + "env": { + "GITHUB_TOKEN": "${GITHUB_TOKEN}" + }, + "args": [ + "-y", + "@anthropic/github-mcp-server" + ] + }, + "searxng": { + "httpUrl": "http://localhost:8080" + }, + "ollama": { + "httpUrl": "http://localhost:11434" + }, + "milvus": { + "httpUrl": "http://localhost:19530" + } + } +} \ No newline at end of file diff --git a/.github/agents/analyst.agent.md b/.github/agents/analyst.agent.md new file mode 100644 index 000000000..dfa4ca692 --- /dev/null +++ b/.github/agents/analyst.agent.md @@ -0,0 +1,15 @@ +# analyst.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/analyst.md + +## Role +Analysis agent. Performs research, root-cause analysis, and pattern discovery. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md + +## Research Protocol (MANDATORY) +1. claude-context search FIRST +2. Verify with rg/ls +3. Read docs/workflows/BASE_HANDBOOK.md diff --git a/.github/agents/build-monitor.agent.md b/.github/agents/build-monitor.agent.md new file mode 100644 index 000000000..2bb9c0910 --- /dev/null +++ b/.github/agents/build-monitor.agent.md @@ -0,0 +1,18 @@ +# build-monitor.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/build-monitor.md + +## Role +Build monitoring agent. Validates Hugo builds, CI/CD pipelines, and performance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- `bin/hugo-build` must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s +- `bin/rake test:critical` green on every commit + +## CI/CD +- GitHub Actions → GitHub Pages +- Workflows: .github/workflows/publish.yml, test.yml, sync-and-publish.yml diff --git a/.github/agents/coder.agent.md b/.github/agents/coder.agent.md new file mode 100644 index 000000000..7c8b2615e --- /dev/null +++ b/.github/agents/coder.agent.md @@ -0,0 +1,26 @@ +# coder.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/coder.md +# +# APM compiles this agent for all target tools. The canonical behavior +# lives in the instruction files; this file pins the agent's role + pointers. + +## Role +Primary implementation agent. Writes code following TDD cycle (RED → GREEN → REFACTOR). + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## For CSS/HTML work +- @.apm/instructions/css-consolidation.instructions.md + +## For Ruby work +- @docs/workflows/ruby.md + +## Constraints +- Behavior-focused tests ONLY — reject structural/CSS class tests +- Run `bin/rake test:critical` after every micro-change +- Never use `npm` — use `bun` +- Never create ad hoc `*.sh` test scripts diff --git a/.github/agents/content-creator.agent.md b/.github/agents/content-creator.agent.md new file mode 100644 index 000000000..e6c244ca8 --- /dev/null +++ b/.github/agents/content-creator.agent.md @@ -0,0 +1,20 @@ +# content-creator.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/voice-guide.instructions.md +# Full agent definitions: .claude/agents/content-creator.md + +## Role +Content creation agent. Writes blog posts, LinkedIn posts, and marketing copy. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md +- @docs/workflows/blog-pipeline.md +- @docs/workflows/linkedin-post-pipeline.md + +## Constraints +- Zero generic AI language — run slop-detector + humanizer pass +- Cold-eyes gate (9 checks) mandatory before publishing +- Every sentence needs a person doing something +- Banned words: unlock, harness, leverage, dive in, game-changer, etc. +- Use `-` not `—` for all dashes diff --git a/.github/agents/content-marketer.agent.md b/.github/agents/content-marketer.agent.md new file mode 100644 index 000000000..053ecd0a7 --- /dev/null +++ b/.github/agents/content-marketer.agent.md @@ -0,0 +1,10 @@ +# content-marketer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/content-marketer.md + +## Role +Content marketing agent. Plans content calendars, researches topics, audits SEO performance. + +## Instructions +- @.apm/instructions/icp-target.instructions.md +- @docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md diff --git a/.github/agents/hugo-expert.agent.md b/.github/agents/hugo-expert.agent.md new file mode 100644 index 000000000..24fe61525 --- /dev/null +++ b/.github/agents/hugo-expert.agent.md @@ -0,0 +1,25 @@ +# hugo-expert.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/hugo-expert.md + +## Role +Hugo static site generator expert. Handles templates, shortcodes, content structure, and build optimization. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @docs/workflows/css-consolidation.md + +## Key Files +- `config/_default/hugo.toml` — Hugo configuration +- `themes/beaver/layouts/` — Templates +- `themes/beaver/assets/css/` — CSS (PostCSS pipeline) +- `content/` — Content files (Markdown + Hugo frontmatter) + +## Commands +- `bin/hugo-build` — Build + validate +- `hugo server -D` — Dev server + +## Constraints +- Never modify vendor CSS files +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- BEM methodology for all new CSS diff --git a/.github/agents/planner.agent.md b/.github/agents/planner.agent.md new file mode 100644 index 000000000..837cedb13 --- /dev/null +++ b/.github/agents/planner.agent.md @@ -0,0 +1,9 @@ +# planner.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/planner.md + +## Role +Planning agent. Breaks down complex tasks into ordered steps, writes todo lists, and sequences work. + +## Instructions +- @.apm/instructions/project-rules.instructions.md diff --git a/.github/agents/qa-browser-tester.agent.md b/.github/agents/qa-browser-tester.agent.md new file mode 100644 index 000000000..3a18ca639 --- /dev/null +++ b/.github/agents/qa-browser-tester.agent.md @@ -0,0 +1,16 @@ +# qa-browser-tester.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/qa-browser-tester.md + +## Role +QA browser tester. Runs Chrome DevTools validation after HTML/CSS/JS changes. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Console: ZERO JS errors +- Network: ZERO 404s for assets +- Capture desktop + mobile screenshots +- All gates pass → commit diff --git a/.github/agents/researcher.agent.md b/.github/agents/researcher.agent.md new file mode 100644 index 000000000..5d953465d --- /dev/null +++ b/.github/agents/researcher.agent.md @@ -0,0 +1,10 @@ +# researcher.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/researcher.md + +## Role +Research agent. Discovers existing patterns, framework docs, and best practices before implementation. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md diff --git a/.github/agents/reviewer.agent.md b/.github/agents/reviewer.agent.md new file mode 100644 index 000000000..989624346 --- /dev/null +++ b/.github/agents/reviewer.agent.md @@ -0,0 +1,17 @@ +# reviewer.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/reviewer.md + +## Role +Code review agent. Validates correctness, adherence to project rules, and TDD compliance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Zero structural test patterns (CSS class testing, HTML counting) +- Visual regression tolerance verified +- Four-eyes principle enforced for all critical changes +- Feature branch + PR pattern for HTML/CSS/template changes diff --git a/.github/agents/ruby-coder.agent.md b/.github/agents/ruby-coder.agent.md new file mode 100644 index 000000000..510d186df --- /dev/null +++ b/.github/agents/ruby-coder.agent.md @@ -0,0 +1,15 @@ +# ruby-coder.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-coder.md + +## Role +Ruby implementation agent. Writes Ruby code (tests, sync scripts, lib/) following TDD. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md +- @docs/workflows/ruby.md + +## Commands +- `bin/rake test:critical` +- `bundle exec standardrb --fix` diff --git a/.github/agents/ruby-reviewer.agent.md b/.github/agents/ruby-reviewer.agent.md new file mode 100644 index 000000000..bdfcf27b8 --- /dev/null +++ b/.github/agents/ruby-reviewer.agent.md @@ -0,0 +1,14 @@ +# ruby-reviewer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-reviewer.md + +## Role +Ruby code reviewer. Validates Ruby code quality, TDD compliance, and Minitest patterns. + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md + +## Constraints +- Behavior-focused tests ONLY — reject structural testing +- StandardRB compliance +- No ad hoc test scripts diff --git a/.github/agents/screenshot-guardian.agent.md b/.github/agents/screenshot-guardian.agent.md new file mode 100644 index 000000000..f160b3b75 --- /dev/null +++ b/.github/agents/screenshot-guardian.agent.md @@ -0,0 +1,15 @@ +# screenshot-guardian.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/screenshot-guardian.md + +## Role +Visual regression guardian. Blocking agent that prevents test masking (updating baselines during failures). + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md +- @.claude/hooks/pre-commit-screenshot-validation.md + +## Gates +- ZERO tolerance: screenshot updates during visual test failures +- Tolerance: 0.0 for refactors, ≤0.03 for new features +- Both bin/test AND bin/dtest must pass before commit diff --git a/.github/agents/seo-specialist.agent.md b/.github/agents/seo-specialist.agent.md new file mode 100644 index 000000000..328a80718 --- /dev/null +++ b/.github/agents/seo-specialist.agent.md @@ -0,0 +1,21 @@ +# seo-specialist.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/seo-specialist.md + +## Role +SEO optimization agent. Handles keyword research, meta tags, schema, and content optimization. + +## Instructions +- @docs/90-99-content-strategy/seo-optimization/ +- @docs/90-99-content-strategy/strategy-analysis/ + +## Key Files +- `themes/beaver/layouts/partials/seo/enhanced-meta-tags.html` — SEO/og:image template +- `themes/beaver/layouts/partials/seo/article-schema.html` — JSON-LD schema +- `config/_default/hugo.toml` — Hugo config (permalinks, sitemap) + +## Constraints +- Title ≤45 chars, description 150-160 chars +- Primary keyword in first 100 words +- 4+ internal links, 5+ external citations +- No keyword stuffing diff --git a/.github/agents/tester.agent.md b/.github/agents/tester.agent.md new file mode 100644 index 000000000..8bc5f213b --- /dev/null +++ b/.github/agents/tester.agent.md @@ -0,0 +1,25 @@ +# tester.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/tester.md + +## Role +Test agent. Writes and runs tests following TDD methodology. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Framework +- Minitest (test/system/, test/unit/) +- capybara-screenshot-diff for visual regression + +## Commands +- `bin/rake test:critical` — critical tests +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker) + +## Constraints +- Behavior-focused tests ONLY +- Assert shape, not config values +- Run both bin/test AND bin/dtest before commit for HTML/CSS changes diff --git a/.github/agents/tutorial-engineer.agent.md b/.github/agents/tutorial-engineer.agent.md new file mode 100644 index 000000000..14374cb5e --- /dev/null +++ b/.github/agents/tutorial-engineer.agent.md @@ -0,0 +1,10 @@ +# tutorial-engineer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/tutorial-engineer.md + +## Role +Tutorial engineer. Creates step-by-step how-to content, validates code examples, and ensures copy-paste-ability. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md diff --git a/.github/agents/ui-problem-diagnosis.agent.md b/.github/agents/ui-problem-diagnosis.agent.md new file mode 100644 index 000000000..9f88e69ee --- /dev/null +++ b/.github/agents/ui-problem-diagnosis.agent.md @@ -0,0 +1,10 @@ +# ui-problem-diagnosis.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ui-problem-diagnosis-specialist.md + +## Role +UI problem diagnosis specialist. Investigates visual regressions, cross-browser issues, and CSS bugs. + +## Instructions +- @.apm/instructions/css-consolidation.instructions.md +- @docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.github/agents/ux-browser-validator.agent.md b/.github/agents/ux-browser-validator.agent.md new file mode 100644 index 000000000..118ea4ffa --- /dev/null +++ b/.github/agents/ux-browser-validator.agent.md @@ -0,0 +1,14 @@ +# ux-browser-validator.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ux-browser-validator.md + +## Role +UX browser validator. Validates UX interactions, accessibility, and cross-browser behavior. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- WCAG 2.1 AA accessibility compliance +- Semantic HTML elements (h1, button, main, nav) +- Responsive design: desktop + mobile verification diff --git a/.github/instructions/css-consolidation.instructions.md b/.github/instructions/css-consolidation.instructions.md new file mode 100644 index 000000000..0f1faae2d --- /dev/null +++ b/.github/instructions/css-consolidation.instructions.md @@ -0,0 +1,30 @@ +# CSS Consolidation Rules — JetThoughts Site +# +# MANDATORY for all CSS/HTML template changes. +# Full docs: docs/workflows/css-consolidation.md +# Project: docs/projects/2509-css-migration/css-loading-order-analysis.md + +## Architecture +- **Methodology**: BEM (Block__Element--Modifier) +- **Pipeline**: PostCSS (import, mixins, nested, autoprefixer, cssnano, purgecss) +- **Cascade order**: Critical → Layout → Component → Theme → Footer + +## Rules +- Never modify vendor files (`css/vendors/*.min.css`) or dynamic templates (`css/dynamic-*.css`) +- Preserve cascade order in all changes +- Extract whole rule sets; keep page-specific `.fl-node-{hash}` in original files +- Run `bin/rake test:critical` after each extraction + +## FL-Node Extraction (Beaver Builder → BEM) +- **Phase**: TDD RED-GREEN-REFACTOR cycle +- **Validation**: `env PRECOMPILED_ASSETS=false bin/rake test:critical` after each change +- **Pattern**: Add BEM classes first → verify visual fidelity → remove FL-nodes → retest +- **Commit**: micro-commit on green tests only + +## Visual Regression +- Tolerance: 0.0 for refactoring (zero visual changes) +- Tolerance: ≤0.03 for new features only +- Run BOTH `bin/test` and `bin/dtest` before commit +- Visual failures are commit blockers, not warnings + +@see docs/workflows/css-consolidation.md diff --git a/.github/instructions/icp-target.instructions.md b/.github/instructions/icp-target.instructions.md new file mode 100644 index 000000000..e9457d522 --- /dev/null +++ b/.github/instructions/icp-target.instructions.md @@ -0,0 +1,46 @@ +# ICP Target — JetThoughts Primary Website Audience +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before content, design, marketing, or blog work. +# Compiled by APM into every AI tool's context. + +## ICP-E: Non-Technical Founder Burned by a Devshop + +### Who They Are +- 35-50 years old +- Non-technical or semi-technical +- Raised funding ($500K–$2M seed) +- Hired a dev shop or freelancers +- Missed deadlines, buggy product, mounting technical debt +- Starting to question: "Is it me? Is it them? How do I know?" + +### Their Pain +- Can't evaluate code quality themselves +- Dev shop says "almost done" for months +- Every new feature breaks something else +- No tests, no documentation, no deploy pipeline +- Starting to lose investor confidence + +### What They Need +- Someone who speaks plain English, not jargon +- Proof that the problem is real and solvable (specific stories, not vague promises) +- A clear path out: audit → stabilize → build right +- Trust signals: named clients, specific results, honest trade-offs + +### What Resonates +- Stories of other founders in the same situation +- Specific numbers: "$40K wasted," "11-minute outage," "84 support tickets" +- Honest acknowledgment that rescue is hard and expensive +- The idea that good engineering is a competitive advantage +- "You're not crazy — this IS what bad engineering looks like" + +### What Alienates +- jargon-dense technical explanations before establishing trust +- "We're the best" claims without evidence +- Generic consulting language ("partner with you," "drive outcomes") +- Ignoring the emotional reality (shame, frustration, fear of looking stupid) + +@see docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.github/instructions/project-rules.instructions.md b/.github/instructions/project-rules.instructions.md new file mode 100644 index 000000000..deb7313e4 --- /dev/null +++ b/.github/instructions/project-rules.instructions.md @@ -0,0 +1,79 @@ +# JetThoughts Site — Project Rules +# +# This is the SINGLE SOURCE for AI agent instructions across all tools. +# APM compiles this to each tool's expected path (CLAUDE.md, .github/ +# copilot-instructions.md, etc.). Edit here, not in tool-specific files. +# +# CANONICAL SOURCE: THIS FILE. The existing CLAUDE.md is a Claude-specific +# superset; over time CLI tool instructions converge here. Voice, ICP, TDD, +# and CSS rules are split into separate instruction files for modularity. +# +# Full workflow docs: docs/workflows/ +# Full content docs: docs/90-99-content-strategy/ + +## Stack +- **Site**: Hugo 0.147.9 Extended static site generator +- **Theme**: Custom "Beaver" theme (BEM + PostCSS) +- **Tests**: Ruby 3.4, Minitest, Capybara, Selenium WebDriver +- **CSS**: PostCSS pipeline (autoprefixer, cssnano, purgecss) +- **Package managers**: Bun (JS, NOT npm), Bundler (Ruby) +- **CI/CD**: GitHub Actions → GitHub Pages + +## Build & Test Commands +- Build: `bin/hugo-build` +- Test (critical): `bin/rake test:critical` +- Test (visual/macOS): `bin/test` +- Test (visual/Linux Docker): `bin/dtest` +- Lint Ruby: `bundle exec standardrb --fix` + +## Research Protocol (MANDATORY — before any change) +1. Search codebase with `claude-context` MCP FIRST +2. Verify exact filenames with `rg`/`ls` as fallback +3. Read `docs/workflows/BASE_HANDBOOK.md` at session start +4. Read `docs/workflows/flow-router.md` to route to correct workflow +5. For blog content: find existing posts via `docs/blog-post-index.md` +6. Never guess slugs — verify with `ls content/blog//index.md` + +## Non-Negotiables +- **Zero generic AI language** in content — all AI-sounding phrases rejected +- **Zero Hugo build breaks** — `bin/hugo-build` must pass for content changes +- **Zero unsupported claims** — all assertions must have citations +- **No ad hoc test scripts** — use `bin/rake test:critical` and `bin/test` +- **No Python for analysis** — prefer `rg`, `sed`, `awk`, shell tools +- **No duplicate throwaway files** — no `*_refactored.*`, `*_new.*`, `*_backup.*` +- **New docs only under `docs/workflows/`** — else edit existing files +- **Never commit coordinator/verification reports** — write to `/tmp/` instead + +## Content Work (Blog Posts, LinkedIn, Pages) +- **BEFORE writing**: Read voice guide + ICP target (see instructions/voice-guide, instructions/icp-target) +- **Blog posts**: Follow `docs/workflows/blog-pipeline.md` end-to-end +- **LinkedIn**: Follow `docs/workflows/linkedin-post-pipeline.md` +- **Cover images**: Follow `docs/workflows/cover-images.md` + `.stitch/design.md` +- Run slop-detector + humanizer pass on all drafts +- Cold-eyes gate (9 checks) mandatory before publishing + +## CSS / HTML Changes +- **BEM methodology** mandatory for all new CSS +- **FL-node extraction**: TDD cycle — RED → GREEN → REFACTOR → TEST +- **Visual regression tolerance**: 0.0 for refactors, ≤0.03 for new features +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- **Feature branches**: HTML/CSS/template changes → feature branch → one PR per sprint +- Zero tolerance: CSS class existence testing, framework selector usage in tests + +## TDD & Testing +- **Cycle**: RED → GREEN → REFACTOR +- **Framework**: Minitest (test/system/, test/unit/) +- **Behavior-focused tests ONLY** — reject implementation/existence/config tests +- **Avoid fragile config assertions** — assert shape, not tunable values +- **Visual regression**: screenshot comparison, 0.0 tolerance for refactoring +- Run `bin/rake test:critical` after every micro-change (<10 lines) +- Chrome DevTools validation after HTML/CSS/JS changes: zero console errors, zero 404s + +## Behavioral Constraints +- **User says "code is bad" or "over-engineered"**: HALT, 5-Why analysis, fix config, proceed +- **Reflection triggers**: zero-defect tracking, test masking detection +- **Four-eyes principle**: paired agents for all critical changes +- **Direct-to-master only for**: content-only blog edits, commit fixes, docs, CLAUDE.md policy updates + +@see docs/workflows/ for full workflow documentation +@see docs/90-99-content-strategy/ for content strategy diff --git a/.github/instructions/tdd-enforcement.instructions.md b/.github/instructions/tdd-enforcement.instructions.md new file mode 100644 index 000000000..a532cfa19 --- /dev/null +++ b/.github/instructions/tdd-enforcement.instructions.md @@ -0,0 +1,62 @@ +# TDD Enforcement — JetThoughts Site +# +# MANDATORY for all code changes. Extracted from CLAUDE.md TDD section. +# Full docs: docs/60.03-tdd-quality-enforcement.md, docs/60.04-four-eyes-principle.md + +## TDD Cycle +1. **RED**: Write a failing test that validates BEHAVIOR (not implementation) +2. **GREEN**: Minimal code to make the test pass +3. **REFACTOR**: Clean up while tests stay green +4. **COMMIT**: Micro-commit on green tests + +## Test Quality Rules (ZERO TOLERANCE) + +### Prohibited Test Patterns — Agent MUST Reject +- ❌ CSS class existence testing (`.fl-node-*`, `.has_css?(".px-4")`) +- ❌ HTML structure counting (`page.all("div").count`) +- ❌ Framework-generated selector usage (FL-Builder, Tailwind utility classes) +- ❌ Method existence testing (`assert SomeClass.method_defined?`) +- ❌ Config value assertions (hardcoded `q=90`, exact file sizes, specific dimensions) +- ❌ Implementation detail testing + +### Required Test Patterns +- ✅ Visual regression: `take_screenshot` → `assert_visual_match` with tolerance +- ✅ User-visible content: `assert page.has_content?("text")` +- ✅ Semantic elements: `assert page.has_css?("h1", text: "...")` +- ✅ User interaction: `click_button` → `assert_current_path` +- ✅ Shape assertions: `q=\d+`, `src contains wsrv.nl`, not `q=90`, not exact URLs + +### Avoid Fragile Config Assertions +Don't hardcode tunable values. Assert the *shape*, not the configuration: +- Bad: `assert_match /q=90/, src` +- Good: `assert_match /q=\d+/, src` +- Bad: `assert_match /w=360/, src` +- Good: `assert has_css?("picture source")` + +## Visual Regression Gates (BLOCKING for HTML/CSS changes) +- **Tolerance**: 0.0 for refactoring, ≤0.03 for new features +- **Protocol**: Capture baseline BEFORE changes → compare AFTER → block on any diff >0% +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- Visual regression failures are COMMIT BLOCKERS, not warnings + +## Test Runner +- Framework: Minitest +- Critical tests: `bin/rake test:critical` (after every micro-change <10 lines) +- Visual macOS: `bin/test` +- Visual Linux/Docker: `bin/dtest` +- NEVER create ad hoc `*.sh` test scripts + +## Chrome DevTools Validation (MANDATORY after HTML/CSS/JS) +1. Start Hugo dev server, open page in Chrome DevTools +2. Console: ZERO JS errors +3. Network: ZERO 404s +4. Capture desktop + mobile screenshots +5. All gates pass → commit. Any gate fails → fix, repeat + +## Feature Branch + PR (HTML/CSS/template changes) +1. `git checkout -b ` +2. Multiple related commits on branch +3. Both test gates green on each commit +4. `git push -u origin ` +5. ONE PR per sprint via `gh pr create` +6. Direct-to-master only for: content-only blog edits, commit fixes, docs, CLAUDE.md updates diff --git a/.github/instructions/voice-guide.instructions.md b/.github/instructions/voice-guide.instructions.md new file mode 100644 index 000000000..97aeec148 --- /dev/null +++ b/.github/instructions/voice-guide.instructions.md @@ -0,0 +1,68 @@ +# Voice Guide — JetThoughts Content +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before writing ANY blog post, LinkedIn post, or marketing copy. +# Compiled by APM into every AI tool's context. + +## Two Voices + +### Founder Posts (Paul Keen / JT leadership) +- **Rob Walling directness** + **Rand Fishkin vulnerability** +- Plain English, empathy, specific numbers +- Talk to a non-technical founder burned by a devshop +- "Been there" energy — practitioner not vendor +- Trade-offs acknowledged honestly + +### Tech Posts (engineering team) +- **Thoughtbot style**: open with tension, not features +- Own your opinions — no "it depends" hedging +- Code as narrative evidence, not decoration +- Honest trade-offs: what does this solution fail to do? + +## Banned Words +unlock, harness, leverage, dive in, game-changer, journey, seamless, robust, +supercharge, revolutionize, embark, delve, discover, blast radius, suspect list + +## Banned Structural Patterns +- Rule of three (parallel triads) +- Signposting ("This post is about...", "Here's what you need to know") +- Bold inline-header lists +- Triple rhetorical questions +- Slogany parallel closings ("X is A. Y is B.") +- Therapist voice ("That's the hardest part") +- Copula avoidance ("serves as" → use "is") +- Impersonal fragment stacking — every sentence needs a human subject +- Sustained staccato (3+ consecutive short fragments or uniform-length sentences) +- Command structure repetition (3+ paragraphs starting with imperatives) +- Apologetic caveats ("every project is different") +- Telling instead of showing — replace adjectives with concrete mechanics +- Fake authority generalizations ("We've seen this on every codebase") +- Timeline fabrication — verify technology release dates before using "last year" +- Use `-` not `—` for all dashes + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? If subject is a thing, rewrite with a person +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: is ≥90% educational? Is promotion ≤10%? +- **"Trade-off" test**: did I acknowledge what the solution fails to do? +- **"Practitioner" test**: replace generalized scenarios with specific incidents + +## Mannerism Noun Cap +discipline, cycle, pattern, canonical, workflow, framework, cadence, rhythm, +contract, gate, gatekeeper, layer, round, review, pass +→ Max 5 occurrences total per post. Vary to the concrete thing happening. + +## Cadence Quotas (per H2 section) +- At least one sentence <9 words AND one >22 words +- No 3 consecutive sentences within 3 words of each other +- One single-sentence paragraph per H2 +- Max 3 sentences / 70 words per paragraph +- No two sentences in same paragraph starting with same first word +- "The..." paragraph openers: <20% of total paragraphs +- "We..." paragraph openers: <15% of total paragraphs + +@see docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md diff --git a/.github/prompts/blog-pipeline.prompt.md b/.github/prompts/blog-pipeline.prompt.md new file mode 100644 index 000000000..9ad0669b1 --- /dev/null +++ b/.github/prompts/blog-pipeline.prompt.md @@ -0,0 +1,75 @@ +# Blog Post Pipeline — Trigger Prompt +# +# Copy this prompt to write the next blog post from the content plan. +# Full pipeline: docs/workflows/blog-pipeline.md +# +# This is a reusable PROMPT — APM compiles it to slash-commands for +# each AI tool (e.g., /blog-post in Claude, #blog-post in Copilot). + +Write the next blog post following the full pipeline. + +## STEP 1 — Pick Topic +Read the content plan: docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md +Find the next 🔲 Planned topic. Confirm slug, primary keyword, target publish date. + +## STEP 2 — Read Context (mandatory, do not skip) +- ICP: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +- Voice guide: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +- Content plan brief: read the topic's brief section +- Design spec: .stitch/design.md + +## STEP 3 — Research +- Web search for 5+ authoritative sources +- Check existing posts for duplication: ls content/blog/ | grep -iE "" +- Verify every statistic has a citable source + +## STEP 3b — Find Internal Posts to Reference +- Use claude-context MCP search FIRST +- For tag/slug lookups: docs/blog-post-index.md +- Verify each slug: ls content/blog//index.md +- Collect at least 4 verified slugs before drafting + +## STEP 4 — Draft +Create content/blog//index.md with: +- Frontmatter: title ≤45 chars, description 150-160 chars, date, slug, keywords, tags +- Voice: plain English, empathy first, founder-to-founder tone +- Structure: punchy hook → keyword in first 100 words → numbered H2s → "When NOT to" → JT proof → CTA → related reading → further reading +- 4+ internal links in body, 5+ external citations +- Paragraphs ≤3 sentences +- Cut test: "what does the reader DO differently?" — delete if answer is "nothing new" + +## STEP 5 — Review Loop +Spawn 3 parallel critic agents: +1. Founder persona (Alex, burned CEO) — ≥8/10 +2. SEO/slop detector — ≥8/10 humanization +3. Senior copy editor — "publish as-is" or "minor edits" + +## STEP 5c — Cold-Eyes Gate (mandatory) +Spawn fresh-context reviewer with 9 explicit checks: +1. Frontmatter vs body consistency +2. Fluffy AI narration detection +3. Fake authority stamps +4. Timeline fabrication +5. "Not X but Y" patterns +6. Em dashes → hyphens +7. Rule-of-three modifiers +8. Cross-section template repetition +9. Impersonal fragment stacking + +## STEP 6 — Cover Image +- Read .stitch/design.md (6-slot layout) +- Duplicate existing HTML from .stitch/designs/ +- Render: chrome-devtools → viewport 2400×1260×2 → screenshot +- Downsample: magick → 2400×1260 → content/blog//cover.png + +## STEP 7 — Validate +- bin/hugo-build must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s, og:image resolves + +## STEP 8 — Update Content Plan +- Change topic status: 🔲 Planned → ✅ Published +- Add commit SHA + changelog + +## STEP 9 — Commit +- Stage: post directory + cover HTML + content plan update +- Commit format: feat(content): add post diff --git a/.github/prompts/cover-image.prompt.md b/.github/prompts/cover-image.prompt.md new file mode 100644 index 000000000..2f53b5b4b --- /dev/null +++ b/.github/prompts/cover-image.prompt.md @@ -0,0 +1,19 @@ +# Cover Image Generation — Trigger Prompt +# +# Reusable prompt for generating blog post cover images via Stitch design system. +# Full spec: .stitch/design.md (canonical 6-slot layout) +# Full workflow: docs/workflows/cover-images.md + +Generate a cover image for a blog post. + +## Steps +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ (e.g., rails-8-1-active-job-continuations-cover.html) +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — see .stitch/design.md for exact positioning diff --git a/.github/prompts/research.prompt.md b/.github/prompts/research.prompt.md new file mode 100644 index 000000000..76d9c1507 --- /dev/null +++ b/.github/prompts/research.prompt.md @@ -0,0 +1,26 @@ +# Research Protocol — Trigger Prompt +# +# Reusable prompt for research-first development. +# MANDATORY sequence before any implementation. + +Research this topic before implementing: {TOPIC} + +## Research Sequence +1. **Handbook search**: Search claude-context for existing patterns in /knowledge/ and docs/ +2. **Codebase search**: Search claude-context for similar implementations in this repo +3. **Framework docs**: context7 for official documentation (Hugo, PostCSS, Ruby, etc.) +4. **Package analysis**: package-search for dependency research (if using new packages) +5. **Web search**: brave-search / searxng for current best practices (2025-2026) + +## Output Requirements +- 5+ authoritative sources +- Existing patterns found (or confirmation of none) +- Framework documentation citations +- Dependency evaluation (if applicable) +- Recommendation with trade-offs + +## Anti-Patterns (BLOCKED) +- Implementation before research +- Single-source decisions +- Dependencies installed without package-search verification +- Slugs guessed without ls content/blog/ verification diff --git a/.gitignore b/.gitignore index 89d5f897c..8fc5b1277 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,17 @@ hugo.linux !.stitch !.junie !.gitignore +!.apm + +# APM-generated tool configs (committed — like package-lock.json) +!.codex +!.cursor +!.gemini +!.opencode +!.windsurf +!.kiro +!.agents +!.github # SnapDiff runtime *.diff.png @@ -99,16 +110,28 @@ docs/projects/2509-css-migration/50-59-execution/ .cache _workspace .claude/scheduled_tasks.lock -.stitch/designs/ -.stitch/prototypes/ -.stitch/loop-status.md -.stitch/next-prompt.md -.stitch/stitch-mockup.html -.stitch/SITE.md - -# Sprint coordinator/verification reports — working notes only, not project docs. -# User policy 2026-04-30: write to /tmp/ instead, or restore-staged before commit. -docs/projects/**/sprint-*-coordinator-report.md -docs/projects/**/sprint-*-verification-report.md -docs/projects/**/*-coordinator-report.md -docs/projects/**/*-verification-report.md +.stitch/designs/ +.stitch/prototypes/ +.stitch/loop-status.md +.stitch/next-prompt.md +.stitch/stitch-mockup.html +.stitch/SITE.md + +# Sprint coordinator/verification reports — working notes only, not project docs. +# User policy 2026-04-30: write to /tmp/ instead, or restore-staged before commit. +docs/projects/**/sprint-*-coordinator-report.md +docs/projects/**/sprint-*-verification-report.md +docs/projects/**/*-coordinator-report.md +docs/projects/**/*-verification-report.md +.grepai/ + +# APM (Agent Package Manager) +# apm_modules/ is the local cache — like node_modules, do not commit +# apm.lock.yaml IS committed — like package-lock.json, ensures reproducibility +apm_modules/ + +# Docker volumes (compose.mcp.yml) +searxng_data/ +milvus_data/ +etcd_data/ +minio_data/ diff --git a/.junie/AGENTS.md b/.junie/AGENTS.md index e860800d9..b422d1eb9 100644 --- a/.junie/AGENTS.md +++ b/.junie/AGENTS.md @@ -1,21 +1,13 @@ # AGENTS.md — JetThoughts Blog (Junie) +# +# GENERATED BY APM — do not edit directly. +# Source: .apm/instructions/project-rules.instructions.md (manual — Junie not yet an APM target) +# Regenerate: apm install -Canonical instructions live in `CLAUDE.md`. Read that first. -Session start: always read `@docs/workflows/BASE_HANDBOOK.md` and `@docs/workflows/flow-router.md`. +Canonical instructions: `.apm/instructions/project-rules.instructions.md` +Canonical voice guide: `.apm/instructions/voice-guide.instructions.md` +Canonical ICP target: `.apm/instructions/icp-target.instructions.md` -**ICP (MANDATORY for content/design/marketing):** Read `docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md` before any content or design work. Target: non-technical founder burned by a devshop. +Session start: read `docs/workflows/BASE_HANDBOOK.md` and `docs/workflows/flow-router.md`. -**Voice (MANDATORY when writing):** Read `docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md`. Founder posts: Walling+Fishkin. Tech posts: thoughtbot style (tension-first, opinionated, code as evidence). Run stream-specific self-test. - -**Finding posts to reference:** Use claude-context MCP search: `Search the codebase at /Users/pftg/dev/jetthoughts.github.io for: "topic"`. Tag/slug index: `docs/blog-post-index.md`. Verify slugs: `ls content/blog//index.md`. - -Workflow references: -- `docs/workflows/css-consolidation.md` -- `docs/workflows/blog-pipeline.md` -- `docs/workflows/cover-images.md` (canonical spec in `.stitch/design.md`) -- `docs/workflows/commands.md` -- `docs/workflows/agents.md` - -Key commands: -- `bin/hugo-build` -- `bin/rake test:critical` +Key commands: `bin/hugo-build` | `bin/rake test:critical` diff --git a/.kiro/settings/mcp.json b/.kiro/settings/mcp.json new file mode 100644 index 000000000..368800ab2 --- /dev/null +++ b/.kiro/settings/mcp.json @@ -0,0 +1,68 @@ +{ + "mcpServers": { + "claude-context": { + "command": "npx", + "args": [ + "-y", + "@anthropic/claude-context" + ] + }, + "context7": { + "command": "npx", + "args": [ + "-y", + "@upstash/context7-mcp" + ] + }, + "brave-search": { + "command": "npx", + "env": { + "BRAVE_API_KEY": "${BRAVE_API_KEY}" + }, + "args": [ + "-y", + "@anthropic/brave-search-mcp" + ] + }, + "lean-ctx": { + "command": "npx", + "args": [ + "-y", + "lean-ctx-mcp" + ] + }, + "chrome-devtools": { + "command": "npx", + "args": [ + "-y", + "@anthropic/chrome-devtools-mcp" + ] + }, + "package-search": { + "command": "npx", + "args": [ + "-y", + "package-search-mcp" + ] + }, + "github-mcp-server": { + "command": "npx", + "env": { + "GITHUB_TOKEN": "${GITHUB_TOKEN}" + }, + "args": [ + "-y", + "@anthropic/github-mcp-server" + ] + }, + "searxng": { + "url": "http://localhost:8080" + }, + "ollama": { + "url": "http://localhost:11434" + }, + "milvus": { + "url": "http://localhost:19530" + } + } +} \ No newline at end of file diff --git a/.kiro/skills/blog-post-pipeline/SKILL.md b/.kiro/skills/blog-post-pipeline/SKILL.md new file mode 100644 index 000000000..5f2324f46 --- /dev/null +++ b/.kiro/skills/blog-post-pipeline/SKILL.md @@ -0,0 +1,41 @@ +# Blog Post Pipeline Skill +# +# Reusable 9-phase autonomous content pipeline for Hugo-based blogs. +# This is a PRODUCER skill — published by jetthoughts/site for other repos. + +## Overview +End-to-end pipeline from topic selection to published post with automated +quality gates, multi-critic review, and cover image generation. + +## Phases +1. Pick topic from content plan +2. Read context (ICP, voice guide, brief) +3. Research (5+ authoritative sources) +4. Draft with voice enforcement + cadence quotas +5. Review loop (3 parallel critic agents: founder, SEO/slop, editor) +5c. Cold-eyes gate (9 explicit checks) +6. Cover image (6-slot HTML → chrome-devtools render → lanczos downsample) +7. Validate (Hugo build + Chrome DevTools) +8. Update content plan +9. Commit + +## Dependencies +### MCP Servers +- claude-context — semantic codebase search for existing posts +- brave-search / searxng — web research +- chrome-devtools — cover image rendering, validation + +### Other Skills +- content-voice-enforcement — voice guide compliance +- cover-image-generation — 6-slot layout rendering + +### Agents +- content-creator — drafting +- seo-specialist — SEO compliance +- reviewer — quality gates + +## Trigger +@.apm/prompts/blog-pipeline.prompt.md + +## Full Documentation +docs/workflows/blog-pipeline.md diff --git a/.kiro/skills/content-voice-enforcement/SKILL.md b/.kiro/skills/content-voice-enforcement/SKILL.md new file mode 100644 index 000000000..df01df43f --- /dev/null +++ b/.kiro/skills/content-voice-enforcement/SKILL.md @@ -0,0 +1,37 @@ +# Content Voice Enforcement Skill +# +# Reusable voice enforcement for JetThoughts content — blog posts, LinkedIn, +# and marketing copy targeting the ICP-E audience (non-technical founder +# burned by a devshop). + +## Overview +Enforces the JetThoughts voice guide, banned word list, structural patterns, +cadence quotas, and quality tests on all content. + +## Voice Guide +See .apm/instructions/voice-guide.instructions.md for the full compiled extract. +Canonical source: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md + +## Two Voices +- **Founder posts**: Rob Walling directness + Rand Fishkin vulnerability +- **Tech posts**: Thoughtbot style (tension-first, opinionated, code as evidence) + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: ≥90% educational, ≤10% promotional +- **"Trade-off" test**: acknowledged what the solution fails to do? +- **"Practitioner" test**: replace generalizations with specific incidents + +## Slop Detector + Cold-Eyes Gate +- Run slop-detector on all drafts +- Run humanizer pass if flagged +- Cold-eyes gate (9 checks) mandatory before publishing +- See docs/workflows/blog-pipeline.md STEP 5a + STEP 5c + +## Full Documentation +.apm/instructions/voice-guide.instructions.md +.apm/instructions/icp-target.instructions.md +docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.kiro/skills/cover-image-generation/SKILL.md b/.kiro/skills/cover-image-generation/SKILL.md new file mode 100644 index 000000000..a367207dc --- /dev/null +++ b/.kiro/skills/cover-image-generation/SKILL.md @@ -0,0 +1,32 @@ +# Cover Image Generation Skill +# +# Reusable skill for generating blog post cover images using the +# JetVelocity 6-slot design system. + +## Overview +Generates 2400×1260 cover images for blog posts using a 6-slot HTML layout +rendered via chrome-devtools. + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — canonical spec in .stitch/design.md + +## Workflow +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png +6. Set frontmatter: cover_image: cover.png, cover_image_alt: descriptive alt text + +## Dependencies +### MCP +- chrome-devtools — rendering + +### System +- ImageMagick (magick CLI) — downsampling + +## Full Documentation +.stitch/design.md (canonical 6-slot spec) +docs/workflows/cover-images.md diff --git a/.kiro/skills/css-bem-migration/SKILL.md b/.kiro/skills/css-bem-migration/SKILL.md new file mode 100644 index 000000000..9fcd1046f --- /dev/null +++ b/.kiro/skills/css-bem-migration/SKILL.md @@ -0,0 +1,49 @@ +# CSS BEM Migration Skill +# +# Reusable methodology for migrating from FL-Builder (Beaver Builder) +# auto-generated classes to BEM component architecture. + +## Overview +TDD-driven FL-node extraction: add BEM classes → verify visual fidelity → +remove FL-nodes → retest. Micro-commits on every green test. + +## Pattern +1. RED: Identify FL-node CSS dependencies +2. GREEN: Add BEM classes to HTML, consolidate CSS +3. REFACTOR: Remove duplicate FL-node CSS, cleanup +4. TEST: `env PRECOMPILED_ASSETS=false bin/rake test:critical` +5. COMMIT: Micro-commit on green tests + +## BEM Component Structure +```html + +
+ + +
+ + +
+``` + +## CSS Consolidation Pattern +```css +/* Before: 3 separate FL-node selectors */ +.fl-node-yx43bujcaiqn { width: 32%; margin-right: 30px; } +.fl-node-ktz4ipj39vd6 { width: 36%; margin: 0 30px; } +.fl-node-m39uvorzy5g8 { width: 32%; margin-left: 30px; } + +/* After: DRY BEM pattern */ +.c-feature-card { width: 32%; margin-right: 30px; } +.c-feature-card--second { width: 36%; margin: 0 30px; } +.c-feature-card--third { margin-right: 0; } +``` + +## Constraints +- Never modify vendor files or dynamic templates +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- Run BOTH bin/test (macOS) AND bin/dtest (Linux Docker) before commit + +## Full Documentation +docs/workflows/css-consolidation.md +docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.kiro/skills/visual-regression-testing/SKILL.md b/.kiro/skills/visual-regression-testing/SKILL.md new file mode 100644 index 000000000..ff12576f9 --- /dev/null +++ b/.kiro/skills/visual-regression-testing/SKILL.md @@ -0,0 +1,41 @@ +# Visual Regression Testing Skill +# +# Reusable visual regression testing protocol for Hugo static sites. + +## Overview +Screenshot comparison-based visual testing using capybara-screenshot-diff. +Blocks commits on any visual regression during refactoring. + +## Protocol +1. Capture baseline screenshots BEFORE changes +2. Make CSS/HTML changes +3. Capture comparison screenshots AFTER changes +4. Compare with tolerance: + - 0.0 for refactoring (zero visual changes) + - ≤0.03 for new features only +5. Block commit on any difference > tolerance + +## Test Pattern +```ruby +def test_hero_section_visual_consistency + visit "/services/fractional-cto/" + screenshot_path = take_screenshot("fractional_cto_hero") + assert_visual_match(screenshot_path, "baseline/fractional_cto_hero.png", + tolerance: 0.03) +end +``` + +## Prohibited Patterns (ZERO TOLERANCE) +- CSS class existence testing +- HTML structure counting +- Framework-generated selector usage +- Method existence testing + +## Commands +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker, CI parity) +- BOTH must pass before commit for HTML/CSS changes + +## Full Documentation +.apm/instructions/tdd-enforcement.instructions.md +docs/60.03-tdd-quality-enforcement.md diff --git a/.kiro/steering/css-consolidation.md b/.kiro/steering/css-consolidation.md new file mode 100644 index 000000000..15db1b509 --- /dev/null +++ b/.kiro/steering/css-consolidation.md @@ -0,0 +1,34 @@ +--- +inclusion: always +--- + +# CSS Consolidation Rules — JetThoughts Site +# +# MANDATORY for all CSS/HTML template changes. +# Full docs: docs/workflows/css-consolidation.md +# Project: docs/projects/2509-css-migration/css-loading-order-analysis.md + +## Architecture +- **Methodology**: BEM (Block__Element--Modifier) +- **Pipeline**: PostCSS (import, mixins, nested, autoprefixer, cssnano, purgecss) +- **Cascade order**: Critical → Layout → Component → Theme → Footer + +## Rules +- Never modify vendor files (`css/vendors/*.min.css`) or dynamic templates (`css/dynamic-*.css`) +- Preserve cascade order in all changes +- Extract whole rule sets; keep page-specific `.fl-node-{hash}` in original files +- Run `bin/rake test:critical` after each extraction + +## FL-Node Extraction (Beaver Builder → BEM) +- **Phase**: TDD RED-GREEN-REFACTOR cycle +- **Validation**: `env PRECOMPILED_ASSETS=false bin/rake test:critical` after each change +- **Pattern**: Add BEM classes first → verify visual fidelity → remove FL-nodes → retest +- **Commit**: micro-commit on green tests only + +## Visual Regression +- Tolerance: 0.0 for refactoring (zero visual changes) +- Tolerance: ≤0.03 for new features only +- Run BOTH `bin/test` and `bin/dtest` before commit +- Visual failures are commit blockers, not warnings + +@see docs/workflows/css-consolidation.md diff --git a/.kiro/steering/icp-target.md b/.kiro/steering/icp-target.md new file mode 100644 index 000000000..edd88516b --- /dev/null +++ b/.kiro/steering/icp-target.md @@ -0,0 +1,50 @@ +--- +inclusion: always +--- + +# ICP Target — JetThoughts Primary Website Audience +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before content, design, marketing, or blog work. +# Compiled by APM into every AI tool's context. + +## ICP-E: Non-Technical Founder Burned by a Devshop + +### Who They Are +- 35-50 years old +- Non-technical or semi-technical +- Raised funding ($500K–$2M seed) +- Hired a dev shop or freelancers +- Missed deadlines, buggy product, mounting technical debt +- Starting to question: "Is it me? Is it them? How do I know?" + +### Their Pain +- Can't evaluate code quality themselves +- Dev shop says "almost done" for months +- Every new feature breaks something else +- No tests, no documentation, no deploy pipeline +- Starting to lose investor confidence + +### What They Need +- Someone who speaks plain English, not jargon +- Proof that the problem is real and solvable (specific stories, not vague promises) +- A clear path out: audit → stabilize → build right +- Trust signals: named clients, specific results, honest trade-offs + +### What Resonates +- Stories of other founders in the same situation +- Specific numbers: "$40K wasted," "11-minute outage," "84 support tickets" +- Honest acknowledgment that rescue is hard and expensive +- The idea that good engineering is a competitive advantage +- "You're not crazy — this IS what bad engineering looks like" + +### What Alienates +- jargon-dense technical explanations before establishing trust +- "We're the best" claims without evidence +- Generic consulting language ("partner with you," "drive outcomes") +- Ignoring the emotional reality (shame, frustration, fear of looking stupid) + +@see docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.kiro/steering/project-rules.md b/.kiro/steering/project-rules.md new file mode 100644 index 000000000..3fed6b02a --- /dev/null +++ b/.kiro/steering/project-rules.md @@ -0,0 +1,83 @@ +--- +inclusion: always +--- + +# JetThoughts Site — Project Rules +# +# This is the SINGLE SOURCE for AI agent instructions across all tools. +# APM compiles this to each tool's expected path (CLAUDE.md, .github/ +# copilot-instructions.md, etc.). Edit here, not in tool-specific files. +# +# CANONICAL SOURCE: THIS FILE. The existing CLAUDE.md is a Claude-specific +# superset; over time CLI tool instructions converge here. Voice, ICP, TDD, +# and CSS rules are split into separate instruction files for modularity. +# +# Full workflow docs: docs/workflows/ +# Full content docs: docs/90-99-content-strategy/ + +## Stack +- **Site**: Hugo 0.147.9 Extended static site generator +- **Theme**: Custom "Beaver" theme (BEM + PostCSS) +- **Tests**: Ruby 3.4, Minitest, Capybara, Selenium WebDriver +- **CSS**: PostCSS pipeline (autoprefixer, cssnano, purgecss) +- **Package managers**: Bun (JS, NOT npm), Bundler (Ruby) +- **CI/CD**: GitHub Actions → GitHub Pages + +## Build & Test Commands +- Build: `bin/hugo-build` +- Test (critical): `bin/rake test:critical` +- Test (visual/macOS): `bin/test` +- Test (visual/Linux Docker): `bin/dtest` +- Lint Ruby: `bundle exec standardrb --fix` + +## Research Protocol (MANDATORY — before any change) +1. Search codebase with `claude-context` MCP FIRST +2. Verify exact filenames with `rg`/`ls` as fallback +3. Read `docs/workflows/BASE_HANDBOOK.md` at session start +4. Read `docs/workflows/flow-router.md` to route to correct workflow +5. For blog content: find existing posts via `docs/blog-post-index.md` +6. Never guess slugs — verify with `ls content/blog//index.md` + +## Non-Negotiables +- **Zero generic AI language** in content — all AI-sounding phrases rejected +- **Zero Hugo build breaks** — `bin/hugo-build` must pass for content changes +- **Zero unsupported claims** — all assertions must have citations +- **No ad hoc test scripts** — use `bin/rake test:critical` and `bin/test` +- **No Python for analysis** — prefer `rg`, `sed`, `awk`, shell tools +- **No duplicate throwaway files** — no `*_refactored.*`, `*_new.*`, `*_backup.*` +- **New docs only under `docs/workflows/`** — else edit existing files +- **Never commit coordinator/verification reports** — write to `/tmp/` instead + +## Content Work (Blog Posts, LinkedIn, Pages) +- **BEFORE writing**: Read voice guide + ICP target (see instructions/voice-guide, instructions/icp-target) +- **Blog posts**: Follow `docs/workflows/blog-pipeline.md` end-to-end +- **LinkedIn**: Follow `docs/workflows/linkedin-post-pipeline.md` +- **Cover images**: Follow `docs/workflows/cover-images.md` + `.stitch/design.md` +- Run slop-detector + humanizer pass on all drafts +- Cold-eyes gate (9 checks) mandatory before publishing + +## CSS / HTML Changes +- **BEM methodology** mandatory for all new CSS +- **FL-node extraction**: TDD cycle — RED → GREEN → REFACTOR → TEST +- **Visual regression tolerance**: 0.0 for refactors, ≤0.03 for new features +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- **Feature branches**: HTML/CSS/template changes → feature branch → one PR per sprint +- Zero tolerance: CSS class existence testing, framework selector usage in tests + +## TDD & Testing +- **Cycle**: RED → GREEN → REFACTOR +- **Framework**: Minitest (test/system/, test/unit/) +- **Behavior-focused tests ONLY** — reject implementation/existence/config tests +- **Avoid fragile config assertions** — assert shape, not tunable values +- **Visual regression**: screenshot comparison, 0.0 tolerance for refactoring +- Run `bin/rake test:critical` after every micro-change (<10 lines) +- Chrome DevTools validation after HTML/CSS/JS changes: zero console errors, zero 404s + +## Behavioral Constraints +- **User says "code is bad" or "over-engineered"**: HALT, 5-Why analysis, fix config, proceed +- **Reflection triggers**: zero-defect tracking, test masking detection +- **Four-eyes principle**: paired agents for all critical changes +- **Direct-to-master only for**: content-only blog edits, commit fixes, docs, CLAUDE.md policy updates + +@see docs/workflows/ for full workflow documentation +@see docs/90-99-content-strategy/ for content strategy diff --git a/.kiro/steering/tdd-enforcement.md b/.kiro/steering/tdd-enforcement.md new file mode 100644 index 000000000..41f773d2d --- /dev/null +++ b/.kiro/steering/tdd-enforcement.md @@ -0,0 +1,66 @@ +--- +inclusion: always +--- + +# TDD Enforcement — JetThoughts Site +# +# MANDATORY for all code changes. Extracted from CLAUDE.md TDD section. +# Full docs: docs/60.03-tdd-quality-enforcement.md, docs/60.04-four-eyes-principle.md + +## TDD Cycle +1. **RED**: Write a failing test that validates BEHAVIOR (not implementation) +2. **GREEN**: Minimal code to make the test pass +3. **REFACTOR**: Clean up while tests stay green +4. **COMMIT**: Micro-commit on green tests + +## Test Quality Rules (ZERO TOLERANCE) + +### Prohibited Test Patterns — Agent MUST Reject +- ❌ CSS class existence testing (`.fl-node-*`, `.has_css?(".px-4")`) +- ❌ HTML structure counting (`page.all("div").count`) +- ❌ Framework-generated selector usage (FL-Builder, Tailwind utility classes) +- ❌ Method existence testing (`assert SomeClass.method_defined?`) +- ❌ Config value assertions (hardcoded `q=90`, exact file sizes, specific dimensions) +- ❌ Implementation detail testing + +### Required Test Patterns +- ✅ Visual regression: `take_screenshot` → `assert_visual_match` with tolerance +- ✅ User-visible content: `assert page.has_content?("text")` +- ✅ Semantic elements: `assert page.has_css?("h1", text: "...")` +- ✅ User interaction: `click_button` → `assert_current_path` +- ✅ Shape assertions: `q=\d+`, `src contains wsrv.nl`, not `q=90`, not exact URLs + +### Avoid Fragile Config Assertions +Don't hardcode tunable values. Assert the *shape*, not the configuration: +- Bad: `assert_match /q=90/, src` +- Good: `assert_match /q=\d+/, src` +- Bad: `assert_match /w=360/, src` +- Good: `assert has_css?("picture source")` + +## Visual Regression Gates (BLOCKING for HTML/CSS changes) +- **Tolerance**: 0.0 for refactoring, ≤0.03 for new features +- **Protocol**: Capture baseline BEFORE changes → compare AFTER → block on any diff >0% +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- Visual regression failures are COMMIT BLOCKERS, not warnings + +## Test Runner +- Framework: Minitest +- Critical tests: `bin/rake test:critical` (after every micro-change <10 lines) +- Visual macOS: `bin/test` +- Visual Linux/Docker: `bin/dtest` +- NEVER create ad hoc `*.sh` test scripts + +## Chrome DevTools Validation (MANDATORY after HTML/CSS/JS) +1. Start Hugo dev server, open page in Chrome DevTools +2. Console: ZERO JS errors +3. Network: ZERO 404s +4. Capture desktop + mobile screenshots +5. All gates pass → commit. Any gate fails → fix, repeat + +## Feature Branch + PR (HTML/CSS/template changes) +1. `git checkout -b ` +2. Multiple related commits on branch +3. Both test gates green on each commit +4. `git push -u origin ` +5. ONE PR per sprint via `gh pr create` +6. Direct-to-master only for: content-only blog edits, commit fixes, docs, CLAUDE.md updates diff --git a/.kiro/steering/voice-guide.md b/.kiro/steering/voice-guide.md new file mode 100644 index 000000000..d610b703d --- /dev/null +++ b/.kiro/steering/voice-guide.md @@ -0,0 +1,72 @@ +--- +inclusion: always +--- + +# Voice Guide — JetThoughts Content +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before writing ANY blog post, LinkedIn post, or marketing copy. +# Compiled by APM into every AI tool's context. + +## Two Voices + +### Founder Posts (Paul Keen / JT leadership) +- **Rob Walling directness** + **Rand Fishkin vulnerability** +- Plain English, empathy, specific numbers +- Talk to a non-technical founder burned by a devshop +- "Been there" energy — practitioner not vendor +- Trade-offs acknowledged honestly + +### Tech Posts (engineering team) +- **Thoughtbot style**: open with tension, not features +- Own your opinions — no "it depends" hedging +- Code as narrative evidence, not decoration +- Honest trade-offs: what does this solution fail to do? + +## Banned Words +unlock, harness, leverage, dive in, game-changer, journey, seamless, robust, +supercharge, revolutionize, embark, delve, discover, blast radius, suspect list + +## Banned Structural Patterns +- Rule of three (parallel triads) +- Signposting ("This post is about...", "Here's what you need to know") +- Bold inline-header lists +- Triple rhetorical questions +- Slogany parallel closings ("X is A. Y is B.") +- Therapist voice ("That's the hardest part") +- Copula avoidance ("serves as" → use "is") +- Impersonal fragment stacking — every sentence needs a human subject +- Sustained staccato (3+ consecutive short fragments or uniform-length sentences) +- Command structure repetition (3+ paragraphs starting with imperatives) +- Apologetic caveats ("every project is different") +- Telling instead of showing — replace adjectives with concrete mechanics +- Fake authority generalizations ("We've seen this on every codebase") +- Timeline fabrication — verify technology release dates before using "last year" +- Use `-` not `—` for all dashes + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? If subject is a thing, rewrite with a person +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: is ≥90% educational? Is promotion ≤10%? +- **"Trade-off" test**: did I acknowledge what the solution fails to do? +- **"Practitioner" test**: replace generalized scenarios with specific incidents + +## Mannerism Noun Cap +discipline, cycle, pattern, canonical, workflow, framework, cadence, rhythm, +contract, gate, gatekeeper, layer, round, review, pass +→ Max 5 occurrences total per post. Vary to the concrete thing happening. + +## Cadence Quotas (per H2 section) +- At least one sentence <9 words AND one >22 words +- No 3 consecutive sentences within 3 words of each other +- One single-sentence paragraph per H2 +- Max 3 sentences / 70 words per paragraph +- No two sentences in same paragraph starting with same first word +- "The..." paragraph openers: <20% of total paragraphs +- "We..." paragraph openers: <15% of total paragraphs + +@see docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md diff --git a/.opencode/agents/analyst.md b/.opencode/agents/analyst.md new file mode 100644 index 000000000..dfa4ca692 --- /dev/null +++ b/.opencode/agents/analyst.md @@ -0,0 +1,15 @@ +# analyst.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/analyst.md + +## Role +Analysis agent. Performs research, root-cause analysis, and pattern discovery. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md + +## Research Protocol (MANDATORY) +1. claude-context search FIRST +2. Verify with rg/ls +3. Read docs/workflows/BASE_HANDBOOK.md diff --git a/.opencode/agents/build-monitor.md b/.opencode/agents/build-monitor.md new file mode 100644 index 000000000..2bb9c0910 --- /dev/null +++ b/.opencode/agents/build-monitor.md @@ -0,0 +1,18 @@ +# build-monitor.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/build-monitor.md + +## Role +Build monitoring agent. Validates Hugo builds, CI/CD pipelines, and performance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- `bin/hugo-build` must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s +- `bin/rake test:critical` green on every commit + +## CI/CD +- GitHub Actions → GitHub Pages +- Workflows: .github/workflows/publish.yml, test.yml, sync-and-publish.yml diff --git a/.opencode/agents/coder.md b/.opencode/agents/coder.md new file mode 100644 index 000000000..7c8b2615e --- /dev/null +++ b/.opencode/agents/coder.md @@ -0,0 +1,26 @@ +# coder.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/coder.md +# +# APM compiles this agent for all target tools. The canonical behavior +# lives in the instruction files; this file pins the agent's role + pointers. + +## Role +Primary implementation agent. Writes code following TDD cycle (RED → GREEN → REFACTOR). + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## For CSS/HTML work +- @.apm/instructions/css-consolidation.instructions.md + +## For Ruby work +- @docs/workflows/ruby.md + +## Constraints +- Behavior-focused tests ONLY — reject structural/CSS class tests +- Run `bin/rake test:critical` after every micro-change +- Never use `npm` — use `bun` +- Never create ad hoc `*.sh` test scripts diff --git a/.opencode/agents/content-creator.md b/.opencode/agents/content-creator.md new file mode 100644 index 000000000..e6c244ca8 --- /dev/null +++ b/.opencode/agents/content-creator.md @@ -0,0 +1,20 @@ +# content-creator.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/voice-guide.instructions.md +# Full agent definitions: .claude/agents/content-creator.md + +## Role +Content creation agent. Writes blog posts, LinkedIn posts, and marketing copy. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md +- @docs/workflows/blog-pipeline.md +- @docs/workflows/linkedin-post-pipeline.md + +## Constraints +- Zero generic AI language — run slop-detector + humanizer pass +- Cold-eyes gate (9 checks) mandatory before publishing +- Every sentence needs a person doing something +- Banned words: unlock, harness, leverage, dive in, game-changer, etc. +- Use `-` not `—` for all dashes diff --git a/.opencode/agents/content-marketer.md b/.opencode/agents/content-marketer.md new file mode 100644 index 000000000..053ecd0a7 --- /dev/null +++ b/.opencode/agents/content-marketer.md @@ -0,0 +1,10 @@ +# content-marketer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/content-marketer.md + +## Role +Content marketing agent. Plans content calendars, researches topics, audits SEO performance. + +## Instructions +- @.apm/instructions/icp-target.instructions.md +- @docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md diff --git a/.opencode/agents/hugo-expert.md b/.opencode/agents/hugo-expert.md new file mode 100644 index 000000000..24fe61525 --- /dev/null +++ b/.opencode/agents/hugo-expert.md @@ -0,0 +1,25 @@ +# hugo-expert.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/hugo-expert.md + +## Role +Hugo static site generator expert. Handles templates, shortcodes, content structure, and build optimization. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @docs/workflows/css-consolidation.md + +## Key Files +- `config/_default/hugo.toml` — Hugo configuration +- `themes/beaver/layouts/` — Templates +- `themes/beaver/assets/css/` — CSS (PostCSS pipeline) +- `content/` — Content files (Markdown + Hugo frontmatter) + +## Commands +- `bin/hugo-build` — Build + validate +- `hugo server -D` — Dev server + +## Constraints +- Never modify vendor CSS files +- Preserve cascade order: Critical → Layout → Component → Theme → Footer +- BEM methodology for all new CSS diff --git a/.opencode/agents/planner.md b/.opencode/agents/planner.md new file mode 100644 index 000000000..837cedb13 --- /dev/null +++ b/.opencode/agents/planner.md @@ -0,0 +1,9 @@ +# planner.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/planner.md + +## Role +Planning agent. Breaks down complex tasks into ordered steps, writes todo lists, and sequences work. + +## Instructions +- @.apm/instructions/project-rules.instructions.md diff --git a/.opencode/agents/qa-browser-tester.md b/.opencode/agents/qa-browser-tester.md new file mode 100644 index 000000000..3a18ca639 --- /dev/null +++ b/.opencode/agents/qa-browser-tester.md @@ -0,0 +1,16 @@ +# qa-browser-tester.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/qa-browser-tester.md + +## Role +QA browser tester. Runs Chrome DevTools validation after HTML/CSS/JS changes. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Console: ZERO JS errors +- Network: ZERO 404s for assets +- Capture desktop + mobile screenshots +- All gates pass → commit diff --git a/.opencode/agents/researcher.md b/.opencode/agents/researcher.md new file mode 100644 index 000000000..5d953465d --- /dev/null +++ b/.opencode/agents/researcher.md @@ -0,0 +1,10 @@ +# researcher.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/researcher.md + +## Role +Research agent. Discovers existing patterns, framework docs, and best practices before implementation. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/prompts/research.prompt.md diff --git a/.opencode/agents/reviewer.md b/.opencode/agents/reviewer.md new file mode 100644 index 000000000..989624346 --- /dev/null +++ b/.opencode/agents/reviewer.md @@ -0,0 +1,17 @@ +# reviewer.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/reviewer.md + +## Role +Code review agent. Validates correctness, adherence to project rules, and TDD compliance. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Gates +- Zero structural test patterns (CSS class testing, HTML counting) +- Visual regression tolerance verified +- Four-eyes principle enforced for all critical changes +- Feature branch + PR pattern for HTML/CSS/template changes diff --git a/.opencode/agents/ruby-coder.md b/.opencode/agents/ruby-coder.md new file mode 100644 index 000000000..510d186df --- /dev/null +++ b/.opencode/agents/ruby-coder.md @@ -0,0 +1,15 @@ +# ruby-coder.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-coder.md + +## Role +Ruby implementation agent. Writes Ruby code (tests, sync scripts, lib/) following TDD. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md +- @docs/workflows/ruby.md + +## Commands +- `bin/rake test:critical` +- `bundle exec standardrb --fix` diff --git a/.opencode/agents/ruby-reviewer.md b/.opencode/agents/ruby-reviewer.md new file mode 100644 index 000000000..bdfcf27b8 --- /dev/null +++ b/.opencode/agents/ruby-reviewer.md @@ -0,0 +1,14 @@ +# ruby-reviewer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/ruby/ruby-reviewer.md + +## Role +Ruby code reviewer. Validates Ruby code quality, TDD compliance, and Minitest patterns. + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md + +## Constraints +- Behavior-focused tests ONLY — reject structural testing +- StandardRB compliance +- No ad hoc test scripts diff --git a/.opencode/agents/screenshot-guardian.md b/.opencode/agents/screenshot-guardian.md new file mode 100644 index 000000000..f160b3b75 --- /dev/null +++ b/.opencode/agents/screenshot-guardian.md @@ -0,0 +1,15 @@ +# screenshot-guardian.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/core/screenshot-guardian.md + +## Role +Visual regression guardian. Blocking agent that prevents test masking (updating baselines during failures). + +## Instructions +- @.apm/instructions/tdd-enforcement.instructions.md +- @.claude/hooks/pre-commit-screenshot-validation.md + +## Gates +- ZERO tolerance: screenshot updates during visual test failures +- Tolerance: 0.0 for refactors, ≤0.03 for new features +- Both bin/test AND bin/dtest must pass before commit diff --git a/.opencode/agents/seo-specialist.md b/.opencode/agents/seo-specialist.md new file mode 100644 index 000000000..328a80718 --- /dev/null +++ b/.opencode/agents/seo-specialist.md @@ -0,0 +1,21 @@ +# seo-specialist.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/seo-specialist.md + +## Role +SEO optimization agent. Handles keyword research, meta tags, schema, and content optimization. + +## Instructions +- @docs/90-99-content-strategy/seo-optimization/ +- @docs/90-99-content-strategy/strategy-analysis/ + +## Key Files +- `themes/beaver/layouts/partials/seo/enhanced-meta-tags.html` — SEO/og:image template +- `themes/beaver/layouts/partials/seo/article-schema.html` — JSON-LD schema +- `config/_default/hugo.toml` — Hugo config (permalinks, sitemap) + +## Constraints +- Title ≤45 chars, description 150-160 chars +- Primary keyword in first 100 words +- 4+ internal links, 5+ external citations +- No keyword stuffing diff --git a/.opencode/agents/tester.md b/.opencode/agents/tester.md new file mode 100644 index 000000000..8bc5f213b --- /dev/null +++ b/.opencode/agents/tester.md @@ -0,0 +1,25 @@ +# tester.agent.md — Thin Wrapper +# +# Canonical instructions: .apm/instructions/project-rules.instructions.md +# Full agent definitions: .claude/agents/core/tester.md + +## Role +Test agent. Writes and runs tests following TDD methodology. + +## Instructions +- @.apm/instructions/project-rules.instructions.md +- @.apm/instructions/tdd-enforcement.instructions.md + +## Framework +- Minitest (test/system/, test/unit/) +- capybara-screenshot-diff for visual regression + +## Commands +- `bin/rake test:critical` — critical tests +- `bin/test` — visual regression (macOS) +- `bin/dtest` — visual regression (Linux/Docker) + +## Constraints +- Behavior-focused tests ONLY +- Assert shape, not config values +- Run both bin/test AND bin/dtest before commit for HTML/CSS changes diff --git a/.opencode/agents/tutorial-engineer.md b/.opencode/agents/tutorial-engineer.md new file mode 100644 index 000000000..14374cb5e --- /dev/null +++ b/.opencode/agents/tutorial-engineer.md @@ -0,0 +1,10 @@ +# tutorial-engineer.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/content/tutorial-engineer.md + +## Role +Tutorial engineer. Creates step-by-step how-to content, validates code examples, and ensures copy-paste-ability. + +## Instructions +- @.apm/instructions/voice-guide.instructions.md +- @.apm/instructions/icp-target.instructions.md diff --git a/.opencode/agents/ui-problem-diagnosis.md b/.opencode/agents/ui-problem-diagnosis.md new file mode 100644 index 000000000..9f88e69ee --- /dev/null +++ b/.opencode/agents/ui-problem-diagnosis.md @@ -0,0 +1,10 @@ +# ui-problem-diagnosis.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ui-problem-diagnosis-specialist.md + +## Role +UI problem diagnosis specialist. Investigates visual regressions, cross-browser issues, and CSS bugs. + +## Instructions +- @.apm/instructions/css-consolidation.instructions.md +- @docs/projects/2509-css-migration/css-loading-order-analysis.md diff --git a/.opencode/agents/ux-browser-validator.md b/.opencode/agents/ux-browser-validator.md new file mode 100644 index 000000000..118ea4ffa --- /dev/null +++ b/.opencode/agents/ux-browser-validator.md @@ -0,0 +1,14 @@ +# ux-browser-validator.agent.md — Thin Wrapper +# +# Full agent definitions: .claude/agents/validation/ux-browser-validator.md + +## Role +UX browser validator. Validates UX interactions, accessibility, and cross-browser behavior. + +## Instructions +- @.apm/instructions/project-rules.instructions.md + +## Gates +- WCAG 2.1 AA accessibility compliance +- Semantic HTML elements (h1, button, main, nav) +- Responsive design: desktop + mobile verification diff --git a/.opencode/commands/blog-pipeline.md b/.opencode/commands/blog-pipeline.md new file mode 100644 index 000000000..5c9dae536 --- /dev/null +++ b/.opencode/commands/blog-pipeline.md @@ -0,0 +1,79 @@ +--- +{} +--- + +# Blog Post Pipeline — Trigger Prompt +# +# Copy this prompt to write the next blog post from the content plan. +# Full pipeline: docs/workflows/blog-pipeline.md +# +# This is a reusable PROMPT — APM compiles it to slash-commands for +# each AI tool (e.g., /blog-post in Claude, #blog-post in Copilot). + +Write the next blog post following the full pipeline. + +## STEP 1 — Pick Topic +Read the content plan: docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md +Find the next 🔲 Planned topic. Confirm slug, primary keyword, target publish date. + +## STEP 2 — Read Context (mandatory, do not skip) +- ICP: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +- Voice guide: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +- Content plan brief: read the topic's brief section +- Design spec: .stitch/design.md + +## STEP 3 — Research +- Web search for 5+ authoritative sources +- Check existing posts for duplication: ls content/blog/ | grep -iE "" +- Verify every statistic has a citable source + +## STEP 3b — Find Internal Posts to Reference +- Use claude-context MCP search FIRST +- For tag/slug lookups: docs/blog-post-index.md +- Verify each slug: ls content/blog//index.md +- Collect at least 4 verified slugs before drafting + +## STEP 4 — Draft +Create content/blog//index.md with: +- Frontmatter: title ≤45 chars, description 150-160 chars, date, slug, keywords, tags +- Voice: plain English, empathy first, founder-to-founder tone +- Structure: punchy hook → keyword in first 100 words → numbered H2s → "When NOT to" → JT proof → CTA → related reading → further reading +- 4+ internal links in body, 5+ external citations +- Paragraphs ≤3 sentences +- Cut test: "what does the reader DO differently?" — delete if answer is "nothing new" + +## STEP 5 — Review Loop +Spawn 3 parallel critic agents: +1. Founder persona (Alex, burned CEO) — ≥8/10 +2. SEO/slop detector — ≥8/10 humanization +3. Senior copy editor — "publish as-is" or "minor edits" + +## STEP 5c — Cold-Eyes Gate (mandatory) +Spawn fresh-context reviewer with 9 explicit checks: +1. Frontmatter vs body consistency +2. Fluffy AI narration detection +3. Fake authority stamps +4. Timeline fabrication +5. "Not X but Y" patterns +6. Em dashes → hyphens +7. Rule-of-three modifiers +8. Cross-section template repetition +9. Impersonal fragment stacking + +## STEP 6 — Cover Image +- Read .stitch/design.md (6-slot layout) +- Duplicate existing HTML from .stitch/designs/ +- Render: chrome-devtools → viewport 2400×1260×2 → screenshot +- Downsample: magick → 2400×1260 → content/blog//cover.png + +## STEP 7 — Validate +- bin/hugo-build must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s, og:image resolves + +## STEP 8 — Update Content Plan +- Change topic status: 🔲 Planned → ✅ Published +- Add commit SHA + changelog + +## STEP 9 — Commit +- Stage: post directory + cover HTML + content plan update +- Commit format: feat(content): add post \ No newline at end of file diff --git a/.opencode/commands/cover-image.md b/.opencode/commands/cover-image.md new file mode 100644 index 000000000..024cd8573 --- /dev/null +++ b/.opencode/commands/cover-image.md @@ -0,0 +1,23 @@ +--- +{} +--- + +# Cover Image Generation — Trigger Prompt +# +# Reusable prompt for generating blog post cover images via Stitch design system. +# Full spec: .stitch/design.md (canonical 6-slot layout) +# Full workflow: docs/workflows/cover-images.md + +Generate a cover image for a blog post. + +## Steps +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ (e.g., rails-8-1-active-job-continuations-cover.html) +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — see .stitch/design.md for exact positioning \ No newline at end of file diff --git a/.opencode/commands/research.md b/.opencode/commands/research.md new file mode 100644 index 000000000..59101394b --- /dev/null +++ b/.opencode/commands/research.md @@ -0,0 +1,30 @@ +--- +{} +--- + +# Research Protocol — Trigger Prompt +# +# Reusable prompt for research-first development. +# MANDATORY sequence before any implementation. + +Research this topic before implementing: {TOPIC} + +## Research Sequence +1. **Handbook search**: Search claude-context for existing patterns in /knowledge/ and docs/ +2. **Codebase search**: Search claude-context for similar implementations in this repo +3. **Framework docs**: context7 for official documentation (Hugo, PostCSS, Ruby, etc.) +4. **Package analysis**: package-search for dependency research (if using new packages) +5. **Web search**: brave-search / searxng for current best practices (2025-2026) + +## Output Requirements +- 5+ authoritative sources +- Existing patterns found (or confirmation of none) +- Framework documentation citations +- Dependency evaluation (if applicable) +- Recommendation with trade-offs + +## Anti-Patterns (BLOCKED) +- Implementation before research +- Single-source decisions +- Dependencies installed without package-search verification +- Slugs guessed without ls content/blog/ verification \ No newline at end of file diff --git a/.windsurf/rules/css-consolidation.md b/.windsurf/rules/css-consolidation.md new file mode 100644 index 000000000..7094f3c5a --- /dev/null +++ b/.windsurf/rules/css-consolidation.md @@ -0,0 +1,34 @@ +--- +trigger: always_on +--- + +# CSS Consolidation Rules — JetThoughts Site +# +# MANDATORY for all CSS/HTML template changes. +# Full docs: docs/workflows/css-consolidation.md +# Project: docs/projects/2509-css-migration/css-loading-order-analysis.md + +## Architecture +- **Methodology**: BEM (Block__Element--Modifier) +- **Pipeline**: PostCSS (import, mixins, nested, autoprefixer, cssnano, purgecss) +- **Cascade order**: Critical → Layout → Component → Theme → Footer + +## Rules +- Never modify vendor files (`css/vendors/*.min.css`) or dynamic templates (`css/dynamic-*.css`) +- Preserve cascade order in all changes +- Extract whole rule sets; keep page-specific `.fl-node-{hash}` in original files +- Run `bin/rake test:critical` after each extraction + +## FL-Node Extraction (Beaver Builder → BEM) +- **Phase**: TDD RED-GREEN-REFACTOR cycle +- **Validation**: `env PRECOMPILED_ASSETS=false bin/rake test:critical` after each change +- **Pattern**: Add BEM classes first → verify visual fidelity → remove FL-nodes → retest +- **Commit**: micro-commit on green tests only + +## Visual Regression +- Tolerance: 0.0 for refactoring (zero visual changes) +- Tolerance: ≤0.03 for new features only +- Run BOTH `bin/test` and `bin/dtest` before commit +- Visual failures are commit blockers, not warnings + +@see docs/workflows/css-consolidation.md diff --git a/.windsurf/rules/icp-target.md b/.windsurf/rules/icp-target.md new file mode 100644 index 000000000..a97ceb21e --- /dev/null +++ b/.windsurf/rules/icp-target.md @@ -0,0 +1,50 @@ +--- +trigger: always_on +--- + +# ICP Target — JetThoughts Primary Website Audience +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before content, design, marketing, or blog work. +# Compiled by APM into every AI tool's context. + +## ICP-E: Non-Technical Founder Burned by a Devshop + +### Who They Are +- 35-50 years old +- Non-technical or semi-technical +- Raised funding ($500K–$2M seed) +- Hired a dev shop or freelancers +- Missed deadlines, buggy product, mounting technical debt +- Starting to question: "Is it me? Is it them? How do I know?" + +### Their Pain +- Can't evaluate code quality themselves +- Dev shop says "almost done" for months +- Every new feature breaks something else +- No tests, no documentation, no deploy pipeline +- Starting to lose investor confidence + +### What They Need +- Someone who speaks plain English, not jargon +- Proof that the problem is real and solvable (specific stories, not vague promises) +- A clear path out: audit → stabilize → build right +- Trust signals: named clients, specific results, honest trade-offs + +### What Resonates +- Stories of other founders in the same situation +- Specific numbers: "$40K wasted," "11-minute outage," "84 support tickets" +- Honest acknowledgment that rescue is hard and expensive +- The idea that good engineering is a competitive advantage +- "You're not crazy — this IS what bad engineering looks like" + +### What Alienates +- jargon-dense technical explanations before establishing trust +- "We're the best" claims without evidence +- Generic consulting language ("partner with you," "drive outcomes") +- Ignoring the emotional reality (shame, frustration, fear of looking stupid) + +@see docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md diff --git a/.windsurf/rules/project-rules.md b/.windsurf/rules/project-rules.md new file mode 100644 index 000000000..e64f154fe --- /dev/null +++ b/.windsurf/rules/project-rules.md @@ -0,0 +1,83 @@ +--- +trigger: always_on +--- + +# JetThoughts Site — Project Rules +# +# This is the SINGLE SOURCE for AI agent instructions across all tools. +# APM compiles this to each tool's expected path (CLAUDE.md, .github/ +# copilot-instructions.md, etc.). Edit here, not in tool-specific files. +# +# CANONICAL SOURCE: THIS FILE. The existing CLAUDE.md is a Claude-specific +# superset; over time CLI tool instructions converge here. Voice, ICP, TDD, +# and CSS rules are split into separate instruction files for modularity. +# +# Full workflow docs: docs/workflows/ +# Full content docs: docs/90-99-content-strategy/ + +## Stack +- **Site**: Hugo 0.147.9 Extended static site generator +- **Theme**: Custom "Beaver" theme (BEM + PostCSS) +- **Tests**: Ruby 3.4, Minitest, Capybara, Selenium WebDriver +- **CSS**: PostCSS pipeline (autoprefixer, cssnano, purgecss) +- **Package managers**: Bun (JS, NOT npm), Bundler (Ruby) +- **CI/CD**: GitHub Actions → GitHub Pages + +## Build & Test Commands +- Build: `bin/hugo-build` +- Test (critical): `bin/rake test:critical` +- Test (visual/macOS): `bin/test` +- Test (visual/Linux Docker): `bin/dtest` +- Lint Ruby: `bundle exec standardrb --fix` + +## Research Protocol (MANDATORY — before any change) +1. Search codebase with `claude-context` MCP FIRST +2. Verify exact filenames with `rg`/`ls` as fallback +3. Read `docs/workflows/BASE_HANDBOOK.md` at session start +4. Read `docs/workflows/flow-router.md` to route to correct workflow +5. For blog content: find existing posts via `docs/blog-post-index.md` +6. Never guess slugs — verify with `ls content/blog//index.md` + +## Non-Negotiables +- **Zero generic AI language** in content — all AI-sounding phrases rejected +- **Zero Hugo build breaks** — `bin/hugo-build` must pass for content changes +- **Zero unsupported claims** — all assertions must have citations +- **No ad hoc test scripts** — use `bin/rake test:critical` and `bin/test` +- **No Python for analysis** — prefer `rg`, `sed`, `awk`, shell tools +- **No duplicate throwaway files** — no `*_refactored.*`, `*_new.*`, `*_backup.*` +- **New docs only under `docs/workflows/`** — else edit existing files +- **Never commit coordinator/verification reports** — write to `/tmp/` instead + +## Content Work (Blog Posts, LinkedIn, Pages) +- **BEFORE writing**: Read voice guide + ICP target (see instructions/voice-guide, instructions/icp-target) +- **Blog posts**: Follow `docs/workflows/blog-pipeline.md` end-to-end +- **LinkedIn**: Follow `docs/workflows/linkedin-post-pipeline.md` +- **Cover images**: Follow `docs/workflows/cover-images.md` + `.stitch/design.md` +- Run slop-detector + humanizer pass on all drafts +- Cold-eyes gate (9 checks) mandatory before publishing + +## CSS / HTML Changes +- **BEM methodology** mandatory for all new CSS +- **FL-node extraction**: TDD cycle — RED → GREEN → REFACTOR → TEST +- **Visual regression tolerance**: 0.0 for refactors, ≤0.03 for new features +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- **Feature branches**: HTML/CSS/template changes → feature branch → one PR per sprint +- Zero tolerance: CSS class existence testing, framework selector usage in tests + +## TDD & Testing +- **Cycle**: RED → GREEN → REFACTOR +- **Framework**: Minitest (test/system/, test/unit/) +- **Behavior-focused tests ONLY** — reject implementation/existence/config tests +- **Avoid fragile config assertions** — assert shape, not tunable values +- **Visual regression**: screenshot comparison, 0.0 tolerance for refactoring +- Run `bin/rake test:critical` after every micro-change (<10 lines) +- Chrome DevTools validation after HTML/CSS/JS changes: zero console errors, zero 404s + +## Behavioral Constraints +- **User says "code is bad" or "over-engineered"**: HALT, 5-Why analysis, fix config, proceed +- **Reflection triggers**: zero-defect tracking, test masking detection +- **Four-eyes principle**: paired agents for all critical changes +- **Direct-to-master only for**: content-only blog edits, commit fixes, docs, CLAUDE.md policy updates + +@see docs/workflows/ for full workflow documentation +@see docs/90-99-content-strategy/ for content strategy diff --git a/.windsurf/rules/tdd-enforcement.md b/.windsurf/rules/tdd-enforcement.md new file mode 100644 index 000000000..0be2a001a --- /dev/null +++ b/.windsurf/rules/tdd-enforcement.md @@ -0,0 +1,66 @@ +--- +trigger: always_on +--- + +# TDD Enforcement — JetThoughts Site +# +# MANDATORY for all code changes. Extracted from CLAUDE.md TDD section. +# Full docs: docs/60.03-tdd-quality-enforcement.md, docs/60.04-four-eyes-principle.md + +## TDD Cycle +1. **RED**: Write a failing test that validates BEHAVIOR (not implementation) +2. **GREEN**: Minimal code to make the test pass +3. **REFACTOR**: Clean up while tests stay green +4. **COMMIT**: Micro-commit on green tests + +## Test Quality Rules (ZERO TOLERANCE) + +### Prohibited Test Patterns — Agent MUST Reject +- ❌ CSS class existence testing (`.fl-node-*`, `.has_css?(".px-4")`) +- ❌ HTML structure counting (`page.all("div").count`) +- ❌ Framework-generated selector usage (FL-Builder, Tailwind utility classes) +- ❌ Method existence testing (`assert SomeClass.method_defined?`) +- ❌ Config value assertions (hardcoded `q=90`, exact file sizes, specific dimensions) +- ❌ Implementation detail testing + +### Required Test Patterns +- ✅ Visual regression: `take_screenshot` → `assert_visual_match` with tolerance +- ✅ User-visible content: `assert page.has_content?("text")` +- ✅ Semantic elements: `assert page.has_css?("h1", text: "...")` +- ✅ User interaction: `click_button` → `assert_current_path` +- ✅ Shape assertions: `q=\d+`, `src contains wsrv.nl`, not `q=90`, not exact URLs + +### Avoid Fragile Config Assertions +Don't hardcode tunable values. Assert the *shape*, not the configuration: +- Bad: `assert_match /q=90/, src` +- Good: `assert_match /q=\d+/, src` +- Bad: `assert_match /w=360/, src` +- Good: `assert has_css?("picture source")` + +## Visual Regression Gates (BLOCKING for HTML/CSS changes) +- **Tolerance**: 0.0 for refactoring, ≤0.03 for new features +- **Protocol**: Capture baseline BEFORE changes → compare AFTER → block on any diff >0% +- **MANDATORY**: Run BOTH `bin/test` (macOS) AND `bin/dtest` (Linux Docker) before commit +- Visual regression failures are COMMIT BLOCKERS, not warnings + +## Test Runner +- Framework: Minitest +- Critical tests: `bin/rake test:critical` (after every micro-change <10 lines) +- Visual macOS: `bin/test` +- Visual Linux/Docker: `bin/dtest` +- NEVER create ad hoc `*.sh` test scripts + +## Chrome DevTools Validation (MANDATORY after HTML/CSS/JS) +1. Start Hugo dev server, open page in Chrome DevTools +2. Console: ZERO JS errors +3. Network: ZERO 404s +4. Capture desktop + mobile screenshots +5. All gates pass → commit. Any gate fails → fix, repeat + +## Feature Branch + PR (HTML/CSS/template changes) +1. `git checkout -b ` +2. Multiple related commits on branch +3. Both test gates green on each commit +4. `git push -u origin ` +5. ONE PR per sprint via `gh pr create` +6. Direct-to-master only for: content-only blog edits, commit fixes, docs, CLAUDE.md updates diff --git a/.windsurf/rules/voice-guide.md b/.windsurf/rules/voice-guide.md new file mode 100644 index 000000000..ed72a3fac --- /dev/null +++ b/.windsurf/rules/voice-guide.md @@ -0,0 +1,72 @@ +--- +trigger: always_on +--- + +# Voice Guide — JetThoughts Content +# +# CANONICAL SOURCE: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +# This file is a COMPILED EXTRACT for APM — the full doc is authoritative. +# Update the canonical source first, then sync this extract. +# +# MANDATORY reading before writing ANY blog post, LinkedIn post, or marketing copy. +# Compiled by APM into every AI tool's context. + +## Two Voices + +### Founder Posts (Paul Keen / JT leadership) +- **Rob Walling directness** + **Rand Fishkin vulnerability** +- Plain English, empathy, specific numbers +- Talk to a non-technical founder burned by a devshop +- "Been there" energy — practitioner not vendor +- Trade-offs acknowledged honestly + +### Tech Posts (engineering team) +- **Thoughtbot style**: open with tension, not features +- Own your opinions — no "it depends" hedging +- Code as narrative evidence, not decoration +- Honest trade-offs: what does this solution fail to do? + +## Banned Words +unlock, harness, leverage, dive in, game-changer, journey, seamless, robust, +supercharge, revolutionize, embark, delve, discover, blast radius, suspect list + +## Banned Structural Patterns +- Rule of three (parallel triads) +- Signposting ("This post is about...", "Here's what you need to know") +- Bold inline-header lists +- Triple rhetorical questions +- Slogany parallel closings ("X is A. Y is B.") +- Therapist voice ("That's the hardest part") +- Copula avoidance ("serves as" → use "is") +- Impersonal fragment stacking — every sentence needs a human subject +- Sustained staccato (3+ consecutive short fragments or uniform-length sentences) +- Command structure repetition (3+ paragraphs starting with imperatives) +- Apologetic caveats ("every project is different") +- Telling instead of showing — replace adjectives with concrete mechanics +- Fake authority generalizations ("We've seen this on every codebase") +- Timeline fabrication — verify technology release dates before using "last year" +- Use `-` not `—` for all dashes + +## Quality Tests (run on every paragraph) +- **"Who" test**: who is doing what? If subject is a thing, rewrite with a person +- **"Show" test**: did I show the mechanic or just label it? +- **"Coffee" test**: would a tired founder talk like this at a bar? +- **"90/10" test**: is ≥90% educational? Is promotion ≤10%? +- **"Trade-off" test**: did I acknowledge what the solution fails to do? +- **"Practitioner" test**: replace generalized scenarios with specific incidents + +## Mannerism Noun Cap +discipline, cycle, pattern, canonical, workflow, framework, cadence, rhythm, +contract, gate, gatekeeper, layer, round, review, pass +→ Max 5 occurrences total per post. Vary to the concrete thing happening. + +## Cadence Quotas (per H2 section) +- At least one sentence <9 words AND one >22 words +- No 3 consecutive sentences within 3 words of each other +- One single-sentence paragraph per H2 +- Max 3 sentences / 70 words per paragraph +- No two sentences in same paragraph starting with same first word +- "The..." paragraph openers: <20% of total paragraphs +- "We..." paragraph openers: <15% of total paragraphs + +@see docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md diff --git a/.windsurf/workflows/blog-pipeline.md b/.windsurf/workflows/blog-pipeline.md new file mode 100644 index 000000000..5c9dae536 --- /dev/null +++ b/.windsurf/workflows/blog-pipeline.md @@ -0,0 +1,79 @@ +--- +{} +--- + +# Blog Post Pipeline — Trigger Prompt +# +# Copy this prompt to write the next blog post from the content plan. +# Full pipeline: docs/workflows/blog-pipeline.md +# +# This is a reusable PROMPT — APM compiles it to slash-commands for +# each AI tool (e.g., /blog-post in Claude, #blog-post in Copilot). + +Write the next blog post following the full pipeline. + +## STEP 1 — Pick Topic +Read the content plan: docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md +Find the next 🔲 Planned topic. Confirm slug, primary keyword, target publish date. + +## STEP 2 — Read Context (mandatory, do not skip) +- ICP: docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md +- Voice guide: docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md +- Content plan brief: read the topic's brief section +- Design spec: .stitch/design.md + +## STEP 3 — Research +- Web search for 5+ authoritative sources +- Check existing posts for duplication: ls content/blog/ | grep -iE "" +- Verify every statistic has a citable source + +## STEP 3b — Find Internal Posts to Reference +- Use claude-context MCP search FIRST +- For tag/slug lookups: docs/blog-post-index.md +- Verify each slug: ls content/blog//index.md +- Collect at least 4 verified slugs before drafting + +## STEP 4 — Draft +Create content/blog//index.md with: +- Frontmatter: title ≤45 chars, description 150-160 chars, date, slug, keywords, tags +- Voice: plain English, empathy first, founder-to-founder tone +- Structure: punchy hook → keyword in first 100 words → numbered H2s → "When NOT to" → JT proof → CTA → related reading → further reading +- 4+ internal links in body, 5+ external citations +- Paragraphs ≤3 sentences +- Cut test: "what does the reader DO differently?" — delete if answer is "nothing new" + +## STEP 5 — Review Loop +Spawn 3 parallel critic agents: +1. Founder persona (Alex, burned CEO) — ≥8/10 +2. SEO/slop detector — ≥8/10 humanization +3. Senior copy editor — "publish as-is" or "minor edits" + +## STEP 5c — Cold-Eyes Gate (mandatory) +Spawn fresh-context reviewer with 9 explicit checks: +1. Frontmatter vs body consistency +2. Fluffy AI narration detection +3. Fake authority stamps +4. Timeline fabrication +5. "Not X but Y" patterns +6. Em dashes → hyphens +7. Rule-of-three modifiers +8. Cross-section template repetition +9. Impersonal fragment stacking + +## STEP 6 — Cover Image +- Read .stitch/design.md (6-slot layout) +- Duplicate existing HTML from .stitch/designs/ +- Render: chrome-devtools → viewport 2400×1260×2 → screenshot +- Downsample: magick → 2400×1260 → content/blog//cover.png + +## STEP 7 — Validate +- bin/hugo-build must pass (zero errors) +- Chrome DevTools: zero console errors, zero 404s, og:image resolves + +## STEP 8 — Update Content Plan +- Change topic status: 🔲 Planned → ✅ Published +- Add commit SHA + changelog + +## STEP 9 — Commit +- Stage: post directory + cover HTML + content plan update +- Commit format: feat(content): add post \ No newline at end of file diff --git a/.windsurf/workflows/cover-image.md b/.windsurf/workflows/cover-image.md new file mode 100644 index 000000000..024cd8573 --- /dev/null +++ b/.windsurf/workflows/cover-image.md @@ -0,0 +1,23 @@ +--- +{} +--- + +# Cover Image Generation — Trigger Prompt +# +# Reusable prompt for generating blog post cover images via Stitch design system. +# Full spec: .stitch/design.md (canonical 6-slot layout) +# Full workflow: docs/workflows/cover-images.md + +Generate a cover image for a blog post. + +## Steps +1. Read .stitch/design.md for the 6-slot layout specification +2. Duplicate an existing HTML from .stitch/designs/ (e.g., rails-8-1-active-job-continuations-cover.html) +3. Change ONLY: title, category, pill, 3 headline lines, 3 chip labels+values, status text +4. Render: chrome-devtools new_page → emulate viewport=2400x1260x2 → wait 2s → take_screenshot +5. Downsample: magick {screenshot} -filter Lanczos -resize 2400x1260 -sampling-factor 4:4:4 -strip -quality 95 content/blog//cover.png + +## Design System +- JetVelocity: obsidian dark, Ruby red (#cc342d), neon purple (#a855f7) +- Font: Inter (headlines), JetBrains Mono (code/metrics) +- 6-slot grid layout — see .stitch/design.md for exact positioning \ No newline at end of file diff --git a/.windsurf/workflows/research.md b/.windsurf/workflows/research.md new file mode 100644 index 000000000..59101394b --- /dev/null +++ b/.windsurf/workflows/research.md @@ -0,0 +1,30 @@ +--- +{} +--- + +# Research Protocol — Trigger Prompt +# +# Reusable prompt for research-first development. +# MANDATORY sequence before any implementation. + +Research this topic before implementing: {TOPIC} + +## Research Sequence +1. **Handbook search**: Search claude-context for existing patterns in /knowledge/ and docs/ +2. **Codebase search**: Search claude-context for similar implementations in this repo +3. **Framework docs**: context7 for official documentation (Hugo, PostCSS, Ruby, etc.) +4. **Package analysis**: package-search for dependency research (if using new packages) +5. **Web search**: brave-search / searxng for current best practices (2025-2026) + +## Output Requirements +- 5+ authoritative sources +- Existing patterns found (or confirmation of none) +- Framework documentation citations +- Dependency evaluation (if applicable) +- Recommendation with trade-offs + +## Anti-Patterns (BLOCKED) +- Implementation before research +- Single-source decisions +- Dependencies installed without package-search verification +- Slugs guessed without ls content/blog/ verification \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 89de46797..d6d13dffc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,27 +1,16 @@ # AGENTS.md — JetThoughts Blog +# +# GENERATED BY APM — do not edit directly. +# Source: .apm/instructions/project-rules.instructions.md (manual — no APM target for AGENTS.md) +# Regenerate: apm install -Canonical instructions live in `CLAUDE.md`. Read that first. -Session start: always read `@docs/workflows/BASE_HANDBOOK.md` and `@docs/workflows/flow-router.md`. +Canonical instructions: `.apm/instructions/project-rules.instructions.md` +Canonical voice guide: `.apm/instructions/voice-guide.instructions.md` +Canonical ICP target: `.apm/instructions/icp-target.instructions.md` -**ICP (MANDATORY for content/design/marketing work):** Read `docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md` before writing blog posts, designing pages, planning content, or creating marketing materials. Target audience: non-technical founder burned by a devshop. +Session start: read `docs/workflows/BASE_HANDBOOK.md` and `docs/workflows/flow-router.md`. -**Voice (MANDATORY when writing):** Read `docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md`. -- **Founder posts**: Rob Walling directness + Rand Fishkin vulnerability. Plain English, empathy, specific numbers. -- **Tech posts**: Thoughtbot style. Open with tension not features. Own opinions. Code as narrative evidence. Honest tradeoffs. -- Run the stream-specific self-test checklist before publishing. - -**Finding posts to reference (MANDATORY when writing blog posts):** Use claude-context MCP search first: `Search the codebase at /Users/pftg/dev/jetthoughts.github.io for: "topic keywords"`. For tag/slug lookups see `docs/blog-post-index.md`. Never guess slugs — verify with `ls content/blog//index.md`. - -Workflow references: -- `docs/workflows/css-consolidation.md` -- `docs/workflows/blog-pipeline.md` -- `docs/workflows/cover-images.md` (canonical spec in `.stitch/design.md`) -- `docs/workflows/commands.md` -- `docs/workflows/agents.md` - -Key commands: -- `bin/hugo-build` -- `bin/rake test:critical` +Key commands: `bin/hugo-build` | `bin/rake test:critical` OUTPUT STYLE: expert-terse diff --git a/Brewfile b/Brewfile index 91244919d..eca2a1588 100644 --- a/Brewfile +++ b/Brewfile @@ -4,3 +4,6 @@ brew "bun", link: true, force: true brew "hugo" brew "rbenv" brew "ruby-build" + +# MCP infrastructure +brew "ollama", restart_service: true diff --git a/GEMINI.md b/GEMINI.md index efaf014bd..443d4375e 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -1,21 +1,13 @@ # GEMINI.md — JetThoughts Blog +# +# GENERATED BY APM — do not edit directly. +# Source: apm.yml → targets.gemini → .apm/instructions/project-rules.instructions.md +# Regenerate: apm install -Canonical instructions live in `CLAUDE.md`. Read that first. -Session start: always read `@docs/workflows/BASE_HANDBOOK.md` and `@docs/workflows/flow-router.md`. +Canonical instructions: `.apm/instructions/project-rules.instructions.md` +Canonical voice guide: `.apm/instructions/voice-guide.instructions.md` +Canonical ICP target: `.apm/instructions/icp-target.instructions.md` -**ICP (MANDATORY for content/design/marketing):** Read `docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md` before any content or design work. Target: non-technical founder burned by a devshop. +Session start: read `docs/workflows/BASE_HANDBOOK.md` and `docs/workflows/flow-router.md`. -**Voice (MANDATORY when writing):** Read `docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md`. Founder posts: Walling+Fishkin. Tech posts: thoughtbot style (tension-first, opinionated, code as evidence). Run stream-specific self-test. - -**Finding posts to reference:** Use claude-context MCP search: `Search the codebase at /Users/pftg/dev/jetthoughts.github.io for: "topic"`. Tag/slug index: `docs/blog-post-index.md`. Verify slugs: `ls content/blog//index.md`. - -Workflow references: -- `docs/workflows/css-consolidation.md` -- `docs/workflows/blog-pipeline.md` -- `docs/workflows/cover-images.md` (canonical spec in `.stitch/design.md`) -- `docs/workflows/commands.md` -- `docs/workflows/agents.md` - -Key commands: -- `bin/hugo-build` -- `bin/rake test:critical` +Key commands: `bin/hugo-build` | `bin/rake test:critical` diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..2713bb30c --- /dev/null +++ b/Makefile @@ -0,0 +1,52 @@ +# Makefile — JetThoughts Site +# +# APM declares MCP dependencies in apm.yml (what agents need). +# This Makefile RUNS the persistent backends via docker compose + brew. +# Stdio-based MCPs are auto-started by the AI tool — no target needed. +# +# Quick start: +# apm install # Install agent primitives (instructions, agents, prompts) +# make mcp-up # Start persistent MCP backends +# make mcp-status # Verify everything is running +# code . # Open in Claude/Copilot/Cursor/etc. + +.PHONY: mcp-up mcp-down mcp-status help + +help: + @echo "JetThoughts Site — Development Commands" + @echo "" + @echo " make mcp-up Start all MCP backends (ollama + docker compose)" + @echo " make mcp-down Stop Docker-based backends" + @echo " make mcp-status Health check all MCP backends" + @echo "" + @echo "Docker services defined in compose.mcp.yml" + @echo "Ollama managed via brew services" + @echo "MCP servers declared in apm.yml → dependencies.mcp" + +mcp-up: + @echo "==> Starting MCP backends..." + @echo "" + # Ollama — local LLM/embeddings via Homebrew + @brew services start ollama 2>/dev/null && echo " ✓ ollama started" || echo " ! ollama not installed — run: brew install ollama" + @echo "" + # Docker-based MCP services (searxng, milvus, etcd, minio) + @docker compose -f compose.mcp.yml up -d + @echo "" + @$(MAKE) mcp-status + +mcp-down: + @echo "==> Stopping MCP backends..." + @docker compose -f compose.mcp.yml down + @echo " ollama: left running (brew services stop ollama to stop)" + @echo "==> MCP backends stopped" + +mcp-status: + @echo "==> MCP Backend Status" + @echo "" + @printf " %-14s " "ollama :11434"; \ + curl -s -o /dev/null -w "%{http_code}" http://localhost:11434/api/tags 2>/dev/null | grep -q 200 && echo "✓ running" || echo "✗ down" + @printf " %-14s " "searxng :8080"; \ + curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/healthz 2>/dev/null | grep -q 200 && echo "✓ running" || echo "✗ down" + @printf " %-14s " "milvus :19530"; \ + curl -s -o /dev/null -w "%{http_code}" http://localhost:19530/health 2>/dev/null | grep -q 200 && echo "✓ running" || echo "✗ down" + @echo "" diff --git a/QWEN.md b/QWEN.md index 10b0eb6d4..05bf21c8f 100644 --- a/QWEN.md +++ b/QWEN.md @@ -1,24 +1,14 @@ # QWEN.md — JetThoughts Blog +# +# GENERATED BY APM — do not edit directly. +# Source: .apm/instructions/project-rules.instructions.md (manual — Qwen Code not yet an APM target) +# Regenerate: apm install -Canonical instructions live in `CLAUDE.md`. Read that first. +Canonical instructions: `.apm/instructions/project-rules.instructions.md` +Canonical voice guide: `.apm/instructions/voice-guide.instructions.md` +Canonical ICP target: `.apm/instructions/icp-target.instructions.md` -Session start: always read `@docs/workflows/BASE_HANDBOOK.md` and `@docs/workflows/flow-router.md`. +Session start: read `docs/workflows/BASE_HANDBOOK.md` and `docs/workflows/flow-router.md`. +Prefer **skills** over agents. Use agents only when explicitly required. -**ICP (MANDATORY for content/design/marketing):** Read `docs/90-99-content-strategy/strategy-analysis/90.10-icp-primary-website-target.md` before any content or design work. Target: non-technical founder burned by a devshop. - -**Voice (MANDATORY when writing):** Read `docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md`. Founder posts: Walling+Fishkin. Tech posts: thoughtbot style (tension-first, opinionated, code as evidence). Run stream-specific self-test. - -**Finding posts to reference:** Use claude-context MCP search: `Search the codebase at /Users/pftg/dev/jetthoughts.github.io for: "topic"`. Tag/slug index: `docs/blog-post-index.md`. Verify slugs: `ls content/blog//index.md`. - -Prefer **skills** over agents. Use agents only when a task explicitly requires them. - -Workflow references: -- `docs/workflows/css-consolidation.md` -- `docs/workflows/blog-pipeline.md` -- `docs/workflows/cover-images.md` (canonical spec in `.stitch/design.md`) -- `docs/workflows/commands.md` -- `docs/workflows/agents.md` - -Key commands: -- `bin/hugo-build` -- `bin/rake test:critical` +Key commands: `bin/hugo-build` | `bin/rake test:critical` diff --git a/README.md b/README.md index 16997157d..3f1c0fea2 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ - [Features](#features) - [Technology Stack](#technology-stack) - [Quick Start](#quick-start) +- [AI Agent Setup (APM)](#ai-agent-setup-apm) - [Development](#development) - [Testing](#testing) - [Deployment](#deployment) @@ -130,6 +131,60 @@ hugo server -D Visit `http://localhost:1313` to view the site. +## 🤖 AI Agent Setup (APM) + +This project uses [Microsoft APM](https://github.com/microsoft/apm) (Agent Package Manager) to manage AI coding tool configuration. One manifest (`apm.yml`) declares instructions, agents, skills, prompts, and MCP servers — and APM compiles them for **all** tools automatically. + +### Tools Auto-Configured + +Claude Code • GitHub Copilot • Codex CLI • Cursor • Gemini CLI • Windsurf • Devin • Codebuff • Qwen Code • Junie + +### Quick Setup + +```bash +# 1. Install APM (macOS) +curl -fsSL https://get.apm.dev | sh +# or via Homebrew: brew install microsoft/tap/apm + +# 2. Install agent primitives (instructions, agents, prompts) +apm install + +# 3. Start persistent MCP backends (ollama, searxng, milvus) +make mcp-up + +# 4. Open in any AI tool — same config everywhere +code . # VS Code with Copilot +claude # Claude Code +gemini # Gemini CLI +``` + +### What APM Manages + +| Primitive | Location | Purpose | +|-----------|----------|---------| +| **Instructions** | `.apm/instructions/` | Shared project rules compiled to all tools | +| **Prompts** | `.apm/prompts/` | Slash-command triggers (blog-pipeline, research, cover-image) | +| **Agents** | `.apm/agents/` | Persona definitions (coder, reviewer, content-creator, etc.) | +| **Skills** | `.apm/skills/` | Reusable capabilities (blog-pipeline, css-bem-migration, etc.) | +| **MCP Servers** | Declared in `apm.yml` | claude-context, context7, brave-search, searxng, ollama, milvus, etc. | + +### MCP Servers + +MCP servers are declared in `apm.yml` → `dependencies.mcp`. Two categories: + +- **Stdio (auto-started)**: `claude-context`, `context7`, `brave-search`, `lean-ctx`, `chrome-devtools`, `package-search`, `github-mcp-server` — started on-demand by the AI tool. +- **Persistent**: `ollama` (brew service), `searxng` + `milvus` (docker compose via `compose.mcp.yml`) — managed via `make mcp-up` / `make mcp-down`. + +### Environment Variables + +API keys for MCP servers are consumed from your environment — never hardcoded in config files: + +```bash +# MCP Server API Keys +BRAVE_API_KEY=your_brave_search_key +GITHUB_TOKEN=your_github_pat +``` + ## 💻 Development ### Project Structure diff --git a/apm.lock.yaml b/apm.lock.yaml new file mode 100644 index 000000000..a78be1249 --- /dev/null +++ b/apm.lock.yaml @@ -0,0 +1,395 @@ +lockfile_version: '1' +generated_at: '2026-07-08T02:51:37.719380+00:00' +dependencies: [] +mcp_servers: +- brave-search +- chrome-devtools +- claude-context +- context7 +- github-mcp-server +- lean-ctx +- milvus +- ollama +- package-search +- searxng +mcp_configs: + brave-search: + name: brave-search + transport: stdio + env: + BRAVE_API_KEY: ${BRAVE_API_KEY} + args: + - -y + - '@anthropic/brave-search-mcp' + registry: false + command: npx + chrome-devtools: + name: chrome-devtools + transport: stdio + args: + - -y + - '@anthropic/chrome-devtools-mcp' + registry: false + command: npx + claude-context: + name: claude-context + transport: stdio + args: + - -y + - '@anthropic/claude-context' + registry: false + command: npx + context7: + name: context7 + transport: stdio + args: + - -y + - '@upstash/context7-mcp' + registry: false + command: npx + github-mcp-server: + name: github-mcp-server + transport: stdio + env: + GITHUB_TOKEN: ${GITHUB_TOKEN} + args: + - -y + - '@anthropic/github-mcp-server' + registry: false + command: npx + lean-ctx: + name: lean-ctx + transport: stdio + args: + - -y + - lean-ctx-mcp + registry: false + command: npx + milvus: + name: milvus + transport: http + registry: false + url: http://localhost:19530 + ollama: + name: ollama + transport: http + registry: false + url: http://localhost:11434 + package-search: + name: package-search + transport: stdio + args: + - -y + - package-search-mcp + registry: false + command: npx + searxng: + name: searxng + transport: http + registry: false + url: http://localhost:8080 +local_deployed_files: +- .agents/skills/blog-post-pipeline +- .agents/skills/blog-post-pipeline/SKILL.md +- .agents/skills/content-voice-enforcement +- .agents/skills/content-voice-enforcement/SKILL.md +- .agents/skills/cover-image-generation +- .agents/skills/cover-image-generation/SKILL.md +- .agents/skills/css-bem-migration +- .agents/skills/css-bem-migration/SKILL.md +- .agents/skills/visual-regression-testing +- .agents/skills/visual-regression-testing/SKILL.md +- .claude/agents/analyst.md +- .claude/agents/coder.md +- .claude/agents/content-marketer.md +- .claude/agents/planner.md +- .claude/agents/qa-browser-tester.md +- .claude/agents/researcher.md +- .claude/agents/reviewer.md +- .claude/agents/ruby-coder.md +- .claude/agents/ruby-reviewer.md +- .claude/agents/screenshot-guardian.md +- .claude/agents/tester.md +- .claude/agents/tutorial-engineer.md +- .claude/agents/ui-problem-diagnosis.md +- .claude/agents/ux-browser-validator.md +- .claude/commands/blog-pipeline.md +- .claude/commands/cover-image.md +- .claude/commands/research.md +- .claude/rules/css-consolidation.md +- .claude/rules/icp-target.md +- .claude/rules/project-rules.md +- .claude/rules/tdd-enforcement.md +- .claude/rules/voice-guide.md +- .claude/skills/blog-post-pipeline +- .claude/skills/blog-post-pipeline/SKILL.md +- .claude/skills/content-voice-enforcement +- .claude/skills/content-voice-enforcement/SKILL.md +- .claude/skills/cover-image-generation +- .claude/skills/cover-image-generation/SKILL.md +- .claude/skills/css-bem-migration +- .claude/skills/css-bem-migration/SKILL.md +- .claude/skills/visual-regression-testing +- .claude/skills/visual-regression-testing/SKILL.md +- .codex/agents/analyst.toml +- .codex/agents/build-monitor.toml +- .codex/agents/coder.toml +- .codex/agents/content-creator.toml +- .codex/agents/content-marketer.toml +- .codex/agents/hugo-expert.toml +- .codex/agents/planner.toml +- .codex/agents/qa-browser-tester.toml +- .codex/agents/researcher.toml +- .codex/agents/reviewer.toml +- .codex/agents/ruby-coder.toml +- .codex/agents/ruby-reviewer.toml +- .codex/agents/screenshot-guardian.toml +- .codex/agents/seo-specialist.toml +- .codex/agents/tester.toml +- .codex/agents/tutorial-engineer.toml +- .codex/agents/ui-problem-diagnosis.toml +- .codex/agents/ux-browser-validator.toml +- .cursor/agents/analyst.md +- .cursor/agents/build-monitor.md +- .cursor/agents/coder.md +- .cursor/agents/content-creator.md +- .cursor/agents/content-marketer.md +- .cursor/agents/hugo-expert.md +- .cursor/agents/planner.md +- .cursor/agents/qa-browser-tester.md +- .cursor/agents/researcher.md +- .cursor/agents/reviewer.md +- .cursor/agents/ruby-coder.md +- .cursor/agents/ruby-reviewer.md +- .cursor/agents/screenshot-guardian.md +- .cursor/agents/seo-specialist.md +- .cursor/agents/tester.md +- .cursor/agents/tutorial-engineer.md +- .cursor/agents/ui-problem-diagnosis.md +- .cursor/agents/ux-browser-validator.md +- .cursor/commands/blog-pipeline.md +- .cursor/commands/cover-image.md +- .cursor/commands/research.md +- .cursor/rules/css-consolidation.mdc +- .cursor/rules/icp-target.mdc +- .cursor/rules/project-rules.mdc +- .cursor/rules/tdd-enforcement.mdc +- .cursor/rules/voice-guide.mdc +- .gemini/commands/blog-pipeline.toml +- .gemini/commands/cover-image.toml +- .gemini/commands/research.toml +- .github/agents/analyst.agent.md +- .github/agents/build-monitor.agent.md +- .github/agents/coder.agent.md +- .github/agents/content-creator.agent.md +- .github/agents/content-marketer.agent.md +- .github/agents/hugo-expert.agent.md +- .github/agents/planner.agent.md +- .github/agents/qa-browser-tester.agent.md +- .github/agents/researcher.agent.md +- .github/agents/reviewer.agent.md +- .github/agents/ruby-coder.agent.md +- .github/agents/ruby-reviewer.agent.md +- .github/agents/screenshot-guardian.agent.md +- .github/agents/seo-specialist.agent.md +- .github/agents/tester.agent.md +- .github/agents/tutorial-engineer.agent.md +- .github/agents/ui-problem-diagnosis.agent.md +- .github/agents/ux-browser-validator.agent.md +- .github/instructions/css-consolidation.instructions.md +- .github/instructions/icp-target.instructions.md +- .github/instructions/project-rules.instructions.md +- .github/instructions/tdd-enforcement.instructions.md +- .github/instructions/voice-guide.instructions.md +- .github/prompts/blog-pipeline.prompt.md +- .github/prompts/cover-image.prompt.md +- .github/prompts/research.prompt.md +- .kiro/skills/blog-post-pipeline +- .kiro/skills/blog-post-pipeline/SKILL.md +- .kiro/skills/content-voice-enforcement +- .kiro/skills/content-voice-enforcement/SKILL.md +- .kiro/skills/cover-image-generation +- .kiro/skills/cover-image-generation/SKILL.md +- .kiro/skills/css-bem-migration +- .kiro/skills/css-bem-migration/SKILL.md +- .kiro/skills/visual-regression-testing +- .kiro/skills/visual-regression-testing/SKILL.md +- .kiro/steering/css-consolidation.md +- .kiro/steering/icp-target.md +- .kiro/steering/project-rules.md +- .kiro/steering/tdd-enforcement.md +- .kiro/steering/voice-guide.md +- .opencode/agents/analyst.md +- .opencode/agents/build-monitor.md +- .opencode/agents/coder.md +- .opencode/agents/content-creator.md +- .opencode/agents/content-marketer.md +- .opencode/agents/hugo-expert.md +- .opencode/agents/planner.md +- .opencode/agents/qa-browser-tester.md +- .opencode/agents/researcher.md +- .opencode/agents/reviewer.md +- .opencode/agents/ruby-coder.md +- .opencode/agents/ruby-reviewer.md +- .opencode/agents/screenshot-guardian.md +- .opencode/agents/seo-specialist.md +- .opencode/agents/tester.md +- .opencode/agents/tutorial-engineer.md +- .opencode/agents/ui-problem-diagnosis.md +- .opencode/agents/ux-browser-validator.md +- .opencode/commands/blog-pipeline.md +- .opencode/commands/cover-image.md +- .opencode/commands/research.md +- .windsurf/rules/css-consolidation.md +- .windsurf/rules/icp-target.md +- .windsurf/rules/project-rules.md +- .windsurf/rules/tdd-enforcement.md +- .windsurf/rules/voice-guide.md +- .windsurf/workflows/blog-pipeline.md +- .windsurf/workflows/cover-image.md +- .windsurf/workflows/research.md +local_deployed_file_hashes: + .agents/skills/blog-post-pipeline/SKILL.md: sha256:f169ad41677c3e50d367f8edbd3b765d8f853dd967a70201e85e79ffe4b31356 + .agents/skills/content-voice-enforcement/SKILL.md: sha256:0005acf787979ed0935833437e5225fc893a4c8ee5b206e19f81df0ebafb56f6 + .agents/skills/cover-image-generation/SKILL.md: sha256:1b386045354b231a9575d682e9539e4244362ba686877f49985f1914002a1314 + .agents/skills/css-bem-migration/SKILL.md: sha256:cfd51b99fefc745d40c5fa4cb7ea1755cea6b5d1f9ee4ea819c0cfd78f9fb85c + .agents/skills/visual-regression-testing/SKILL.md: sha256:952575d548ed20abce7e08f79bec4ba53a4c72987de0b507520069d332f8e10b + .claude/agents/analyst.md: sha256:fd6b3b5c78aec9a2521e6e39f4256598e9aa0d01dedcbb2357a44cf5d4caf3e6 + .claude/agents/coder.md: sha256:60533575db22019d7a1a513e6efe854c5b59d1859f146d38132b123ffbb4aa17 + .claude/agents/content-marketer.md: sha256:1cd7ee611816579e75a1c6c2ea8ce9a20a4712010da5b59848913a08b4d43ffe + .claude/agents/planner.md: sha256:7dd9e396043bdd52989698f25e47c9cd1dc75b901677388ab062ff3237737706 + .claude/agents/qa-browser-tester.md: sha256:e57d5a6c920672206872cec0617e797b4059b13d87719a5364e08a95b5b8b9c6 + .claude/agents/researcher.md: sha256:dfdfb57af650e20a1a173ba1a769d727fe4afd9e89ed3bd4b19cd4e290c3f79a + .claude/agents/reviewer.md: sha256:bdc276926bf77265af49698249ad677c7db7e7089b74ebc0e8fd72977d4383a2 + .claude/agents/ruby-coder.md: sha256:5b1f7bcbd1e12b194268d24889420654941008d1c58bca33bd350bab95a251f6 + .claude/agents/ruby-reviewer.md: sha256:b2b17e1726394e1891c25be639380b60549b337e9fd10dee77f0ae13f5b562de + .claude/agents/screenshot-guardian.md: sha256:edf9e8326306713be1095c0c3625af16b81cedb47bdf6c741e87e813a6dba723 + .claude/agents/tester.md: sha256:7d59c5295ea98f66219f7aa7b4b861d4a3b104a3978f60cb36331426b34924ce + .claude/agents/tutorial-engineer.md: sha256:7dc7cbd1422abc2398e0982637ed770f4837048bd58a872ac8123257056b939b + .claude/agents/ui-problem-diagnosis.md: sha256:08910a672753738c73de4ea7b6635ea8966e2e8fecb0835c894f37c12f67903b + .claude/agents/ux-browser-validator.md: sha256:9d311911585106b65f15a7aae0dda2e82388b785d3e13608d356cb93fdea0ffe + .claude/commands/blog-pipeline.md: sha256:2d19b9a9fafcfd0ba1be79ec2ce2003c6e5230a8353e140516e4c74c05f8d53f + .claude/commands/cover-image.md: sha256:aa2235f48abfe6c6c61c43f8c133a0bee2176892622028b2ce1baaa04ab48ba4 + .claude/commands/research.md: sha256:ebf8a17af5b5f66661fa827d534380c72327d3d57ebcd684e7690fe7e4afe73f + .claude/rules/css-consolidation.md: sha256:7664778a092d6aae023bf9630b444355074d225de6c2fa963c72a5102e5d523b + .claude/rules/icp-target.md: sha256:bc9afaac38691997e0632a78f7936473899ce16a2d959048a91e9ddd3fb5f5d0 + .claude/rules/project-rules.md: sha256:26cdb09fdcf39ee9cc2317dd715f837bc21c6f64f38b2c19289ad000da0868c4 + .claude/rules/tdd-enforcement.md: sha256:bf9eae071c503890569a36dada8efa53a9adeec7bf8ec95194908f6ba58707c6 + .claude/rules/voice-guide.md: sha256:3dcf04d4b81bfd441795841e75c7d0b1b3dfd0c2e6ddebf8e8e680563c2954a9 + .claude/skills/blog-post-pipeline/SKILL.md: sha256:f169ad41677c3e50d367f8edbd3b765d8f853dd967a70201e85e79ffe4b31356 + .claude/skills/content-voice-enforcement/SKILL.md: sha256:0005acf787979ed0935833437e5225fc893a4c8ee5b206e19f81df0ebafb56f6 + .claude/skills/cover-image-generation/SKILL.md: sha256:1b386045354b231a9575d682e9539e4244362ba686877f49985f1914002a1314 + .claude/skills/css-bem-migration/SKILL.md: sha256:cfd51b99fefc745d40c5fa4cb7ea1755cea6b5d1f9ee4ea819c0cfd78f9fb85c + .claude/skills/visual-regression-testing/SKILL.md: sha256:952575d548ed20abce7e08f79bec4ba53a4c72987de0b507520069d332f8e10b + .codex/agents/analyst.toml: sha256:70faf83cc0b57308c3a9a3c79302a9096beee6d2db2f323777b84854d2dbbf05 + .codex/agents/build-monitor.toml: sha256:e7021093abb12c1f3b1ac14be07f1addf8b681f42f6360c2c4cdb7f4180f5094 + .codex/agents/coder.toml: sha256:a2f7e4444d0076895f57b43f1ab67d100ed00e426df2a89ddc5b60ce8fac7112 + .codex/agents/content-creator.toml: sha256:a97e66aa5a901ebbef0065907a6bc100a512c52d21a9f6a16c561afe7f44b95c + .codex/agents/content-marketer.toml: sha256:2dd949cc86ee343993cbcca1988ee39ed1a7e58c452cfbab74928a7079c45848 + .codex/agents/hugo-expert.toml: sha256:a2f3439af2851fbc01d5bbccc93b6977364fc44bb036b509b666373dd8240de1 + .codex/agents/planner.toml: sha256:209afbc2422f29ab6d3fd2ebc2223ca6d527031c90d38a7f553387956a9026d4 + .codex/agents/qa-browser-tester.toml: sha256:2b1dd26a13533bf447b32c78fa5c1a6a97e5c37b2bdbee148b0d16cdaeb65d11 + .codex/agents/researcher.toml: sha256:bb69369bb32594d07c22f6a9e37988a6d6901843897cad9582837de8bce03865 + .codex/agents/reviewer.toml: sha256:06759aee4c750db655fb32e6244d28ddc1ab0d43f788ba8fd5e50b01e21e618b + .codex/agents/ruby-coder.toml: sha256:a92df95c26135d9fcddf22b078ea542f5827b372d1b812c358e66030a4eda9f9 + .codex/agents/ruby-reviewer.toml: sha256:36141dda08de3a4d95f005aefd099033b82757577a0c2bd1a9b3e95e5529f363 + .codex/agents/screenshot-guardian.toml: sha256:07e01540221422d24a6cbce3bf6106c5785486007d5e5c5514ea676fc9c37da0 + .codex/agents/seo-specialist.toml: sha256:f1200560cb238197e240a751f653f7c2f3c9b06e2f3937302d30be7bd8eb276a + .codex/agents/tester.toml: sha256:bf2306734665b4df060d36ac148cfa92e5f3511a8826cb24fe1da4e9d27daa1d + .codex/agents/tutorial-engineer.toml: sha256:8fb0a9eb7479ae1f61dff8479633c1fa5a0e6c6c21a3fc198be18e83ce465c7f + .codex/agents/ui-problem-diagnosis.toml: sha256:49cdc2fd50eced91a0699db6608e8071ce2620ddb65408eb2d6d3e970abde27c + .codex/agents/ux-browser-validator.toml: sha256:83564d3fa2c23ce43a421182e0fe175a9b1d91330619ccda57054fa83aeaaeb2 + .cursor/agents/analyst.md: sha256:fd6b3b5c78aec9a2521e6e39f4256598e9aa0d01dedcbb2357a44cf5d4caf3e6 + .cursor/agents/build-monitor.md: sha256:ec44db48151179313850daae620f1ef503b385466355a7c336fd21e8774efcbe + .cursor/agents/coder.md: sha256:60533575db22019d7a1a513e6efe854c5b59d1859f146d38132b123ffbb4aa17 + .cursor/agents/content-creator.md: sha256:0fdda3cdc0dab7f4bc5c574a709c7e9374f6cc7b3ba1dcb072954390e33c8722 + .cursor/agents/content-marketer.md: sha256:1cd7ee611816579e75a1c6c2ea8ce9a20a4712010da5b59848913a08b4d43ffe + .cursor/agents/hugo-expert.md: sha256:3460dd0cf80548d9a423cac015e2e3ecee2829a2e9d9773da5bbf465b1491162 + .cursor/agents/planner.md: sha256:7dd9e396043bdd52989698f25e47c9cd1dc75b901677388ab062ff3237737706 + .cursor/agents/qa-browser-tester.md: sha256:e57d5a6c920672206872cec0617e797b4059b13d87719a5364e08a95b5b8b9c6 + .cursor/agents/researcher.md: sha256:dfdfb57af650e20a1a173ba1a769d727fe4afd9e89ed3bd4b19cd4e290c3f79a + .cursor/agents/reviewer.md: sha256:bdc276926bf77265af49698249ad677c7db7e7089b74ebc0e8fd72977d4383a2 + .cursor/agents/ruby-coder.md: sha256:5b1f7bcbd1e12b194268d24889420654941008d1c58bca33bd350bab95a251f6 + .cursor/agents/ruby-reviewer.md: sha256:b2b17e1726394e1891c25be639380b60549b337e9fd10dee77f0ae13f5b562de + .cursor/agents/screenshot-guardian.md: sha256:edf9e8326306713be1095c0c3625af16b81cedb47bdf6c741e87e813a6dba723 + .cursor/agents/seo-specialist.md: sha256:2d9976d55381dae4fa25b0099eb5a2c1aa1ca863407a32e11a464c543bf7a649 + .cursor/agents/tester.md: sha256:7d59c5295ea98f66219f7aa7b4b861d4a3b104a3978f60cb36331426b34924ce + .cursor/agents/tutorial-engineer.md: sha256:7dc7cbd1422abc2398e0982637ed770f4837048bd58a872ac8123257056b939b + .cursor/agents/ui-problem-diagnosis.md: sha256:08910a672753738c73de4ea7b6635ea8966e2e8fecb0835c894f37c12f67903b + .cursor/agents/ux-browser-validator.md: sha256:9d311911585106b65f15a7aae0dda2e82388b785d3e13608d356cb93fdea0ffe + .cursor/commands/blog-pipeline.md: sha256:2d19b9a9fafcfd0ba1be79ec2ce2003c6e5230a8353e140516e4c74c05f8d53f + .cursor/commands/cover-image.md: sha256:aa2235f48abfe6c6c61c43f8c133a0bee2176892622028b2ce1baaa04ab48ba4 + .cursor/commands/research.md: sha256:ebf8a17af5b5f66661fa827d534380c72327d3d57ebcd684e7690fe7e4afe73f + .cursor/rules/css-consolidation.mdc: sha256:54c0515b4056c624929420108a99a854ae9aac7a5bcc3d8ce33bb2cc2254729b + .cursor/rules/icp-target.mdc: sha256:d374638f65f105e0432d862a194092c42351b2da040e9e22187203ebccc99dcc + .cursor/rules/project-rules.mdc: sha256:904d478370120c6001aa8b9d7d26c0d0854708aff7cdf073d10ab41ba0338ef9 + .cursor/rules/tdd-enforcement.mdc: sha256:6fc26c5fbfb1e62962fdefae8e5d0436708b08a2e7c9d1e06e626a8e7da4d405 + .cursor/rules/voice-guide.mdc: sha256:23df966ec8094c029016120806ca45ddcbc498eee843adb5647be0eacac51187 + .gemini/commands/blog-pipeline.toml: sha256:9c222fd62bfeac3e28c2759198faf41c6e6bb092daa21625767a4ba22a33cf2f + .gemini/commands/cover-image.toml: sha256:e76ee8cafc142c51d38060f3b2d2d18dd782328d5cb9bff9166cffdbaf0d620e + .gemini/commands/research.toml: sha256:f552a11bd5825cca6ec95c3bfc211e2d3831e5386a60f2c94e8dd725d933f5a5 + .github/agents/analyst.agent.md: sha256:fd6b3b5c78aec9a2521e6e39f4256598e9aa0d01dedcbb2357a44cf5d4caf3e6 + .github/agents/build-monitor.agent.md: sha256:ec44db48151179313850daae620f1ef503b385466355a7c336fd21e8774efcbe + .github/agents/coder.agent.md: sha256:60533575db22019d7a1a513e6efe854c5b59d1859f146d38132b123ffbb4aa17 + .github/agents/content-creator.agent.md: sha256:0fdda3cdc0dab7f4bc5c574a709c7e9374f6cc7b3ba1dcb072954390e33c8722 + .github/agents/content-marketer.agent.md: sha256:1cd7ee611816579e75a1c6c2ea8ce9a20a4712010da5b59848913a08b4d43ffe + .github/agents/hugo-expert.agent.md: sha256:3460dd0cf80548d9a423cac015e2e3ecee2829a2e9d9773da5bbf465b1491162 + .github/agents/planner.agent.md: sha256:7dd9e396043bdd52989698f25e47c9cd1dc75b901677388ab062ff3237737706 + .github/agents/qa-browser-tester.agent.md: sha256:e57d5a6c920672206872cec0617e797b4059b13d87719a5364e08a95b5b8b9c6 + .github/agents/researcher.agent.md: sha256:dfdfb57af650e20a1a173ba1a769d727fe4afd9e89ed3bd4b19cd4e290c3f79a + .github/agents/reviewer.agent.md: sha256:bdc276926bf77265af49698249ad677c7db7e7089b74ebc0e8fd72977d4383a2 + .github/agents/ruby-coder.agent.md: sha256:5b1f7bcbd1e12b194268d24889420654941008d1c58bca33bd350bab95a251f6 + .github/agents/ruby-reviewer.agent.md: sha256:b2b17e1726394e1891c25be639380b60549b337e9fd10dee77f0ae13f5b562de + .github/agents/screenshot-guardian.agent.md: sha256:edf9e8326306713be1095c0c3625af16b81cedb47bdf6c741e87e813a6dba723 + .github/agents/seo-specialist.agent.md: sha256:2d9976d55381dae4fa25b0099eb5a2c1aa1ca863407a32e11a464c543bf7a649 + .github/agents/tester.agent.md: sha256:7d59c5295ea98f66219f7aa7b4b861d4a3b104a3978f60cb36331426b34924ce + .github/agents/tutorial-engineer.agent.md: sha256:7dc7cbd1422abc2398e0982637ed770f4837048bd58a872ac8123257056b939b + .github/agents/ui-problem-diagnosis.agent.md: sha256:08910a672753738c73de4ea7b6635ea8966e2e8fecb0835c894f37c12f67903b + .github/agents/ux-browser-validator.agent.md: sha256:9d311911585106b65f15a7aae0dda2e82388b785d3e13608d356cb93fdea0ffe + .github/instructions/css-consolidation.instructions.md: sha256:7664778a092d6aae023bf9630b444355074d225de6c2fa963c72a5102e5d523b + .github/instructions/icp-target.instructions.md: sha256:bc9afaac38691997e0632a78f7936473899ce16a2d959048a91e9ddd3fb5f5d0 + .github/instructions/project-rules.instructions.md: sha256:26cdb09fdcf39ee9cc2317dd715f837bc21c6f64f38b2c19289ad000da0868c4 + .github/instructions/tdd-enforcement.instructions.md: sha256:bf9eae071c503890569a36dada8efa53a9adeec7bf8ec95194908f6ba58707c6 + .github/instructions/voice-guide.instructions.md: sha256:3dcf04d4b81bfd441795841e75c7d0b1b3dfd0c2e6ddebf8e8e680563c2954a9 + .github/prompts/blog-pipeline.prompt.md: sha256:f960e4824d90ebf06b5395bbf5a964c47a5edc3b207e0f43a78d5f4dfd38ec5e + .github/prompts/cover-image.prompt.md: sha256:20ccbc871c4028307cca49b1d8e7521ada2c9b7489be56fbeb66aabdd66ad857 + .github/prompts/research.prompt.md: sha256:19878f66c1a89e38cba9c9078248d9ec08fda0001eaaae992d0a42ca81cb62e9 + .kiro/skills/blog-post-pipeline/SKILL.md: sha256:f169ad41677c3e50d367f8edbd3b765d8f853dd967a70201e85e79ffe4b31356 + .kiro/skills/content-voice-enforcement/SKILL.md: sha256:0005acf787979ed0935833437e5225fc893a4c8ee5b206e19f81df0ebafb56f6 + .kiro/skills/cover-image-generation/SKILL.md: sha256:1b386045354b231a9575d682e9539e4244362ba686877f49985f1914002a1314 + .kiro/skills/css-bem-migration/SKILL.md: sha256:cfd51b99fefc745d40c5fa4cb7ea1755cea6b5d1f9ee4ea819c0cfd78f9fb85c + .kiro/skills/visual-regression-testing/SKILL.md: sha256:952575d548ed20abce7e08f79bec4ba53a4c72987de0b507520069d332f8e10b + .kiro/steering/css-consolidation.md: sha256:8f622fae6291d1ce4c906a170a1f0a5f9cc03263ea08130aaf4e414662345388 + .kiro/steering/icp-target.md: sha256:772ef808ed9112588aabf3d51c2ff1bcc2b19555491a611d60ce0d3981e4fd44 + .kiro/steering/project-rules.md: sha256:df049b1e0e4f976ad1ca11586164c237f90dfa79c4178fd1f00ddf3cabd1ebf2 + .kiro/steering/tdd-enforcement.md: sha256:1c6267029066dbaa4a96f2c7a8cdcff976806238aef5c8ad281446a4d2b3f4b2 + .kiro/steering/voice-guide.md: sha256:f17939a682fc28734fa3992e8f10576c73c3074eebf7a094d615ae0954b5c335 + .opencode/agents/analyst.md: sha256:fd6b3b5c78aec9a2521e6e39f4256598e9aa0d01dedcbb2357a44cf5d4caf3e6 + .opencode/agents/build-monitor.md: sha256:ec44db48151179313850daae620f1ef503b385466355a7c336fd21e8774efcbe + .opencode/agents/coder.md: sha256:60533575db22019d7a1a513e6efe854c5b59d1859f146d38132b123ffbb4aa17 + .opencode/agents/content-creator.md: sha256:0fdda3cdc0dab7f4bc5c574a709c7e9374f6cc7b3ba1dcb072954390e33c8722 + .opencode/agents/content-marketer.md: sha256:1cd7ee611816579e75a1c6c2ea8ce9a20a4712010da5b59848913a08b4d43ffe + .opencode/agents/hugo-expert.md: sha256:3460dd0cf80548d9a423cac015e2e3ecee2829a2e9d9773da5bbf465b1491162 + .opencode/agents/planner.md: sha256:7dd9e396043bdd52989698f25e47c9cd1dc75b901677388ab062ff3237737706 + .opencode/agents/qa-browser-tester.md: sha256:e57d5a6c920672206872cec0617e797b4059b13d87719a5364e08a95b5b8b9c6 + .opencode/agents/researcher.md: sha256:dfdfb57af650e20a1a173ba1a769d727fe4afd9e89ed3bd4b19cd4e290c3f79a + .opencode/agents/reviewer.md: sha256:bdc276926bf77265af49698249ad677c7db7e7089b74ebc0e8fd72977d4383a2 + .opencode/agents/ruby-coder.md: sha256:5b1f7bcbd1e12b194268d24889420654941008d1c58bca33bd350bab95a251f6 + .opencode/agents/ruby-reviewer.md: sha256:b2b17e1726394e1891c25be639380b60549b337e9fd10dee77f0ae13f5b562de + .opencode/agents/screenshot-guardian.md: sha256:edf9e8326306713be1095c0c3625af16b81cedb47bdf6c741e87e813a6dba723 + .opencode/agents/seo-specialist.md: sha256:2d9976d55381dae4fa25b0099eb5a2c1aa1ca863407a32e11a464c543bf7a649 + .opencode/agents/tester.md: sha256:7d59c5295ea98f66219f7aa7b4b861d4a3b104a3978f60cb36331426b34924ce + .opencode/agents/tutorial-engineer.md: sha256:7dc7cbd1422abc2398e0982637ed770f4837048bd58a872ac8123257056b939b + .opencode/agents/ui-problem-diagnosis.md: sha256:08910a672753738c73de4ea7b6635ea8966e2e8fecb0835c894f37c12f67903b + .opencode/agents/ux-browser-validator.md: sha256:9d311911585106b65f15a7aae0dda2e82388b785d3e13608d356cb93fdea0ffe + .opencode/commands/blog-pipeline.md: sha256:2d19b9a9fafcfd0ba1be79ec2ce2003c6e5230a8353e140516e4c74c05f8d53f + .opencode/commands/cover-image.md: sha256:aa2235f48abfe6c6c61c43f8c133a0bee2176892622028b2ce1baaa04ab48ba4 + .opencode/commands/research.md: sha256:ebf8a17af5b5f66661fa827d534380c72327d3d57ebcd684e7690fe7e4afe73f + .windsurf/rules/css-consolidation.md: sha256:dd6f393a0c5e0f5d4a2f701c598b108d76a5210b91fba389cac6a9ca3c73ccc6 + .windsurf/rules/icp-target.md: sha256:0162f023b9084fb86430df3754024c5a549112d81bd33b8b3191f8722d75233f + .windsurf/rules/project-rules.md: sha256:7a9408331ce330fe113d9b388b1f55efc3ef6ecdb270637015dd7ce9ef75ded7 + .windsurf/rules/tdd-enforcement.md: sha256:8143c2bb851b5ead6008e3a5654b50f51df10299bd57ab21911aa95317cce1e8 + .windsurf/rules/voice-guide.md: sha256:532c3202b8bfc9227e5de97b35ba0bac6f6b44fa4b9d12737e9c44754c9b90f4 + .windsurf/workflows/blog-pipeline.md: sha256:2d19b9a9fafcfd0ba1be79ec2ce2003c6e5230a8353e140516e4c74c05f8d53f + .windsurf/workflows/cover-image.md: sha256:aa2235f48abfe6c6c61c43f8c133a0bee2176892622028b2ce1baaa04ab48ba4 + .windsurf/workflows/research.md: sha256:ebf8a17af5b5f66661fa827d534380c72327d3d57ebcd684e7690fe7e4afe73f diff --git a/apm.yml b/apm.yml new file mode 100644 index 000000000..a3014a8e3 --- /dev/null +++ b/apm.yml @@ -0,0 +1,135 @@ +# ============================================================================= +# APM Manifest — JetThoughts Site +# ============================================================================= +# This repo is a PRODUCER: it defines canonical agents, skills, instructions, +# and prompts reusable across all JetThoughts repos. +# +# Tools auto-configured by APM v0.24.0: +# Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI, Windsurf, +# Kiro, OpenCode, Antigravity (AGENTS.md+skills). +# +# Tools configured manually (APM doesn't support these targets yet): +# Devin, Codebuff, Qwen Code, Junie — use thin-wrapper files at root. +# +# Quick start: +# apm install # Compile .apm/ → tool configs +# make mcp-up # Start persistent MCP backends (ollama, searxng, milvus) +# code . # Open in any AI tool — same config everywhere +# ============================================================================= + +name: jetthoughts/site +version: 0.1.0 +description: > + JetThoughts website — Hugo static site blog with AI-assisted content + pipeline, BEM CSS architecture, visual regression testing, and TDD + enforcement. Exports reusable voice guides, blog-pipeline skills, + CSS-consolidation patterns, and agent definitions. + +# --------------------------------------------------------------------------- +# DEPENDENCIES — what this project consumes +# --------------------------------------------------------------------------- +dependencies: + + # --- APM Packages --- + apm: [] + + # --- MCP Servers --- + mcp: + + # Stdio-based (auto-started by AI tool's MCP client) + # claude-flow-memory intentionally excluded — claude-flow plugin dependency + + - name: claude-context + registry: false + transport: stdio + command: npx + args: + - "-y" + - "@anthropic/claude-context" + + - name: context7 + registry: false + transport: stdio + command: npx + args: + - "-y" + - "@upstash/context7-mcp" + + - name: brave-search + registry: false + transport: stdio + command: npx + args: + - "-y" + - "@anthropic/brave-search-mcp" + env: + BRAVE_API_KEY: "${BRAVE_API_KEY}" + + - name: lean-ctx + registry: false + transport: stdio + command: npx + args: + - "-y" + - "lean-ctx-mcp" + + - name: chrome-devtools + registry: false + transport: stdio + command: npx + args: + - "-y" + - "@anthropic/chrome-devtools-mcp" + + - name: package-search + registry: false + transport: stdio + command: npx + args: + - "-y" + - "package-search-mcp" + + - name: github-mcp-server + registry: false + transport: stdio + command: npx + args: + - "-y" + - "@anthropic/github-mcp-server" + env: + GITHUB_TOKEN: "${GITHUB_TOKEN}" + + # HTTP-based persistent backends (started via `make mcp-up`) + # These run as Docker services defined in compose.mcp.yml + + - name: searxng + registry: false + transport: http + url: http://localhost:8080 + + - name: ollama + registry: false + transport: http + url: http://localhost:11434 + + - name: milvus + registry: false + transport: http + url: http://localhost:19530 + +# --------------------------------------------------------------------------- +# TOOL TARGETS — which tools APM compiles configuration for +# --------------------------------------------------------------------------- +# All share .apm/instructions/project-rules.instructions.md. +# Thin-wrapper files (AGENTS.md, GEMINI.md, QWEN.md, .junie/AGENTS.md) +# serve as fallback for tools without APM target support. + +targets: + - claude + - copilot + - codex + - cursor + - gemini + - opencode + - windsurf + - kiro diff --git a/compose.mcp.yml b/compose.mcp.yml new file mode 100644 index 000000000..050b3a368 --- /dev/null +++ b/compose.mcp.yml @@ -0,0 +1,67 @@ +# compose.mcp.yml — MCP Infrastructure for JetThoughts Site +# +# Persistent backends for MCP servers declared in apm.yml → dependencies.mcp. +# Started via: make mcp-up (docker compose -f compose.mcp.yml up -d) +# Stopped via: make mcp-down (docker compose -f compose.mcp.yml down) +# +# These run per-repo — clone the repo, run make mcp-up, done. +# Stdio-based MCPs (claude-context, context7, brave-search, etc.) are +# auto-started by the AI tool's MCP client — no compose entry needed. +# ========================================================================== + +services: + # ---- SearXNG — Privacy-respecting meta-search engine ---- + # Used by: searxng MCP server → web research for blog posts + # Endpoint: http://localhost:8080 + searxng: + image: searxng/searxng:latest + ports: + - "8080:8080" + volumes: + - searxng_data:/etc/searxng + environment: + - SEARXNG_BASE_URL=http://localhost:8080/ + restart: unless-stopped + + # ---- Milvus — Vector database for semantic search ---- + # Used by: claude-context MCP server (storage backend) + # Endpoint: http://localhost:19530 + milvus: + image: milvusdb/milvus:v2.4.0 + ports: + - "19530:19530" + - "9091:9091" + environment: + ETCD_ENDPOINTS: etcd:2379 + MINIO_ADDRESS: minio:9000 + volumes: + - milvus_data:/var/lib/milvus + restart: unless-stopped + depends_on: + - etcd + - minio + + etcd: + image: quay.io/coreos/etcd:v3.5.5 + environment: + ETCD_AUTO_COMPACTION_MODE: revision + ETCD_AUTO_COMPACTION_RETENTION: "1000" + ETCD_QUOTA_BACKEND_BYTES: "4294967296" + volumes: + - etcd_data:/etcd + command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 + + minio: + image: minio/minio:RELEASE.2023-03-20T20-16-18Z + environment: + MINIO_ACCESS_KEY: minioadmin + MINIO_SECRET_KEY: minioadmin + volumes: + - minio_data:/minio_data + command: minio server /minio_data --console-address ":9001" + +volumes: + searxng_data: + milvus_data: + etcd_data: + minio_data: diff --git a/docs/mcp-user-setup.md b/docs/mcp-user-setup.md new file mode 100644 index 000000000..68e738a67 --- /dev/null +++ b/docs/mcp-user-setup.md @@ -0,0 +1,40 @@ +# Per-Repo MCP Setup + +Persistent MCP backends (searxng, milvus) run as Docker services defined +in `compose.mcp.yml`. One `make mcp-up` starts everything. + +## Prerequisites + +- Docker (Desktop or colima) +- Homebrew (for ollama) + +## One-Time Setup + +```bash +# Install system dependencies +brew bundle # installs ollama, bun, hugo, rbenv, ruby-build + +# Pull Docker images (optional — compose will pull on first up) +docker compose -f compose.mcp.yml pull +``` + +## Daily Use + +```bash +make mcp-up # Start ollama (brew) + searxng/milvus (docker compose) +make mcp-status # Health check +make mcp-down # Stop Docker services +``` + +## Architecture + +``` +apm.yml # Declares all MCP servers +compose.mcp.yml # Docker services: searxng, milvus, etcd, minio +Makefile (mcp-up/mcp-down) # Orchestration: brew + docker compose +Brewfile # System deps: ollama, bun, hugo, rbenv +``` + +- **Stdio MCPs** (claude-context, context7, brave-search, etc.): auto-started by the AI tool's MCP client. No infrastructure needed. +- **Ollama**: managed via `brew services`. Started by `brew bundle` (restart_service: true). +- **SearXNG + Milvus**: Docker services in `compose.mcp.yml`. Started by `make mcp-up`. diff --git a/opencode.json b/opencode.json new file mode 100644 index 000000000..333cc299d --- /dev/null +++ b/opencode.json @@ -0,0 +1,88 @@ +{ + "mcp": { + "claude-context": { + "type": "local", + "enabled": true, + "command": [ + "npx", + "-y", + "@anthropic/claude-context" + ] + }, + "context7": { + "type": "local", + "enabled": true, + "command": [ + "npx", + "-y", + "@upstash/context7-mcp" + ] + }, + "brave-search": { + "type": "local", + "enabled": true, + "command": [ + "npx", + "-y", + "@anthropic/brave-search-mcp" + ], + "environment": { + "BRAVE_API_KEY": "${BRAVE_API_KEY}" + } + }, + "lean-ctx": { + "type": "local", + "enabled": true, + "command": [ + "npx", + "-y", + "lean-ctx-mcp" + ] + }, + "chrome-devtools": { + "type": "local", + "enabled": true, + "command": [ + "npx", + "-y", + "@anthropic/chrome-devtools-mcp" + ] + }, + "package-search": { + "type": "local", + "enabled": true, + "command": [ + "npx", + "-y", + "package-search-mcp" + ] + }, + "github-mcp-server": { + "type": "local", + "enabled": true, + "command": [ + "npx", + "-y", + "@anthropic/github-mcp-server" + ], + "environment": { + "GITHUB_TOKEN": "${GITHUB_TOKEN}" + } + }, + "searxng": { + "type": "remote", + "enabled": true, + "url": "http://localhost:8080" + }, + "ollama": { + "type": "remote", + "enabled": true, + "url": "http://localhost:11434" + }, + "milvus": { + "type": "remote", + "enabled": true, + "url": "http://localhost:19530" + } + } +} \ No newline at end of file From f4cd730fcf3bfe052c08e533098b623ff89427fc Mon Sep 17 00:00:00 2001 From: Paul Keen Date: Tue, 7 Jul 2026 23:30:29 -0400 Subject: [PATCH 2/6] fix(mcp): add milvus standalone command and fix health checks for colima MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add command: ["milvus", "run", "standalone"] to compose.mcp.yml (milvus v2.4.0 requires explicit standalone entrypoint) - Switch docker compose → docker-compose in Makefile targets (colima with standalone docker-cli lacks compose plugin) - Fix milvus health check: use nc port check instead of curl /health (milvus v2.4.0 has no /health HTTP endpoint on :19530) --- Makefile | 10 +++++----- compose.mcp.yml | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 2713bb30c..f2e4e1fb7 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ # Makefile — JetThoughts Site # # APM declares MCP dependencies in apm.yml (what agents need). -# This Makefile RUNS the persistent backends via docker compose + brew. +# This Makefile RUNS the persistent backends via docker-compose + brew. # Stdio-based MCPs are auto-started by the AI tool — no target needed. # # Quick start: # apm install # Install agent primitives (instructions, agents, prompts) -# make mcp-up # Start persistent MCP backends +# make mcp-up # Start persistent MCP backends (via docker-compose) # make mcp-status # Verify everything is running # code . # Open in Claude/Copilot/Cursor/etc. @@ -30,13 +30,13 @@ mcp-up: @brew services start ollama 2>/dev/null && echo " ✓ ollama started" || echo " ! ollama not installed — run: brew install ollama" @echo "" # Docker-based MCP services (searxng, milvus, etcd, minio) - @docker compose -f compose.mcp.yml up -d + @docker-compose -f compose.mcp.yml up -d @echo "" @$(MAKE) mcp-status mcp-down: @echo "==> Stopping MCP backends..." - @docker compose -f compose.mcp.yml down + @docker-compose -f compose.mcp.yml down @echo " ollama: left running (brew services stop ollama to stop)" @echo "==> MCP backends stopped" @@ -48,5 +48,5 @@ mcp-status: @printf " %-14s " "searxng :8080"; \ curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/healthz 2>/dev/null | grep -q 200 && echo "✓ running" || echo "✗ down" @printf " %-14s " "milvus :19530"; \ - curl -s -o /dev/null -w "%{http_code}" http://localhost:19530/health 2>/dev/null | grep -q 200 && echo "✓ running" || echo "✗ down" + nc -z -w 2 localhost 19530 2>/dev/null && echo "✓ running" || echo "✗ down" @echo "" diff --git a/compose.mcp.yml b/compose.mcp.yml index 050b3a368..ab770642c 100644 --- a/compose.mcp.yml +++ b/compose.mcp.yml @@ -28,6 +28,7 @@ services: # Endpoint: http://localhost:19530 milvus: image: milvusdb/milvus:v2.4.0 + command: ["milvus", "run", "standalone"] ports: - "19530:19530" - "9091:9091" From 33fb7682f691294f3cb9cf56b413f7ac2aa6e64e Mon Sep 17 00:00:00 2001 From: Paul Keen Date: Tue, 7 Jul 2026 23:37:29 -0400 Subject: [PATCH 3/6] chore(mcp): bump milvus to v2.6.19, etcd to v3.5.25, minio to 2024-05-28 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - milvusdb/milvus: v2.4.0 → v2.6.19 (latest stable as of Jul 2026) - quay.io/coreos/etcd: v3.5.5 → v3.5.25 (v2.6 compatible metadata schema) - minio/minio: 2023-03-20 → 2024-05-28 (v2.6 compatible storage) All versions match official milvus v2.6 standalone compose template. Verified: containers start, healthz OK, searxng API returns results. --- compose.mcp.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compose.mcp.yml b/compose.mcp.yml index ab770642c..4675f2210 100644 --- a/compose.mcp.yml +++ b/compose.mcp.yml @@ -27,7 +27,7 @@ services: # Used by: claude-context MCP server (storage backend) # Endpoint: http://localhost:19530 milvus: - image: milvusdb/milvus:v2.4.0 + image: milvusdb/milvus:v2.6.19 command: ["milvus", "run", "standalone"] ports: - "19530:19530" @@ -43,7 +43,7 @@ services: - minio etcd: - image: quay.io/coreos/etcd:v3.5.5 + image: quay.io/coreos/etcd:v3.5.25 environment: ETCD_AUTO_COMPACTION_MODE: revision ETCD_AUTO_COMPACTION_RETENTION: "1000" @@ -53,7 +53,7 @@ services: command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 minio: - image: minio/minio:RELEASE.2023-03-20T20-16-18Z + image: minio/minio:RELEASE.2024-05-28T17-19-04Z environment: MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin From a7c639e0644ce9f4cdc5ed6cb39a8683c38c39ee Mon Sep 17 00:00:00 2001 From: Paul Keen Date: Tue, 7 Jul 2026 23:42:21 -0400 Subject: [PATCH 4/6] feat(mcp): add healthchecks to etcd/minio with service_healthy dependency - Add etcd healthcheck (etcdctl endpoint health) with start_period - Add minio healthcheck (bash /dev/tcp port 9000 check) with start_period (minio image has no curl/wget/mc/pgrep, uses bash built-in TCP) - Update milvus depends_on to condition: service_healthy Ensures etcd+minio are ready before milvus starts, eliminating startup race conditions that caused milvus crash loops. --- compose.mcp.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/compose.mcp.yml b/compose.mcp.yml index 4675f2210..0d16bbe92 100644 --- a/compose.mcp.yml +++ b/compose.mcp.yml @@ -39,8 +39,10 @@ services: - milvus_data:/var/lib/milvus restart: unless-stopped depends_on: - - etcd - - minio + etcd: + condition: service_healthy + minio: + condition: service_healthy etcd: image: quay.io/coreos/etcd:v3.5.25 @@ -51,6 +53,12 @@ services: volumes: - etcd_data:/etcd command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 + healthcheck: + test: ["CMD", "etcdctl", "endpoint", "health"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s minio: image: minio/minio:RELEASE.2024-05-28T17-19-04Z @@ -60,6 +68,12 @@ services: volumes: - minio_data:/minio_data command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ["CMD", "bash", "-c", "echo > /dev/tcp/localhost/9000"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s volumes: searxng_data: From 05fdc58f0dc67bf305089443268bd43844df1e97 Mon Sep 17 00:00:00 2001 From: Paul Keen Date: Tue, 7 Jul 2026 23:45:08 -0400 Subject: [PATCH 5/6] feat(mcp): add seed searxng settings.yml with JSON API enabled - Create .dev/searxng/settings.yml enabling html+json search formats - Bind-mount read-only into searxng container in compose.mcp.yml - Fixes: JSON API was previously ephemeral (written to Docker volume), lost on docker-compose down -v or volume prune - JSON at :8080/search?q=X&format=json now works out of the box on fresh clone after make mcp-up --- .dev/searxng/settings.yml | 13 +++++++++++++ compose.mcp.yml | 1 + 2 files changed, 14 insertions(+) create mode 100644 .dev/searxng/settings.yml diff --git a/.dev/searxng/settings.yml b/.dev/searxng/settings.yml new file mode 100644 index 000000000..fe9905b64 --- /dev/null +++ b/.dev/searxng/settings.yml @@ -0,0 +1,13 @@ +# SearXNG settings — JetThoughts local MCP instance +# Mounted read-only via compose.mcp.yml +use_default_settings: true + +search: + formats: + - html + - json + +server: + secret_key: "1oOHoKQ97m1uS9AjDH3fDVr0ZeQCyJjc" + bind_address: "0.0.0.0" + image_proxy: true diff --git a/compose.mcp.yml b/compose.mcp.yml index 0d16bbe92..b2dbfbbe0 100644 --- a/compose.mcp.yml +++ b/compose.mcp.yml @@ -19,6 +19,7 @@ services: - "8080:8080" volumes: - searxng_data:/etc/searxng + - ./.dev/searxng/settings.yml:/etc/searxng/settings.yml:ro environment: - SEARXNG_BASE_URL=http://localhost:8080/ restart: unless-stopped From 19484183659bf958e0dddf65e236a6c81b69e364 Mon Sep 17 00:00:00 2001 From: Paul Keen Date: Tue, 7 Jul 2026 23:52:57 -0400 Subject: [PATCH 6/6] feat(mcp): switch claude-context to @zilliz/claude-context-mcp with local Milvus+Ollama - Migrate from @anthropic/claude-context (GOB file storage) to @zilliz/claude-context-mcp@latest (Milvus vector backend) - Configure Ollama embeddings (nomic-embed-text, dim 768) - Point to local Milvus (localhost:19530, root:Milvus) - Update all 8 MCP config files + docs/mcp-user-setup.md Prerequisites verified: - Package @zilliz/claude-context-mcp exists (v0.1.15) - Ollama has nomic-embed-text model - Milvus (:9091/healthz) and Ollama (:11434/api/tags) reachable - Server starts without errors --- .codex/config.toml | 8 +++- .cursor/mcp.json | 12 +++++- .gemini/settings.json | 12 +++++- .kiro/settings/mcp.json | 12 +++++- .mcp.json | 86 +++++++++++++++++++++++++++++++++++++++++ apm.lock.yaml | 9 ++++- apm.yml | 9 ++++- docs/mcp-user-setup.md | 3 +- opencode.json | 12 +++++- 9 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 .mcp.json diff --git a/.codex/config.toml b/.codex/config.toml index be084c500..e7b30822e 100644 --- a/.codex/config.toml +++ b/.codex/config.toml @@ -1,6 +1,6 @@ [mcp_servers.claude-context] command = "npx" -args = [ "-y", "@anthropic/claude-context",] +args = [ "-y", "@zilliz/claude-context-mcp@latest",] id = "" [mcp_servers.context7] @@ -34,6 +34,12 @@ args = [ "-y", "@anthropic/github-mcp-server",] id = "" [mcp_servers.claude-context.env] +EMBEDDING_PROVIDER = "Ollama" +EMBEDDING_MODEL = "nomic-embed-text" +OLLAMA_HOST = "http://localhost:11434" +EMBEDDING_DIMENSION = "768" +MILVUS_ADDRESS = "http://localhost:19530" +MILVUS_TOKEN = "root:Milvus" [mcp_servers.context7.env] diff --git a/.cursor/mcp.json b/.cursor/mcp.json index 7d37ea206..d2cf02837 100644 --- a/.cursor/mcp.json +++ b/.cursor/mcp.json @@ -5,8 +5,16 @@ "command": "npx", "args": [ "-y", - "@anthropic/claude-context" - ] + "@zilliz/claude-context-mcp@latest" + ], + "env": { + "EMBEDDING_PROVIDER": "Ollama", + "EMBEDDING_MODEL": "nomic-embed-text", + "OLLAMA_HOST": "http://localhost:11434", + "EMBEDDING_DIMENSION": "768", + "MILVUS_ADDRESS": "http://localhost:19530", + "MILVUS_TOKEN": "root:Milvus" + } }, "context7": { "type": "stdio", diff --git a/.gemini/settings.json b/.gemini/settings.json index 46037b8c2..120a7833b 100644 --- a/.gemini/settings.json +++ b/.gemini/settings.json @@ -4,8 +4,16 @@ "command": "npx", "args": [ "-y", - "@anthropic/claude-context" - ] + "@zilliz/claude-context-mcp@latest" + ], + "env": { + "EMBEDDING_PROVIDER": "Ollama", + "EMBEDDING_MODEL": "nomic-embed-text", + "OLLAMA_HOST": "http://localhost:11434", + "EMBEDDING_DIMENSION": "768", + "MILVUS_ADDRESS": "http://localhost:19530", + "MILVUS_TOKEN": "root:Milvus" + } }, "context7": { "command": "npx", diff --git a/.kiro/settings/mcp.json b/.kiro/settings/mcp.json index 368800ab2..706f0d207 100644 --- a/.kiro/settings/mcp.json +++ b/.kiro/settings/mcp.json @@ -4,8 +4,16 @@ "command": "npx", "args": [ "-y", - "@anthropic/claude-context" - ] + "@zilliz/claude-context-mcp@latest" + ], + "env": { + "EMBEDDING_PROVIDER": "Ollama", + "EMBEDDING_MODEL": "nomic-embed-text", + "OLLAMA_HOST": "http://localhost:11434", + "EMBEDDING_DIMENSION": "768", + "MILVUS_ADDRESS": "http://localhost:19530", + "MILVUS_TOKEN": "root:Milvus" + } }, "context7": { "command": "npx", diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 000000000..3bbac4feb --- /dev/null +++ b/.mcp.json @@ -0,0 +1,86 @@ +{ + "mcpServers": { + "claude-context": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@zilliz/claude-context-mcp@latest" + ], + "env": { + "EMBEDDING_PROVIDER": "Ollama", + "EMBEDDING_MODEL": "nomic-embed-text", + "OLLAMA_HOST": "http://localhost:11434", + "EMBEDDING_DIMENSION": "768", + "MILVUS_ADDRESS": "http://localhost:19530", + "MILVUS_TOKEN": "root:Milvus" + } + }, + "context7": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@upstash/context7-mcp" + ] + }, + "brave-search": { + "type": "stdio", + "command": "npx", + "env": { + "BRAVE_API_KEY": "${BRAVE_API_KEY}" + }, + "args": [ + "-y", + "@anthropic/brave-search-mcp" + ] + }, + "lean-ctx": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "lean-ctx-mcp" + ] + }, + "chrome-devtools": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@anthropic/chrome-devtools-mcp" + ] + }, + "package-search": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "package-search-mcp" + ] + }, + "github-mcp-server": { + "type": "stdio", + "command": "npx", + "env": { + "GITHUB_TOKEN": "${GITHUB_TOKEN}" + }, + "args": [ + "-y", + "@anthropic/github-mcp-server" + ] + }, + "searxng": { + "type": "http", + "url": "http://localhost:8080" + }, + "ollama": { + "type": "http", + "url": "http://localhost:11434" + }, + "milvus": { + "type": "http", + "url": "http://localhost:19530" + } + } +} diff --git a/apm.lock.yaml b/apm.lock.yaml index a78be1249..0c5b77b23 100644 --- a/apm.lock.yaml +++ b/apm.lock.yaml @@ -34,9 +34,16 @@ mcp_configs: claude-context: name: claude-context transport: stdio + env: + EMBEDDING_PROVIDER: Ollama + EMBEDDING_MODEL: nomic-embed-text + OLLAMA_HOST: http://localhost:11434 + EMBEDDING_DIMENSION: '768' + MILVUS_ADDRESS: http://localhost:19530 + MILVUS_TOKEN: root:Milvus args: - -y - - '@anthropic/claude-context' + - '@zilliz/claude-context-mcp@latest' registry: false command: npx context7: diff --git a/apm.yml b/apm.yml index a3014a8e3..82a9576bd 100644 --- a/apm.yml +++ b/apm.yml @@ -45,7 +45,14 @@ dependencies: command: npx args: - "-y" - - "@anthropic/claude-context" + - "@zilliz/claude-context-mcp@latest" + env: + EMBEDDING_PROVIDER: Ollama + EMBEDDING_MODEL: nomic-embed-text + OLLAMA_HOST: http://localhost:11434 + EMBEDDING_DIMENSION: "768" + MILVUS_ADDRESS: http://localhost:19530 + MILVUS_TOKEN: root:Milvus - name: context7 registry: false diff --git a/docs/mcp-user-setup.md b/docs/mcp-user-setup.md index 68e738a67..6ce08e497 100644 --- a/docs/mcp-user-setup.md +++ b/docs/mcp-user-setup.md @@ -35,6 +35,7 @@ Makefile (mcp-up/mcp-down) # Orchestration: brew + docker compose Brewfile # System deps: ollama, bun, hugo, rbenv ``` -- **Stdio MCPs** (claude-context, context7, brave-search, etc.): auto-started by the AI tool's MCP client. No infrastructure needed. +- **Stdio MCPs** (claude-context via @zilliz/claude-context-mcp, context7, brave-search, etc.): auto-started by the AI tool's MCP client. No infrastructure needed. +- **claude-context** uses local Milvus (:19530) for vector storage + Ollama (nomic-embed-text) for embeddings. - **Ollama**: managed via `brew services`. Started by `brew bundle` (restart_service: true). - **SearXNG + Milvus**: Docker services in `compose.mcp.yml`. Started by `make mcp-up`. diff --git a/opencode.json b/opencode.json index 333cc299d..36d5e68db 100644 --- a/opencode.json +++ b/opencode.json @@ -6,8 +6,16 @@ "command": [ "npx", "-y", - "@anthropic/claude-context" - ] + "@zilliz/claude-context-mcp@latest" + ], + "environment": { + "EMBEDDING_PROVIDER": "Ollama", + "EMBEDDING_MODEL": "nomic-embed-text", + "OLLAMA_HOST": "http://localhost:11434", + "EMBEDDING_DIMENSION": "768", + "MILVUS_ADDRESS": "http://localhost:19530", + "MILVUS_TOKEN": "root:Milvus" + } }, "context7": { "type": "local",