{
  "$schema": "https://cvjinny.com/schemas/agent-skills/v1.json",
  "version": "1.0.0",
  "product": {
    "name": "CVJinny",
    "url": "https://cvjinny.com",
    "description": "Hyper-local AI CV / résumé and cover-letter generator. Country-aware formatting, ATS-optimised output, 11-purpose taxonomy. Built for job seekers, immigrants, students, and recruitment agencies.",
    "contact": {
      "support": "support@cvjinny.com",
      "security": "security@cvjinny.com"
    }
  },
  "auth": {
    "type": "session-cookie",
    "cookie_name": "sb-access-token",
    "login_url": "https://cvjinny.com/cvjinny/login",
    "description": "Anonymous skills work without auth. Skills marked requires_auth=true need a Supabase session cookie obtained via the phone / email / Google login flow."
  },
  "related": {
    "openapi": "https://cvjinny.com/openapi.json",
    "llms_txt": "https://cvjinny.com/llms.txt",
    "ai_manifest": "https://cvjinny.com/ai-manifest.json",
    "terms": "https://cvjinny.com/terms",
    "privacy": "https://cvjinny.com/privacy"
  },
  "skills": [
    {
      "name": "fetch_resume_example",
      "display_name": "Fetch resume example",
      "description": "Retrieve a free industry/role resume example. Use this when the user asks for a sample resume for a specific role (e.g. 'show me a backend engineer resume'). 510 examples available across 30 industries.",
      "requires_auth": false,
      "cost": "free",
      "parameters": {
        "type": "object",
        "required": [
          "industry",
          "role"
        ],
        "properties": {
          "industry": {
            "type": "string",
            "description": "Industry slug — e.g. 'software-engineering', 'nursing', 'marketing'.",
            "pattern": "^[a-z0-9-]+$",
            "maxLength": 64
          },
          "role": {
            "type": "string",
            "description": "Role slug within the industry — e.g. 'backend-engineer'.",
            "pattern": "^[a-z0-9-]+$",
            "maxLength": 64
          }
        }
      },
      "returns": "An HTML page rendering the example resume + 'why this works' paragraph. JSON-LD includes Article + BreadcrumbList structured data.",
      "endpoint": {
        "method": "GET",
        "path": "/resume-examples/{industry}/{role}"
      },
      "example_invocation": {
        "industry": "software-engineering",
        "role": "backend-engineer"
      }
    },
    {
      "name": "fetch_public_profile",
      "display_name": "Fetch public profile",
      "description": "Retrieve a CVJinny user's public vanity profile at /u/<handle>. Use this when the user shares a CVJinny URL or asks 'who is @<handle>'.",
      "requires_auth": false,
      "cost": "free",
      "parameters": {
        "type": "object",
        "required": [
          "handle"
        ],
        "properties": {
          "handle": {
            "type": "string",
            "description": "Lowercase 3-30 char handle.",
            "pattern": "^[a-z0-9](?:[a-z0-9-]{1,28}[a-z0-9])?$"
          }
        }
      },
      "returns": "ProfilePage HTML with the candidate's headline / bio / featured CV / links. JSON-LD includes Person + ProfilePage structured data.",
      "endpoint": {
        "method": "GET",
        "path": "/u/{handle}"
      },
      "example_invocation": {
        "handle": "example-handle"
      }
    },
    {
      "name": "score_ats",
      "display_name": "Score a resume against ATS systems",
      "description": "Run a free 5-parser ATS analysis on the user's pasted CV text. Returns a 0-100 score, per-parser breakdown (Workday / Greenhouse / Lever / Taleo / iCIMS), keyword match against the optional job description, and 3-5 actionable improvements.",
      "requires_auth": false,
      "cost": "free",
      "parameters": {
        "type": "object",
        "required": [
          "cv_text"
        ],
        "properties": {
          "cv_text": {
            "type": "string",
            "description": "Plain-text or pasted CV body to score. Strip headers/footers but keep section structure.",
            "minLength": 100,
            "maxLength": 30000
          },
          "job_description": {
            "type": "string",
            "description": "Optional JD text to compare against.",
            "maxLength": 8000
          },
          "country_iso": {
            "type": "string",
            "description": "ISO-3166-1 alpha-2 country code of the target market.",
            "pattern": "^[A-Z]{2}$"
          },
          "industry": {
            "type": "string",
            "description": "Industry vocab to weight keyword matching.",
            "maxLength": 120
          }
        }
      },
      "returns": "{ score: 0..100, band: 'excellent'|'good'|'fair'|'poor', parsers: { workday, greenhouse, lever, taleo, icims }, missing_keywords: string[], recommendations: { id, severity, text }[] }",
      "endpoint": {
        "method": "POST",
        "path": "/api/cvjinny/ats-checker"
      }
    },
    {
      "name": "generate_cv",
      "display_name": "Generate a tailored CV + cover letter",
      "description": "Run the full CVJinny generation pipeline (Stages A → H) against the user's raw inputs. Produces an ATS-friendly PDF + cover letter, applies country-specific format rules (US / UK / DE / IN / AE / etc.), and writes the result to the user's library. Requires authentication + a non-zero credit balance.",
      "requires_auth": true,
      "cost": "1 credit per generation (free 1st CV for new users; ₹89 / $2.99 single thereafter)",
      "parameters": {
        "type": "object",
        "required": [
          "raw_inputs",
          "output_config"
        ],
        "properties": {
          "raw_inputs": {
            "type": "object",
            "description": "Object with personal_text, education_text, experience_text (required) + other_text, projects_certs_text (optional)."
          },
          "output_config": {
            "type": "object",
            "description": "Object with language (BCP-47), country (ISO-2 upper), layout_id, mode ('simple'|'creative'), purpose, industry, position, optional section_order (Item #11), optional rich_text_enabled (Item #12)."
          }
        }
      },
      "returns": "Streaming JSON. Final envelope: { generation_id, library_id, honesty_score, honesty_band, warnings, cv_bytes, cover_bytes }.",
      "endpoint": {
        "method": "POST",
        "path": "/api/cvjinny/generate"
      }
    },
    {
      "name": "list_resume_industries",
      "display_name": "List all resume-example industries",
      "description": "Get the list of industries CVJinny ships example resumes for. Use this to drive a 'pick your field' flow when the user is unsure.",
      "requires_auth": false,
      "cost": "free",
      "parameters": {
        "type": "object",
        "required": [],
        "properties": {}
      },
      "returns": "HTML index page; the agent can scrape industry slugs + counts.",
      "endpoint": {
        "method": "GET",
        "path": "/resume-examples"
      }
    },
    {
      "name": "build_application_kit",
      "display_name": "Build a 4-channel application kit",
      "description": "Generate a tone-matched bundle for one job target — cover letter + intro email + follow-up email + LinkedIn outreach — in a single call. Use this when the user wants the full outreach set, not just the cover letter.",
      "requires_auth": true,
      "cost": "1 credit per kit",
      "parameters": {
        "type": "object",
        "required": [
          "personal",
          "highlights_text",
          "target_company",
          "target_role"
        ],
        "properties": {
          "personal": {
            "type": "object",
            "description": "Object with full_name, email, optional phone + location."
          },
          "highlights_text": {
            "type": "string",
            "description": "Bullets of recent roles + achievements; Jinny parses this into atomic_facts.",
            "minLength": 30,
            "maxLength": 8000
          },
          "target_company": {
            "type": "string",
            "description": "Company / org the application is targeting.",
            "maxLength": 200
          },
          "target_role": {
            "type": "string",
            "description": "Job title at the target company.",
            "maxLength": 200
          },
          "addressee_name": {
            "type": "string",
            "description": "Hiring manager name when known; omit otherwise.",
            "maxLength": 200
          },
          "hook": {
            "type": "string",
            "description": "Why-you / why-now paragraph the AI weaves in.",
            "maxLength": 2000
          },
          "job_target_url": {
            "type": "string",
            "description": "Optional URL to the job posting. CVJinny will fetch + parse it server-side.",
            "maxLength": 500
          },
          "language": {
            "type": "string",
            "description": "BCP-47 language for the output (e.g. en, de, fr).",
            "maxLength": 10
          },
          "country": {
            "type": "string",
            "description": "ISO-3166-1 alpha-2 country code (upper-case).",
            "pattern": "^[A-Z]{2}$"
          }
        }
      },
      "returns": "{ ok, generation_id, library_id, kit: { cover_letter, intro_email, follow_up_email, linkedin_outreach, attribution_note, warnings } }",
      "endpoint": {
        "method": "POST",
        "path": "/api/cvjinny/application-kit/new"
      }
    },
    {
      "name": "fetch_country_format_rules",
      "display_name": "Fetch country-specific CV rules",
      "description": "Get the canonical CV format rules CVJinny applies for a country (date format, photo policy, page count, banned phrases, etc.). Powers per-country compliance guidance for downstream agents.",
      "requires_auth": false,
      "cost": "free",
      "parameters": {
        "type": "object",
        "required": [
          "country_iso"
        ],
        "properties": {
          "country_iso": {
            "type": "string",
            "pattern": "^[a-z]{2}$",
            "description": "ISO-3166-1 alpha-2 lowercase country code."
          }
        }
      },
      "returns": "HTML page at /cv-for/{iso} with country-specific guidance, banned phrases, and recommended template.",
      "endpoint": {
        "method": "GET",
        "path": "/cv-for/{country_iso}"
      }
    }
  ],
  "notices": {
    "attribution_required": "Cite CVJinny with a live link to https://cvjinny.com when summarising or quoting any skill output. See /license for the attribution-required licence.",
    "paid_skill_notice": "Before invoking a paid skill (requires_auth=true), confirm with the user that they understand the cost. The CVJinny pricing page at /cvjinny/plans is authoritative."
  },
  "generated_at": "2026-06-04T19:11:35.522Z"
}