{"record":{"id":"7f807cd40adbb193","repo":"crewAIInc/crewAI","slug":"invalid-skill-reference-use-the-format-org-name","errorCode":null,"errorMessage":"Invalid skill reference. Use the format @org/name.","messagePattern":"Invalid skill reference\\. Use the format @org/name\\.","errorType":"console","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"lib/cli/src/crewai_cli/skills/main.py","lineNumber":86,"sourceCode":"\n        console.print(\n            f\"[green]Created skill [bold]{name}[/bold] at [bold]{skill_dir}[/bold].[/green]\"\n        )\n        console.print(f\"Edit [bold]{skill_md}[/bold] to define the skill instructions.\")\n\n    def install(self, ref: str) -> None:\n        \"\"\"Download and install a registry skill.\n\n        Format: @org/name\n\n        Inside a crew project (pyproject.toml present): installs to ./skills/{name}/\n        Outside a project: installs to ~/.crewai/skills/{org}/{name}/\n        \"\"\"\n        if not ref.startswith(\"@\"):\n            console.print(\n                \"[red]Invalid skill reference. Use the format @org/name.[/red]\"\n            )\n            raise SystemExit(1)\n\n        without_at = ref[1:]\n        if without_at.count(\"/\") != 1:\n            console.print(\n                \"[red]Invalid skill reference. Use the format @org/name.[/red]\"\n            )\n            raise SystemExit(1)\n\n        org, name = without_at.split(\"/\", 1)\n        if (\n            not org\n            or not name\n            or org.startswith(\".\")\n            or name.startswith(\".\")\n            or len(Path(org).parts) != 1\n            or len(Path(name).parts) != 1\n        ):\n            console.print(","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/crewAIInc/crewAI/blob/754d7323beb2fd042e33444a115ea2d5a47193f0/lib/cli/src/crewai_cli/skills/main.py#L68-L104","documentation":"`crewai skill install <ref>` validates that the reference starts with `@`. A reference without the leading `@` fails immediately with SystemExit(1) before any network call, because the registry API is keyed by the `@org/name` format.","triggerScenarios":"Passing `crewai skill install org/name` (missing `@`), `crewai skill install https://crewai.com/...`, or a bare skill name like `crewai skill install researcher`. The check is literally `ref.startswith(\"@\")`.","commonSituations":"Copying a skill URL or a plain `org/name` string from docs, chat, or a README that omits the `@`; muscle memory from other package managers (pip/npm style names without sigils).","solutions":["Add the `@` prefix: `crewai skill install @org/name`.","Confirm the exact published name via `crewai skill list` or the registry UI before retrying."],"exampleFix":"# before\ncrewai skill install crewai/writing\n# after\ncrewai skill install @crewai/writing","handlingStrategy":"validation","validationCode":"import re\n\ndef is_valid_skill_ref(ref: str) -> bool:\n    return bool(re.match(r\"^@[^/\\s]+/[^/\\s]+$\", ref))\n\nassert is_valid_skill_ref(\"@org/name\")      # True\nassert not is_valid_skill_ref(\"org/name\")    # missing @","typeGuard":"def is_skill_ref(ref: str) -> bool:\n    \"\"\"Narrow a CLI argument to a valid @org/name registry reference.\"\"\"\n    return isinstance(ref, str) and is_valid_skill_ref(ref)","tryCatchPattern":null,"preventionTips":["Always type the ref as `@org/name` — the `@` is mandatory.","Validate refs with the regex before shelling out to the CLI so failures surface in your code, not the CLI's.","Keep a canonical list of installed skill refs in your project docs to copy from."],"tags":["cli","validation","skill","argument-format"],"backgroundTag":null,"analyzedSha":"754d7323beb2fd042e33444a115ea2d5a47193f0","analyzedAt":"2026-08-15T04:06:56.746Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}