#!/usr/bin/env bun /** * Telos Weekly Planner * * Combines Personal Day cycles with Telos goals to create weekly action plan. * Shows which telos goals align with each day's energy. * * Usage: * bun telos-week.ts --birthdate "5/13/1982" --name "Your Name" * bun telos-week.ts --birthdate "5/13/1982" --name "Your Name" --start-date "10/14/2025" * bun telos-week.ts --birthdate "5/13/1982" --name "Your Name" --telos-file ~/path/to/telos.md * * Default telos file: ~/.claude/context/personal/telos/telos.md */ import { calculateCycles } from './cycles'; import { personalDay as personalDayMeanings } from './cycle-meanings'; import { loadProfile } from './profile-manager'; // Parse command line arguments const args = process.argv.slice(2); let birthdate = ''; let name = ''; let profileId = ''; let startDate = ''; let telosFilePath = `${process.env.HOME}/.claude/context/personal/telos/telos.md`; for (let i = 0; i < args.length; i++) { if ((args[i] === '--profile' || args[i] === '-p') && args[i + 1]) { profileId = args[i + 1]; i++; } else if ((args[i] === '--birthdate' || args[i] === '-b') && args[i + 1]) { birthdate = args[i + 1]; i++; } else if ((args[i] === '--name' || args[i] === '-n') && args[i + 1]) { name = args[i + 1]; i++; } else if ((args[i] === '--start-date' || args[i] === '-s') && args[i + 1]) { startDate = args[i + 1]; i++; } else if ((args[i] === '--telos-file' || args[i] === '-t') && args[i + 1]) { telosFilePath = args[i + 1]; i++; } else if (args[i] === '--help' || args[i] === '-h') { console.log(` Telos Weekly Planner - Align your goals with daily energy cycles USAGE: bun telos-week.ts --profile bun telos-week.ts --birthdate "mm/dd/yyyy" --name "Your Name" OPTIONS: -p, --profile Use saved profile -b, --birthdate Your birthdate (mm/dd/yyyy) [required if no profile] -n, --name Your name (for personalization) [required if no profile] -s, --start-date Start date (mm/dd/yyyy) [default: today] -t, --telos-file Path to telos.md file [default: ~/.claude/context/personal/telos/telos.md] -h, --help Show this help message EXAMPLES: # With profile bun telos-week.ts --profile rob bun telos-week.ts --profile rob -s "10/14/2025" # With name/birthdate bun telos-week.ts -b "5/13/1982" -n "John" bun telos-week.ts -b "5/13/1982" -n "John" -s "10/14/2025" bun telos-week.ts -b "5/13/1982" -n "John" -t ~/my-telos.md `); process.exit(0); } } // Load profile if specified if (profileId) { const profile = loadProfile(profileId); if (!profile) { console.error(`Error: Profile '${profileId}' not found`); console.error('List profiles with: bun profile.ts list'); process.exit(1); } name = profile.name; birthdate = profile.birthdate; } if (!birthdate || !name) { console.error('Error: --birthdate and --name are required (or use --profile)'); console.error('Try: bun telos-week.ts --help'); process.exit(1); } // Load and parse telos file interface TelosGoal { id: string; description: string; category: string; status?: string; } async function parseTelosFile(filePath: string): Promise { try { const file = Bun.file(filePath); const content = await file.text(); const goals: TelosGoal[] = []; let currentCategory = ''; const lines = content.split('\n'); for (let i = 0; i < lines.length; i++) { const line = lines[i].trim(); // Detect category headers if (line.match(/^(Career|Business|Personal|Technical|Content|Spiritual|Expression)/)) { currentCategory = line.replace(/^#*\s*/, '').replace(/\s*-.*$/, ''); } // Parse goal lines const goalMatch = line.match(/^-\s+(G[A-Z]*\d+):\s*(.+)/); if (goalMatch && currentCategory) { const [, id, description] = goalMatch; const status = description.includes('āœ…') ? 'achieved' : description.includes('Back burner') ? 'backburner' : description.includes('Future goal') ? 'future' : 'active'; let cleanDesc = description .replace(/āœ…\s*ACHIEVED\s*-?\s*/gi, '') .replace(/āœ…\s*ONGOING\s*-?\s*/gi, '') .replace(/āœ…\s*EXCEEDED\s*-?\s*/gi, '') .replace(/\(.*?\)/g, '') .replace(/Back burner/gi, '') .replace(/Future goal/gi, '') .trim(); goals.push({ id, description: cleanDesc, category: currentCategory, status }); } } return goals; } catch (error) { console.error(`Error reading telos file: ${error}`); return []; } } // Format date as mm/dd/yyyy function formatDate(date: Date): string { const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const year = date.getFullYear(); return `${month}/${day}/${year}`; } // Get day name (short) function getDayName(date: Date): string { return date.toLocaleDateString('en-US', { weekday: 'short' }); } // Get month name (short) function getMonthName(date: Date): string { return date.toLocaleDateString('en-US', { month: 'short' }); } // Get best activities for Personal Day function getBestActivities(personalDay: number): string { const activities: Record = { 1: 'Starting new projects, taking initiative, independence', 2: 'Collaboration, details, patience, partnerships', 3: 'Content creation, communication, socializing', 4: 'Organizing, building systems, hard work', 5: 'Trying new things, flexibility, exploration', 6: 'Client/family focus, service, responsibility', 7: 'Research, deep study, spiritual practice, rest', 8: 'Business planning, financial matters, achievement', 9: 'Finishing projects, clearing clutter, completion', 11: 'Inspiring others, intuitive work, spiritual teaching', 22: 'Large-scale building, manifesting visions, legacy work', 33: 'Teaching, healing, compassionate service' }; return activities[personalDay] || activities[personalDay % 11] || 'General activities'; } // Match goals to Personal Day energy (simplified) function matchGoalsToDay(personalDay: number, goals: TelosGoal[]): string[] { const matched: string[] = []; // Day-specific matching const patterns: Record = { 1: ['start', 'launch', 'begin', 'new'], 2: ['partner', 'collaboration', 'team', 'detail'], 3: ['content', 'blog', 'video', 'education', 'speaking', 'write'], 4: ['build', 'system', 'infrastructure', 'organize'], 5: ['learn', 'explore', 'new', 'practice'], 6: ['client', 'help', 'service', 'teaching', 'education'], 7: ['study', 'certification', 'research', 'spiritual'], 8: ['scale', 'revenue', 'business', 'profitability'], 9: ['finish', 'complete', 'publish'], 11: ['inspire', 'teach', 'spiritual', 'intuitive'], 22: ['build', 'scale', 'infrastructure', 'legacy'], 33: ['teach', 'education', 'service', 'heal'] }; const dayPatterns = patterns[personalDay] || []; goals.forEach(g => { if (g.status !== 'active') return; const desc = g.description.toLowerCase(); const cat = g.category.toLowerCase(); for (const pattern of dayPatterns) { if (desc.includes(pattern) || cat.includes(pattern)) { matched.push(`${g.id}: ${g.description.substring(0, 60)}${g.description.length > 60 ? '...' : ''}`); return; // Only match once } } }); return matched.slice(0, 3); // Max 3 goals per day } // Get avoid activities function getAvoidActivities(personalDay: number): string { const avoid: Record = { 1: 'Depending on others, waiting for permission', 2: 'Rushing, going solo, hasty decisions', 3: 'Deep analytical work, heavy organizing', 4: 'Scattered creative work, starting new things', 5: 'Long-term commitments, rigid plans', 6: 'Self-focused work, ignoring commitments', 7: 'Networking events, major launches, sales calls', 8: 'Being passive, rest days', 9: 'Starting new projects, major commitments', 11: 'Ignoring intuition, suppressing sensitivity', 22: 'Small thinking, self-sabotage', 33: 'Martyrdom, neglecting self-care' }; return avoid[personalDay] || avoid[personalDay % 11] || ''; } // Main execution async function main() { // Load telos goals const goals = await parseTelosFile(telosFilePath); const activeGoals = goals.filter(g => g.status === 'active'); // Determine start date (today by default) let start: Date; if (startDate) { const parts = startDate.split('/'); start = new Date(parseInt(parts[2]), parseInt(parts[0]) - 1, parseInt(parts[1])); } else { start = new Date(); } // Get cycles for 7 days const weekDays = []; for (let i = 0; i < 7; i++) { const date = new Date(start); date.setDate(start.getDate() + i); const dateStr = formatDate(date); const cycles = calculateCycles(birthdate, dateStr); weekDays.push({ date, dateStr, cycles }); } // Calculate Personal Year and Month const todayCycles = calculateCycles(birthdate); const personalYear = todayCycles.personal.year; const personalMonth = todayCycles.personal.month; // Get meanings const yearMeanings: Record = { 1: 'New Beginnings', 2: 'Patience & Cooperation', 3: 'Expression & Creativity', 4: 'Hard Work & Foundation', 5: 'Change & Freedom', 6: 'Responsibility & Service', 7: 'Introspection & Spirituality', 8: 'Achievement & Power', 9: 'Completion & Release', 11: 'Inspiration & Illumination', 22: 'Master Building', 33: 'Master Teaching' }; const monthMeanings: Record = { 1: 'Initiation', 2: 'Patience', 3: 'Expression', 4: 'Work', 5: 'Change', 6: 'Responsibility', 7: 'Introspection', 8: 'Achievement', 9: 'Completion' }; // Output header const startFormatted = `${getMonthName(start)} ${start.getDate()}`; const endDate = new Date(start); endDate.setDate(start.getDate() + 6); const endFormatted = `${getMonthName(endDate)} ${endDate.getDate()}, ${endDate.getFullYear()}`; console.log(`\nšŸ“… YOUR WEEK: ${startFormatted}-${endFormatted}\n`); console.log(`Personal Year ${personalYear} (${yearMeanings[personalYear]}) + Month ${personalMonth} (${monthMeanings[personalMonth]})`); // Contextual theme if (personalYear === 9 && personalMonth === 1) { console.log(`→ Theme: Completing major cycles while initiating final projects`); console.log(` (Year 9 wants to finish/release, Month 1 brings fresh energy)`); } else if (personalYear === 33) { console.log(`→ Theme: Master teaching year - share wisdom through service, not profit`); console.log(` (Focus on teaching/healing - abundance follows service)`); } else if (personalYear === 1) { console.log(`→ Theme: Fresh starts - plant seeds for the next 9-year cycle`); } else { console.log(`→ Theme: Year ${personalYear} energy expressed through Month ${personalMonth} focus`); } console.log(`\nšŸ“Š Active Goals: ${activeGoals.length} | Telos file: ${telosFilePath.replace(process.env.HOME || '', '~')}\n`); // Output each day for (const { date, cycles } of weekDays) { const dayName = getDayName(date); const dayNum = date.getDate(); const personalDay = cycles.personal.day; // Get meaning keywords const meaningText = personalDayMeanings[personalDay]; const meaningMatch = meaningText?.match(/^([^.]+)/); const keywords = meaningMatch ? meaningMatch[1].replace(' day', '') : `Day ${personalDay}`; // Match goals const matchedGoals = matchGoalsToDay(personalDay, goals); const bestFor = getBestActivities(personalDay); const avoid = getAvoidActivities(personalDay); console.log(`─────────────────────────────────────────────────────────`); console.log(`${dayName} ${getMonthName(date)} ${dayNum} - Personal Day ${personalDay} (${keywords})`); console.log(` āœ… Best for: ${bestFor}`); if (matchedGoals.length > 0) { console.log(` šŸŽÆ Telos:`); matchedGoals.forEach(goal => console.log(` • ${goal}`)); } else { // Provide category-level guidance when no specific match const categoryGuidance: Record = { 3: 'Content creation goals, communication, public speaking', 7: 'Study/certification goals, spiritual practice', 8: 'Business scaling goals, financial planning', 1: 'New project launches, initiating goals', 6: 'Client service goals, teaching, helping others', 4: 'Infrastructure/system building goals', 5: 'Learning/exploration goals, trying new approaches', 9: 'Completing pending projects, publishing finished work', 11: 'Inspiring/teaching goals, intuitive projects', 22: 'Large-scale building, legacy projects', 33: 'Education/teaching goals, healing/service work' }; const guidance = categoryGuidance[personalDay] || 'Work on any active goals with appropriate energy'; console.log(` šŸ’” Guidance: Good day for ${guidance}`); } if (avoid) { console.log(` āš ļø Avoid: ${avoid}`); } console.log(''); } console.log(`─────────────────────────────────────────────────────────`); // Weekly Summary console.log(`\nšŸ“Š WEEKLY SUMMARY\n`); console.log(`Personal Year ${personalYear} + Month ${personalMonth}`); // Weekly Theme based on Year/Month console.log(`\nšŸŽÆ WEEKLY THEME:`); if (personalYear === 9 && personalMonth === 1) { console.log(`You're completing a 9-year cycle (endings/teaching) while Month 1 brings`); console.log(`fresh initiative energy. Focus on finishing major projects while preparing`); console.log(`seeds for your new cycle starting in ${new Date().getFullYear() + 1}.`); } else if (personalYear === 33) { console.log(`Master Teacher year - your purpose this year is to uplift and heal through`); console.log(`teaching and service. Focus on sharing wisdom, not accumulating wealth.`); console.log(`Abundance flows naturally when you serve from overflow.`); } else if (personalYear === 1) { console.log(`New 9-year cycle begins! This week sets the tone for the next 9 years.`); console.log(`Be bold, take initiative, plant seeds you want to harvest over this cycle.`); } else if (personalYear === 8) { console.log(`Power and achievement year. This week offers opportunities for business`); console.log(`growth, financial gains, and stepping into leadership roles.`); } else { console.log(`Year ${personalYear} energy (${yearMeanings[personalYear]}) flowing through Month ${personalMonth}.`); console.log(`Balance your yearly theme with monthly focus for optimal results.`); } // Key Opportunities console.log(`\n🌟 KEY OPPORTUNITIES THIS WEEK:`); const opportunityDays = weekDays.filter(d => [1, 3, 8, 11, 22, 33].includes(d.cycles.personal.day)); if (opportunityDays.length > 0) { opportunityDays.forEach(d => { const day = d.cycles.personal.day; const opportunities: Record = { 1: `${getDayName(d.date)} (Day 1): New beginnings - start important projects`, 3: `${getDayName(d.date)} (Day 3): Expression - create content, communicate ideas`, 8: `${getDayName(d.date)} (Day 8): Achievement - business deals, financial planning`, 11: `${getDayName(d.date)} (Day 11): Inspiration - channel higher wisdom, teach`, 22: `${getDayName(d.date)} (Day 22): Master building - manifest grand visions`, 33: `${getDayName(d.date)} (Day 33): Master teaching - heal and serve compassionately` }; if (opportunities[day]) { console.log(` ${opportunities[day]}`); } }); } else { console.log(` This week emphasizes steady progress over dramatic breakthroughs.`); console.log(` Focus on consistent daily action aligned with each day's energy.`); } // Weekly Advice console.log(`\nšŸ’” WEEKLY ADVICE:`); if (personalYear === 9) { console.log(` • Complete unfinished projects before starting new ones`); console.log(` • Release what no longer serves your growth`); console.log(` • Document lessons learned - they'll guide your next cycle`); } else if (personalYear === 1) { console.log(` • Take initiative even if you don't feel 100% ready`); console.log(` • Your independence is your superpower this year`); console.log(` • Small seeds planted now become big trees later`); } else if (personalYear === 33) { console.log(` • Teach what you know - your wisdom helps others heal`); console.log(` • Self-care is non-negotiable (can't pour from empty cup)`); console.log(` • Focus on service impact, not financial compensation`); } else if (personalYear === 7) { console.log(` • Honor your need for solitude and introspection`); console.log(` • Deep study and research are favored over action`); console.log(` • Trust your intuition - it's especially strong this year`); } else { console.log(` • Align daily tasks with each Personal Day's energy`); console.log(` • Work with your cycles, not against them`); console.log(` • Rest on Day 7, launch on Day 1, create on Day 3`); } console.log(`\n✨ Generated with Telos + Numerology Integration System`); } main().catch(console.error);