- Core calculations (Life Path, Expression, Soul Urge, Birthday) - Advanced numbers (Maturity, Personality, Hidden Passion, Karmic Lessons) - Timing cycles and optimal days finder - Compatibility analysis and name optimizer - Telos integration for personal development - Professional PDF report generation - Profile management system - Security fix: Add .claude/ to .gitignore 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
439 lines
17 KiB
TypeScript
Executable file
439 lines
17 KiB
TypeScript
Executable file
#!/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 <id>
|
|
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<TelosGoal[]> {
|
|
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<number, string> = {
|
|
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<number, string[]> = {
|
|
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<number, string> = {
|
|
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<number, string> = {
|
|
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<number, string> = {
|
|
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<number, string> = {
|
|
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<number, string> = {
|
|
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);
|