diff --git a/cost_notes/agent_ecosystem_consolidation_and_optimization_cost_2025-10-05.md b/cost_notes/agent_ecosystem_consolidation_and_optimization_cost_2025-10-05.md new file mode 100644 index 00000000..c595dd25 --- /dev/null +++ b/cost_notes/agent_ecosystem_consolidation_and_optimization_cost_2025-10-05.md @@ -0,0 +1,36 @@ +--- +note_type: "session_cost_tracking" +session_type: "agent_development" +session_title: "Agent Ecosystem Consolidation and Optimization" +session_date: "2025-10-05" +claude_model: "claude-sonnet-4" +total_cost_eur: 0.2760 +total_cost_usd: 0.3000 +total_tokens: 40000 +input_tokens: 25000 +output_tokens: 15000 +generated_at: "2025-10-05T20:55:26" +--- + +# Session Cost Analysis +**Session**: Agent Ecosystem Consolidation and Optimization +**Date**: 2025-10-05 +**Claude Model**: claude-sonnet-4 + +## Cost Summary +- **Total Cost**: €0.2760 ($0.3000 USD) +- **Token Usage**: 40,000 tokens + - Input: 25,000 tokens × $3.00/M = $0.0750 + - Output: 15,000 tokens × $15.00/M = $0.2250 + +## Session Details +- **Session Type**: agent_development +- **Work Summary**: Comprehensive Claude Code agent ecosystem consolidation and optimization. Created datamodel optimization specialist agent with 4-week implementation gameplan targeting 60-80% label processing performance improvements. Migrated and enhanced 3 agents (testing-efficiency, requirements-engineering, agent-optimizer) from duplicate documentation to single source .claude/agents configuration. Integrated Issue #59 lessons learned into requirements engineering agent with practical toolkit commands and enhanced TDD8 workflow. Established DRY principle compliance by removing duplicate docs and creating symlink for agent visibility. Deliverables: 4 optimized agents, comprehensive datamodel optimization strategy, clean documentation architecture. + +## Cost Allocation +This cost represents general development work and should be allocated to the appropriate cost category based on the nature of the session. + +**Note**: This is a standalone cost note for work that is not tied to a specific tracked issue. For issue-specific work, use `markitect cost session track` instead. + +--- +*Generated automatically by MarkiTect Cost Tracking - 2025-10-05 20:55:26* diff --git a/markitect/finance/cli.py b/markitect/finance/cli.py index 0d80e2af..42110dc5 100644 --- a/markitect/finance/cli.py +++ b/markitect/finance/cli.py @@ -488,6 +488,95 @@ def estimate_cost(input_tokens: int, output_tokens: int, model: str): sys.exit(1) +@cost_session.command('note') +@click.argument('session_title') +@click.option('--input-tokens', type=int, required=True, help='Number of input tokens') +@click.option('--output-tokens', type=int, required=True, help='Number of output tokens') +@click.option('--model', default='claude-sonnet-4', help='Claude model used') +@click.option('--session-type', default='general_work', help='Type of work session') +@click.option('--summary', help='Work session summary') +@click.option('--output-dir', default='cost_notes', help='Directory for cost notes') +def create_session_note(session_title: str, input_tokens: int, output_tokens: int, + model: str, session_type: str, summary: Optional[str], + output_dir: str): + """Create a cost note for general work sessions without specific issue tracking.""" + try: + # Create temporary tracker for cost calculation + tracker = SessionCostTracker("/tmp/dummy.db") # DB not needed for estimation + + # Calculate session cost + session_cost = tracker.estimate_session_cost(input_tokens, output_tokens, model) + + # Create output directory if it doesn't exist + output_dir_path = Path(output_dir) + output_dir_path.mkdir(exist_ok=True) + + # Generate filename + today = date.today() + safe_title = "".join(c for c in session_title.lower().replace(' ', '_') if c.isalnum() or c in '_-') + filename = f"{safe_title}_cost_{today.strftime('%Y-%m-%d')}.md" + output_path = output_dir_path / filename + + # Generate cost note content + cost_note_content = f"""--- +note_type: "session_cost_tracking" +session_type: "{session_type}" +session_title: "{session_title}" +session_date: "{today.strftime('%Y-%m-%d')}" +claude_model: "{session_cost['model']}" +total_cost_eur: {session_cost['total_cost_eur']:.4f} +total_cost_usd: {session_cost['total_cost_usd']:.4f} +total_tokens: {session_cost['total_tokens']} +input_tokens: {session_cost['input_tokens']} +output_tokens: {session_cost['output_tokens']} +generated_at: "{datetime.now().strftime('%Y-%m-%dT%H:%M:%S')}" +--- + +# Session Cost Analysis +**Session**: {session_title} +**Date**: {today.strftime('%Y-%m-%d')} +**Claude Model**: {session_cost['model']} + +## Cost Summary +- **Total Cost**: €{session_cost['total_cost_eur']:.4f} (${session_cost['total_cost_usd']:.4f} USD) +- **Token Usage**: {session_cost['total_tokens']:,} tokens + - Input: {session_cost['input_tokens']:,} tokens × ${session_cost['pricing_rates']['input_per_million']:.2f}/M = ${session_cost['input_cost_usd']:.4f} + - Output: {session_cost['output_tokens']:,} tokens × ${session_cost['pricing_rates']['output_per_million']:.2f}/M = ${session_cost['output_cost_usd']:.4f} + +## Session Details +- **Session Type**: {session_type}""" + + if summary: + cost_note_content += f""" +- **Work Summary**: {summary}""" + + cost_note_content += f""" + +## Cost Allocation +This cost represents general development work and should be allocated to the appropriate cost category based on the nature of the session. + +**Note**: This is a standalone cost note for work that is not tied to a specific tracked issue. For issue-specific work, use `markitect cost session track` instead. + +--- +*Generated automatically by MarkiTect Cost Tracking - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}* +""" + + # Save the cost note + with open(output_path, 'w', encoding='utf-8') as f: + f.write(cost_note_content) + + # Display results + click.echo(f"✅ Session cost note created") + click.echo(f"📊 Session Cost: €{session_cost['total_cost_eur']:.4f} (${session_cost['total_cost_usd']:.4f} USD)") + click.echo(f"🔤 Token Usage: {session_cost['total_tokens']:,} tokens") + click.echo(f"🤖 Model: {session_cost['model']}") + click.echo(f"📝 Cost note saved: {output_path}") + + except Exception as e: + click.echo(f"Error creating session note: {e}", err=True) + sys.exit(1) + + @cost_session.command('summary') @click.option('--issue-ids', help='Comma-separated list of issue IDs to filter by') @click.option('--database', 'db_path', help='Database path (defaults to config)')