feat(reference-curator): Add pipeline orchestrator and refactor skill format

Pipeline Orchestrator:
- Add 07-pipeline-orchestrator skill with code/CLAUDE.md and desktop/SKILL.md
- Add /reference-curator-pipeline slash command for full workflow automation
- Add pipeline_runs and pipeline_iteration_tracker tables to schema.sql
- Add v_pipeline_status and v_pipeline_iterations views
- Add pipeline_config.yaml configuration template
- Update AGENTS.md with Reference Curator Skills section
- Update claude-project files with pipeline documentation

Skill Format Refactoring:
- Extract YAML frontmatter from SKILL.md files to separate skill.yaml
- Add tools/ directories with MCP tool documentation
- Update SKILL-FORMAT-REQUIREMENTS.md with new structure
- Add migrate-skill-structure.py script for format conversion

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 01:01:02 +07:00
parent 243b9d851c
commit d1cd1298a8
91 changed files with 2475 additions and 281 deletions

View File

@@ -139,6 +139,32 @@ Task 2: general-purpose - "Implement the planned skill" # Needs Task 1 result
- Skills export data to Working with AI database - Skills export data to Working with AI database
- Check schema compatibility before creating pages - Check schema compatibility before creating pages
### Reference Curator Skills (90-99)
- Use **reference-curator-pipeline** for full automated curation workflows
- Runs as background task, coordinates all 6 skills in sequence
- Handles QA loops automatically (max 3 refactor, 2 deep_research iterations)
- Supports three input modes: topic (full pipeline), URLs (skip discovery), manifest (resume)
```
# Full pipeline from topic
/reference-curator-pipeline "Claude Code best practices" --max-sources 5
# Direct URL crawling (skip discovery)
/reference-curator-pipeline https://docs.anthropic.com/en/docs/prompt-caching
# Resume from manifest
/reference-curator-pipeline ./manifest.json --auto-approve
```
Individual skills can still be run separately:
- `/reference-discovery` - Search and validate sources
- `/web-crawler` - Crawl URLs with auto-backend selection
- `/content-repository` - Manage stored documents
- `/content-distiller` - Summarize and extract key concepts
- `/quality-reviewer` - QA scoring and routing
- `/markdown-exporter` - Export to project files or JSONL
## Background Agents ## Background Agents
For long-running tasks, use `run_in_background: true`: For long-running tasks, use `run_in_background: true`:

View File

@@ -73,7 +73,24 @@ This is a Claude Skills collection repository containing:
|---|-------|---------|---------| |---|-------|---------|---------|
| 90 | reference-curator | Modular skill suite for reference documentation | See sub-skills below | | 90 | reference-curator | Modular skill suite for reference documentation | See sub-skills below |
**Sub-skills (installed via `./install.sh`):** **Pipeline Orchestrator (Recommended):**
| Command | Purpose |
|---------|---------|
| `/reference-curator-pipeline` | Full pipeline orchestration with QA loop handling |
```
# Full pipeline from topic
/reference-curator-pipeline "Claude Code best practices" --max-sources 5
# From URLs (skip discovery)
/reference-curator-pipeline https://docs.anthropic.com/en/docs/prompt-caching
# With auto-approve and fine-tuning output
/reference-curator-pipeline "MCP servers" --auto-approve --export-format fine_tuning
```
**Individual Sub-skills (installed via `./install.sh`):**
| Skill | Command | Purpose | | Skill | Command | Purpose |
|-------|---------|---------| |-------|---------|---------|
@@ -83,6 +100,7 @@ This is a Claude Skills collection repository containing:
| content-distiller | `/content-distiller` | Summarization & key concept extraction | | content-distiller | `/content-distiller` | Summarization & key concept extraction |
| quality-reviewer | `/quality-reviewer` | QA loop with approve/refactor/research routing | | quality-reviewer | `/quality-reviewer` | QA loop with approve/refactor/research routing |
| markdown-exporter | `/markdown-exporter` | Export to markdown or JSONL for fine-tuning | | markdown-exporter | `/markdown-exporter` | Export to markdown or JSONL for fine-tuning |
| pipeline-orchestrator | `/reference-curator-pipeline` | Full 6-skill workflow orchestration |
## Dual-Platform Skill Structure ## Dual-Platform Skill Structure
@@ -96,7 +114,11 @@ XX-skill-name/
│ └── references/ # Documentation │ └── references/ # Documentation
├── desktop/ # Claude Desktop version ├── desktop/ # Claude Desktop version
│ ├── SKILL.md # MCP-focused directive (YAML frontmatter) │ ├── skill.yaml # Metadata (name, description, allowed-tools, license)
│ ├── SKILL.md # MCP-focused directive (content only, no frontmatter)
│ ├── tools/ # MCP tool documentation & configs
│ │ ├── {tool-name}.md # Tool usage docs (e.g., firecrawl.md)
│ │ └── {tool-name}.yaml # Tool config (optional)
│ ├── references/ # Guidance docs │ ├── references/ # Guidance docs
│ └── examples/ # Usage examples │ └── examples/ # Usage examples
@@ -107,10 +129,28 @@ XX-skill-name/
| Aspect | `code/` | `desktop/` | | Aspect | `code/` | `desktop/` |
|--------|---------|------------| |--------|---------|------------|
| Directive | CLAUDE.md | SKILL.md (YAML) | | Directive | CLAUDE.md | SKILL.md (content) |
| Metadata | In CLAUDE.md | skill.yaml |
| Tool docs | N/A | tools/ directory |
| Execution | Direct Bash/Python | MCP tools only | | Execution | Direct Bash/Python | MCP tools only |
| Scripts | Required | Reference only | | Scripts | Required | Reference only |
### skill.yaml Schema
```yaml
# Required fields
name: string # Skill identifier
description: string # Trigger description (can be multi-line with |)
# Optional fields
allowed-tools: # List of permitted MCP/Claude tools
- mcp__firecrawl__*
- Read
- Write
license: string # MIT, Internal-use Only, etc.
triggers: [] # Explicit trigger keywords
```
### Development Workflow ### Development Workflow
1. **Build Claude Code version first** - Full automation with scripts 1. **Build Claude Code version first** - Full automation with scripts
@@ -166,6 +206,7 @@ our-claude-skills/
│ │ ├── 04-content-distiller/ │ │ ├── 04-content-distiller/
│ │ ├── 05-quality-reviewer/ │ │ ├── 05-quality-reviewer/
│ │ ├── 06-markdown-exporter/ │ │ ├── 06-markdown-exporter/
│ │ ├── 07-pipeline-orchestrator/ # Full pipeline coordination
│ │ ├── shared/ # Config templates & MySQL schema │ │ ├── shared/ # Config templates & MySQL schema
│ │ └── install.sh # Cross-machine installer │ │ └── install.sh # Cross-machine installer
│ │ │ │

View File

@@ -1,9 +1,3 @@
---
name: ourdigital-research-publisher
description: |
End-to-end research-to-publication workflow for OurDigital channels. Transforms questions into comprehensive research, then Korean/English blog posts. Use when user wants to: (1) Research a topic deeply, (2) Create research papers from conversations, (3) Write blog posts for OurDigital/Ghost, (4) Execute "research to publish" workflow, (5) Save research to Notion and export to Ulysses. Triggers: "research this", "write a blog about", "publish to OurDigital", "deep dive into", "연구해줘", "블로그 작성", "포스팅 초안".
---
# OurDigital Research-to-Publisher Workflow # OurDigital Research-to-Publisher Workflow
Transform questions into comprehensive research papers and polished blog posts for OurDigital channels. Transform questions into comprehensive research papers and polished blog posts for OurDigital channels.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: ourdigital-research-publisher
description: |
End-to-end research-to-publication workflow for OurDigital channels. Transforms questions into comprehensive research, then Korean/English blog posts. Use when user wants to: (1) Research a topic deeply, (2) Create research papers from conversations, (3) Write blog posts for OurDigital/Ghost, (4) Execute "research to publish" workflow, (5) Save research to Notion and export to Ulysses. Triggers: "research this", "write a blog about", "publish to OurDigital", "deep dive into", "연구해줘", "블로그 작성", "포스팅 초안".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,9 +1,3 @@
---
name: ourdigital-visual-storytelling
description: Creates sophisticated featured image prompts for OurDigital blogs (blog.ourdigital.org, journal.ourdigital.org, ourstory.day) that capture philosophical depth through minimalist visual metaphors. Specializes in translating complex essays about humanity, technology, and culture into contemplative visual narratives using Korean-Western aesthetic fusion. Use when creating blog featured images that require intellectual sophistication and conceptual abstraction.
license: MIT
---
# OurDigital Visual Storytelling # OurDigital Visual Storytelling
Transform philosophical essays into sophisticated visual narratives through minimalist, conceptually rich featured images. Transform philosophical essays into sophisticated visual narratives through minimalist, conceptually rich featured images.

View File

@@ -0,0 +1,11 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: ourdigital-visual-storytelling
description: |
Creates sophisticated featured image prompts for OurDigital blogs (blog.ourdigital.org, journal.ourdigital.org, ourstory.day) that capture philosophical depth through minimalist visual metaphors. Specializes in translating complex essays about humanity, technology, and culture into contemplative visual narratives using Korean-Western aesthetic fusion. Use when creating blog featured images that require intellectual sophistication and conceptual abstraction.
# Optional fields
license: MIT
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: research-to-presentation
description: Transforms Notion research content into branded presentations through an automated workflow. Collects research from Notion pages/databases, synthesizes content to extract key topics and agenda items, creates presentation structure with slide plans, and generates branded PPT/Figma presentations. Use when converting research into meeting materials, creating data-driven presentations from Notion content, transforming documentation into executive presentations, or building slide decks from scattered research notes.
---
# Research to Presentation Workflow # Research to Presentation Workflow
Automated pipeline for transforming Notion research into professional presentations with brand consistency. Automated pipeline for transforming Notion research into professional presentations with brand consistency.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: research-to-presentation
description: |
Transforms Notion research content into branded presentations through an automated workflow. Collects research from Notion pages/databases, synthesizes content to extract key topics and agenda items, creates presentation structure with slide plans, and generates branded PPT/Figma presentations. Use when converting research into meeting materials, creating data-driven presentations from Notion content, transforming documentation into executive presentations, or building slide decks from scattered research notes.
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,9 +1,3 @@
---
name: seo-technical-audit
description: "Technical SEO auditor for crawlability fundamentals. Triggers: robots.txt, sitemap validation, crawlability, indexing check, technical SEO."
allowed-tools: mcp__firecrawl__*, mcp__perplexity__*, mcp__notion__*
---
# SEO Technical Audit # SEO Technical Audit
## Purpose ## Purpose

View File

@@ -0,0 +1,13 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-technical-audit
description: |
Technical SEO auditor for crawlability fundamentals. Triggers: robots.txt, sitemap validation, crawlability, indexing check, technical SEO.
# Optional fields
allowed-tools:
- mcp__firecrawl__*
- mcp__perplexity__*
- mcp__notion__*
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Firecrawl
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Notion
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Perplexity
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: seo-on-page-audit
description: "On-page SEO analyzer for meta tags, headings, links, images, and Open Graph. Triggers: on-page SEO, meta tags, title tag, heading structure, alt text."
allowed-tools: mcp__firecrawl__*, mcp__perplexity__*, mcp__notion__*
---
# SEO On-Page Audit # SEO On-Page Audit
## Purpose ## Purpose

