refactor: replace Wizard with CoopBuilder in navigation, enhance budget store structure, and streamline template components for improved user experience
This commit is contained in:
parent
eede87a273
commit
f67b138d95
33 changed files with 4970 additions and 2451 deletions
157
data/skillsProblems.ts
Normal file
157
data/skillsProblems.ts
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue