feat: enhance cost tracking with general work session support
- Add `markitect cost session note` command for general work sessions - Support work that is not tied to specific tracked issues - Generate structured cost notes with comprehensive metadata - Include token usage breakdown and cost allocation guidance - Create cost note for agent ecosystem consolidation work (€0.2760) Enhancement allows tracking of general development work like agent optimization, infrastructure improvements, and other non-issue tasks while maintaining proper cost documentation and allocation. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -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*
|
||||
@@ -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)')
|
||||
|
||||
Reference in New Issue
Block a user