cc-codeconductor 0.2.6 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +18 -1
  2. package/dist/index.js +782 -24
  3. package/package.json +2 -1
  4. package/presets/opencode/README.md +7 -7
  5. package/presets/opencode/agents/architect.md +0 -1
  6. package/presets/opencode/agents/docs.md +0 -1
  7. package/presets/opencode/agents/implementer.md +0 -1
  8. package/presets/opencode/agents/orchestrator.md +0 -1
  9. package/presets/opencode/agents/repo-explorer.md +0 -1
  10. package/presets/opencode/agents/reviewer.md +0 -1
  11. package/presets/opencode/agents/task-coach.md +0 -1
  12. package/presets/opencode/agents/tester.md +0 -1
  13. package/presets/opencode/opencode.jsonc +2 -11
  14. package/presets/opencode/prompts/v0.2.0/docs.md +1 -1
  15. package/presets/opencode/prompts/v0.2.0/repo-explorer.md +1 -1
  16. package/presets/opencode/prompts/v0.2.0/reviewer.md +1 -1
  17. package/presets/opencode/prompts/v0.2.0/task-coach.md +1 -1
  18. package/presets/seo-hotel/commands/cc-seo-audit.md +87 -0
  19. package/presets/seo-hotel/skills/astro-seo/SKILL.md +245 -0
  20. package/presets/seo-hotel/skills/geo-readiness/SKILL.md +221 -0
  21. package/presets/seo-hotel/skills/off-page/SKILL.md +201 -0
  22. package/presets/seo-hotel/skills/schema-validator/SKILL.md +325 -0
  23. package/presets/seo-hotel/skills/seo-audit/SKILL.md +191 -0
  24. package/src/presets/manifests/agy.yml +9 -0
  25. package/src/presets/manifests/opencode.yml +2 -1
  26. package/src/presets/models/agy.yml +59 -0
  27. package/src/presets/models/claude.yml +3 -3
  28. package/src/presets/models/codex.yml +3 -3
  29. package/src/presets/models/cursor.yml +3 -3
  30. package/src/presets/models/gemini.yml +3 -3
  31. package/src/presets/models/opencode.yml +11 -46
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-codeconductor",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "A multi-agent orchestration framework for AI-assisted software engineering workflows.",
5
5
  "keywords": [
6
6
  "ai",
@@ -29,6 +29,7 @@
29
29
  },
30
30
  "type": "module",
31
31
  "bin": {
32
+ "cc-codeconductor": "./dist/index.js",
32
33
  "codeconductor": "./dist/index.js"
33
34
  },
34
35
  "scripts": {
@@ -24,7 +24,7 @@ providers)** models.
24
24
  | `deepseek-v4-pro` | DeepSeek | Reasoning complejo, arquitectura | Architect, orchestrator |
25
25
  | `mimo-v2.5-pro` | MiniMax | Razonamiento matemático, código | Implementer |
26
26
  | `minimax-m2.7` | MiniMax | Tareas equilibradas | Tester, orchestrator |
27
- | `qwen-3.6-plus` | Qwen | Rápido, eficiente | Reviewer, Task Coach, Docs |
27
+ | `qwen3.6-plus` | Qwen | Rápido, eficiente | Reviewer, Task Coach, Docs |
28
28
  | `kimi-k2-6` | Kimi (Moonshot) | Conversación natural | Task Coach, Docs |
29
29
 
30
30
  ---
@@ -37,10 +37,10 @@ providers)** models.
37
37
  | **Architect** | `claude-opus-4-7` | `deepseek-v4-pro` | `mimo-v2.5-pro` |
38
38
  | **Implementer** | `claude-sonnet-4-6` | `mimo-v2.5-pro` | `minimax-m2.7` |
39
39
  | **Tester** | `claude-sonnet-4-6` | `minimax-m2.7` | `deepseek-v4-pro` |
