feat(a2a): A2A facade session and plan lifecycle operations functional via CLI #1041

Merged
freemo merged 4 commits from feature/m6-a2a-facade-cli into master 2026-03-22 05:40:51 +00:00

4 Commits

Author SHA1 Message Date
freemo a2113deace fix(a2a): suppress stdout/stderr in facade bootstrap to prevent test pollution
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 41s
CI / lint (pull_request) Successful in 3m19s
CI / quality (pull_request) Successful in 3m44s
CI / typecheck (pull_request) Successful in 3m56s
CI / security (pull_request) Successful in 4m5s
CI / e2e_tests (pull_request) Successful in 8m33s
CI / integration_tests (pull_request) Successful in 8m37s
CI / unit_tests (pull_request) Successful in 8m42s
CI / docker (pull_request) Successful in 1m12s
CI / coverage (pull_request) Successful in 10m58s
CI / status-check (pull_request) Successful in 1s
CI / lint (push) Successful in 3m28s
CI / build (push) Successful in 14s
CI / typecheck (push) Successful in 3m52s
CI / benchmark-regression (push) Has been skipped
CI / security (push) Successful in 4m0s
CI / quality (push) Successful in 4m5s
CI / integration_tests (push) Successful in 6m56s
CI / unit_tests (push) Successful in 7m15s
CI / docker (push) Successful in 1m12s
CI / e2e_tests (push) Successful in 8m36s
CI / coverage (push) Successful in 11m35s
CI / status-check (push) Successful in 2s
CI / benchmark-publish (push) Successful in 28m44s
CI / benchmark-regression (pull_request) Successful in 51m20s
The _notify_facade and _facade_dispatch functions call get_container()
during lazy facade construction. This can trigger structlog output that
corrupts CLI stdout captured by CliRunner in tests.

Wrap facade construction in redirect_stdout/redirect_stderr to
suppress any side-effect output. Also reset the facade singleton
in after_scenario for test isolation.
2026-03-22 05:25:44 +00:00
freemo 4f2aa4189c fix(test): guard result.stderr access against ValueError
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 3m20s
CI / typecheck (pull_request) Successful in 3m56s
CI / build (pull_request) Successful in 37s
CI / security (pull_request) Successful in 4m2s
CI / quality (pull_request) Successful in 4m8s
CI / unit_tests (pull_request) Failing after 4m13s
CI / docker (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 7m10s
CI / e2e_tests (pull_request) Successful in 9m34s
CI / coverage (pull_request) Successful in 11m1s
CI / status-check (pull_request) Failing after 1s
CI / benchmark-regression (pull_request) Has been cancelled
Click/Typer CliRunner.Result.stderr is a property that raises
ValueError when stderr was not separately captured (mix_stderr=True
is the default).  Wrap all result.stderr accesses in try/except
to handle this gracefully.
2026-03-22 05:01:06 +00:00
freemo 0c301ac581 fix(test): update facade operation count from 11 to 42
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 44s
CI / lint (pull_request) Successful in 3m19s
CI / unit_tests (pull_request) Failing after 3m42s
CI / quality (pull_request) Successful in 3m48s
CI / typecheck (pull_request) Successful in 4m55s
CI / security (pull_request) Successful in 5m6s
CI / docker (pull_request) Has been skipped
CI / e2e_tests (pull_request) Successful in 5m9s
CI / integration_tests (pull_request) Successful in 6m52s
CI / coverage (pull_request) Failing after 19m27s
CI / benchmark-regression (pull_request) Successful in 48m13s
CI / status-check (pull_request) Failing after 1s
The A2A facade now exposes 42 operations (31 extension + 11 legacy)
after the spec-aligned _cleveragents/ extension methods were added.
Update the BDD assertion and docs to match the actual count.
2026-03-22 03:23:42 +00:00
freemo 24aad463a1 feat(a2a): A2A facade session and plan lifecycle operations functional via CLI
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 3m20s
CI / unit_tests (pull_request) Failing after 3m30s
CI / build (pull_request) Successful in 15s
CI / typecheck (pull_request) Successful in 3m54s
CI / quality (pull_request) Successful in 4m0s
CI / security (pull_request) Successful in 4m14s
CI / docker (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 7m8s
CI / e2e_tests (pull_request) Successful in 9m32s
CI / coverage (pull_request) Failing after 13m20s
CI / benchmark-regression (pull_request) Successful in 48m39s
CI / status-check (pull_request) Failing after 1s
Wire CLI session and plan lifecycle commands through the A2A local
facade, establishing the A2A protocol data flow:
CLI -> A2aLocalFacade.dispatch() -> Service -> Domain.

Key changes:
- Added cli_bootstrap.py module providing get_facade() which lazily
  constructs a process-wide A2aLocalFacade instance wired to the DI
  container (plan_lifecycle_service, session_service,
  resource_registry_service, tool_registry). Service wiring is
  best-effort via contextlib.suppress.
- Session CLI create command now notifies the A2A facade after session
  creation for protocol bookkeeping and telemetry.
- Plan CLI commands (use, execute, lifecycle-apply) now notify the A2A
  facade via _notify_facade() helper after operations complete. The
  notification is best-effort (exceptions are suppressed) to avoid
  breaking CLI functionality if the facade is not available.
- Added Behave feature (a2a_cli_facade_integration.feature) with 8
  scenarios covering: facade bootstrap wiring, all 11 operations
  supported, session/plan dispatch through facade, and best-effort
  error suppression.

The facade notification pattern preserves backward compatibility:
CLI commands still perform the primary work via direct service calls,
then notify the facade for A2A protocol compliance. This allows
incremental migration toward full facade-first routing.

ISSUES CLOSED: #852
2026-03-22 01:54:33 +00:00