Add SEO skills 33-34 and fix bugs in skills 19-34

New skills:
- Skill 33: Site migration planner with redirect mapping and monitoring
- Skill 34: Reporting dashboard with HTML charts and Korean executive reports

Bug fixes (Skill 34 - report_aggregator.py):
- Add audit_type fallback for skill identification (was only using audit_id prefix)
- Extract health scores from nested data dict (technical_score, onpage_score, etc.)
- Support subdomain matching in domain filter (blog.ourdigital.org matches ourdigital.org)
- Skip self-referencing DASH- aggregated reports

Bug fixes (Skill 20 - naver_serp_analyzer.py):
- Remove VIEW tab selectors (removed by Naver in 2026)
- Add new section detectors: books (도서), shortform (숏폼), influencer (인플루언서)

Improvements (Skill 34 - dashboard/executive report):
- Add Korean category labels for Chart.js charts (기술 SEO, 온페이지, etc.)
- Add Korean trend labels (개선 중 ↑, 안정 →, 하락 중 ↓)
- Add English→Korean issue description translation layer (20 common patterns)

Documentation improvements:
- Add Korean triggers to 4 skill descriptions (19, 25, 28, 31)
- Expand Skill 32 SKILL.md from 40→143 lines (was 6/10, added workflow, output format, limitations)
- Add output format examples to Skills 27 and 28 SKILL.md
- Add limitations sections to Skills 27 and 28
- Update README.md, CLAUDE.md, AGENTS.md for skills 33-34

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-14 00:01:00 +09:00
parent dbfaa883cd
commit d2d0a2d460
37 changed files with 5462 additions and 56 deletions

View File

@@ -59,11 +59,11 @@ python scripts/naver_serp_analyzer.py --keywords-file keywords.txt --json
```
**Capabilities**:
- Naver section detection (블로그, 카페, 지식iN, 스마트스토어, 브랜드존, VIEW탭)
- Naver section detection (블로그, 카페, 지식iN, 스마트스토어, 브랜드존, 도서, 숏폼, 인플루언서)
- Section priority mapping (which sections appear above fold)
- Content type distribution per section
- Brand zone presence detection
- VIEW tab content analysis
- Shortform/influencer content analysis
## Ahrefs MCP Tools Used

View File

@@ -80,13 +80,6 @@ NAVER_SECTION_SELECTORS: dict[str, list[str]] = {
"type_brand",
"sc_new.sp_brand",
],
"view_tab": [
"sp_view",
"view_widget",
"sc_new.sp_view",
"type_view",
"api_subject_view",
],
"news": [
"sp_nnews",
"news_widget",
@@ -132,6 +125,26 @@ NAVER_SECTION_SELECTORS: dict[str, list[str]] = {
"type_ad",
"nx_ad",
],
"books": [
"sp_book",
"sc_new.sp_book",
"type_book",
"api_subject_book",
"nx_book",
],
"shortform": [
"sp_shortform",
"sc_new.sp_shortform",
"type_shortform",
"sp_shorts",
"type_shorts",
],
"influencer": [
"sp_influencer",
"sc_new.sp_influencer",
"type_influencer",
"api_subject_influencer",
],
}
# Section display names in Korean
@@ -141,13 +154,15 @@ SECTION_DISPLAY_NAMES: dict[str, str] = {
"knowledge_in": "지식iN",
"smart_store": "스마트스토어",
"brand_zone": "브랜드존",
"view_tab": "VIEW",
"news": "뉴스",
"encyclopedia": "백과사전",
"image": "이미지",
"video": "동영상",
"place": "플레이스",
"ad": "광고",
"books": "도서",
"shortform": "숏폼",
"influencer": "인플루언서",
}
# Default headers for Naver requests
@@ -199,7 +214,6 @@ class NaverSerpResult:
above_fold_sections: list[str] = field(default_factory=list)
ad_count: int = 0
dominant_section: str = ""
has_view_tab: bool = False
has_place_section: bool = False
timestamp: str = ""
@@ -485,7 +499,6 @@ class NaverSerpAnalyzer:
ad_count = sum(s.item_count for s in ad_sections) if ad_sections else 0
# Check special sections
has_view = any(s.section_type == "view_tab" for s in sections)
has_place = any(s.section_type == "place" for s in sections)
dominant = self._find_dominant_section(sections)
@@ -499,7 +512,6 @@ class NaverSerpAnalyzer:
above_fold_sections=above_fold,
ad_count=ad_count,
dominant_section=dominant,
has_view_tab=has_view,
has_place_section=has_place,
)
return result
@@ -534,7 +546,6 @@ def print_rich_report(result: NaverSerpResult) -> None:
summary_table.add_row("Brand Zone", "Yes" if result.brand_zone_present else "No")
if result.brand_zone_brand:
summary_table.add_row("Brand Name", result.brand_zone_brand)
summary_table.add_row("VIEW Tab", "Yes" if result.has_view_tab else "No")
summary_table.add_row("Place Section", "Yes" if result.has_place_section else "No")
summary_table.add_row("Dominant Section", result.dominant_section or "N/A")
console.print(summary_table)

View File

@@ -17,7 +17,7 @@ Analyze search engine result page composition for Google and Naver. Detect SERP
2. **Competitor Position Mapping** - Extract domains, positions, content types for top organic results
3. **Opportunity Scoring** - Score SERP opportunity (0-100) based on feature landscape and competition
4. **Search Intent Validation** - Infer intent (informational, navigational, commercial, transactional, local) from SERP composition
5. **Naver SERP Composition** - Detect sections (blog, cafe, knowledge iN, Smart Store, brand zone, VIEW tab), map section priority, analyze brand zone presence
5. **Naver SERP Composition** - Detect sections (blog, cafe, knowledge iN, Smart Store, brand zone, books, shortform, influencer), map section priority, analyze brand zone presence
## MCP Tool Usage
@@ -53,7 +53,7 @@ WebFetch: Fetch Naver SERP HTML for section analysis
### 2. Naver SERP Analysis
1. Fetch Naver search page for the target keyword
2. Detect SERP sections (blog, cafe, knowledge iN, Smart Store, brand zone, VIEW tab, news, encyclopedia)
2. Detect SERP sections (blog, cafe, knowledge iN, Smart Store, brand zone, news, encyclopedia, books, shortform, influencer)
3. Map section priority (above-fold order)
4. Check brand zone presence and extract brand name
5. Count items per section