geeadd Changelog
Current Release Released: Dec 01 2025

v2.1.0 Service Auth & Hardening

A significant minor release introducing Service Account authentication support via JSON keys, improved type safety across the codebase, and enhancements to the quota tools.

Service Account Auth

Authenticate natively using a Service Account JSON key, enabling headless operations and automated workflows.

geeadd auth --cred keys.json

Robustness & Types

Comprehensive type annotations added across modules. Copyright headers replaced with SPDX identifiers. Enhanced error handling and concurrency logic.

Detailed Changelog

  • Added: geeadd auth support for service account JSON keys.
  • Refactor: Replaced copyright headers with standardized SPDX identifiers.
  • Refactor: Improved type annotations and expanded docstrings across multiple modules.
  • Fix: Modified Quota estimate tool to work correctly with Service Accounts.
  • Fix: Refined concurrency logic and enhanced general error handling/logging.
  • Removed: Unused concurrent_ee_assets.py file.
  • CI/CD: Updated GitHub Actions workflow for improved test and installation steps.

Legacy Release Released: Nov 24, 2025

v2.0.0: The Great Refactor

A complete rewrite of the core logic. We moved from argparse to click, introduced rich for beautiful terminal output, and reorganized the command structure for scalability.

Nested Commands

Commands are now logically grouped (e.g., projects quota instead of just quota).

Rich UI

Beautiful tables, panels, and spinners replace standard text output and basic progress bars.

Deprecations

Legacy commands are caught and provide helpful redirection messages to the new syntax.

Core Architecture (v2.0)

The underlying CLI framework has been completely swapped to improve maintainability and help generation.

BEFORE (v1)
geeadd_old.py
import argparse

# Flat argument parsing
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

parser_quota = subparsers.add_parser("quota")
parser_quota.set_defaults(func=quota_from_parser)

parser_copy = subparsers.add_parser("copy")
parser_copy.set_defaults(func=copy_from_parser)
AFTER (v2)
geeadd.py
import click
from click import Group

# Nested Group Structure
@click.group(cls=OrderedGroup)
def cli(): pass

@cli.group()
def projects(): pass

@projects.command('quota')
def projects_quota(project): ...

Command Restructuring (v2.0)

Old Command New Command Group Reasoning
geeadd quota geeadd projects quota Grouped under 'projects' management.
geeadd projects geeadd projects enabled Clarified action (listing enabled projects).
geeadd copy geeadd assets copy All file operations moved to 'assets' group.
geeadd search geeadd utils search Moved generic tools to 'utils' group.
geeadd cancel geeadd tasks cancel Consolidated task operations.

UI & Rich Output

We removed colorama and basic print() statements in favor of the rich library.

Example: Quota Output
Cloud Project: projects/samapriya
Storage: 231.33 GB of 250 GB
[███████████████████████████░░░] 92.5%
Assets: 4,133 of 50,000
[██░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 8.3%

Code Implementation

Tables are now constructed using rich.table.Table, enabling auto-sizing columns and consistent coloring across the application. Panels are used for error messages and deprecation warnings.