"""Skill routing: task_type + stage -> skill configuration. Each entry maps a (task_type, stage) pair to either: - A Claude Code skill (skill_file, tools, max_turns) - An AutoCora handler (handler="autocora") To add a new task type: add an entry here + write the skill .md file. """ from __future__ import annotations from dataclasses import dataclass from typing import Any @dataclass(frozen=True) class SkillRoute: """One step in a task's pipeline.""" next_stage: str next_status: str handler: str = "claude" # "claude" or "autocora" skill_file: str = "" # path relative to skills_dir tools: str = "" # comma-separated Claude Code --allowedTools max_turns: int = 10 # Tools commonly needed for content work _CONTENT_TOOLS = "Read,Edit,Write,Bash,Glob,Grep,WebFetch,WebSearch" _LINK_TOOLS = "Read,Edit,Write,Bash,Glob,Grep" SKILL_MAP: dict[str, dict[str, SkillRoute]] = { "Content Creation": { "run_cora": SkillRoute( handler="autocora", next_stage="outline", next_status="review", ), "outline": SkillRoute( skill_file="content_outline.md", next_stage="draft", next_status="review", tools=_CONTENT_TOOLS, max_turns=20, ), "draft": SkillRoute( skill_file="content_draft.md", next_stage="final", next_status="review", tools=_CONTENT_TOOLS, max_turns=30, ), }, "On Page Optimization": { "run_cora": SkillRoute( handler="autocora", next_stage="outline", next_status="review", ), "outline": SkillRoute( skill_file="content_outline.md", next_stage="draft", next_status="review", tools=_CONTENT_TOOLS, max_turns=20, ), "draft": SkillRoute( skill_file="content_draft.md", next_stage="hidden div", next_status="review", tools=_CONTENT_TOOLS, max_turns=30, ), "hidden div": SkillRoute( skill_file="content_hidden_div.md", next_stage="final", next_status="review", tools=_CONTENT_TOOLS, max_turns=15, ), }, "Press Release": { "draft": SkillRoute( skill_file="press_release_prompt.md", next_stage="final", next_status="review", tools=_CONTENT_TOOLS, max_turns=25, ), }, "Link Building": { "run_cora": SkillRoute( handler="autocora", next_stage="build", next_status="review", ), "build": SkillRoute( skill_file="linkbuilding.md", next_stage="final", next_status="review", tools=_LINK_TOOLS, max_turns=15, ), }, } def get_route(task_type: str, stage: str) -> SkillRoute | None: """Look up the skill route for a task type + stage. Returns None if no mapping exists. """ type_routes = SKILL_MAP.get(task_type) if not type_routes: return None return type_routes.get(stage.lower().strip()) def get_valid_stages(task_type: str) -> list[str]: """Return the list of valid stage names for a task type.""" type_routes = SKILL_MAP.get(task_type) if not type_routes: return [] return list(type_routes.keys()) def get_supported_task_types() -> list[str]: """Return all supported task type names.""" return list(SKILL_MAP.keys())