#!/usr/bin/env python3 import argparse import datetime import json import os import sys def load_log(file_path): if not os.path.exists(file_path): return [] with open(file_path, 'r') as file: try: return json.load(file) except json.JSONDecodeError: print("\033[91mError: Invalid log file format.\033[0m") sys.exit(1) def save_log(log, file_path): with open(file_path, 'w') as file: json.dump(log, file, indent=4) def start_session(log, description): session = { 'description': description, 'start_time': datetime.datetime.now().isoformat() } log.append(session) save_log(log, 'chronokeep.log') print(f"\033[92mSession started: {description}\033[0m") def stop_session(log): if not log: print("\033[91mError: No active session.\033[0m") return last_session = log[-1] if 'end_time' in last_session: print("\033[91mError: Session already stopped.\033[0m") return last_session['end_time'] = datetime.datetime.now().isoformat() save_log(log, 'chronokeep.log') print(f"\033[92mSession stopped: {last_session['description']}\033[0m") def list_sessions(log): if not log: print("\033[91mNo sessions logged.\033[0m") return print("\033[94mSession Log:\033[0m") for i, session in enumerate(log): start_time = datetime.datetime.fromisoformat(session['start_time']) if 'end_time' in session: end_time = datetime.datetime.fromisoformat(session['end_time']) duration = end_time - start_time print(f"{i+1}. {session['description']} - {start_time.strftime('%Y-%m-%d %H:%M')} to {end_time.strftime('%Y-%m-%d %H:%M')} ({duration})") else: print(f"{i+1}. {session['description']} - {start_time.strftime('%Y-%m-%d %H:%M')} (active)") def main(): parser = argparse.ArgumentParser(description='Chronokeep - A terminal-based time tracking and logging tool') subparsers = parser.add_subparsers(dest='command') start_parser = subparsers.add_parser('start', help='Start a new session') start_parser.add_argument('description', help='Session description') stop_parser = subparsers.add_parser('stop', help='Stop the current session') list_parser = subparsers.add_parser('list', help='List all sessions') args = parser.parse_args() log = load_log('chronokeep.log') if args.command == 'start': start_session(log, args.description) elif args.command == 'stop': stop_session(log) elif args.command == 'list': list_sessions(log) else: parser.print_help() if __name__ == '__main__': main()