40
- | **Reviewer** | `claude-sonnet-4-6` | `qwen-3.6-plus` | `minimax-m2.7` |
41
- | **Task Coach** | `claude-haiku-4-5-20251001` | `qwen-3.6-plus` | `kimi-k2.6` |
42
- | **Docs** | `claude-haiku-4-5-20251001` | `qwen-3.6-plus` | `kimi-k2.6` |
43
- | **Repo Explorer** | `claude-haiku-4-5-20251001` | `qwen-3.6-plus` | `kimi-k2.6` |
40
+ | **Reviewer** | `claude-sonnet-4-6` | `qwen3.6-plus` | `minimax-m2.7` |
41
+ | **Task Coach** | `claude-haiku-4-5-20251001` | `qwen3.6-plus` | `kimi-k2.6` |
42
+ | **Docs** | `claude-haiku-4-5-20251001` | `qwen3.6-plus` | `kimi-k2.6` |
43
+ | **Repo Explorer** | `claude-haiku-4-5-20251001` | `qwen3.6-plus` | `kimi-k2.6` |
44
44
 
45
45
  ---
46
46
 
@@ -84,7 +84,7 @@ The following paths are denied by default:
84
84
 
85
85
  ### Simple Tasks (Q&A, intake, documentation)
86
86
 
87
- **Recommended:** `qwen-3.6-plus` (OpenCode Go) or `claude-haiku-4-5-20251001`
87
+ **Recommended:** `qwen3.6-plus` (OpenCode Go) or `claude-haiku-4-5-20251001`
88
88
  (Claude)
89
89
 
90
90
  - Task Coach intake
@@ -164,7 +164,7 @@ export KIMI_API_KEY="your-key"
164
164
  | Scenario | Recommended |
165
165
  | ------------------------------- | -------------------------------------------------- |
166
166
  | Complex reasoning, architecture | OpenCode Go (`deepseek-v4-pro`) or Claude (`opus`) |
167
- | Fast iteration, simple tasks | OpenCode Go (`qwen-3.6-plus`) or Claude (`haiku`) |
167
+ | Fast iteration, simple tasks | OpenCode Go (`qwen3.6-plus`) or Claude (`haiku`) |
168
168
  | Code implementation | OpenCode Go (`mimo-v2.5-pro`) or Claude (`sonnet`) |
169
169
  | Budget constraints | OpenCode Go (generally lower cost) |
170
170
  | Availability issues | Switch to alternative from the matrix |
@@ -7,7 +7,6 @@ description:
7
7
  mode: subagent
8
8
  model: "{{MODEL}}"
9
9
  temperature: 0.1
10
- maxTurns: 80
11
10
  tools: Read, Glob, Grep
12
11
  permission:
13
12
  read: allow
@@ -6,7 +6,6 @@ description:
6
6
  mode: subagent
7
7
  model: "{{MODEL}}"
8
8
  temperature: 0.1
9
- maxTurns: 30
10
9
  tools: Read, Write, Edit, Glob, Grep
11
10
  permission:
12
11
  read: allow
@@ -6,7 +6,6 @@ description:
6
6
  mode: subagent
7
7
  model: "{{MODEL}}"
8
8
  temperature: 0.1
9
- maxTurns: 100
10
9
  tools: Read, Write, Edit, Bash, Glob, Grep
11
10
  permission:
12
11
  read: allow
@@ -7,7 +7,6 @@ description:
7
7
  mode: primary
8
8
  model: "{{MODEL}}"
9
9
  temperature: 0.1
10
- maxTurns: 60
11
10
  tools: Read, Glob, Grep, Bash
12
11
  permission:
13
12
  read: allow
@@ -7,7 +7,6 @@ description:
7
7
  mode: subagent
8
8
  model: "{{MODEL}}"
9
9
  temperature: 0.1
10
- maxTurns: 35
11
10
  tools: Read, Glob, Grep, Bash
12
11
  permission:
13
12
  read: allow
@@ -7,7 +7,6 @@ description:
7
7
  mode: subagent
8
8
  model: "{{MODEL}}"
9
9
  temperature: 0.1
10
- maxTurns: 40
11
10
  tools: Read, Glob, Grep, Bash
12
11
  permission:
13
12
  read: allow
@@ -7,7 +7,6 @@ description:
7
7
  mode: subagent
8
8
  model: "{{MODEL}}"
9
9
  temperature: 0.1
10
- maxTurns: 30
11
10
  tools: Read, Glob, Grep
12
11
  permission:
