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)