diff --git a/src/commands/import_cmd.py b/src/commands/import_cmd.py new file mode 100644 index 0000000..897717d --- /dev/null +++ b/src/commands/import_cmd.py @@ -0,0 +1,95 @@ +"""Import prompts from various formats.""" + +import json +from typing import Optional + +import click +import yaml + +from ..models import Prompt +from ..storage import PromptStorage + + +@click.command("import") +@click.argument("input", type=click.Path(exists=True)) +@click.option("--format", "-f", default="auto", type=click.Choice(["auto", "yaml", "json"])) +@click.option("--force", is_flag=True, help="Overwrite existing prompts") +@click.option("--dir", "prompt_dir", default=None, help="Prompt directory") +def import_prompts( + input: str, + format: str, + force: bool, + prompt_dir: Optional[str] +): + """Import prompts from JSON or YAML files.""" + storage = PromptStorage(prompt_dir) + + with open(input) as f: + content = f.read() + + if format == "auto": + if input.endswith(".json"): + format = "json" + else: + format = "yaml" + + if format == "yaml": + data = yaml.safe_load(content) + if isinstance(data, dict): + data = [data] + else: + data = json.loads(content) + if isinstance(data, dict): + data = [data] + + imported = 0 + skipped = 0 + + for item in data: + try: + prompt_data = _normalize_prompt_data(item) + prompt = Prompt.from_dict(prompt_data) + + if storage.prompt_exists(prompt.name) and not force: + skipped += 1 + continue + + storage.save_prompt(prompt) + for tag in prompt.tags: + storage.add_tag_to_prompt(prompt.name, tag) + imported += 1 + except Exception as e: + click.echo(f"Error importing prompt: {e}", err=True) + + click.echo(f"Imported {imported} prompts, skipped {skipped}") + + +def _normalize_prompt_data(data: dict) -> dict: + """Normalize prompt data to internal format.""" + normalized = { + "name": data.get("name", "unnamed"), + "template": data.get("template") or data.get("prompt") or "", + "description": data.get("description", ""), + "tags": data.get("tags", []), + "variables": [], + "provider": data.get("provider", ""), + "model": data.get("model", ""), + } + + if "variables" in data: + for v in data["variables"]: + if isinstance(v, dict): + normalized["variables"].append(v) + elif isinstance(v, str): + normalized["variables"].append({"name": v, "required": True}) + + params = data.get("parameters", {}) + if "properties" in params: + for name, prop in params["properties"].items(): + var = {"name": name} + if isinstance(prop, dict): + var["description"] = prop.get("description", "") + var["required"] = name in params.get("required", []) + normalized["variables"].append(var) + + return normalized