View File

@@ -0,0 +1,13 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-on-page-audit
description: |
On-page SEO analyzer for meta tags, headings, links, images, and Open Graph. Triggers: on-page SEO, meta tags, title tag, heading structure, alt text.
# Optional fields
allowed-tools:
- mcp__firecrawl__*
- mcp__perplexity__*
- mcp__notion__*
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Firecrawl
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Notion
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Perplexity
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: seo-local-audit
description: "Local SEO auditor for NAP consistency, Google Business Profile, citations, and LocalBusiness schema. Triggers: local SEO, Google Business Profile, GBP, NAP, citations, local rankings."
allowed-tools: mcp__firecrawl__*, mcp__perplexity__*, mcp__notion__*
---
# SEO Local Audit # SEO Local Audit
## Purpose ## Purpose

View File

@@ -0,0 +1,13 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-local-audit
description: |
Local SEO auditor for NAP consistency, Google Business Profile, citations, and LocalBusiness schema. Triggers: local SEO, Google Business Profile, GBP, NAP, citations, local rankings.
# Optional fields
allowed-tools:
- mcp__firecrawl__*
- mcp__perplexity__*
- mcp__notion__*
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Firecrawl
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Notion
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Perplexity
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: seo-schema-validator
description: "Structured data validator for JSON-LD, Microdata, and RDFa. Triggers: validate schema, structured data, JSON-LD, rich results, schema.org."
allowed-tools: mcp__firecrawl__*, mcp__perplexity__*
---
# SEO Schema Validator # SEO Schema Validator
## Purpose ## Purpose

View File

@@ -0,0 +1,12 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-schema-validator
description: |
Structured data validator for JSON-LD, Microdata, and RDFa. Triggers: validate schema, structured data, JSON-LD, rich results, schema.org.
# Optional fields
allowed-tools:
- mcp__firecrawl__*
- mcp__perplexity__*
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Firecrawl
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Perplexity
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: seo-schema-generator
description: "Schema markup generator for JSON-LD structured data. Triggers: generate schema, create JSON-LD, add structured data, schema markup."
allowed-tools: mcp__firecrawl__*, mcp__perplexity__*
---
# SEO Schema Generator # SEO Schema Generator
## Purpose ## Purpose

View File

@@ -0,0 +1,12 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-schema-generator
description: |
Schema markup generator for JSON-LD structured data. Triggers: generate schema, create JSON-LD, add structured data, schema markup.
# Optional fields
allowed-tools:
- mcp__firecrawl__*
- mcp__perplexity__*
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Firecrawl
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Perplexity
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: seo-core-web-vitals
description: "Core Web Vitals analyzer for LCP, FID, CLS, INP performance metrics. Triggers: Core Web Vitals, page speed, LCP, CLS, FID, INP, performance."
allowed-tools: mcp__firecrawl__*, mcp__perplexity__*
---
# SEO Core Web Vitals # SEO Core Web Vitals
## Purpose ## Purpose

View File

@@ -0,0 +1,12 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-core-web-vitals
description: |
Core Web Vitals analyzer for LCP, FID, CLS, INP performance metrics. Triggers: Core Web Vitals, page speed, LCP, CLS, FID, INP, performance.
# Optional fields
allowed-tools:
- mcp__firecrawl__*
- mcp__perplexity__*
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Firecrawl
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Perplexity
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: seo-search-console
description: "Google Search Console data analyzer for rankings, CTR, impressions, and index coverage. Triggers: Search Console, GSC, rankings, search performance, impressions, CTR."
allowed-tools: mcp__perplexity__*, mcp__notion__*
---
# SEO Search Console # SEO Search Console
## Purpose ## Purpose

View File

@@ -0,0 +1,12 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-search-console
description: |
Google Search Console data analyzer for rankings, CTR, impressions, and index coverage. Triggers: Search Console, GSC, rankings, search performance, impressions, CTR.
# Optional fields
allowed-tools:
- mcp__perplexity__*
- mcp__notion__*
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Notion
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Perplexity
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: seo-gateway-strategist
description: Creates comprehensive SEO-focused gateway page strategies for Korean medical/service websites
license: OurDigital internal-use ONLY
---
# SEO Gateway Page Strategist # SEO Gateway Page Strategist
This skill helps you create comprehensive SEO-focused gateway page strategies for Korean medical/service websites, optimized for both Naver and Google. This skill helps you create comprehensive SEO-focused gateway page strategies for Korean medical/service websites, optimized for both Naver and Google.

View File

@@ -0,0 +1,11 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: seo-gateway-strategist
description: |
Creates comprehensive SEO-focused gateway page strategies for Korean medical/service websites
# Optional fields
license: OurDigital internal-use ONLY
# triggers: [] # TODO: Extract from description

View File

@@ -1,9 +1,3 @@
---
name: gateway-page-content-builder
description: Systematic content generation framework for SEO-optimized gateway pages with local service focus
license: OurDigital internal-use ONLY
---
# Gateway Page Content Builder # Gateway Page Content Builder
A comprehensive skill for building high-quality, SEO-optimized gateway page content for local services, medical practices, and business locations. A comprehensive skill for building high-quality, SEO-optimized gateway page content for local services, medical practices, and business locations.

View File

@@ -0,0 +1,11 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: gateway-page-content-builder
description: |
Systematic content generation framework for SEO-optimized gateway pages with local service focus
# Optional fields
license: OurDigital internal-use ONLY
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: gtm-audit
description: Automated Google Tag Manager audit and validation toolkit. Use when auditing GTM container installations, verifying tag firing, debugging dataLayer events, form tracking validation, e-commerce checkout flow testing, or generating tag implementation reports. Triggers on GTM audit, tag debugging, dataLayer inspection, form submission tracking, checkout funnel analysis, conversion tracking validation, GA4/Meta/LinkedIn pixel verification requests.
---
# GTM Audit Skill # GTM Audit Skill
Automated audit workflow for GTM containers using **Chrome DevTools MCP** for browser inspection and **DTM Agent MCP** for GTM API operations. Automated audit workflow for GTM containers using **Chrome DevTools MCP** for browser inspection and **DTM Agent MCP** for GTM API operations.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: gtm-audit
description: |
Automated Google Tag Manager audit and validation toolkit. Use when auditing GTM container installations, verifying tag firing, debugging dataLayer events, form tracking validation, e-commerce checkout flow testing, or generating tag implementation reports. Triggers on GTM audit, tag debugging, dataLayer inspection, form submission tracking, checkout funnel analysis, conversion tracking validation, GA4/Meta/LinkedIn pixel verification requests.
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,18 +1,3 @@
---
name: gtm-guardian
description: |
Google Tag Manager 태깅 전략 수립부터 구현까지 7단계 워크플로우를 지원하는 SMART Tool.
Triggers:
- GTM 태깅 계획, Tagging Plan 작성, 이벤트 설계
- DataLayer 스키마 설계, dataLayer 구현 가이드
- 사용자 행동 분석, User Behaviour Modeling, KPI 정의
- Event Taxonomy, 이벤트 택소노미, 이벤트 명명 규칙
- GTM 구현 가이드, 태그 설정 체크리스트
- Server-side GTM, sGTM, Stape, Google Tag Gateway
- GA4 이벤트, Meta Pixel, Kakao Pixel, Google Ads 전환 추적
---
# GTM Guardian (Desktop) # GTM Guardian (Desktop)
GTM(Google Tag Manager) 태깅 전략 수립부터 구현까지의 전체 라이프사이클을 지원하는 7단계 워크플로우 스킬. GTM(Google Tag Manager) 태깅 전략 수립부터 구현까지의 전체 라이프사이클을 지원하는 7단계 워크플로우 스킬.

View File

@@ -0,0 +1,18 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: gtm-guardian
description: |
Google Tag Manager 태깅 전략 수립부터 구현까지 7단계 워크플로우를 지원하는 SMART Tool.
Triggers:
- GTM 태깅 계획, Tagging Plan 작성, 이벤트 설계
- DataLayer 스키마 설계, dataLayer 구현 가이드
- 사용자 행동 분석, User Behaviour Modeling, KPI 정의
- Event Taxonomy, 이벤트 택소노미, 이벤트 명명 규칙
- GTM 구현 가이드, 태그 설정 체크리스트
- Server-side GTM, sGTM, Stape, Google Tag Gateway
- GA4 이벤트, Meta Pixel, Kakao Pixel, Google Ads 전환 추적
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,9 +1,3 @@
---
name: notion-organizer
description: Notion workspace management agent for organizing, restructuring, consolidating, and maintaining databases and pages. Use when user asks to search Notion, organize databases, clean up properties, migrate data, merge databases, audit schemas, or manage Notion content. Activates for keywords like Notion, database, knowledge base, wiki, workspace organization.
allowed-tools: mcp__notion__*, Read, Write, Edit, Bash(python:*), Bash(pip:*)
---
# Notion Organizer Skill # Notion Organizer Skill
## Purpose ## Purpose

View File

@@ -0,0 +1,16 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: notion-organizer
description: |
Notion workspace management agent for organizing, restructuring, consolidating, and maintaining databases and pages. Use when user asks to search Notion, organize databases, clean up properties, migrate data, merge databases, audit schemas, or manage Notion content. Activates for keywords like Notion, database, knowledge base, wiki, workspace organization.
# Optional fields
allowed-tools:
- mcp__notion__*
- Read
- Write
- Edit
- Bash(python:*)
- Bash(pip:*)
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Claude Core Tools (Read, Write, Edit, Bash, Glob, Grep)
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# Notion
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: notion-writer
description: Push markdown content to Notion pages or databases. Supports appending to pages, replacing page content, creating database rows, listing accessible content, and getting page/database info. Use when working with Notion documentation, saving reports to Notion, or managing Notion content programmatically.
allowed-tools: Read, Glob, Grep, Write, Edit, Bash
---
# Notion Writer Skill # Notion Writer Skill
Push markdown content to Notion pages or databases via Claude Code. Push markdown content to Notion pages or databases via Claude Code.

View File

@@ -0,0 +1,16 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: notion-writer
description: |
Push markdown content to Notion pages or databases. Supports appending to pages, replacing page content, creating database rows, listing accessible content, and getting page/database info. Use when working with Notion documentation, saving reports to Notion, or managing Notion content programmatically.
# Optional fields
allowed-tools:
- Read
- Glob
- Grep
- Write
- Edit
- Bash
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Claude Core Tools (Read, Write, Edit, Bash, Glob, Grep)
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,9 +1,3 @@
---
name: jamie-brand-editor
description: "Branded content generator for Jamie Plastic Surgery Clinic (제이미성형외과). Creates new marketing content including blog posts, ad copy, social media content, and procedure pages following Jamie's brand voice and Korean medical advertising regulations. Use when generating NEW content for Jamie clinic - triggers: write Jamie blog, create ad copy, draft procedure page, 제이미 블로그 작성, 광고 카피 생성. For reviewing/correcting existing content, use jamie-brand-guardian instead."
license: Internal-use Only
---
# Jamie Brand Editor Skill # Jamie Brand Editor Skill
> **Purpose**: Generate branded content for Jamie Plastic Surgery Clinic > **Purpose**: Generate branded content for Jamie Plastic Surgery Clinic

View File