13
12
  read: allow
@@ -7,7 +7,6 @@ description:
7
7
  mode: subagent
8
8
  model: "{{MODEL}}"
9
9
  temperature: 0.1
10
- maxTurns: 60
11
10
  tools: Read, Write, Edit, Bash, Glob, Grep
12
11
  permission:
13
12
  read: allow
@@ -1,6 +1,4 @@
1
1
  {
2
- // CodeConductor policies are declarative until the policy compiler exists.
3
- // Enforcement depends on OpenCode permission support.
4
2
  "$schema": "https://opencode.ai/config.json",
5
3
  "model": "opencode-go/qwen3.7-max",
6
4
  "permission": {
@@ -28,9 +26,7 @@
28
26
  },
29
27
  "glob": "allow",
30
28
  "grep": "allow",
31
- "external_directory": {
32
- "*": "deny"
33
- },
29
+ "external_directory": "deny",
34
30
  "bash": {
35
31
  "*": "ask",
36
32
  "git status*": "allow",
@@ -79,11 +75,6 @@
79
75
  },
80
76
  "webfetch": "ask",
81
77
  "websearch": "ask",
82
- "task": {
83
- "*": "ask"
84
- },
85
- "skill": {
86
- "*": "ask"
87
- }
78
+ "skill": "ask"
88
79
  }
89
80
  }
@@ -8,7 +8,7 @@ description:
8
8
  | Provider | Model | Use Case |
9
9
  |----------|-------|----------|
10
10
  | Claude | claude-haiku-4-5-20251001 | Fast — documentation |
11
- | OpenCode Go | opencode-go/qwen-3.6-plus | Best — efficient docs |
11
+ | OpenCode Go | opencode-go/qwen3.6-plus | Best — efficient docs |
12
12
  | OpenCode Go | opencode-go/kimi-k2.6 | Alternative |
13
13
  ---
14
14
 
@@ -9,7 +9,7 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-haiku-4-5-20251001 | Fast — exploration |
12
- | OpenCode Go | opencode-go/qwen-3.6-plus | Best — quick mapping |
12
+ | OpenCode Go | opencode-go/qwen3.6-plus | Best — quick mapping |
13
13
  | OpenCode Go | opencode-go/kimi-k2.6 | Alternative |
14
14
  ---
15
15
 
@@ -9,7 +9,7 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-sonnet-4-6 | Default — code review |
12
- | OpenCode Go | opencode-go/qwen-3.6-plus | Best — efficient reviews |
12
+ | OpenCode Go | opencode-go/qwen3.6-plus | Best — efficient reviews |
13
13
  | OpenCode Go | opencode-go/minimax-m2.7 | Detailed reviews |
14
14
  ---
15
15
 
@@ -9,7 +9,7 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-haiku-4-5-20251001 | Fast — intake, Q&A |
12
- | OpenCode Go | opencode-go/qwen-3.6-plus | Best — efficient Q&A |
12
+ | OpenCode Go | opencode-go/qwen3.6-plus | Best — efficient Q&A |
13
13
  | OpenCode Go | opencode-go/kimi-k2.6 | Alternative |
14
14
  ---
15
15
 
