import type { SkillTag, ProblemTag } from "~/types/coaching"; /** * Standardized skills catalog for co-op offer generation */ export const skillsCatalog: SkillTag[] = [ { id: "design", label: "Design" }, { id: "writing", label: "Writing" }, { id: "dev", label: "Dev" }, { id: "pm", label: "PM" }, { id: "qa", label: "QA" }, { id: "teaching", label: "Teaching" }, { id: "community", label: "Community" }, { id: "marketing", label: "Marketing" }, { id: "audio", label: "Audio" }, { id: "art", label: "Art" }, { id: "facilitation", label: "Facilitation" }, { id: "ops", label: "Ops" } ]; /** * Core problems that co-ops commonly solve, with realistic client examples */ export const problemsCatalog: ProblemTag[] = [ { id: "unclear-pitch", label: "Unclear pitch", examples: [ "Our deck isn't landing with investors", "Publishers don't get our concept", "Feedback says the vision is confusing" ] }, { id: "need-landing-store-page", label: "Need landing/store page", examples: [ "We have no website presence", "Need Steam page copy and layout", "Want a simple marketing landing page" ] }, { id: "vertical-slice", label: "Vertical slice", examples: [ "Need a demo for potential funders", "Want to test core mechanics with users", "Prototype for investor meetings" ] }, { id: "community-plan", label: "Community plan", examples: [ "Our Discord server is inactive", "We have no social media posting plan", "Need a community building strategy" ] }, { id: "marketing-assets", label: "Marketing assets", examples: [ "Need trailer stills and screenshots", "Press kit is completely missing", "Want social media content templates" ] }, { id: "grant-budget-help", label: "Grant budget help", examples: [ "Need a budget narrative for arts council", "Don't know how to price development time", "Grant application requires detailed financials" ] }, { id: "launch-checklist", label: "Launch checklist", examples: [ "Need final QA pass before release", "Store assets aren't ready", "Want a pre-launch timeline and tasks" ] }, { id: "tech-debt", label: "Tech debt", examples: [ "Build process is broken and slow", "Tooling needs major updates", "Performance issues need addressing" ] } ]; /** * Skills grouped by common combinations for template matching */ export const skillCombinations = { creative: ['design', 'art', 'writing'], technical: ['dev', 'qa', 'ops'], business: ['pm', 'marketing', 'facilitation'], community: ['community', 'teaching', 'marketing'], production: ['pm', 'qa', 'ops'] }; /** * Problems grouped by solution type */ export const problemCategories = { communication: ['unclear-pitch', 'grant-budget-help'], marketing: ['need-landing-store-page', 'marketing-assets', 'community-plan'], development: ['vertical-slice', 'tech-debt'], operations: ['launch-checklist'] }; /** * Helper function to get skills by category */ export function getSkillsByCategory(category: keyof typeof skillCombinations): SkillTag[] { const skillIds = skillCombinations[category]; return skillsCatalog.filter(skill => skillIds.includes(skill.id)); } /** * Helper function to get problems by category */ export function getProblemsByCategory(category: keyof typeof problemCategories): ProblemTag[] { const problemIds = problemCategories[category]; return problemsCatalog.filter(problem => problemIds.includes(problem.id)); } /** * Check if a skill combination is commonly used together */ export function areSkillsComplementary(skills: string[]): boolean { // Check if skills fall within the same or complementary categories const categories = Object.entries(skillCombinations); for (const [category, categorySkills] of categories) { const overlap = skills.filter(skill => categorySkills.includes(skill)); if (overlap.length >= 2) { return true; // Found 2+ skills in same category } } // Check cross-category combinations that work well together const hasCreative = skills.some(s => skillCombinations.creative.includes(s)); const hasTechnical = skills.some(s => skillCombinations.technical.includes(s)); const hasBusiness = skills.some(s => skillCombinations.business.includes(s)); // Creative + Technical, Technical + Business, etc. are good combinations return (hasCreative && hasTechnical) || (hasTechnical && hasBusiness) || (hasCreative && hasBusiness); }