@@ -0,0 +1,11 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: jamie-brand-editor
description: |
Branded content generator for Jamie Plastic Surgery Clinic (제이미성형외과). Creates new marketing content including blog posts, ad copy, social media content, and procedure pages following Jamie's brand voice and Korean medical advertising regulations. Use when generating NEW content for Jamie clinic - triggers: write Jamie blog, create ad copy, draft procedure page, 제이미 블로그 작성, 광고 카피 생성. For reviewing/correcting existing content, use jamie-brand-guardian instead.
# Optional fields
license: Internal-use Only
# triggers: [] # TODO: Extract from description

View File

@@ -1,9 +1,3 @@
---
name: jamie-brand-guardian
description: "Brand compliance reviewer for Jamie Plastic Surgery Clinic (제이미성형외과). Reviews, corrects, and evaluates EXISTING content for brand compliance, tone/voice alignment, and Korean medical advertising regulations. Use when given content to review - triggers: review this content, check brand compliance, 이 콘텐츠 검토해줘, 브랜드 적합성 평가. For generating NEW content, use jamie-brand-editor instead."
allowed-tools: Read, Glob, Grep, Write, Edit
---
# Jamie Clinic Brand Guardian Skill # Jamie Clinic Brand Guardian Skill
> **브랜드**: 제이미성형외과 (Jamie Plastic Surgery Clinic) > **브랜드**: 제이미성형외과 (Jamie Plastic Surgery Clinic)

View File

@@ -0,0 +1,15 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: jamie-brand-guardian
description: |
Brand compliance reviewer for Jamie Plastic Surgery Clinic (제이미성형외과). Reviews, corrects, and evaluates EXISTING content for brand compliance, tone/voice alignment, and Korean medical advertising regulations. Use when given content to review - triggers: review this content, check brand compliance, 이 콘텐츠 검토해줘, 브랜드 적합성 평가. For generating NEW content, use jamie-brand-editor instead.
# Optional fields
allowed-tools:
- Read
- Glob
- Grep
- Write
- Edit
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Claude Core Tools (Read, Write, Edit, Bash, Glob, Grep)
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,10 +1,3 @@
---
name: jamie-instagram-manager
description: |
Instagram Account Manager for Jamie Plastic Surgery Clinic (제이미성형외과). Manages Instagram presence including: account status analysis, follower engagement (reply/comment suggestions), content planning (3-4x weekly), storytelling ideation, and post boost strategies. Integrates with Instagram Graph API via MCP. Use when managing Jamie's Instagram account - triggers: "Instagram 관리", "인스타그램 댓글", "Instagram engagement", "posting plan", "follower reply", "boost post", "스토리 아이디어". For content generation, use jamie-brand-editor; for compliance review, use jamie-brand-guardian.
license: Internal-use Only
---
# Jamie Instagram Manager Skill # Jamie Instagram Manager Skill
> **Purpose**: Dedicated Instagram Account Manager for Jamie Plastic Surgery Clinic > **Purpose**: Dedicated Instagram Account Manager for Jamie Plastic Surgery Clinic

View File

@@ -0,0 +1,11 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: jamie-instagram-manager
description: |
Instagram Account Manager for Jamie Plastic Surgery Clinic (제이미성형외과). Manages Instagram presence including: account status analysis, follower engagement (reply/comment suggestions), content planning (3-4x weekly), storytelling ideation, and post boost strategies. Integrates with Instagram Graph API via MCP. Use when managing Jamie's Instagram account - triggers: "Instagram 관리", "인스타그램 댓글", "Instagram engagement", "posting plan", "follower reply", "boost post", "스토리 아이디어". For content generation, use jamie-brand-editor; for compliance review, use jamie-brand-guardian.
# Optional fields
license: Internal-use Only
# triggers: [] # TODO: Extract from description

View File

@@ -1,11 +1,3 @@
---
name: jamie-youtube-manager
description: |
YouTube Channel Manager and SEO Auditor for Jamie Plastic Surgery Clinic (제이미성형외과). Includes CLI scripts for API-based channel/video management and SEO audit capabilities. Check video status, get channel statistics, fetch video info from URLs, batch update metadata, and audit videos for SEO optimization (title, description, tags, timestamps, schema). Use when working with Jamie YouTube content - triggers: "YouTube 감사", "유튜브 SEO", "video audit", "check video", "channel status", "영상 최적화", "챕터 확인".
allowed-tools: Read, Glob, Grep, Write, Edit, Bash, WebFetch
license: Internal-use Only
---
# Jamie YouTube Manager Skill # Jamie YouTube Manager Skill
> **Purpose**: YouTube Channel SEO Auditor & Content Manager for Jamie Plastic Surgery Clinic > **Purpose**: YouTube Channel SEO Auditor & Content Manager for Jamie Plastic Surgery Clinic

View File

@@ -0,0 +1,19 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: jamie-youtube-manager
description: |
YouTube Channel Manager and SEO Auditor for Jamie Plastic Surgery Clinic (제이미성형외과). Includes CLI scripts for API-based channel/video management and SEO audit capabilities. Check video status, get channel statistics, fetch video info from URLs, batch update metadata, and audit videos for SEO optimization (title, description, tags, timestamps, schema). Use when working with Jamie YouTube content - triggers: "YouTube 감사", "유튜브 SEO", "video audit", "check video", "channel status", "영상 최적화", "챕터 확인".
# Optional fields
allowed-tools:
- Read
- Glob
- Grep
- Write
- Edit
- Bash
- WebFetch
license: Internal-use Only
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,15 @@
# Claude Core Tools (Read, Write, Edit, Bash, Glob, Grep)
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -0,0 +1,15 @@
# WebFetch
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples

View File

