persona-community-5/pkg/persona/lifestyle.go
jordan bd2f591b98
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline was successful
Initialize project from skeleton template
2026-02-24 07:39:46 +00:00

228 lines
10 KiB
Go

package persona
// Lifestyle contains the persona's interests, fashion sense, and vacation style.
// Generated in Stage 3 of the specgen pipeline using identity and psychology as inputs.
type Lifestyle struct {
// Interests captures the persona's hobbies and passions.
Interests Interests `json:"interests" yaml:"interests"`
// FashionSense describes the persona's clothing style preferences.
FashionSense FashionSense `json:"fashion_sense" yaml:"fashion_sense"`
// VacationStyle describes travel preferences.
VacationStyle VacationStyle `json:"vacation_style" yaml:"vacation_style"`
}
// Interests captures a persona's hobbies and passions across 5 categories.
type Interests struct {
// Creative interests: art, music, writing, photography, etc.
Creative []string `json:"creative" yaml:"creative"`
// Active interests: sports, fitness, dance, hiking, etc.
Active []string `json:"active" yaml:"active"`
// Social interests: dining, travel, nightlife, community, etc.
Social []string `json:"social" yaml:"social"`
// Intellectual interests: books, philosophy, science, tech, etc.
Intellectual []string `json:"intellectual" yaml:"intellectual"`
// Lifestyle interests: cooking, gardening, home decor, wellness, etc.
Lifestyle []string `json:"lifestyle" yaml:"lifestyle"`
}
// FashionSense describes a persona's clothing style.
type FashionSense struct {
// Primary is the dominant fashion context name.
Primary FashionContextName `json:"primary" yaml:"primary"`
// Secondary is a secondary style influence (optional).
Secondary FashionContextName `json:"secondary,omitempty" yaml:"secondary,omitempty"`
// SignatureDetails are specific personal styling touches (e.g., "always wears gold hoops").
SignatureDetails []string `json:"signature_details,omitempty" yaml:"signature_details,omitempty"`
}
// VacationStyle describes a persona's travel preferences.
type VacationStyle struct {
// Primary is the dominant vacation type: "beach", "city", "adventure", "luxury", "cultural".
Primary string `json:"primary" yaml:"primary"`
// Activities are preferred vacation activities.
Activities []string `json:"activities,omitempty" yaml:"activities,omitempty"`
// DreamDestinations are top travel destinations.
DreamDestinations []string `json:"dream_destinations,omitempty" yaml:"dream_destinations,omitempty"`
}
// FashionContextName identifies one of the 15 defined fashion contexts.
type FashionContextName string
const (
FashionClassicMinimalist FashionContextName = "classic_minimalist"
FashionStreetwearChic FashionContextName = "streetwear_chic"
FashionBohemianSpirit FashionContextName = "bohemian_free_spirit"
FashionAthleisurePro FashionContextName = "athleisure_pro"
FashionBusinessCasual FashionContextName = "business_casual"
FashionRomanticFeminine FashionContextName = "romantic_feminine"
FashionEdgyAlternative FashionContextName = "edgy_alternative"
FashionCoastalCasual FashionContextName = "coastal_casual"
FashionUrbanProfessional FashionContextName = "urban_professional"
FashionFestivalGlam FashionContextName = "festival_glam"
FashionPreppyClassic FashionContextName = "preppy_classic"
FashionDarkAcademia FashionContextName = "dark_academia"
FashionCottagecore FashionContextName = "cottagecore"
FashionY2KRevival FashionContextName = "y2k_revival"
FashionLuxeLoungewear FashionContextName = "luxe_loungewear"
)
// FashionContext describes a named fashion style with styling details.
type FashionContext struct {
// Name is the canonical identifier.
Name FashionContextName `json:"name" yaml:"name"`
// Description is a one-line style summary.
Description string `json:"description" yaml:"description"`
// KeyPieces are the defining wardrobe items.
KeyPieces []string `json:"key_pieces" yaml:"key_pieces"`
// Brands are representative brands for this aesthetic.
Brands []string `json:"brands" yaml:"brands"`
// Silhouette describes the overall shape/fit profile.
Silhouette string `json:"silhouette" yaml:"silhouette"`
}
// AllFashionContexts returns the catalog of all 15 defined fashion contexts.
func AllFashionContexts() []FashionContext {
return []FashionContext{
{
Name: FashionClassicMinimalist,
Description: "Clean lines, neutral palette, and timeless silhouettes",
KeyPieces: []string{"crisp white shirt", "tailored trousers", "structured blazer", "minimal gold jewelry"},
Brands: []string{"COS", "Everlane", "The Row", "A.P.C."},
Silhouette: "slim, structured, minimal layering",
},
{
Name: FashionStreetwearChic,
Description: "Urban-influenced with oversized fits, sneakers, and bold logos",
KeyPieces: []string{"oversized hoodie", "cargo pants", "chunky sneakers", "bucket hat"},
Brands: []string{"Off-White", "Supreme", "Stüssy", "PANGAIA"},
Silhouette: "oversized tops, tapered or wide bottoms",
},
{
Name: FashionBohemianSpirit,
Description: "Free-flowing fabrics, earthy tones, and global-inspired prints",
KeyPieces: []string{"flowy maxi dress", "embroidered blouse", "woven bag", "layered necklaces"},
Brands: []string{"Free People", "Spell", "Anthropologie", "Zimmermann"},
Silhouette: "loose, flowing, layered",
},
{
Name: FashionAthleisurePro,
Description: "Performance fabrics worn stylishly beyond the gym",
KeyPieces: []string{"seamless leggings", "sports bra", "zip-up hoodie", "white sneakers"},
Brands: []string{"Lululemon", "Alo Yoga", "Gymshark", "Vuori"},
Silhouette: "form-fitting, streamlined",
},
{
Name: FashionBusinessCasual,
Description: "Polished and professional with approachable comfort",
KeyPieces: []string{"fitted blazer", "straight-leg trousers", "silk blouse", "loafers"},
Brands: []string{"Banana Republic", "Theory", "J.Crew", "& Other Stories"},
Silhouette: "tailored, clean lines, moderate coverage",
},
{
Name: FashionRomanticFeminine,
Description: "Soft, delicate pieces with florals, lace, and pastel tones",
KeyPieces: []string{"floral midi dress", "lace cami", "ballet flats", "pearl accessories"},
Brands: []string{"Reformation", "Loveshackfancy", "Hill House Home", "Rixo"},
Silhouette: "fitted bodice with full or flowy skirts",
},
{
Name: FashionEdgyAlternative,
Description: "Dark palette, punk and rock influences, leather and hardware",
KeyPieces: []string{"leather jacket", "black skinny jeans", "combat boots", "silver chain jewelry"},
Brands: []string{"AllSaints", "Saint Laurent", "Helmut Lang", "Rick Owens"},
Silhouette: "slim, angular, layered with hardware",
},
{
Name: FashionCoastalCasual,
Description: "Relaxed, sun-kissed looks inspired by beach and ocean lifestyles",
KeyPieces: []string{"linen shorts", "striped tee", "espadrilles", "canvas tote"},
Brands: []string{"Outerknown", "Marine Layer", "Vilebrequin", "Solid & Striped"},
Silhouette: "relaxed, breezy, effortless",
},
{
Name: FashionUrbanProfessional,
Description: "Sharp city-dweller style blending fashion and function",
KeyPieces: []string{"tailored coat", "ankle boots", "structured handbag", "monochrome sets"},
Brands: []string{"Toteme", "Cos", "Sandro", "BOSS"},
Silhouette: "sleek, polished, statement outerwear",
},
{
Name: FashionFestivalGlam,
Description: "Bold prints, glitter, and maximalist looks built for events",
KeyPieces: []string{"crop top with sequins", "fringe jacket", "platform sandals", "body chains"},
Brands: []string{"House of CB", "PrettyLittleThing", "Fashion Nova", "Nasty Gal"},
Silhouette: "skin-baring, layered accessories, high visual impact",
},
{
Name: FashionPreppyClassic,
Description: "Collegiate-inspired clean aesthetics with a polished finish",
KeyPieces: []string{"polo shirt", "chino trousers", "boat shoes", "cable-knit sweater"},
Brands: []string{"Ralph Lauren", "Brooks Brothers", "Tommy Hilfiger", "Lacoste"},
Silhouette: "classic proportions, clean and put-together",
},
{
Name: FashionDarkAcademia,
Description: "Literary and scholarly aesthetic with earth tones and vintage pieces",
KeyPieces: []string{"tweed blazer", "turtleneck", "pleated skirt", "oxford shoes"},
Brands: []string{"Cordera", "Mango", "H&M Studio", "Massimo Dutti"},
Silhouette: "layered, traditional, intellectual",
},
{
Name: FashionCottagecore,
Description: "Pastoral romanticism with floral prints, ruffles, and natural textures",
KeyPieces: []string{"prairie dress", "puff-sleeve blouse", "wicker bag", "mary jane shoes"},
Brands: []string{"Doen", "For Love & Lemons", "Batsheva", "Emilia Wickstead"},
Silhouette: "loose, romantic, tiered or smocked",
},
{
Name: FashionY2KRevival,
Description: "Early 2000s nostalgia with low-rise, butterfly prints, and metallics",
KeyPieces: []string{"low-rise jeans", "halter top", "platform boots", "mini bag"},
Brands: []string{"Blumarine", "Diesel", "Juicy Couture", "Paris Hilton Collection"},
Silhouette: "crop tops with low-rise bottoms, skin-baring midriff",
},
{
Name: FashionLuxeLoungewear,
Description: "Elevated comfort dressing in premium fabrics and tonal sets",
KeyPieces: []string{"cashmere loungewear set", "silk slip", "fuzzy slides", "oversized cashmere cardigan"},
Brands: []string{"Skims", "Eberjey", "Brunello Cucinelli", "Leset"},
Silhouette: "relaxed but polished, tonal and monochromatic",
},
}
}
// FashionContextFor returns the FashionContext definition for the given name.
// Returns a zero-value FashionContext if the name is not found.
func FashionContextFor(name FashionContextName) FashionContext {
for _, fc := range AllFashionContexts() {
if fc.Name == name {
return fc
}
}
return FashionContext{}
}
// AllFashionContextNames returns all 15 fashion context names.
func AllFashionContextNames() []FashionContextName {
all := AllFashionContexts()
names := make([]FashionContextName, len(all))
for i, fc := range all {
names[i] = fc.Name
}
return names
}