@@ -0,0 +1,87 @@
1
+ # SEO Audit
2
+
3
+ Run a comprehensive SEO and GEO audit on hotel and hospitality websites.
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ /cc-seo-audit --url <url> [--format json] [--fail-on error|warning]
9
+ /cc-seo-audit --sitemap <sitemap-url> [--format json] [--fail-on error|warning]
10
+ /cc-seo-audit --astro --path <src-path>
11
+ ```
12
+
13
+ ## Parameters
14
+
15
+ | Parameter | Required | Description |
16
+ |-----------|----------|-------------|
17
+ | `--url` | One of `--url` or `--sitemap` | Single URL to audit |
18
+ | `--sitemap` | One of `--url` or `--sitemap` | Remote sitemap XML URL. Only URLs listed here will be audited. |
19
+ | `--format` | No | Output format: `cli` (default) or `json` |
20
+ | `--fail-on` | No | Exit code trigger: `error` (default) or `warning` |
21
+ | `--astro` | No | Run Astro-specific SEO validation on source code |
22
+ | `--path` | With `--astro` | Path to Astro source directory |
23
+ | `--delay` | No | Delay between requests in ms (default: 500) |
24
+
25
+ ## Workflow
26
+
27
+ 1. **Classify** the audit type:
28
+ - `--url` → single page audit
29
+ - `--sitemap` → batch audit, sitemap-scoped only
30
+ - `--astro` → source code validation (no network)
31
+
32
+ 2. **Route** to the appropriate skill(s):
33
+ - Schema validation → `schema-validator` skill
34
+ - Technical SEO → `seo-audit` skill
35
+ - GEO readiness → `geo-readiness` skill
36
+ - Astro source → `astro-seo` skill
37
+ - Off-page strategy → `off-page` skill
38
+
39
+ 3. **Execute** the audit:
40
+ - For `--sitemap`: fetch and parse sitemap XML, extract `<loc>` entries
41
+ - Validate ONLY URLs from the sitemap — never follow external links
42
+ - Apply rate limiting (500ms default between requests)
43
+ - SSRF prevention: reject private IPs and non-HTTP(S) schemes
44
+
45
+ 4. **Report** findings:
46
+ - CLI output with pass/fail/warning per check
47
+ - JSON output for CI/CD integration
48
+ - Remediation guidance with exact code snippets
49
+
50
+ 5. **Exit codes**:
51
+ - `0` = all checks passed
52
+ - `1` = failures found (or warnings if `--fail-on warning`)
53
+ - `2` = warnings only
54
+ - `3` = network or parsing error
55
+
56
+ ## Hard Rules
57
+
58
+ - **Sitemap-scoped only.** When `--sitemap` is provided, only audit URLs from the sitemap.
59
+ - **No external crawling.** Never follow hyperlinks found on pages.
60
+ - **GET only.** No POST, PUT, DELETE requests.
61
+ - **No auth.** Never send cookies, tokens, or API keys.
62
+ - **Timeout.** 10 seconds per request.
63
+ - **SSRF prevention.** Reject private IP ranges and non-HTTP(S) schemes.
64
+
65
+ ## Examples
66
+
67
+ ```bash
68
+ # Audit a single hotel page
69
+ /cc-seo-audit --url https://www.cantovallarta.com
70
+
71
+ # Batch audit from sitemap
72
+ /cc-seo-audit --sitemap https://www.cantovallarta.com/sitemap-0.xml
73
+
74
+ # CI/CD integration
75
+ /cc-seo-audit --sitemap https://preview.example.com/sitemap-0.xml --format json --fail-on error
76
+
77
+ # Astro source code audit
78
+ /cc-seo-audit --astro --path ./src
79
+ ```
80
+
81
+ ## Skills Loaded
82
+
83
+ - `schema-validator` — Schema.org structured data validation
84
+ - `seo-audit` — Technical SEO checks
85
+ - `geo-readiness` — AI-search readiness (GEO)
86
+ - `astro-seo` — Astro framework SEO validation
87
+ - `off-page` — Off-page SEO strategy guidance
@@ -0,0 +1,245 @@
1
+ ---
2
+ id: astro-seo
3
+ version: 1.0.0
4
+ name: Astro SEO Validator
5
+ description: >
6
+ SEO validation specific to Astro framework projects. Checks static generation,
7
+ meta tag rendering, Content Collections usage, Island Architecture implications
8
+ for SEO, image optimization, sitemap generation, and Astro-specific best practices.
9
+
10
+ user-invokable: true
11
+ license: MIT
12
+ metadata:
13
+ author: codeconductor
14
+ category: seo
15
+
16
+ compatibility:
17
+ tools: [claude, codex, gemini, opencode]
18
+ stacks:
19
+ languages: [typescript, javascript]
20
+ frameworks: [astro]
21
+
22
+ risk:
23
+ level: low
24
+ can_execute_shell: false
25
+ can_modify_files: true
26
+ requires_network: false
27
+
28
+ inputs: []
29
+
30
+ outputs:
31
+ - name: report
32
+ type: markdown
33
+ description: Astro-specific SEO validation report
34
+
35
+ quality:
36
+ reviewed_by: codeconductor-core
37
+ version: 0.3.0
38
+ ---
39
+
40
+ # Astro SEO Validator
41
+
42
+ ## Purpose
43
+
44
+ Validate SEO best practices specific to Astro framework projects. Astro's static-first
45
+ approach and Islands Architecture have unique SEO implications that generic tools miss.
46
+
47
+ ## Invocation
48
+
49
+ ```bash
50
+ codeconductor seo audit-astro --path ./src
51
+ codeconductor seo audit-astro --path ./src --format json
52
+ ```
53
+
54
+ ## Audit Checks
55
+
56
+ ### Astro Configuration
57
+
58
+ | Check | Severity | Details |
59
+ |-------|----------|---------|
60
+ | `site` configured in astro.config | FAIL | Required for canonical URLs and sitemap |
61
+ | `output: 'static'` or `'hybrid'` | WARNING | SSR pages need explicit caching strategy |
62
+ | `@astrojs/sitemap` integration | FAIL | Sitemap generation is essential |
63
+ | Image optimization enabled | WARNING | `astro:assets` or `@astrojs/image` for automatic optimization |
64
+ | `trailingSlash` configured | SUGGESTION | Consistent URL format prevents duplicate content |
65
+
66
+ ### Meta Tags (Astro Components)
67
+
68
+ | Check | Severity | Details |
69
+ |-------|----------|---------|
70
+ | `<title>` in layout | FAIL | Every page needs a title via layout or head |
71
+ | Meta description | FAIL | Dynamic per-page descriptions |
72
+ | Canonical URL | FAIL | Use `Astro.url` for canonical |
73
+ | OG tags | WARNING | Open Graph for social sharing |
74
+ | JSON-LD injection | WARNING | Structured data in `<Head>` component |
75
+
76
+ ### Recommended Astro SEO pattern
77
+
78
+ ```astro
79
+ ---
80
+ // src/layouts/BaseLayout.astro
81
+ interface Props {
82
+ title: string;
83
+ description: string;
84
+ image?: string;
85
+ schema?: object;
86
+ }
87
+
88
+ const canonicalURL = new URL(Astro.url.pathname, Astro.site);
89
+ ---
90
+
91
+ <head>
92
+ <title>{title} | Canto Vallarta</title>
93
+ <meta name="description" content={description} />
94
+ <link rel="canonical" href={canonicalURL} />
95
+
96
+ <meta property="og:title" content={title} />
97
+ <meta property="og:description" content={description} />
98
+ <meta property="og:url" content={canonicalURL} />
99
+ <meta property="og:image" content={image ?? '/og-default.jpg'} />
100
+ <meta property="og:type" content="website" />
101
+
102
+ {schema && (
103
+ <script type="application/ld+json" set:html={JSON.stringify(schema)} />
104
+ )}
105
+ </head>
106
+ ```
107
+
108
+ ### Content Collections
109
+
110
+ | Check | Severity | Details |
111
+ |-------|----------|---------|
112
+ | Collections defined in `src/content/config.ts` | WARNING | Type-safe content management |
113
+ | Content schema includes SEO fields | WARNING | title, description, image, schema fields |
114
+ | `getCollection()` used for page generation | SUGGESTION | Static generation from collections |
115
+ | Draft content excluded from build | WARNING | `draft: true` pages should not be published |
116
+
117
+ ### Recommended Content Collection schema
118
+
119
+ ```typescript
120
+ // src/content/config.ts
121
+ import { defineCollection, z } from 'astro:content';
122
+
123
+ const rooms = defineCollection({
124
+ type: 'content',
125
+ schema: z.object({
126
+ title: z.string(),
127
+ description: z.string().max(160),
128
+ image: z.string(),
129
+ priceRange: z.string(),
130
+ amenities: z.array(z.string()),
131
+ schema: z.object({
132
+ '@type': z.literal('HotelRoom'),
133
+ name: z.string(),
134
+ occupancy: z.number(),
135
+ }).optional(),
136
+ draft: z.boolean().default(false),
137
+ }),
138
+ });
139
+
140
+ export const collections = { rooms };
141
+ ```
142
+
143
+ ### Islands Architecture SEO
144
+
145
+ | Check | Severity | Details |
146
+ |-------|----------|---------|
147
+ | Critical content is static | FAIL | SEO-critical content must not be in client islands |
148
+ | `<slot>` used for SEO content | WARNING | Slots render at build time |
149
+ | `client:*` directives on non-interactive content | FAIL | Static content should not be hydrated |
150
+ | `client:only` for third-party scripts | WARNING | Analytics, chat widgets should use `client:only` |
151
+
152
+ ### Anti-patterns
153
+
154
+ ```astro
155
+ <!-- BAD: SEO content in client island -->
156
+ <RoomDescription client:load />
157
+
158
+ <!-- GOOD: Static SEO content, interactive elements in island -->
159
+ <div class="room-description">
160
+ <Content /> <!-- Static, crawlable -->
161
+ <BookingWidget client:load /> <!-- Interactive, not SEO-critical -->
162
+ </div>
163
+ ```
164
+
165
+ ### Image Optimization
166
+
167
+ | Check | Severity | Details |
168
+ |-------|----------|---------|
169
+ | `<Image>` component used | WARNING | Automatic format conversion (WebP/AVIF) |
170
+ | `width` and `height` set | FAIL | Prevents CLS |
171
+ | `alt` text present | FAIL | Accessibility and SEO |
172
+ | Responsive sizes configured | WARNING | `sizes` attribute for responsive images |
173
+ | Images in public/ are optimized | WARNING | Manual images bypass Astro optimization |
174
+
175
+ ### Sitemap
176
+
177
+ | Check | Severity | Details |
178
+ |-------|----------|---------|
179
+ | `@astrojs/sitemap` installed | FAIL | Required for sitemap generation |
180
+ | Custom `serialize` function | SUGGESTION | Add hreflang, image entries |
181
+ | Dynamic routes in sitemap | WARNING | Ensure all generated pages are included |
182
+ | `lastmod` dates present | SUGGESTION | Helps search engines prioritize crawling |
183
+
184
+ ### Recommended sitemap customization
185
+
186
+ ```typescript
187
+ // astro.config.ts
188
+ import sitemap from '@astrojs/sitemap';
189
+
190
+ export default defineConfig({
191
+ site: 'https://www.cantovallarta.com',
192
+ integrations: [
193
+ sitemap({
194
+ serialize(item) {
195
+ // Add hreflang for multilingual sites
196
+ item.links = [
197
+ { lang: 'en', url: item.url },
198
+ { lang: 'es', url: item.url.replace('/en/', '/es/') },
199
+ ];
200
+ return item;
201
+ },
202
+ }),
203
+ ],
204
+ });
205
+ ```
206
+
207
+ ### Performance (Astro-specific)
208
+
209
+ | Check | Severity | Details |
210
+ |-------|----------|---------|
211
+ | No unnecessary `client:load` | WARNING | Hydration increases JS bundle |
212
+ | `client:visible` for below-fold islands | SUGGESTION | Lazy hydration |
213
+ | `client:media` for viewport-dependent islands | SUGGESTION | Hydrate only at specific breakpoints |
214
+ | View transitions configured | SUGGESTION | Astro View Transitions for SPA-like navigation |
215
+
216
+ ## Output Format
217
+
218
+ ```text
219
+ Astro SEO Audit
220
+ ===============
221
+ Path: ./src
222
+ Framework: Astro 5.x
223
+ Output mode: static
224
+ Timestamp: 2026-05-29T06:40:00Z
225
+
226
+ Configuration:
227
+ [FAIL] site not configured in astro.config.ts
228
+ [PASS] @astrojs/sitemap installed
229
+ [WARNING] output: 'server' — ensure caching strategy for SEO pages
230
+
231
+ Content:
232
+ [PASS] 12 pages generated from content collections
233
+ [WARNING] 3 pages missing meta description
234
+
235
+ Islands:
236
+ [FAIL] RoomDescription uses client:load for SEO-critical content
237
+ [PASS] BookingWidget correctly uses client:load for interactive element
238
+
239
+ Images:
240
+ [WARNING] 8 images in public/ bypass Astro optimization
241
+ [FAIL] 3 images missing alt text
242
+
243
+ --- Score ---
244
+ Astro SEO: 62/100
245
+ ```