@@ -1,8 +1,3 @@
---
name: jamie-subtitle-editor
description: "YouTube 자막 편집기 for Jamie Plastic Surgery Clinic. SBV 포맷 자막 파일의 오타 교정, 의학 용어 표준화, 챕터 타임스탬프 추출, YouTube 메타데이터 생성을 수행합니다. 자막 교정, subtitle 오타, SBV 편집, 챕터 추출, 유튜브 자막, caption 수정, 타임스탬프 생성 요청 시 사용하세요."
---
# Jamie YouTube Subtitle Editor Skill # Jamie YouTube Subtitle Editor Skill
> **Purpose**: SBV 자막 파일 오타 교정 및 YouTube 메타데이터 생성 > **Purpose**: SBV 자막 파일 오타 교정 및 YouTube 메타데이터 생성

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: jamie-subtitle-editor
description: |
YouTube 자막 편집기 for Jamie Plastic Surgery Clinic. SBV 포맷 자막 파일의 오타 교정, 의학 용어 표준화, 챕터 타임스탬프 추출, YouTube 메타데이터 생성을 수행합니다. 자막 교정, subtitle 오타, SBV 편집, 챕터 추출, 유튜브 자막, caption 수정, 타임스탬프 생성 요청 시 사용하세요.
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: reference-discovery
description: Search and identify authoritative sources for reference materials. Validates source credibility, prioritizes by relevance, and outputs curated URL lists with metadata. Triggers on "find references", "search documentation", "discover sources", "find authoritative materials", "research topic sources".
---
# Reference Discovery # Reference Discovery
Searches for authoritative sources, validates credibility, and produces curated URL lists for crawling. Searches for authoritative sources, validates credibility, and produces curated URL lists for crawling.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: reference-discovery
description: |
Search and identify authoritative sources for reference materials. Validates source credibility, prioritizes by relevance, and outputs curated URL lists with metadata. Triggers on "find references", "search documentation", "discover sources", "find authoritative materials", "research topic sources".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: web-crawler-orchestrator
description: Orchestrates web crawling using Firecrawl MCP. Handles rate limiting, selects crawl strategies, manages formats (HTML/PDF/markdown), and produces raw content with manifests. Triggers on "crawl URLs", "fetch documents", "scrape pages", "download references", "Firecrawl crawl".
---
# Web Crawler Orchestrator # Web Crawler Orchestrator
Manages crawling operations using Firecrawl MCP with rate limiting and format handling. Manages crawling operations using Firecrawl MCP with rate limiting and format handling.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: web-crawler-orchestrator
description: |
Orchestrates web crawling using Firecrawl MCP. Handles rate limiting, selects crawl strategies, manages formats (HTML/PDF/markdown), and produces raw content with manifests. Triggers on "crawl URLs", "fetch documents", "scrape pages", "download references", "Firecrawl crawl".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: content-repository
description: MySQL storage management for reference library. Use when storing crawled content, managing document versions, deduplicating URLs, querying stored references, or tracking document metadata. Triggers on keywords like "store content", "save to database", "check duplicates", "version tracking", "document retrieval", "reference library DB".
---
# Content Repository # Content Repository
Manages MySQL storage for the reference library system. Handles document storage, version control, deduplication, and retrieval. Manages MySQL storage for the reference library system. Handles document storage, version control, deduplication, and retrieval.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: content-repository
description: |
MySQL storage management for reference library. Use when storing crawled content, managing document versions, deduplicating URLs, querying stored references, or tracking document metadata. Triggers on keywords like "store content", "save to database", "check duplicates", "version tracking", "document retrieval", "reference library DB".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: content-distiller
description: Analyzes and distills raw crawled content into concise reference materials. Extracts key concepts, code snippets, and creates structured summaries optimized for prompt engineering use cases. Triggers on "distill content", "summarize document", "extract key concepts", "process raw content", "create reference summary".
---
# Content Distiller # Content Distiller
Transforms raw crawled content into structured, high-quality reference materials. Transforms raw crawled content into structured, high-quality reference materials.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: content-distiller
description: |
Analyzes and distills raw crawled content into concise reference materials. Extracts key concepts, code snippets, and creates structured summaries optimized for prompt engineering use cases. Triggers on "distill content", "summarize document", "extract key concepts", "process raw content", "create reference summary".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: quality-reviewer
description: QA loop for reference library content. Scores distilled materials against prompt engineering quality criteria, routes decisions (approve/refactor/deep_research/reject), and provides actionable feedback. Triggers on "review content", "quality check", "QA review", "assess distilled content", "check reference quality", "refactoring needed".
---
# Quality Reviewer # Quality Reviewer
Evaluates distilled content for quality, routes decisions, and triggers refactoring or additional research when needed. Evaluates distilled content for quality, routes decisions, and triggers refactoring or additional research when needed.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: quality-reviewer
description: |
QA loop for reference library content. Scores distilled materials against prompt engineering quality criteria, routes decisions (approve/refactor/deep_research/reject), and provides actionable feedback. Triggers on "review content", "quality check", "QA review", "assess distilled content", "check reference quality", "refactoring needed".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -1,8 +1,3 @@
---
name: markdown-exporter
description: Exports approved reference content as structured markdown files for project knowledge or fine-tuning datasets. Generates INDEX files, organizes by topic, and maintains cross-references. Triggers on "export references", "generate project files", "create markdown output", "export for fine-tuning", "build knowledge base".
---
# Markdown Exporter # Markdown Exporter
Exports approved content as structured markdown files for Claude Projects or fine-tuning. Exports approved content as structured markdown files for Claude Projects or fine-tuning.

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: markdown-exporter
description: |
Exports approved reference content as structured markdown files for project knowledge or fine-tuning datasets. Generates INDEX files, organizes by topic, and maintains cross-references. Triggers on "export references", "generate project files", "create markdown output", "export for fine-tuning", "build knowledge base".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -0,0 +1,296 @@
# Pipeline Orchestrator
Coordinates the full 6-skill reference curation workflow with QA loop handling.
## Trigger Keywords
"curate references", "full pipeline", "run curation", "reference-curator-pipeline"
## Architecture
```
[Input] → discovery → crawler → repository → distiller ◄──┐
│ │
reviewer │
│ │
┌───────────────────────────────┼─────┤
▼ ▼ ▼ │
APPROVE REJECT REFACTOR ────┤
│ │ │
▼ ▼ DEEP_RESEARCH
export archive │
crawler ─┘
```
## Input Detection
Parse input to determine mode:
```python
def detect_input_mode(input_value):
if input_value.endswith('.json') and os.path.exists(input_value):
return 'manifest'
elif input_value.startswith('http://') or input_value.startswith('https://'):
return 'urls'
else:
return 'topic'
```
## Pipeline Execution
### Stage 1: Reference Discovery (Topic Mode Only)
```bash
# Skip if input mode is 'urls' or 'manifest'
if mode == 'topic':
/reference-discovery "$TOPIC" --max-sources $MAX_SOURCES
# Output: manifest.json
```
### Stage 2: Web Crawler
```bash
# From manifest or URLs
/web-crawler $INPUT --max-pages $MAX_PAGES
# Output: crawled files in ~/reference-library/raw/
```
### Stage 3: Content Repository
```bash
/content-repository store
# Output: documents stored in MySQL or file-based storage
```
### Stage 4: Content Distiller
```bash
/content-distiller all-pending
# Output: distilled content records
```
### Stage 5: Quality Reviewer
```bash
if auto_approve:
/quality-reviewer all-pending --auto-approve --threshold $THRESHOLD
else:
/quality-reviewer all-pending
```
Handle QA decisions:
- **APPROVE**: Add to export queue
- **REFACTOR**: Re-run distiller with feedback (track iteration count)
- **DEEP_RESEARCH**: Run crawler for additional sources, then distill
- **REJECT**: Archive with reason
### Stage 6: Markdown Exporter
```bash
/markdown-exporter $EXPORT_FORMAT
# Output: files in ~/reference-library/exports/
```
## State Management
### Initialize Pipeline State
```python
def init_pipeline_state(run_id, input_value, options):
state = {
"run_id": run_id,
"run_type": detect_input_mode(input_value),
"input_value": input_value,
"status": "running",
"current_stage": "discovery",
"options": options,
"stats": {
"sources_discovered": 0,
"pages_crawled": 0,
"documents_stored": 0,
"documents_distilled": 0,
"approved": 0,
"refactored": 0,
"deep_researched": 0,
"rejected": 0,
"needs_manual_review": 0
},
"started_at": datetime.now().isoformat()
}
save_state(run_id, state)
return state
```
### MySQL State (Preferred)
```sql
INSERT INTO pipeline_runs (run_type, input_value, options)
VALUES ('topic', 'Claude system prompts', '{"max_sources": 10}');
```
### File-Based Fallback
```
~/reference-library/pipeline_state/run_XXX/
├── state.json # Current stage and stats
├── manifest.json # Discovered sources
├── crawl_results.json # Crawled document paths
├── review_log.json # QA decisions per document
└── errors.log # Any errors encountered
```
## QA Loop Logic
```python
MAX_REFACTOR_ITERATIONS = 3
MAX_DEEP_RESEARCH_ITERATIONS = 2
MAX_TOTAL_ITERATIONS = 5
def handle_qa_decision(doc_id, decision, iteration_counts):
refactor_count = iteration_counts.get('refactor', 0)
research_count = iteration_counts.get('deep_research', 0)
total = refactor_count + research_count
if total >= MAX_TOTAL_ITERATIONS:
return 'needs_manual_review'
if decision == 'refactor':
if refactor_count >= MAX_REFACTOR_ITERATIONS:
return 'needs_manual_review'
iteration_counts['refactor'] = refactor_count + 1
return 're_distill'
if decision == 'deep_research':
if research_count >= MAX_DEEP_RESEARCH_ITERATIONS:
return 'needs_manual_review'
iteration_counts['deep_research'] = research_count + 1
return 're_crawl_and_distill'
return decision # approve or reject
```
## Checkpoint Strategy
Save checkpoint after each stage completes:
| Stage | Checkpoint | Resume Point |
|-------|------------|--------------|
| discovery | `manifest.json` created | → crawler |
| crawl | `crawl_results.json` | → repository |
| store | DB records or file list | → distiller |
| distill | distilled_content records | → reviewer |
| review | review_logs records | → exporter or loop |
| export | final export complete | Done |
## Progress Reporting
Report progress to user at key checkpoints:
```
[Pipeline] Stage 1/6: Discovery - Found 8 sources
[Pipeline] Stage 2/6: Crawling - 45/50 pages complete
[Pipeline] Stage 3/6: Storing - 45 documents saved
[Pipeline] Stage 4/6: Distilling - 45 documents processed
[Pipeline] Stage 5/6: Reviewing - 40 approved, 3 refactored, 2 rejected
[Pipeline] Stage 6/6: Exporting - 40 documents exported
[Pipeline] Complete! See ~/reference-library/exports/
```
## Error Handling
```python
def handle_stage_error(stage, error, state):
state['status'] = 'paused'
state['error_message'] = str(error)
state['error_stage'] = stage
save_state(state['run_id'], state)
# Log to errors.log
log_error(state['run_id'], stage, error)
# Report to user
return f"Pipeline paused at {stage}: {error}. Resume with run_id {state['run_id']}"
```
## Resume Pipeline
```python
def resume_pipeline(run_id):
state = load_state(run_id)
if state['status'] != 'paused':
return f"Pipeline {run_id} is {state['status']}, cannot resume"
stage = state['current_stage']
state['status'] = 'running'
state['error_message'] = None
save_state(run_id, state)
# Resume from failed stage
return execute_from_stage(stage, state)
```
## Output Summary
On completion, generate summary:
```json
{
"run_id": 123,
"status": "completed",
"duration_minutes": 15,
"stats": {
"sources_discovered": 5,
"pages_crawled": 45,
"documents_stored": 45,
"documents_distilled": 45,
"approved": 40,
"refactored": 8,
"deep_researched": 2,
"rejected": 3,
"needs_manual_review": 2
},
"exports": {
"format": "project_files",
"path": "~/reference-library/exports/",
"document_count": 40
},
"errors": []
}
```
## Integration Points
| Skill | Called By | Provides |
|-------|-----------|----------|
| reference-discovery | Orchestrator | manifest.json |
| web-crawler | Orchestrator | Raw crawled files |
| content-repository | Orchestrator | Stored documents |
| content-distiller | Orchestrator, QA loop | Distilled content |
| quality-reviewer | Orchestrator | QA decisions |
| markdown-exporter | Orchestrator | Final exports |
## Configuration
Read from `~/.config/reference-curator/pipeline_config.yaml`:
```yaml
pipeline:
max_sources: 10
max_pages: 50
auto_approve: false
approval_threshold: 0.85
qa_loop:
max_refactor_iterations: 3
max_deep_research_iterations: 2
max_total_iterations: 5
export:
default_format: project_files
include_rejected: false
state:
backend: mysql # or 'file'
state_directory: ~/reference-library/pipeline_state/
```

View File

@@ -0,0 +1,279 @@
# Pipeline Orchestrator
Coordinates the full reference curation workflow, handling QA loops and state management.
## Pipeline Architecture
```
[Input: Topic | URLs | Manifest]
1. reference-discovery ──────────────────┐
(skip if URLs/manifest) │
│ │
▼ │
2. web-crawler-orchestrator │
│ │
▼ │
3. content-repository │
│ │
▼ │
4. content-distiller ◄───────────────────┤
│ │
▼ │
5. quality-reviewer │
│ │
┌─────┼─────┬────────────────┐ │
▼ ▼ ▼ ▼ │
APPROVE REJECT REFACTOR DEEP_RESEARCH│
│ │ │ │ │
│ │ └─────────────┤ │
│ │ └───────┘
▼ ▼
6. markdown-exporter archive
[Complete]
```
## Input Modes
| Mode | Example Input | Pipeline Start |
|------|--------------|----------------|
| **Topic** | `"Claude system prompts"` | Stage 1 (discovery) |
| **URLs** | `["https://docs.anthropic.com/..."]` | Stage 2 (crawler) |
| **Manifest** | Path to `manifest.json` | Stage 2 (crawler) |
## Configuration Options
```yaml
pipeline:
max_sources: 10 # Discovery limit
max_pages: 50 # Pages per source
auto_approve: false # Auto-approve above threshold
approval_threshold: 0.85
qa_loop:
max_refactor_iterations: 3
max_deep_research_iterations: 2
max_total_iterations: 5
export:
format: project_files # or fine_tuning, jsonl
```
## Pipeline Execution
### Stage 1: Reference Discovery
For topic-based input, search and validate authoritative sources:
```python
def run_discovery(topic, max_sources=10):
# Uses WebSearch to find sources
# Validates credibility
# Outputs manifest.json with source URLs
sources = search_authoritative_sources(topic, max_sources)
validate_and_rank_sources(sources)
write_manifest(sources)
return manifest_path
```
### Stage 2: Web Crawler
Crawl URLs from manifest or direct input:
```python
def run_crawler(input_source, max_pages=50):
# Selects optimal crawler backend
# Respects rate limits
# Stores raw content
urls = load_urls(input_source)
for url in urls:
crawl_with_best_backend(url, max_pages)
return crawl_results
```
### Stage 3: Content Repository
Store crawled content with deduplication:
```python
def run_repository(crawl_results):
# Deduplicates by URL hash
# Tracks versions
# Returns stored doc IDs
for result in crawl_results:
store_document(result)
return stored_doc_ids
```
### Stage 4: Content Distiller
Process raw content into structured summaries:
```python
def run_distiller(doc_ids, refactor_instructions=None):
# Extracts key concepts
# Generates summaries
# Creates structured markdown
for doc_id in doc_ids:
distill_document(doc_id, instructions=refactor_instructions)
return distilled_ids
```
### Stage 5: Quality Reviewer
Score and route content based on quality:
```python
def run_reviewer(distilled_ids, auto_approve=False, threshold=0.85):
decisions = {}
for distill_id in distilled_ids:
score, assessment = score_content(distill_id)
if auto_approve and score >= threshold:
decisions[distill_id] = ('approve', None)
elif score >= 0.85:
decisions[distill_id] = ('approve', None)
elif score >= 0.60:
instructions = generate_feedback(assessment)
decisions[distill_id] = ('refactor', instructions)
elif score >= 0.40:
queries = generate_research_queries(assessment)
decisions[distill_id] = ('deep_research', queries)
else:
decisions[distill_id] = ('reject', assessment)
return decisions
```
### Stage 6: Markdown Exporter
Export approved content:
```python
def run_exporter(approved_ids, format='project_files'):
# Organizes by topic
# Generates INDEX.md
# Creates cross-references
export_documents(approved_ids, format=format)
return export_path
```
## QA Loop Handling
```python
def handle_qa_loop(distill_id, decision, iteration_tracker):
counts = iteration_tracker.get(distill_id, {'refactor': 0, 'deep_research': 0})
if decision == 'refactor':
if counts['refactor'] >= MAX_REFACTOR:
return 'needs_manual_review'
counts['refactor'] += 1
iteration_tracker[distill_id] = counts
return 're_distill'
if decision == 'deep_research':
if counts['deep_research'] >= MAX_DEEP_RESEARCH:
return 'needs_manual_review'
counts['deep_research'] += 1
iteration_tracker[distill_id] = counts
return 're_crawl'
return decision
```
## State Management
### MySQL Backend (Preferred)
```sql
SELECT run_id, status, current_stage, stats
FROM pipeline_runs
WHERE run_id = ?;
```
### File-Based Fallback
```
~/reference-library/pipeline_state/
├── run_001/
│ ├── state.json # Pipeline state
│ ├── manifest.json # Discovered sources
│ ├── crawl_results.json
│ └── review_log.json # QA decisions
```
State JSON format:
```json
{
"run_id": "run_001",
"run_type": "topic",
"input_value": "Claude system prompts",
"status": "running",
"current_stage": "distilling",
"stats": {
"sources_discovered": 5,
"pages_crawled": 45,
"approved": 0,
"refactored": 0
},
"started_at": "2026-01-29T10:00:00Z"
}
```
## Checkpointing
Checkpoint after each stage to enable resume:
| Checkpoint | Trigger | Resume From |
|------------|---------|-------------|
| `discovery_complete` | Manifest saved | → crawler |
| `crawl_complete` | All pages crawled | → repository |
| `store_complete` | Docs in database | → distiller |
| `distill_complete` | Content processed | → reviewer |
| `review_complete` | Decisions logged | → exporter |
| `export_complete` | Files generated | Done |
## Output Summary
```json
{
"run_id": 123,
"status": "completed",
"duration_minutes": 15,
"stats": {
"sources_discovered": 5,
"pages_crawled": 45,
"documents_stored": 45,
"documents_distilled": 45,
"approved": 40,
"refactored": 8,
"deep_researched": 2,
"rejected": 3,
"needs_manual_review": 2
},
"exports": {
"format": "project_files",
"path": "~/reference-library/exports/",
"document_count": 40
}
}
```
## Error Handling
On stage failure:
1. Save checkpoint with error state
2. Log error details
3. Report to user with resume instructions
```python
try:
run_stage(stage_name)
save_checkpoint(stage_name, 'complete')
except Exception as e:
save_checkpoint(stage_name, 'failed', error=str(e))
report_error(f"Pipeline paused at {stage_name}: {e}")
```

View File

@@ -0,0 +1,9 @@
# Skill metadata (extracted from SKILL.md frontmatter)
name: pipeline-orchestrator
description: |
Orchestrates the full 6-skill reference curation pipeline as a background task. Coordinates discovery → crawl → store → distill → review → export with QA loop handling. Triggers on "curate references", "run full pipeline", "reference pipeline", "automate curation".
# Optional fields
# triggers: [] # TODO: Extract from description

View File

@@ -130,12 +130,19 @@ This displays available files in `claude-project/` and optionally copies them to
## Architecture ## Architecture
``` ```
[Topic Input] ┌──────────────────────────────┐
│ reference-curator-pipeline │ (Orchestrator)
│ /reference-curator-pipeline │
└──────────────────────────────┘
┌───────────────────────┼───────────────────────┐
┌─────────────────────┐ ▼ ▼ ▼
│ reference-discovery │ → Search & validate sources [Topic Input] [URL Input] [Manifest Input]
└─────────────────────┘ │ │ │
▼ │ │
┌─────────────────────┐ │ │
│ reference-discovery │ ◄─────────┴───────────────────────┘
└─────────────────────┘ (skip if URLs/manifest)
┌──────────────────────────┐ ┌──────────────────────────┐
@@ -149,16 +156,16 @@ This displays available files in `claude-project/` and optionally copies them to
┌───────────────────┐ ┌───────────────────┐
│ content-distiller │ → Summarize & extract │ content-distiller │ → Summarize & extract ◄─────┐
└───────────────────┘ └───────────────────┘
▼ │
┌──────────────────┐ ┌──────────────────┐
│ quality-reviewer │ → QA loop │ quality-reviewer │ → QA loop
└──────────────────┘ └──────────────────┘
├── REFACTOR → content-distiller ├── REFACTOR (max 3) ────────────────────┤
├── DEEP_RESEARCH → web-crawler-orchestrator ├── DEEP_RESEARCH (max 2) → crawler ─────┘
▼ APPROVE ▼ APPROVE
┌───────────────────┐ ┌───────────────────┐
@@ -170,7 +177,35 @@ This displays available files in `claude-project/` and optionally copies them to
## User Guide ## User Guide
### Basic Workflow ### Full Pipeline (Recommended)
Run the complete curation workflow with a single command:
```
# From topic - runs all 6 stages automatically
/reference-curator-pipeline "Claude Code best practices" --max-sources 5
# From URLs - skip discovery, start at crawler
/reference-curator-pipeline https://docs.anthropic.com/en/docs/prompt-caching
# Resume from manifest file
/reference-curator-pipeline ./manifest.json --auto-approve
# Fine-tuning dataset output
/reference-curator-pipeline "MCP servers" --export-format fine_tuning
```
**Pipeline Options:**
- `--max-sources 10` - Max sources to discover (topic mode)
- `--max-pages 50` - Max pages per source to crawl
- `--auto-approve` - Auto-approve scores above threshold
- `--threshold 0.85` - Approval threshold
- `--max-iterations 3` - Max QA loop iterations per document
- `--export-format project_files` - Output format (project_files, fine_tuning, jsonl)
---
### Manual Workflow (Step-by-Step)
**Step 1: Discover References** **Step 1: Discover References**
``` ```
@@ -295,6 +330,7 @@ mysql -h $MYSQL_HOST -u $MYSQL_USER -p"$MYSQL_PASSWORD" reference_library -e "
| 04 | content-distiller | `/content-distiller` | Summarize & extract | | 04 | content-distiller | `/content-distiller` | Summarize & extract |
| 05 | quality-reviewer | `/quality-reviewer` | QA scoring & routing | | 05 | quality-reviewer | `/quality-reviewer` | QA scoring & routing |
| 06 | markdown-exporter | `/markdown-exporter` | Export to markdown/JSONL | | 06 | markdown-exporter | `/markdown-exporter` | Export to markdown/JSONL |
| 07 | pipeline-orchestrator | `/reference-curator-pipeline` | Full pipeline orchestration |
--- ---
@@ -435,7 +471,8 @@ mysql -h $MYSQL_HOST -u $MYSQL_USER -p"$MYSQL_PASSWORD" reference_library < shar
│ ├── content-repository.md │ ├── content-repository.md
│ ├── content-distiller.md │ ├── content-distiller.md
│ ├── quality-reviewer.md │ ├── quality-reviewer.md
── markdown-exporter.md ── markdown-exporter.md
│ └── reference-curator-pipeline.md
├── 01-reference-discovery/ ├── 01-reference-discovery/
│ ├── code/CLAUDE.md # Claude Code directive │ ├── code/CLAUDE.md # Claude Code directive
@@ -455,6 +492,9 @@ mysql -h $MYSQL_HOST -u $MYSQL_USER -p"$MYSQL_PASSWORD" reference_library < shar
├── 06-markdown-exporter/ ├── 06-markdown-exporter/
│ ├── code/CLAUDE.md │ ├── code/CLAUDE.md
│ └── desktop/SKILL.md │ └── desktop/SKILL.md
├── 07-pipeline-orchestrator/
│ ├── code/CLAUDE.md
│ └── desktop/SKILL.md
└── shared/ └── shared/
├── schema.sql # MySQL schema ├── schema.sql # MySQL schema

View File

@@ -0,0 +1,175 @@
# Pipeline Orchestrator
Coordinates the full 6-skill reference curation workflow with automated QA loop handling.
## Trigger Phrases
- "curate references on [topic]"
- "run full curation pipeline"
- "automate reference curation"
- "curate these URLs: [url1, url2]"
## Input Modes
| Mode | Example | Pipeline Start |
|------|---------|----------------|
| **Topic** | "curate references on Claude system prompts" | Stage 1 (discovery) |
| **URLs** | "curate these URLs: https://docs.anthropic.com/..." | Stage 2 (crawler) |
| **Manifest** | "resume curation from manifest.json" | Stage 2 (crawler) |
## Pipeline Stages
```
1. reference-discovery (topic mode only)
2. web-crawler-orchestrator
3. content-repository
4. content-distiller ◄─────────────┐
│ │
▼ │
5. quality-reviewer │
│ │
├── APPROVE → Stage 6 │
├── REFACTOR ───────────────┤
├── DEEP_RESEARCH → Stage 2 ┘
└── REJECT → Archive
6. markdown-exporter
```
## Configuration Options
| Option | Default | Description |
|--------|---------|-------------|
| max_sources | 10 | Maximum sources to discover (topic mode) |
| max_pages | 50 | Maximum pages per source to crawl |
| auto_approve | false | Auto-approve scores above threshold |
| threshold | 0.85 | Quality score threshold for approval |
| max_iterations | 3 | Maximum QA loop iterations per document |
| export_format | project_files | Output format (project_files, fine_tuning, jsonl) |
## QA Loop Handling
The orchestrator automatically handles QA decisions:
| Decision | Action | Iteration Limit |
|----------|--------|-----------------|
| **APPROVE** | Proceed to export | - |
| **REFACTOR** | Re-distill with feedback | 3 iterations |
| **DEEP_RESEARCH** | Crawl more sources, re-distill | 2 iterations |
| **REJECT** | Archive with reason | - |
After reaching iteration limits, documents are marked `needs_manual_review`.
## State Management
### With Database
Pipeline state is tracked in `pipeline_runs` table:
- Run ID, input type, current stage
- Statistics (crawled, distilled, approved, etc.)
- Error handling and resume capability
### File-Based Fallback
State saved to `~/reference-library/pipeline_state/run_XXX/`:
- `state.json` - Current stage and statistics
- `manifest.json` - Discovered sources
- `review_log.json` - QA decisions
## Progress Tracking
The orchestrator reports progress at each stage:
```
[Pipeline] Stage 1/6: Discovery - Found 8 sources
[Pipeline] Stage 2/6: Crawling - 45/50 pages complete
[Pipeline] Stage 3/6: Storing - 45 documents saved
[Pipeline] Stage 4/6: Distilling - 45 documents processed
[Pipeline] Stage 5/6: Reviewing - 40 approved, 3 refactored, 2 rejected
[Pipeline] Stage 6/6: Exporting - 40 documents exported
[Pipeline] Complete! See ~/reference-library/exports/
```
## Output Summary
On completion, returns detailed summary:
```
Pipeline Complete:
- Sources discovered: 5
- Pages crawled: 45
- Documents stored: 45
- Approved: 40
- Refactored: 8
- Deep researched: 2
- Rejected: 3
- Needs manual review: 2
Exports saved to: ~/reference-library/exports/
Format: project_files
```
## Error Handling
If a stage fails:
1. State is checkpointed
2. Error is logged with details
3. Pipeline can be resumed from last successful stage
## Resume Pipeline
To resume a paused or failed pipeline:
- Provide the manifest.json or run state file
- Pipeline continues from last checkpoint
## Example Usage
### Full Pipeline from Topic
```
User: Curate references on Claude Code best practices with 5 sources
Claude: I'll run the full curation pipeline for "Claude Code best practices":
[Pipeline] Stage 1/6: Discovering sources...
Found 5 authoritative sources (3 official, 2 community)
[Pipeline] Stage 2/6: Crawling 5 sources...
Crawled 45 pages total
[Pipeline] Stage 3/6: Storing documents...
45 documents saved to repository
[Pipeline] Stage 4/6: Distilling content...
45 documents processed
[Pipeline] Stage 5/6: Quality review...
- 38 approved
- 5 refactored (re-distilling...)
- 2 rejected (low quality)
[Pipeline] Stage 6/6: Exporting...
40 documents exported to ~/reference-library/exports/
Pipeline complete! 40 reference documents ready for use.
```
### From Specific URLs
```
User: Curate these URLs with auto-approve:
- https://docs.anthropic.com/en/docs/prompt-caching
- https://docs.anthropic.com/en/docs/build-with-claude/tool-use
Claude: Running pipeline from URLs (skipping discovery)...
[Pipeline] Stage 2/6: Crawling 2 sources...
[...continues with remaining stages...]
```

