From 5e88ffe5bfda6a6e8b3396a84fa13663e7b55202 Mon Sep 17 00:00:00 2001 From: kishore Date: Fri, 22 May 2026 13:47:48 -0700 Subject: [PATCH 001/105] feat(output): structured JSON envelopes and branded terminal UI Add a caller-aware rendering system that auto-detects agents vs humans: - JSON envelope contract for every command (ok, data, error, hint) - Rich-panel branding with gradient wordmark for interactive use - Glyph system mapping cloud job statuses to user-facing icons - JSON schemas for every envelope shape (env, which, run, jobs, etc.) - Error-code registry with structured hints for agent recovery - File-lock helper for concurrent job-state access --- comfy_cli/caller.py | 71 +++ comfy_cli/cancellation.py | 117 +++++ comfy_cli/constants.py | 2 + comfy_cli/discovery.py | 170 +++++++ comfy_cli/error_codes.py | 356 ++++++++++++++ comfy_cli/help_json.py | 160 +++++++ comfy_cli/locking.py | 103 +++++ comfy_cli/output/__init__.py | 36 ++ comfy_cli/output/branding.py | 433 ++++++++++++++++++ comfy_cli/output/glyphs.py | 58 +++ comfy_cli/output/panels.py | 284 ++++++++++++ comfy_cli/output/preview.py | 153 +++++++ comfy_cli/output/renderer.py | 365 +++++++++++++++ comfy_cli/output/rich_compat.py | 42 ++ comfy_cli/schemas/__init__.py | 6 + comfy_cli/schemas/auth.json | 30 ++ comfy_cli/schemas/discover.json | 78 ++++ comfy_cli/schemas/env.json | 56 +++ comfy_cli/schemas/envelope.json | 41 ++ comfy_cli/schemas/error.json | 27 ++ comfy_cli/schemas/error_codes.md | 28 ++ comfy_cli/schemas/help.json | 63 +++ comfy_cli/schemas/jobs.json | 38 ++ comfy_cli/schemas/nodes.json | 15 + comfy_cli/schemas/run.json | 22 + comfy_cli/schemas/run_event.json | 31 ++ comfy_cli/schemas/set_default.json | 11 + comfy_cli/schemas/skill.json | 13 + comfy_cli/schemas/transfer.json | 46 ++ comfy_cli/schemas/version.json | 10 + comfy_cli/schemas/which.json | 12 + comfy_cli/schemas/workflow.json | 15 + tests/comfy_cli/conftest.py | 84 ++++ tests/comfy_cli/output/__init__.py | 0 tests/comfy_cli/output/test_branding.py | 225 +++++++++ tests/comfy_cli/output/test_caller.py | 72 +++ tests/comfy_cli/output/test_cancellation.py | 93 ++++ tests/comfy_cli/output/test_discovery.py | 127 +++++ .../comfy_cli/output/test_envelope_schemas.py | 141 ++++++ .../output/test_error_code_registry.py | 199 ++++++++ tests/comfy_cli/output/test_glyphs.py | 37 ++ tests/comfy_cli/output/test_help_json.py | 62 +++ tests/comfy_cli/output/test_locking.py | 53 +++ tests/comfy_cli/output/test_panels.py | 215 +++++++++ tests/comfy_cli/output/test_renderer.py | 190 ++++++++ 45 files changed, 4390 insertions(+) create mode 100644 comfy_cli/caller.py create mode 100644 comfy_cli/cancellation.py create mode 100644 comfy_cli/discovery.py create mode 100644 comfy_cli/error_codes.py create mode 100644 comfy_cli/help_json.py create mode 100644 comfy_cli/locking.py create mode 100644 comfy_cli/output/__init__.py create mode 100644 comfy_cli/output/branding.py create mode 100644 comfy_cli/output/glyphs.py create mode 100644 comfy_cli/output/panels.py create mode 100644 comfy_cli/output/preview.py create mode 100644 comfy_cli/output/renderer.py create mode 100644 comfy_cli/output/rich_compat.py create mode 100644 comfy_cli/schemas/__init__.py create mode 100644 comfy_cli/schemas/auth.json create mode 100644 comfy_cli/schemas/discover.json create mode 100644 comfy_cli/schemas/env.json create mode 100644 comfy_cli/schemas/envelope.json create mode 100644 comfy_cli/schemas/error.json create mode 100644 comfy_cli/schemas/error_codes.md create mode 100644 comfy_cli/schemas/help.json create mode 100644 comfy_cli/schemas/jobs.json create mode 100644 comfy_cli/schemas/nodes.json create mode 100644 comfy_cli/schemas/run.json create mode 100644 comfy_cli/schemas/run_event.json create mode 100644 comfy_cli/schemas/set_default.json create mode 100644 comfy_cli/schemas/skill.json create mode 100644 comfy_cli/schemas/transfer.json create mode 100644 comfy_cli/schemas/version.json create mode 100644 comfy_cli/schemas/which.json create mode 100644 comfy_cli/schemas/workflow.json create mode 100644 tests/comfy_cli/output/__init__.py create mode 100644 tests/comfy_cli/output/test_branding.py create mode 100644 tests/comfy_cli/output/test_caller.py create mode 100644 tests/comfy_cli/output/test_cancellation.py create mode 100644 tests/comfy_cli/output/test_discovery.py create mode 100644 tests/comfy_cli/output/test_envelope_schemas.py create mode 100644 tests/comfy_cli/output/test_error_code_registry.py create mode 100644 tests/comfy_cli/output/test_glyphs.py create mode 100644 tests/comfy_cli/output/test_help_json.py create mode 100644 tests/comfy_cli/output/test_locking.py create mode 100644 tests/comfy_cli/output/test_panels.py create mode 100644 tests/comfy_cli/output/test_renderer.py diff --git a/comfy_cli/caller.py b/comfy_cli/caller.py new file mode 100644 index 00000000..0b8c4da9 --- /dev/null +++ b/comfy_cli/caller.py @@ -0,0 +1,71 @@ +"""Detect whether the CLI is being driven by a human or an agent. + +The detection flips three defaults: + - Output mode (agents → JSON, humans → pretty) + - Confirmation prompts (skipped for agents) + - Pretty banner (suppressed for agents) + +Signals (in priority order — most specific first): + 1. ``COMFY_USER_AGENT=