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.
- package/README.md +18 -1
- package/dist/index.js +782 -24
- package/package.json +2 -1
- package/presets/opencode/README.md +7 -7
- package/presets/opencode/agents/architect.md +0 -1
- package/presets/opencode/agents/docs.md +0 -1
- package/presets/opencode/agents/implementer.md +0 -1
- package/presets/opencode/agents/orchestrator.md +0 -1
- package/presets/opencode/agents/repo-explorer.md +0 -1
- package/presets/opencode/agents/reviewer.md +0 -1
- package/presets/opencode/agents/task-coach.md +0 -1
- package/presets/opencode/agents/tester.md +0 -1
- package/presets/opencode/opencode.jsonc +2 -11
- package/presets/opencode/prompts/v0.2.0/docs.md +1 -1
- package/presets/opencode/prompts/v0.2.0/repo-explorer.md +1 -1
- package/presets/opencode/prompts/v0.2.0/reviewer.md +1 -1
- package/presets/opencode/prompts/v0.2.0/task-coach.md +1 -1
- package/presets/seo-hotel/commands/cc-seo-audit.md +87 -0
- package/presets/seo-hotel/skills/astro-seo/SKILL.md +245 -0
- package/presets/seo-hotel/skills/geo-readiness/SKILL.md +221 -0
- package/presets/seo-hotel/skills/off-page/SKILL.md +201 -0
- package/presets/seo-hotel/skills/schema-validator/SKILL.md +325 -0
- package/presets/seo-hotel/skills/seo-audit/SKILL.md +191 -0
- package/src/presets/manifests/agy.yml +9 -0
- package/src/presets/manifests/opencode.yml +2 -1
- package/src/presets/models/agy.yml +59 -0
- package/src/presets/models/claude.yml +3 -3
- package/src/presets/models/codex.yml +3 -3
- package/src/presets/models/cursor.yml +3 -3
- package/src/presets/models/gemini.yml +3 -3
- package/src/presets/models/opencode.yml +11 -46
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: schema-validator
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
name: Schema.org Validator
|
|
5
|
+
description: >
|
|
6
|
+
Validates Schema.org structured data (JSON-LD, Microdata, RDFa) on hotel and hospitality websites.
|
|
7
|
+
Supports single URL validation via --url and sitemap-scoped batch validation via --sitemap.
|
|
8
|
+
Only crawls URLs explicitly listed in the sitemap — never follows external links.
|
|
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: []
|
|
20
|
+
frameworks: [astro, nextjs, django, spring]
|
|
21
|
+
|
|
22
|
+
risk:
|
|
23
|
+
level: medium
|
|
24
|
+
can_execute_shell: true
|
|
25
|
+
can_modify_files: false
|
|
26
|
+
requires_network: true
|
|
27
|
+
|
|
28
|
+
inputs:
|
|
29
|
+
- name: url
|
|
30
|
+
type: string
|
|
31
|
+
required: false
|
|
32
|
+
description: Single URL to validate
|
|
33
|
+
- name: sitemap
|
|
34
|
+
type: string
|
|
35
|
+
required: false
|
|
36
|
+
description: Remote sitemap XML URL. Only URLs listed here will be crawled.
|
|
37
|
+
|
|
38
|
+
outputs:
|
|
39
|
+
- name: report
|
|
40
|
+
type: json
|
|
41
|
+
description: Structured validation report with pass/fail/warning per schema type
|
|
42
|
+
|
|
43
|
+
quality:
|
|
44
|
+
reviewed_by: codeconductor-core
|
|
45
|
+
version: 0.3.0
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
# Schema.org Validator
|
|
49
|
+
|
|
50
|
+
## Purpose
|
|
51
|
+
|
|
52
|
+
Validate Schema.org structured data on hotel and hospitality websites. Detect missing,
|
|
53
|
+
invalid, or incomplete markup and generate actionable remediation guidance.
|
|
54
|
+
|
|
55
|
+
## Invocation
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Single URL
|
|
59
|
+
codeconductor seo validate-schema --url https://www.example.com
|
|
60
|
+
|
|
61
|
+
# Sitemap-scoped (batch)
|
|
62
|
+
codeconductor seo validate-schema --sitemap https://www.example.com/sitemap-0.xml
|
|
63
|
+
|
|
64
|
+
# JSON output for CI/CD
|
|
65
|
+
codeconductor seo validate-schema --sitemap https://www.example.com/sitemap-0.xml --format json
|
|
66
|
+
|
|
67
|
+
# Fail on errors (CI/CD exit code)
|
|
68
|
+
codeconductor seo validate-schema --sitemap https://www.example.com/sitemap-0.xml --fail-on error
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Hard Rules
|
|
72
|
+
|
|
73
|
+
1. **Sitemap-scoped only.** When `--sitemap` is provided, fetch the XML, extract `<loc>` entries,
|
|
74
|
+
and validate ONLY those URLs. Never follow hyperlinks found on those pages.
|
|
75
|
+
2. **No external crawling.** URLs not present in the sitemap are excluded. Period.
|
|
76
|
+
3. **GET only.** All HTTP requests must be GET. No POST, PUT, DELETE.
|
|
77
|
+
4. **No auth headers.** Never send cookies, auth tokens, or API keys in requests.
|
|
78
|
+
5. **Timeout.** Each HTTP request must timeout after 10 seconds.
|
|
79
|
+
6. **Rate limiting.** Default 500ms delay between requests. Configurable via `--delay`.
|
|
80
|
+
7. **SSRF prevention.** Reject URLs with private IP ranges (10.x, 172.16-31.x, 192.168.x, 127.x, ::1).
|
|
81
|
+
Reject non-HTTP(S) schemes.
|
|
82
|
+
8. **No redirects by default.** Do not follow HTTP redirects unless `--follow-redirects` is passed.
|
|
83
|
+
|
|
84
|
+
## Sitemap Parsing
|
|
85
|
+
|
|
86
|
+
### Supported formats
|
|
87
|
+
|
|
88
|
+
- Standard XML Sitemap (`<urlset>` with `<loc>` entries)
|
|
89
|
+
- Sitemap Index (`<sitemapindex>` with nested `<sitemap><loc>` entries)
|
|
90
|
+
|
|
91
|
+
### Parsing rules
|
|
92
|
+
|
|
93
|
+
1. Fetch the sitemap URL via GET
|
|
94
|
+
2. Parse XML response
|
|
95
|
+
3. If `<sitemapindex>`, recursively fetch each child sitemap (max depth: 2)
|
|
96
|
+
4. Extract all `<loc>` values
|
|
97
|
+
5. Deduplicate URLs
|
|
98
|
+
6. Filter: only HTTP/HTTPS URLs
|
|
99
|
+
7. Filter: only URLs on the same domain as the sitemap origin
|
|
100
|
+
8. Return the final URL list
|
|
101
|
+
|
|
102
|
+
### Example sitemap fetch
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
GET https://www.cantovallarta.com/sitemap-0.xml
|
|
106
|
+
-> Parse <urlset>
|
|
107
|
+
-> Extract: [
|
|
108
|
+
https://www.cantovallarta.com/,
|
|
109
|
+
https://www.cantovallarta.com/rooms,
|
|
110
|
+
https://www.cantovallarta.com/rooms/ocean-suite,
|
|
111
|
+
https://www.cantovallarta.com/dining,
|
|
112
|
+
...
|
|
113
|
+
]
|
|
114
|
+
-> Validate each URL's structured data
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Schema Types to Validate
|
|
118
|
+
|
|
119
|
+
### Hotel & Hospitality (primary)
|
|
120
|
+
|
|
121
|
+
| Schema Type | Required Properties | Common Issues |
|
|
122
|
+
|------------|-------------------|---------------|
|
|
123
|
+
| `Hotel` | name, address, starRating, image | Missing starRating, incomplete address |
|
|
124
|
+
| `LodgingBusiness` | name, address, checkinTime, checkoutTime | Missing check-in/out times |
|
|
125
|
+
| `HotelRoom` | name, occupancy, bed | Missing occupancy details |
|
|
126
|
+
| `LocalBusiness` | name, address, telephone, openingHours | Missing telephone or hours |
|
|
127
|
+
| `Resort` | name, address, amenityFeature | Missing amenities |
|
|
128
|
+
|
|
129
|
+
### Supporting Types (secondary)
|
|
130
|
+
|
|
131
|
+
| Schema Type | Required Properties | Common Issues |
|
|
132
|
+
|------------|-------------------|---------------|
|
|
133
|
+
| `BreadcrumbList` | itemListElement (with position, name, item) | Missing position, broken item URLs |
|
|
134
|
+
| `FAQPage` | mainEntity (Question + acceptedAnswer) | Missing acceptedAnswer |
|
|
135
|
+
| `Review` | author, reviewBody, reviewRating | Missing author or rating |
|
|
136
|
+
| `AggregateRating` | ratingValue, reviewCount, bestRating | Missing reviewCount |
|
|
137
|
+
| `Organization` | name, url, logo | Missing logo |
|
|
138
|
+
| `WebSite` | name, url, potentialAction (SearchAction) | Missing SearchAction |
|
|
139
|
+
| `ImageObject` | contentUrl, caption | Missing caption for accessibility |
|
|
140
|
+
|
|
141
|
+
### Hotel-specific checks
|
|
142
|
+
|
|
143
|
+
- `starRating` must be 1-5
|
|
144
|
+
- `priceRange` should use standard format (e.g., "$$", "$$$")
|
|
145
|
+
- `address` must include `addressCountry` for international hotels
|
|
146
|
+
- `geo` coordinates should be present and within valid ranges
|
|
147
|
+
- `amenityFeature` should use `LocationFeatureSpecification` with proper `name` values
|
|
148
|
+
- `image` must be absolute URLs, not relative paths
|
|
149
|
+
|
|
150
|
+
## Validation Logic
|
|
151
|
+
|
|
152
|
+
### Per URL
|
|
153
|
+
|
|
154
|
+
1. Fetch the page HTML via GET
|
|
155
|
+
2. Extract all `<script type="application/ld+json">` blocks (JSON-LD)
|
|
156
|
+
3. Extract Microdata attributes (`itemscope`, `itemtype`, `itemprop`)
|
|
157
|
+
4. For each structured data block:
|
|
158
|
+
a. Parse JSON (for JSON-LD)
|
|
159
|
+
b. Identify `@type`
|
|
160
|
+
c. Validate required properties for that type
|
|
161
|
+
d. Validate property value formats
|
|
162
|
+
e. Check for common anti-patterns
|
|
163
|
+
5. Score: PASS / WARNING / FAIL per type
|
|
164
|
+
6. Aggregate into URL-level score
|
|
165
|
+
|
|
166
|
+
### Scoring
|
|
167
|
+
|
|
168
|
+
| Status | Meaning |
|
|
169
|
+
|--------|---------|
|
|
170
|
+
| PASS | All required properties present and valid |
|
|
171
|
+
| WARNING | Optional properties missing or suboptimal |
|
|
172
|
+
| FAIL | Required properties missing or invalid |
|
|
173
|
+
| NONE | No structured data found for this type |
|
|
174
|
+
|
|
175
|
+
### Anti-patterns to detect
|
|
176
|
+
|
|
177
|
+
- Duplicate `@type` on same page (e.g., two `Hotel` blocks)
|
|
178
|
+
- `@context` not set to `https://schema.org`
|
|
179
|
+
- Nested types without proper `@id` references
|
|
180
|
+
- Empty string values instead of omitting optional properties
|
|
181
|
+
- `description` that is identical to `name`
|
|
182
|
+
- Images without `width` and `height` (affects CLS and rich results)
|
|
183
|
+
|
|
184
|
+
## Output Format
|
|
185
|
+
|
|
186
|
+
### CLI (default)
|
|
187
|
+
|
|
188
|
+
```text
|
|
189
|
+
Schema.org Validation Report
|
|
190
|
+
============================
|
|
191
|
+
Source: --sitemap https://www.cantovallarta.com/sitemap-0.xml
|
|
192
|
+
URLs validated: 24
|
|
193
|
+
Timestamp: 2026-05-29T06:40:00Z
|
|
194
|
+
|
|
195
|
+
--- https://www.cantovallarta.com/ ---
|
|
196
|
+
Hotel: PASS
|
|
197
|
+
BreadcrumbList: WARNING — missing position on item 2
|
|
198
|
+
Organization: PASS
|
|
199
|
+
WebSite: FAIL — missing potentialAction (SearchAction)
|
|
200
|
+
|
|
201
|
+
--- https://www.cantovallarta.com/rooms/ocean-suite ---
|
|
202
|
+
HotelRoom: PASS
|
|
203
|
+
AggregateRating: WARNING — missing reviewCount
|
|
204
|
+
BreadcrumbList: PASS
|
|
205
|
+
Review: NONE — no review markup found
|
|
206
|
+
|
|
207
|
+
--- Summary ---
|
|
208
|
+
Total URLs: 24
|
|
209
|
+
PASS: 18 (75%)
|
|
210
|
+
WARNING: 4 (17%)
|
|
211
|
+
FAIL: 2 (8%)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### JSON (--format json)
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"source": "https://www.cantovallarta.com/sitemap-0.xml",
|
|
219
|
+
"timestamp": "2026-05-29T06:40:00Z",
|
|
220
|
+
"urlsValidated": 24,
|
|
221
|
+
"results": [
|
|
222
|
+
{
|
|
223
|
+
"url": "https://www.cantovallarta.com/",
|
|
224
|
+
"schemas": [
|
|
225
|
+
{
|
|
226
|
+
"type": "Hotel",
|
|
227
|
+
"status": "pass",
|
|
228
|
+
"issues": []
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"type": "BreadcrumbList",
|
|
232
|
+
"status": "warning",
|
|
233
|
+
"issues": [
|
|
234
|
+
{
|
|
235
|
+
"severity": "warning",
|
|
236
|
+
"message": "missing position on item 2",
|
|
237
|
+
"property": "itemListElement[1].position",
|
|
238
|
+
"fix": "Add \"position\": 2 to the second breadcrumb item"
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
}
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
],
|
|
245
|
+
"summary": {
|
|
246
|
+
"total": 24,
|
|
247
|
+
"pass": 18,
|
|
248
|
+
"warning": 4,
|
|
249
|
+
"fail": 2
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Exit Codes
|
|
255
|
+
|
|
256
|
+
| Code | Meaning |
|
|
257
|
+
|------|---------|
|
|
258
|
+
| 0 | All URLs passed (no FAIL) |
|
|
259
|
+
| 1 | At least one FAIL found |
|
|
260
|
+
| 2 | Warnings only, no FAIL |
|
|
261
|
+
| 3 | Network or parsing error |
|
|
262
|
+
|
|
263
|
+
Use `--fail-on error` to exit 1 only on FAIL, or `--fail-on warning` to exit 1 on WARNING or FAIL.
|
|
264
|
+
|
|
265
|
+
## Remediation Guidance
|
|
266
|
+
|
|
267
|
+
For each FAIL or WARNING, the report must include:
|
|
268
|
+
|
|
269
|
+
1. **What is wrong** — the specific missing or invalid property
|
|
270
|
+
2. **Why it matters** — impact on rich results, AI search, or SEO ranking
|
|
271
|
+
3. **How to fix** — exact JSON-LD snippet to add or correct
|
|
272
|
+
|
|
273
|
+
### Example remediation
|
|
274
|
+
|
|
275
|
+
```text
|
|
276
|
+
FAIL: WebSite missing potentialAction (SearchAction)
|
|
277
|
+
|
|
278
|
+
Why: Google uses SearchAction to display a sitelinks search box in SERPs.
|
|
279
|
+
Without it, your homepage misses this enhanced result.
|
|
280
|
+
|
|
281
|
+
Fix: Add this to your WebSite JSON-LD:
|
|
282
|
+
|
|
283
|
+
{
|
|
284
|
+
"@type": "WebSite",
|
|
285
|
+
"name": "Canto Vallarta",
|
|
286
|
+
"url": "https://www.cantovallarta.com",
|
|
287
|
+
"potentialAction": {
|
|
288
|
+
"@type": "SearchAction",
|
|
289
|
+
"target": "https://www.cantovallarta.com/search?q={search_term_string}",
|
|
290
|
+
"query-input": "required name=search_term_string"
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## CI/CD Integration
|
|
296
|
+
|
|
297
|
+
### GitHub Actions
|
|
298
|
+
|
|
299
|
+
```yaml
|
|
300
|
+
- name: Validate Schema.org
|
|
301
|
+
run: |
|
|
302
|
+
codeconductor seo validate-schema \
|
|
303
|
+
--sitemap https://preview-${{ github.event.pull_request.number }}.example.com/sitemap-0.xml \
|
|
304
|
+
--format json \
|
|
305
|
+
--fail-on error \
|
|
306
|
+
--output schema-report.json
|
|
307
|
+
|
|
308
|
+
- name: Comment PR with results
|
|
309
|
+
if: failure()
|
|
310
|
+
uses: actions/github-script@v7
|
|
311
|
+
with:
|
|
312
|
+
script: |
|
|
313
|
+
const report = require('./schema-report.json');
|
|
314
|
+
const fails = report.results.filter(r => r.schemas.some(s => s.status === 'fail'));
|
|
315
|
+
// ... format and post comment
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Security Constraints
|
|
319
|
+
|
|
320
|
+
- **Network access**: Required, but restricted to GET requests on explicitly provided URLs
|
|
321
|
+
- **No credentials**: Never send auth headers, cookies, or API keys
|
|
322
|
+
- **SSRF prevention**: Reject private IP ranges and non-HTTP(S) schemes
|
|
323
|
+
- **Input sanitization**: URL parameters must be validated as proper URLs before fetching
|
|
324
|
+
- **No DOM execution**: Parse HTML as text, do not execute JavaScript (prevents XSS in audit reports)
|
|
325
|
+
- **Output sanitization**: Strip any user-controlled content from reports that could contain XSS payloads
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: seo-audit
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
name: SEO Technical Audit
|
|
5
|
+
description: >
|
|
6
|
+
Comprehensive technical SEO audit for hotel websites. Checks meta tags, headings,
|
|
7
|
+
internal linking, page speed signals, mobile readiness, crawl directives, and Core Web Vitals
|
|
8
|
+
indicators. Supports --url for single page and --sitemap for batch auditing.
|
|
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: []
|
|
20
|
+
frameworks: [astro, nextjs, django, spring]
|
|
21
|
+
|
|
22
|
+
risk:
|
|
23
|
+
level: medium
|
|
24
|
+
can_execute_shell: true
|
|
25
|
+
can_modify_files: false
|
|
26
|
+
requires_network: true
|
|
27
|
+
|
|
28
|
+
inputs:
|
|
29
|
+
- name: url
|
|
30
|
+
type: string
|
|
31
|
+
required: false
|
|
32
|
+
description: Single URL to audit
|
|
33
|
+
- name: sitemap
|
|
34
|
+
type: string
|
|
35
|
+
required: false
|
|
36
|
+
description: Remote sitemap XML URL. Only URLs listed here will be audited.
|
|
37
|
+
|
|
38
|
+
outputs:
|
|
39
|
+
- name: report
|
|
40
|
+
type: json
|
|
41
|
+
description: Structured SEO audit report
|
|
42
|
+
|
|
43
|
+
quality:
|
|
44
|
+
reviewed_by: codeconductor-core
|
|
45
|
+
version: 0.3.0
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
# SEO Technical Audit
|
|
49
|
+
|
|
50
|
+
## Purpose
|
|
51
|
+
|
|
52
|
+
Perform a comprehensive technical SEO audit on hotel and hospitality websites.
|
|
53
|
+
Identify issues that affect search engine visibility, crawlability, and user experience.
|
|
54
|
+
|
|
55
|
+
## Invocation
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Single URL
|
|
59
|
+
codeconductor seo audit --url https://www.example.com
|
|
60
|
+
|
|
61
|
+
# Sitemap-scoped (batch)
|
|
62
|
+
codeconductor seo audit --sitemap https://www.example.com/sitemap-0.xml
|
|
63
|
+
|
|
64
|
+
# JSON output
|
|
65
|
+
codeconductor seo audit --sitemap https://www.example.com/sitemap-0.xml --format json
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Hard Rules
|
|
69
|
+
|
|
70
|
+
1. **Sitemap-scoped only.** When `--sitemap` is provided, only audit URLs from the sitemap.
|
|
71
|
+
2. **No external link following.** Do not crawl links found on pages that are not in the sitemap.
|
|
72
|
+
3. **GET only.** All HTTP requests must be GET.
|
|
73
|
+
4. **No auth headers.** Never send cookies, auth tokens, or API keys.
|
|
74
|
+
5. **Timeout.** 10 seconds per request.
|
|
75
|
+
6. **Rate limiting.** 500ms delay between requests. Configurable via `--delay`.
|
|
76
|
+
7. **SSRF prevention.** Reject private IP ranges and non-HTTP(S) schemes.
|
|
77
|
+
|
|
78
|
+
## Audit Checks
|
|
79
|
+
|
|
80
|
+
### Meta Tags
|
|
81
|
+
|
|
82
|
+
| Check | Severity | Details |
|
|
83
|
+
|-------|----------|---------|
|
|
84
|
+
| `<title>` present | FAIL | Every page must have a unique title |
|
|
85
|
+
| `<title>` length | WARNING | 50-60 characters optimal |
|
|
86
|
+
| `<title>` has brand | SUGGESTION | Hotel name should appear in title |
|
|
87
|
+
| `<meta name="description">` present | FAIL | Every page needs a meta description |
|
|
88
|
+
| `<meta name="description">` length | WARNING | 150-160 characters optimal |
|
|
89
|
+
| `<link rel="canonical">` present | FAIL | Every page must declare its canonical URL |
|
|
90
|
+
| Canonical matches URL | WARNING | Canonical should match the actual URL or be intentional |
|
|
91
|
+
| `<meta name="robots">` | WARNING | Check for accidental noindex/nofollow |
|
|
92
|
+
| `hreflang` tags | WARNING | Hotel sites are often multilingual |
|
|
93
|
+
|
|
94
|
+
### Open Graph & Social
|
|
95
|
+
|
|
96
|
+
| Check | Severity | Details |
|
|
97
|
+
|-------|----------|---------|
|
|
98
|
+
| `og:title` present | WARNING | Required for social sharing |
|
|
99
|
+
| `og:description` present | WARNING | Required for social sharing |
|
|
100
|
+
| `og:image` present | WARNING | Required for social sharing previews |
|
|
101
|
+
| `og:image` dimensions | SUGGESTION | Minimum 1200x630px recommended |
|
|
102
|
+
| `og:type` present | SUGGESTION | Should be `website` or specific type |
|
|
103
|
+
| `twitter:card` present | SUGGESTION | `summary_large_image` for hotels |
|
|
104
|
+
|
|
105
|
+
### Content Structure
|
|
106
|
+
|
|
107
|
+
| Check | Severity | Details |
|
|
108
|
+
|-------|----------|---------|
|
|
109
|
+
| Single `<h1>` | FAIL | Exactly one H1 per page |
|
|
110
|
+
| Heading hierarchy | WARNING | No skipped levels (H1 -> H3) |
|
|
111
|
+
| Image alt text | WARNING | Every `<img>` must have alt text |
|
|
112
|
+
| Image alt text quality | SUGGESTION | Alt text should be descriptive, not filename |
|
|
113
|
+
| Internal links | WARNING | Pages should link to other site pages |
|
|
114
|
+
| Content length | WARNING | Thin content (< 300 words) on non-utility pages |
|
|
115
|
+
|
|
116
|
+
### Technical
|
|
117
|
+
|
|
118
|
+
| Check | Severity | Details |
|
|
119
|
+
|-------|----------|---------|
|
|
120
|
+
| HTTPS | FAIL | All pages must use HTTPS |
|
|
121
|
+
| Response time | WARNING | Flag pages > 3s response time |
|
|
122
|
+
| Content-Type header | WARNING | Must include charset |
|
|
123
|
+
| HTML validity | SUGGESTION | Flag obvious HTML errors |
|
|
124
|
+
| Viewport meta | FAIL | Required for mobile |
|
|
125
|
+
| `lang` attribute | WARNING | `<html lang="...">` must be present |
|
|
126
|
+
|
|
127
|
+
### Crawl Directives
|
|
128
|
+
|
|
129
|
+
| Check | Severity | Details |
|
|
130
|
+
|-------|----------|---------|
|
|
131
|
+
| robots.txt accessible | WARNING | Should be present at /robots.txt |
|
|
132
|
+
| Sitemap in robots.txt | SUGGESTION | Sitemap URL should be declared |
|
|
133
|
+
| noindex on important pages | FAIL | Hotel pages should be indexable |
|
|
134
|
+
| nofollow on internal links | WARNING | Internal links should pass equity |
|
|
135
|
+
|
|
136
|
+
### Hotel-Specific SEO
|
|
137
|
+
|
|
138
|
+
| Check | Severity | Details |
|
|
139
|
+
|-------|----------|---------|
|
|
140
|
+
| Room pages linked from homepage | WARNING | Key pages should be 1-2 clicks from home |
|
|
141
|
+
| Booking CTA present | SUGGESTION | Hotel pages should have clear booking paths |
|
|
142
|
+
| Location/address visible | WARNING | Important for local SEO |
|
|
143
|
+
| Review markup visible | SUGGESTION | Social proof in search results |
|
|
144
|
+
| Multi-language support | WARNING | hreflang for international hotels |
|
|
145
|
+
|
|
146
|
+
## Output Format
|
|
147
|
+
|
|
148
|
+
### CLI (default)
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
SEO Audit Report
|
|
152
|
+
================
|
|
153
|
+
Source: --sitemap https://www.cantovallarta.com/sitemap-0.xml
|
|
154
|
+
URLs audited: 24
|
|
155
|
+
Timestamp: 2026-05-29T06:40:00Z
|
|
156
|
+
|
|
157
|
+
--- https://www.cantovallarta.com/ ---
|
|
158
|
+
[FAIL] Missing <meta name="description">
|
|
159
|
+
[WARNING] Title too long (68 chars, optimal: 50-60)
|
|
160
|
+
[WARNING] Missing hreflang tags
|
|
161
|
+
[PASS] Canonical URL present
|
|
162
|
+
[PASS] HTTPS
|
|
163
|
+
[PASS] Single H1
|
|
164
|
+
|
|
165
|
+
--- Summary ---
|
|
166
|
+
Total URLs: 24
|
|
167
|
+
Critical: 3
|
|
168
|
+
Warnings: 12
|
|
169
|
+
Suggestions: 8
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Remediation Guidance
|
|
173
|
+
|
|
174
|
+
For each FAIL or WARNING, include:
|
|
175
|
+
|
|
176
|
+
1. **What is wrong** — specific issue
|
|
177
|
+
2. **Why it matters** — SEO impact
|
|
178
|
+
3. **How to fix** — exact code snippet
|
|
179
|
+
|
|
180
|
+
### Example
|
|
181
|
+
|
|
182
|
+
```text
|
|
183
|
+
FAIL: Missing <meta name="description"> on /rooms/ocean-suite
|
|
184
|
+
|
|
185
|
+
Why: Without a meta description, Google auto-generates one from page content.
|
|
186
|
+
This often produces poor snippets that reduce click-through rate.
|
|
187
|
+
|
|
188
|
+
Fix: Add to <head>:
|
|
189
|
+
<meta name="description" content="Ocean Suite at Canto Vallarta — king bed,
|
|
190
|
+
ocean view balcony, and private jacuzzi. Book direct for best rate.">
|
|
191
|
+
```
|
|
@@ -3,6 +3,7 @@ entries:
|
|
|
3
3
|
- src: opencode/opencode.jsonc
|
|
4
4
|
dest: .opencode/opencode.jsonc
|
|
5
5
|
strategy: overwrite
|
|
6
|
+
globalStrategy: merge-json
|
|
6
7
|
- src: opencode/agents
|
|
7
8
|
dest: .opencode/agents
|
|
8
9
|
strategy: overwrite
|
|
@@ -15,4 +16,4 @@ entries:
|
|
|
15
16
|
strategy: overwrite
|
|
16
17
|
- src: opencode/skills
|
|
17
18
|
dest: .opencode/skills
|
|
18
|
-
strategy: overwrite
|
|
19
|
+
strategy: overwrite
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Model configuration for Agy preset (experimental)
|
|
2
|
+
target: agy
|
|
3
|
+
agents:
|
|
4
|
+
architect:
|
|
5
|
+
claude: claude-opus-4-7
|
|
6
|
+
opencode: opencode-go/deepseek-v4-pro
|
|
7
|
+
codex: gpt-5.5
|
|
8
|
+
gemini: gemini-2.5-pro
|
|
9
|
+
cursor: gpt-5.5
|
|
10
|
+
agy: gemini-2.5-pro
|
|
11
|
+
implementer:
|
|
12
|
+
claude: claude-sonnet-4-6
|
|
13
|
+
opencode: opencode-go/mimo-v2.5-pro
|
|
14
|
+
codex: gpt-5.3-codex
|
|
15
|
+
gemini: gemini-2.5-flash
|
|
16
|
+
cursor: gpt-5.3
|
|
17
|
+
agy: gemini-2.5-flash
|
|
18
|
+
tester:
|
|
19
|
+
claude: claude-sonnet-4-6
|
|
20
|
+
opencode: opencode-go/minimax-m2.7
|
|
21
|
+
codex: gpt-5.3-codex
|
|
22
|
+
gemini: gemini-2.5-flash
|
|
23
|
+
cursor: gpt-5.3
|
|
24
|
+
agy: gemini-2.5-flash
|
|
25
|
+
orchestrator:
|
|
26
|
+
claude: claude-sonnet-4-6
|
|
27
|
+
opencode: opencode-go/deepseek-v4-pro
|
|
28
|
+
codex: gpt-5.2
|
|
29
|
+
gemini: gemini-2.5-pro
|
|
30
|
+
cursor: gpt-5.2
|
|
31
|
+
agy: gemini-2.5-pro
|
|
32
|
+
reviewer:
|
|
33
|
+
claude: claude-sonnet-4-6
|
|
34
|
+
opencode: opencode-go/qwen3.6-plus
|
|
35
|
+
codex: gpt-5.4
|
|
36
|
+
gemini: gemini-2.5-pro
|
|
37
|
+
cursor: gpt-5.4
|
|
38
|
+
agy: gemini-2.5-pro
|
|
39
|
+
docs:
|
|
40
|
+
claude: claude-haiku-4-5-20251001
|
|
41
|
+
opencode: opencode-go/qwen3.6-plus
|
|
42
|
+
codex: gpt-5.4-mini
|
|
43
|
+
gemini: gemini-2.5-flash
|
|
44
|
+
cursor: gpt-5.4-mini
|
|
45
|
+
agy: gemini-2.5-flash
|
|
46
|
+
task-coach:
|
|
47
|
+
claude: claude-haiku-4-5-20251001
|
|
48
|
+
opencode: opencode-go/kimi-k2.6
|
|
49
|
+
codex: gpt-5.4-mini
|
|
50
|
+
gemini: gemini-2.5-flash
|
|
51
|
+
cursor: gpt-5.4-mini
|
|
52
|
+
agy: gemini-2.5-flash
|
|
53
|
+
repo-explorer:
|
|
54
|
+
claude: claude-haiku-4-5-20251001
|
|
55
|
+
opencode: opencode-go/qwen3.6-plus
|
|
56
|
+
codex: gpt-5.4-mini
|
|
57
|
+
gemini: gemini-2.5-flash
|
|
58
|
+
cursor: gpt-5.4-mini
|
|
59
|
+
agy: gemini-2.5-flash
|
|
@@ -29,13 +29,13 @@ agents:
|
|
|
29
29
|
cursor: gpt-5.2
|
|
30
30
|
reviewer:
|
|
31
31
|
claude: claude-sonnet-4-6
|
|
32
|
-
opencode: opencode-go/
|
|
32
|
+
opencode: opencode-go/qwen3.6-plus
|
|
33
33
|
codex: gpt-5.4
|
|
34
34
|
gemini: gemini-2.5-pro
|
|
35
35
|
cursor: gpt-5.4
|
|
36
36
|
docs:
|
|
37
37
|
claude: claude-haiku-4-5-20251001
|
|
38
|
-
opencode: opencode-go/
|
|
38
|
+
opencode: opencode-go/qwen3.6-plus
|
|
39
39
|
codex: gpt-5.4-mini
|
|
40
40
|
gemini: gemini-2.5-flash
|
|
41
41
|
cursor: gpt-5.4-mini
|
|
@@ -47,7 +47,7 @@ agents:
|
|
|
47
47
|
cursor: gpt-5.4-mini
|
|
48
48
|
repo-explorer:
|
|
49
49
|
claude: claude-haiku-4-5-20251001
|
|
50
|
-
opencode: opencode-go/qwen3.
|
|
50
|
+
opencode: opencode-go/qwen3.6-plus
|
|
51
51
|
codex: gpt-5.4-mini
|
|
52
52
|
gemini: gemini-2.5-flash
|
|
53
53
|
cursor: gpt-5.4-mini
|
|
@@ -30,13 +30,13 @@ agents:
|
|
|
30
30
|
cursor: gpt-5.2
|
|
31
31
|
reviewer:
|
|
32
32
|
claude: claude-sonnet-4-6
|
|
33
|
-
opencode: opencode-go/
|
|
33
|
+
opencode: opencode-go/qwen3.6-plus
|
|
34
34
|
codex: gpt-5.4
|
|
35
35
|
gemini: gemini-2.5-pro
|
|
36
36
|
cursor: gpt-5.4
|
|
37
37
|
docs:
|
|
38
38
|
claude: claude-haiku-4-5-20251001
|
|
39
|
-
opencode: opencode-go/
|
|
39
|
+
opencode: opencode-go/qwen3.6-plus
|
|
40
40
|
codex: gpt-5.4-mini
|
|
41
41
|
gemini: gemini-2.5-flash
|
|
42
42
|
cursor: gpt-5.4-mini
|
|
@@ -48,7 +48,7 @@ agents:
|
|
|
48
48
|
cursor: gpt-5.4-mini
|
|
49
49
|
repo-explorer:
|
|
50
50
|
claude: claude-haiku-4-5-20251001
|
|
51
|
-
opencode: opencode-go/qwen3.
|
|
51
|
+
opencode: opencode-go/qwen3.6-plus
|
|
52
52
|
codex: gpt-5.4-mini
|
|
53
53
|
gemini: gemini-2.5-flash
|
|
54
54
|
cursor: gpt-5.4-mini
|
|
@@ -29,13 +29,13 @@ agents:
|
|
|
29
29
|
cursor: gpt-5.2
|
|
30
30
|
reviewer:
|
|
31
31
|
claude: claude-sonnet-4-6
|
|
32
|
-
opencode: opencode-go/
|
|
32
|
+
opencode: opencode-go/qwen3.6-plus
|
|
33
33
|
codex: gpt-5.4
|
|
34
34
|
gemini: gemini-2.5-pro
|
|
35
35
|
cursor: gpt-5.4
|
|
36
36
|
docs:
|
|
37
37
|
claude: claude-haiku-4-5-20251001
|
|
38
|
-
opencode: opencode-go/
|
|
38
|
+
opencode: opencode-go/qwen3.6-plus
|
|
39
39
|
codex: gpt-5.4-mini
|
|
40
40
|
gemini: gemini-2.5-flash
|
|
41
41
|
cursor: gpt-5.4-mini
|
|
@@ -47,7 +47,7 @@ agents:
|
|
|
47
47
|
cursor: gpt-5.4-mini
|
|
48
48
|
repo-explorer:
|
|
49
49
|
claude: claude-haiku-4-5-20251001
|
|
50
|
-
opencode: opencode-go/qwen3.
|
|
50
|
+
opencode: opencode-go/qwen3.6-plus
|
|
51
51
|
codex: gpt-5.4-mini
|
|
52
52
|
gemini: gemini-2.5-flash
|
|
53
53
|
cursor: gpt-5.4-mini
|
|
@@ -29,13 +29,13 @@ agents:
|
|
|
29
29
|
cursor: gpt-5.2
|
|
30
30
|
reviewer:
|
|
31
31
|
claude: claude-sonnet-4-6
|
|
32
|
-
opencode: opencode-go/
|
|
32
|
+
opencode: opencode-go/qwen3.6-plus
|
|
33
33
|
codex: gpt-5.4
|
|
34
34
|
gemini: gemini-2.5-pro
|
|
35
35
|
cursor: gpt-5.4
|
|
36
36
|
docs:
|
|
37
37
|
claude: claude-haiku-4-5-20251001
|
|
38
|
-
opencode: opencode-go/
|
|
38
|
+
opencode: opencode-go/qwen3.6-plus
|
|
39
39
|
codex: gpt-5.4-mini
|
|
40
40
|
gemini: gemini-2.5-flash
|
|
41
41
|
cursor: gpt-5.4-mini
|
|
@@ -47,7 +47,7 @@ agents:
|
|
|
47
47
|
cursor: gpt-5.4-mini
|
|
48
48
|
repo-explorer:
|
|
49
49
|
claude: claude-haiku-4-5-20251001
|
|
50
|
-
opencode: opencode-go/qwen3.
|
|
50
|
+
opencode: opencode-go/qwen3.6-plus
|
|
51
51
|
codex: gpt-5.4-mini
|
|
52
52
|
gemini: gemini-2.5-flash
|
|
53
53
|
cursor: gpt-5.4-mini
|