View File

@@ -1,11 +1,27 @@
# Reference Curator - Claude.ai Project Knowledge # Reference Curator - Claude.ai Project Knowledge
This project knowledge enables Claude to curate, process, and export reference documentation through 6 modular skills. This project knowledge enables Claude to curate, process, and export reference documentation through 7 modular skills.
## Quick Start - Pipeline Orchestrator
Run the full curation workflow with a single command:
```
# Full pipeline from topic
curate references on "Claude Code best practices"
# From URLs (skip discovery)
curate these URLs: https://docs.anthropic.com/en/docs/prompt-caching
# With auto-approve
curate references on "MCP servers" with auto-approve
```
## Skills Overview ## Skills Overview
| Skill | Purpose | Trigger Phrases | | Skill | Purpose | Trigger Phrases |
|-------|---------|-----------------| |-------|---------|-----------------|
| **pipeline-orchestrator** | Full 6-skill workflow with QA loops | "curate references", "run full pipeline", "automate curation" |
| **reference-discovery** | Search & validate authoritative sources | "find references", "search documentation", "discover sources" | | **reference-discovery** | Search & validate authoritative sources | "find references", "search documentation", "discover sources" |
| **web-crawler** | Multi-backend crawling orchestration | "crawl URL", "fetch documents", "scrape pages" | | **web-crawler** | Multi-backend crawling orchestration | "crawl URL", "fetch documents", "scrape pages" |
| **content-repository** | MySQL storage management | "store content", "save to database", "check duplicates" | | **content-repository** | MySQL storage management | "store content", "save to database", "check duplicates" |
@@ -16,12 +32,18 @@ This project knowledge enables Claude to curate, process, and export reference d
## Workflow ## Workflow
``` ```
[Topic Input] ┌───────────────────────────┐
│ pipeline-orchestrator │ (Coordinates all stages)
└───────────────────────────┘
┌───────────────────┼───────────────────┐
┌─────────────────────┐ ▼ ▼ ▼
│ reference-discovery │ → Search & validate sources [Topic Input] [URL Input] [Manifest Input]
└─────────────────────┘ │ │ │
▼ │ │
┌─────────────────────┐ │ │
│ reference-discovery │ ◄───┴───────────────────┘
└─────────────────────┘ (skip if URLs/manifest)
┌─────────────────────┐ ┌─────────────────────┐
@@ -35,16 +57,16 @@ This project knowledge enables Claude to curate, process, and export reference d
┌─────────────────────┐ ┌─────────────────────┐
│ content-distiller │ → Summarize & extract │ content-distiller │ → Summarize & extract ◄────┐
└─────────────────────┘ └─────────────────────┘
▼ │
┌─────────────────────┐ ┌─────────────────────┐
│ quality-reviewer │ → QA loop │ quality-reviewer │ → QA loop
└─────────────────────┘ └─────────────────────┘
├── REFACTOR → content-distiller ├── REFACTOR (max 3) ───────────────────────┤
├── DEEP_RESEARCH → web-crawler ├── DEEP_RESEARCH (max 2) → crawler ────────┘
▼ APPROVE ▼ APPROVE
┌─────────────────────┐ ┌─────────────────────┐
@@ -74,16 +96,28 @@ This project knowledge enables Claude to curate, process, and export reference d
## Files in This Project ## Files in This Project
- `INDEX.md` - This overview file - `INDEX.md` - This overview file
- `reference-curator-complete.md` - All 6 skills in one file - `reference-curator-complete.md` - All 7 skills in one file (recommended)
- `01-reference-discovery.md` - Source discovery skill - `01-reference-discovery.md` - Source discovery skill
- `02-web-crawler.md` - Crawling orchestration skill - `02-web-crawler.md` - Crawling orchestration skill
- `03-content-repository.md` - Database storage skill - `03-content-repository.md` - Database storage skill
- `04-content-distiller.md` - Content summarization skill - `04-content-distiller.md` - Content summarization skill
- `05-quality-reviewer.md` - QA review skill - `05-quality-reviewer.md` - QA review skill
- `06-markdown-exporter.md` - Export skill - `06-markdown-exporter.md` - Export skill
- `07-pipeline-orchestrator.md` - Full pipeline orchestration
## Usage ## Usage
Upload all files to a Claude.ai Project, or upload only the skills you need. Upload all files to a Claude.ai Project, or upload only the skills you need.
For the complete experience, upload `reference-curator-complete.md` which contains all skills in one file. For the complete experience, upload `reference-curator-complete.md` which contains all skills in one file.
## Pipeline Orchestrator Options
| Option | Default | Description |
|--------|---------|-------------|
| max_sources | 10 | Max sources to discover |
| max_pages | 50 | Max pages per source |
| auto_approve | false | Auto-approve above threshold |
| threshold | 0.85 | Approval threshold |
| max_iterations | 3 | Max QA loop iterations |
| export_format | project_files | Output format |

View File

@@ -1,6 +1,87 @@
# Reference Curator - Complete Skill Set # Reference Curator - Complete Skill Set
This document contains all 6 skills for curating, processing, and exporting reference documentation. This document contains all 7 skills for curating, processing, and exporting reference documentation.
---
# Pipeline Orchestrator (Recommended Entry Point)
Coordinates the full 6-skill workflow with automated QA loop handling.
## Quick Start
```
# Full pipeline from topic
curate references on "Claude Code best practices"
# From URLs (skip discovery)
curate these URLs: https://docs.anthropic.com/en/docs/prompt-caching
# With auto-approve
curate references on "MCP servers" with auto-approve and fine-tuning output
```
## Configuration Options
| Option | Default | Description |
|--------|---------|-------------|
| max_sources | 10 | Maximum sources to discover |
| max_pages | 50 | Maximum pages per source |
| auto_approve | false | Auto-approve above threshold |
| threshold | 0.85 | Approval threshold |
| max_iterations | 3 | Max QA loop iterations |
| export_format | project_files | Output format |
## Pipeline Flow
```
[Input: Topic | URLs | Manifest]
1. reference-discovery (skip if URLs/manifest)
2. web-crawler
3. content-repository
4. content-distiller ◄─────────────┐
│ │
▼ │
5. quality-reviewer │
│ │
├── APPROVE → export │
├── REFACTOR (max 3) ─────┤
├── DEEP_RESEARCH (max 2) → crawler
└── REJECT → archive
6. markdown-exporter
```
## QA Loop Handling
| Decision | Action | Max Iterations |
|----------|--------|----------------|
| APPROVE | Proceed to export | - |
| REFACTOR | Re-distill with feedback | 3 |
| DEEP_RESEARCH | Crawl more sources | 2 |
| REJECT | Archive with reason | - |
Documents exceeding iteration limits are marked `needs_manual_review`.
## Output Summary
```
Pipeline Complete:
- Sources discovered: 5
- Pages crawled: 45
- Approved: 40
- Needs manual review: 2
- Exports: ~/reference-library/exports/
```
--- ---
@@ -464,6 +545,7 @@ def add_cross_references(doc, all_docs):
| From | Output | To | | From | Output | To |
|------|--------|-----| |------|--------|-----|
| **pipeline-orchestrator** | Coordinates all stages | All skills below |
| **reference-discovery** | URL manifest | web-crawler | | **reference-discovery** | URL manifest | web-crawler |
| **web-crawler** | Raw content + manifest | content-repository | | **web-crawler** | Raw content + manifest | content-repository |
| **content-repository** | Document records | content-distiller | | **content-repository** | Document records | content-distiller |
@@ -471,3 +553,25 @@ def add_cross_references(doc, all_docs):
| **quality-reviewer** (approve) | Approved IDs | markdown-exporter | | **quality-reviewer** (approve) | Approved IDs | markdown-exporter |
| **quality-reviewer** (refactor) | Instructions | content-distiller | | **quality-reviewer** (refactor) | Instructions | content-distiller |
| **quality-reviewer** (deep_research) | Queries | web-crawler | | **quality-reviewer** (deep_research) | Queries | web-crawler |
## State Management
The pipeline orchestrator tracks state for resume capability:
**With Database:**
- `pipeline_runs` table tracks run status, current stage, statistics
- `pipeline_iteration_tracker` tracks QA loop iterations per document
**File-Based Fallback:**
```
~/reference-library/pipeline_state/run_XXX/
├── state.json # Current stage and stats
├── manifest.json # Discovered sources
└── review_log.json # QA decisions
```
## Resume Pipeline
To resume a paused or failed pipeline:
1. Provide the run_id or state file path
2. Pipeline continues from last successful checkpoint

View File

@@ -0,0 +1,115 @@
---
description: Orchestrates full reference curation pipeline as background task. Runs discovery → crawl → store → distill → review → export with QA loop handling.
argument-hint: <topic|urls|manifest> [--max-sources 10] [--max-pages 50] [--auto-approve] [--threshold 0.85] [--max-iterations 3] [--export-format project_files]
allowed-tools: WebSearch, WebFetch, Read, Write, Bash, Grep, Glob, Task
---
# Reference Curator Pipeline
Full-stack orchestration of the 6-skill reference curation workflow.
## Input Modes
| Mode | Input Example | Pipeline Start |
|------|---------------|----------------|
| **Topic** | `"Claude system prompts"` | reference-discovery |
| **URLs** | `https://docs.anthropic.com/...` | web-crawler (skip discovery) |
| **Manifest** | `./manifest.json` | web-crawler (resume from discovery) |
## Arguments
- `<input>`: Required. Topic string, URL(s), or manifest file path
- `--max-sources`: Maximum sources to discover (topic mode, default: 10)
- `--max-pages`: Maximum pages per source to crawl (default: 50)
- `--auto-approve`: Auto-approve scores above threshold
- `--threshold`: Approval threshold (default: 0.85)
- `--max-iterations`: Max QA loop iterations per document (default: 3)
- `--export-format`: Output format: `project_files`, `fine_tuning`, `jsonl` (default: project_files)
## Pipeline Stages
```
1. reference-discovery (topic mode only)
2. web-crawler-orchestrator
3. content-repository
4. content-distiller ◄────────┐
5. quality-reviewer │
├── APPROVE → export │
├── REFACTOR ─────────────────┤
├── DEEP_RESEARCH → crawler ──┘
└── REJECT → archive
6. markdown-exporter
```
## QA Loop Handling
| Decision | Action | Max Iterations |
|----------|--------|----------------|
| REFACTOR | Re-distill with feedback | 3 |
| DEEP_RESEARCH | Crawl more sources, re-distill | 2 |
| Combined | Total loops per document | 5 |
After max iterations, document marked as `needs_manual_review`.
## Example Usage
```
# Full pipeline from topic
/reference-curator-pipeline "Claude Code best practices" --max-sources 5
# Pipeline from specific URLs (skip discovery)
/reference-curator-pipeline https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
# Resume from existing manifest
/reference-curator-pipeline ./manifest.json --auto-approve
# Fine-tuning dataset output
/reference-curator-pipeline "MCP servers" --export-format fine_tuning --auto-approve
```
## State Management
Pipeline state is saved after each stage to allow resume:
**With MySQL:**
```sql
SELECT * FROM pipeline_runs WHERE run_id = 123;
```
**File-based fallback:**
```
~/reference-library/pipeline_state/run_XXX/state.json
```
## Output
Pipeline returns summary on completion:
```json
{
"run_id": 123,
"status": "completed",
"stats": {
"sources_discovered": 5,
"pages_crawled": 45,
"documents_stored": 45,
"approved": 40,
"refactored": 8,
"deep_researched": 2,
"rejected": 3,
"needs_manual_review": 2
},
"exports": {
"format": "project_files",
"path": "~/reference-library/exports/"
}
}
```
## See Also
- `/reference-discovery` - Run discovery stage only
- `/web-crawler` - Run crawler stage only
- `/content-repository` - Manage stored content
- `/quality-reviewer` - Run QA review only
- `/markdown-exporter` - Run export only

View File

@@ -0,0 +1,40 @@
# Pipeline Orchestrator Configuration
# Copy to ~/.config/reference-curator/pipeline_config.yaml
pipeline:
# Discovery stage
max_sources: 10
# Crawler stage
max_pages: 50
# Auto-approve settings
auto_approve: false
approval_threshold: 0.85
qa_loop:
# Maximum iterations before escalating to manual review
max_refactor_iterations: 3
max_deep_research_iterations: 2
max_total_iterations: 5
export:
# Default export format: project_files, fine_tuning, jsonl
default_format: project_files
# Include rejected documents in a separate folder
include_rejected: false
state:
# State management backend: mysql or file
backend: ${STATE_BACKEND:-file}
# File-based state directory (used when backend=file)
state_directory: ${REFERENCE_LIBRARY_PATH:-~/reference-library}/pipeline_state/
logging:
# Log level: DEBUG, INFO, WARNING, ERROR
level: INFO
# Save detailed logs for each run
save_run_logs: true

View File

@@ -187,7 +187,91 @@ CREATE TABLE export_jobs (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------- -- -----------------------------
-- 4. Tracking & Monitoring Tables -- 4. Pipeline Orchestration Tables
-- -----------------------------
CREATE TABLE pipeline_runs (
run_id INT AUTO_INCREMENT PRIMARY KEY,
-- Input configuration
run_type ENUM('topic', 'urls', 'manifest') NOT NULL,
input_value TEXT NOT NULL,
-- Status tracking
status ENUM('running', 'completed', 'failed', 'paused') DEFAULT 'running',
current_stage ENUM('discovery', 'crawling', 'storing', 'distilling', 'reviewing', 'exporting') DEFAULT 'discovery',
-- Configuration options
options JSON,
/*
Example options JSON:
{
"max_sources": 10,
"max_pages": 50,
"auto_approve": false,
"threshold": 0.85,
"max_iterations": 3,
"export_format": "project_files"
}
*/
-- Pipeline statistics
stats JSON,
/*
Example stats JSON:
{
"sources_discovered": 5,
"pages_crawled": 45,
"documents_stored": 45,
"documents_distilled": 45,
"approved": 40,
"refactored": 8,
"deep_researched": 2,
"rejected": 3,
"needs_manual_review": 2
}
*/
-- Export information
export_path VARCHAR(500),
export_document_count INT,
-- Timing
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed_at TIMESTAMP NULL,
-- Error handling
error_message TEXT,
error_stage VARCHAR(50),
INDEX idx_status (status),
INDEX idx_run_type (run_type),
INDEX idx_started_at (started_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE pipeline_iteration_tracker (
tracker_id INT AUTO_INCREMENT PRIMARY KEY,
run_id INT NOT NULL,
doc_id INT NOT NULL,
-- Iteration counts
refactor_count INT DEFAULT 0,
deep_research_count INT DEFAULT 0,
-- Final status
final_decision ENUM('approved', 'rejected', 'needs_manual_review'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (run_id) REFERENCES pipeline_runs(run_id) ON DELETE CASCADE,
FOREIGN KEY (doc_id) REFERENCES documents(doc_id) ON DELETE CASCADE,
UNIQUE INDEX idx_run_doc (run_id, doc_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- -----------------------------
-- 5. Tracking & Monitoring Tables
-- ----------------------------- -- -----------------------------
CREATE TABLE crawl_schedule ( CREATE TABLE crawl_schedule (
@@ -218,7 +302,7 @@ CREATE TABLE change_detection (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------- -- -----------------------------
-- 5. Default Data -- 6. Default Data
-- ----------------------------- -- -----------------------------
INSERT INTO topics (topic_name, topic_slug, description) VALUES INSERT INTO topics (topic_name, topic_slug, description) VALUES
@@ -240,7 +324,7 @@ INSERT INTO sources (source_name, source_type, base_url, credibility_tier, vendo
('Google AI Docs', 'official_docs', 'https://ai.google.dev/docs', 'tier1_official', 'google'); ('Google AI Docs', 'official_docs', 'https://ai.google.dev/docs', 'tier1_official', 'google');
-- ----------------------------- -- -----------------------------
-- 6. Useful Views -- 7. Useful Views
-- ----------------------------- -- -----------------------------
CREATE OR REPLACE VIEW v_pending_reviews AS CREATE OR REPLACE VIEW v_pending_reviews AS
@@ -283,3 +367,39 @@ AND rl.review_id = (
WHERE distill_id = dc.distill_id WHERE distill_id = dc.distill_id
) )
ORDER BY t.topic_slug, rl.quality_score DESC; ORDER BY t.topic_slug, rl.quality_score DESC;
CREATE OR REPLACE VIEW v_pipeline_status AS
SELECT
pr.run_id,
pr.run_type,
pr.input_value,
pr.status,
pr.current_stage,
pr.started_at,
pr.completed_at,
TIMESTAMPDIFF(MINUTE, pr.started_at, COALESCE(pr.completed_at, NOW())) as duration_minutes,
JSON_EXTRACT(pr.stats, '$.sources_discovered') as sources_discovered,
JSON_EXTRACT(pr.stats, '$.pages_crawled') as pages_crawled,
JSON_EXTRACT(pr.stats, '$.documents_stored') as documents_stored,
JSON_EXTRACT(pr.stats, '$.approved') as approved,
JSON_EXTRACT(pr.stats, '$.rejected') as rejected,
JSON_EXTRACT(pr.stats, '$.needs_manual_review') as needs_manual_review,
pr.export_path,
pr.error_message
FROM pipeline_runs pr
ORDER BY pr.started_at DESC;
CREATE OR REPLACE VIEW v_pipeline_iterations AS
SELECT
pit.run_id,
pr.input_value,
d.title,
d.url,
pit.refactor_count,
pit.deep_research_count,
(pit.refactor_count + pit.deep_research_count) as total_iterations,
pit.final_decision
FROM pipeline_iteration_tracker pit
JOIN pipeline_runs pr ON pit.run_id = pr.run_id
JOIN documents d ON pit.doc_id = d.doc_id
ORDER BY pit.run_id DESC, pit.total_iterations DESC;

View File

@@ -1,73 +1,162 @@
# Claude Skills - SKILL.md Format Requirements # Claude Skills - Format Requirements
## 📝 Claude Skills SKILL.md Format ## Overview
Every Claude Skill's SKILL.md file MUST start with YAML frontmatter between triple dashes: This document describes the format requirements for Claude Skills in this repository. Skills support dual-platform development (Claude Code and Claude Desktop) with separated concerns.
## Desktop Skill Structure (Recommended)
For Claude Desktop skills, metadata is stored in a separate `skill.yaml` file:
```
skill-name/
└── desktop/
├── skill.yaml # Metadata (name, description, allowed-tools, license)
├── SKILL.md # Content only (no frontmatter)
├── tools/ # MCP tool documentation
│ ├── firecrawl.md # Tool-specific docs
│ └── notion.md
├── references/ # Guidance docs
└── examples/ # Usage examples
```
### skill.yaml Format
```yaml ```yaml
--- # Required fields
name: skill-name-here name: skill-name-here
version: 1.0.0 description: Brief description of what the skill does and trigger keywords
description: Brief description of what the skill does
author: Your Name/Team
tags:
- tag1
- tag2
- tag3
---
# Optional fields
allowed-tools:
- mcp__firecrawl__*
- mcp__notion__*
- Read
- Write
- Edit
- Bash
- Glob
- Grep
- WebFetch
license: MIT # or Internal-use Only
triggers:
- keyword1
- keyword2
```
### SKILL.md Content
With metadata separated into skill.yaml, SKILL.md contains only the skill directive:
```markdown
# Skill Name # Skill Name
Rest of your skill content goes here... Purpose and overview...
## Workflow
Step-by-step instructions...
## MCP Tool Usage
Tool-specific guidance...
``` ```
### ✅ Example: ### tools/ Directory
Document MCP tools used by the skill:
| File | Purpose |
|------|---------|
| `firecrawl.md` | Firecrawl MCP tool usage |
| `notion.md` | Notion MCP tool usage |
| `perplexity.md` | Perplexity MCP tool usage |
| `chrome-devtools.md` | Chrome DevTools MCP tool usage |
| `claude-core.md` | Claude core tools (Read, Write, Edit, Bash, Glob, Grep) |
| `webfetch.md` | WebFetch tool usage |
## Code Skill Structure
For Claude Code skills:
```
skill-name/
└── code/
├── CLAUDE.md # Action-oriented directive
├── scripts/ # Executable Python/Bash scripts
└── references/ # Documentation
```
## Key Requirements
### 1. Metadata (skill.yaml)
- **name**: Required, lowercase with hyphens
- **description**: Required, include trigger keywords
- **allowed-tools**: Optional, list of permitted tools
- **license**: Optional, MIT or Internal-use Only
### 2. File Structure
- All files must be inside the skill folder
- Desktop version in `desktop/` subdirectory
- Code version in `code/` subdirectory
- Subfolders (tools/, references/, examples/) are allowed
### 3. Naming Conventions
- Use lowercase with hyphens for skill name
- No spaces or special characters in folder/file names
- Skill numbers are two-digit prefixes (00-99)
## Full Directory Structure
```
XX-skill-name/
├── code/ # Claude Code version
│ ├── CLAUDE.md # Action-oriented directive
│ ├── scripts/ # Executable Python/Bash
│ └── references/ # Documentation
├── desktop/ # Claude Desktop version
│ ├── skill.yaml # Metadata
│ ├── SKILL.md # Content only
│ ├── tools/ # MCP tool documentation
│ ├── references/ # Guidance docs
│ └── examples/ # Usage examples
└── README.md # Overview (optional)
```
## Migration Script
To migrate existing SKILL.md files with frontmatter to the new structure:
```bash
python scripts/migrate-skill-structure.py --dry-run # Preview
python scripts/migrate-skill-structure.py # Execute
```
The script:
1. Extracts YAML frontmatter to `skill.yaml`
2. Strips frontmatter from `SKILL.md`
3. Creates `tools/` directory
4. Generates tool stub files based on `allowed-tools`
## Legacy Format (Deprecated)
The old format with frontmatter embedded in SKILL.md is deprecated:
```yaml ```yaml
--- ---
name: seo-gateway-strategist name: skill-name
version: 1.0.0 description: Description
description: Creates comprehensive SEO-focused gateway page strategies for Korean medical/service websites allowed-tools: mcp__firecrawl__*, Read, Write
author: OurDigital Dr.D
tags:
- seo
- strategy
- korean-marketing
- gateway-pages
- content-planning
--- ---
# SEO Gateway Page Strategist # Skill content...
This skill helps you create...
``` ```
## 🔑 Key Requirements for Claude Skills Use the migration script to convert to the new format.
1. **YAML Frontmatter is MANDATORY**
- Must be at the very beginning of SKILL.md
- Must be wrapped in triple dashes (---)
- Must include at minimum: name, version, description
2. **File Structure**
- All files must be inside the top-level folder
- SKILL.md must be in the root of the skill folder
- Subfolders (templates/, scripts/, examples/) are allowed
3. **Naming Conventions**
- Use lowercase with hyphens for skill name
- No spaces or special characters in folder/file names
- Version should follow semantic versioning (x.y.z)
## 📂 Correct Folder Structure
```
skills-name/ # Top-level folder
├── SKILL.md # Must have YAML frontmatter
├── README.md # Documentation
├── scripts/ # Optional subfolder
│ └── keyword_analyzer.py
├── templates/ # Optional subfolder
│ └── *.md
└── examples/ # Optional subfolder
└── *.md
```

View File

@@ -0,0 +1,330 @@
#!/usr/bin/env python3
"""
Migrate SKILL.md files to new structure:
1. Extract YAML frontmatter → skill.yaml
2. Strip frontmatter from SKILL.md
3. Create tools/ directory
Usage:
python migrate-skill-structure.py --dry-run # Preview changes
python migrate-skill-structure.py # Execute migration
python migrate-skill-structure.py --verbose # Verbose output
"""
import argparse
import re
import sys
from pathlib import Path
from typing import Optional
import yaml
def find_skill_files(base_path: Path) -> list[Path]:
"""Find all desktop/SKILL.md files."""
skill_files = []
for skill_md in base_path.rglob("desktop/SKILL.md"):
# Skip archived skills
if "99_archive" in str(skill_md):
continue
skill_files.append(skill_md)
return sorted(skill_files)
def parse_frontmatter(content: str) -> tuple[Optional[dict], str]:
"""
Parse YAML frontmatter from content.
Returns (frontmatter_dict, remaining_content).
"""
# Match frontmatter between --- delimiters
pattern = r'^---\s*\n(.*?)\n---\s*\n(.*)$'
match = re.match(pattern, content, re.DOTALL)
if not match:
return None, content
frontmatter_text = match.group(1)
remaining_content = match.group(2)
try:
frontmatter = yaml.safe_load(frontmatter_text)
return frontmatter, remaining_content
except yaml.YAMLError as e:
print(f" YAML parse error: {e}")
return None, content
def generate_skill_yaml(frontmatter: dict) -> str:
"""Generate skill.yaml content from frontmatter."""
# Use a custom dumper to preserve formatting
result = "# Skill metadata (extracted from SKILL.md frontmatter)\n\n"
# Required fields first
if "name" in frontmatter:
result += f"name: {frontmatter['name']}\n"
if "description" in frontmatter:
desc = frontmatter["description"]
# Check if description is multi-line
if "\n" in str(desc) or len(str(desc)) > 80:
result += "description: |\n"
for line in str(desc).strip().split("\n"):
result += f" {line}\n"
else:
# Single line - use quoted string if contains special chars
if any(c in str(desc) for c in [":", "{", "}", "[", "]", ",", "#", "&", "*", "!", "|", ">", "'", '"', "%", "@", "`"]):
result += f'description: "{desc}"\n'
else:
result += f"description: {desc}\n"
result += "\n# Optional fields\n"
# Optional fields
if "allowed-tools" in frontmatter:
tools = frontmatter["allowed-tools"]
if isinstance(tools, str):
# Parse comma-separated tools
tool_list = [t.strip() for t in tools.split(",")]
else:
tool_list = tools
result += "allowed-tools:\n"
for tool in tool_list:
result += f" - {tool}\n"
if "license" in frontmatter:
result += f"\nlicense: {frontmatter['license']}\n"
# Add triggers section (placeholder - can be extracted from description)
result += "\n# triggers: [] # TODO: Extract from description\n"
return result
def get_tool_stubs(frontmatter: dict) -> dict[str, str]:
"""
Determine which tool stub files to create based on allowed-tools.
Returns dict of {filename: content}.
"""
stubs = {}
if "allowed-tools" not in frontmatter:
return stubs
tools_str = frontmatter["allowed-tools"]
if isinstance(tools_str, str):
tools = [t.strip() for t in tools_str.split(",")]
else:
tools = tools_str
# Map tools to stub files
tool_mappings = {
"mcp__firecrawl__*": "firecrawl",
"mcp__perplexity__*": "perplexity",
"mcp__notion__*": "notion",
"mcp__chrome-devtools__*": "chrome-devtools",
}
claude_core_tools = {"Read", "Write", "Edit", "Bash", "Glob", "Grep"}
webfetch_tools = {"WebFetch"}
has_claude_core = False
has_webfetch = False
mcp_tools = set()
for tool in tools:
tool = tool.strip()
# Check MCP tool patterns
for pattern, stub_name in tool_mappings.items():
if pattern.replace("*", "") in tool or tool == pattern:
mcp_tools.add(stub_name)
break
else:
# Check Claude core tools
if tool in claude_core_tools:
has_claude_core = True
elif tool in webfetch_tools:
has_webfetch = True
# Generate stub content
stub_template = """# {tool_name}
> TODO: Document tool usage for this skill
## Available Commands
- [ ] List commands
## Configuration
- [ ] Add configuration details
## Examples
- [ ] Add usage examples
"""
for mcp_tool in mcp_tools:
title = mcp_tool.replace("-", " ").title()
stubs[f"{mcp_tool}.md"] = stub_template.format(tool_name=title)
if has_claude_core:
stubs["claude-core.md"] = stub_template.format(tool_name="Claude Core Tools (Read, Write, Edit, Bash, Glob, Grep)")
if has_webfetch:
stubs["webfetch.md"] = stub_template.format(tool_name="WebFetch")
return stubs
def migrate_skill(skill_md_path: Path, dry_run: bool = True, verbose: bool = False) -> dict:
"""
Migrate a single SKILL.md file.
Returns status dict.
"""
desktop_dir = skill_md_path.parent
skill_yaml_path = desktop_dir / "skill.yaml"
tools_dir = desktop_dir / "tools"
status = {
"path": str(skill_md_path),
"success": False,
"skill_yaml_created": False,
"frontmatter_stripped": False,
"tools_dir_created": False,
"tool_stubs": [],
"error": None
}
try:
# Read original content
content = skill_md_path.read_text(encoding="utf-8")
# Parse frontmatter
frontmatter, remaining_content = parse_frontmatter(content)
if frontmatter is None:
status["error"] = "No frontmatter found"
return status
# Generate skill.yaml content
skill_yaml_content = generate_skill_yaml(frontmatter)
# Get tool stubs
tool_stubs = get_tool_stubs(frontmatter)
status["tool_stubs"] = list(tool_stubs.keys())
if verbose:
print(f"\n Frontmatter fields: {list(frontmatter.keys())}")
print(f" Tool stubs to create: {status['tool_stubs']}")
if dry_run:
print(f" [DRY-RUN] Would create: {skill_yaml_path}")
print(f" [DRY-RUN] Would strip frontmatter from: {skill_md_path}")
print(f" [DRY-RUN] Would create directory: {tools_dir}")
for stub_name in tool_stubs:
print(f" [DRY-RUN] Would create stub: {tools_dir / stub_name}")
status["success"] = True
else:
# Create skill.yaml
skill_yaml_path.write_text(skill_yaml_content, encoding="utf-8")
status["skill_yaml_created"] = True
# Strip frontmatter from SKILL.md
skill_md_path.write_text(remaining_content.lstrip(), encoding="utf-8")
status["frontmatter_stripped"] = True
# Create tools/ directory
tools_dir.mkdir(exist_ok=True)
status["tools_dir_created"] = True
# Create tool stubs
for stub_name, stub_content in tool_stubs.items():
stub_path = tools_dir / stub_name
stub_path.write_text(stub_content, encoding="utf-8")
status["success"] = True
except Exception as e:
status["error"] = str(e)
return status
def main():
parser = argparse.ArgumentParser(description="Migrate SKILL.md files to new structure")
parser.add_argument("--dry-run", action="store_true", help="Preview changes without executing")
parser.add_argument("--verbose", "-v", action="store_true", help="Verbose output")
parser.add_argument("--path", type=str, default=None, help="Base path to search (default: auto-detect)")
args = parser.parse_args()
# Find base path
if args.path:
base_path = Path(args.path)
else:
# Auto-detect from script location
script_dir = Path(__file__).parent
base_path = script_dir.parent / "custom-skills"
if not base_path.exists():
print(f"Error: Path not found: {base_path}")
sys.exit(1)
print(f"Searching for SKILL.md files in: {base_path}")
print(f"Mode: {'DRY-RUN' if args.dry_run else 'EXECUTE'}")
print("-" * 60)
# Find all skill files
skill_files = find_skill_files(base_path)
print(f"Found {len(skill_files)} desktop/SKILL.md files\n")
# Process each file
results = {
"total": len(skill_files),
"success": 0,
"failed": 0,
"skill_yaml_created": 0,
"tools_dirs_created": 0,
"tool_stubs_created": 0
}
for i, skill_path in enumerate(skill_files, 1):
rel_path = skill_path.relative_to(base_path)
print(f"[{i}/{len(skill_files)}] Processing: {rel_path}")
status = migrate_skill(skill_path, dry_run=args.dry_run, verbose=args.verbose)
if status["success"]:
results["success"] += 1
if status["skill_yaml_created"] or args.dry_run:
results["skill_yaml_created"] += 1
if status["tools_dir_created"] or args.dry_run:
results["tools_dirs_created"] += 1
results["tool_stubs_created"] += len(status["tool_stubs"])
print(f" ✓ OK")
else:
results["failed"] += 1
print(f" ✗ FAILED: {status['error']}")
# Summary
print("\n" + "=" * 60)
print("MIGRATION SUMMARY")
print("=" * 60)
print(f"Total files processed: {results['total']}")
print(f"Successful: {results['success']}")
print(f"Failed: {results['failed']}")
print(f"skill.yaml files {'to create' if args.dry_run else 'created'}: {results['skill_yaml_created']}")
print(f"tools/ directories {'to create' if args.dry_run else 'created'}: {results['tools_dirs_created']}")
print(f"Tool stub files {'to create' if args.dry_run else 'created'}: {results['tool_stubs_created']}")
if args.dry_run:
print("\n[DRY-RUN] No files were modified. Run without --dry-run to execute.")
return 0 if results["failed"] == 0 else 1
if __name__ == "__main__":
sys.exit(main())