Files
HAL9000 f9c308c541 refactor: route CLI→Application communication through A2A boundary
Created src/cleveragents/shared/output_format.py - a new shared module
with format_data() function that provides JSON/YAML/plain/table
serialization without any CLI dependencies.

Fixed reverse dependency in plan_apply_service.py - changed import from
cleveragents.cli.formatting to cleveragents.shared.output_format (the
most critical architectural violation: Application layer importing from
Presentation layer).

Added .importlinter configuration file with rules to enforce:
- No Application->Presentation (CLI) reverse dependencies
- CLI->Application boundary violations (with current exceptions documented)

Added import-linter>=2.0 to dev dependencies in pyproject.toml.

Added BDD feature file features/a2a_boundary_enforcement.feature with
10 scenarios testing the boundary enforcement and step definitions.

ISSUES CLOSED: #9962
2026-06-06 19:05:19 -04:00

42 lines
2.3 KiB
Plaintext

[importlinter]
root_package = cleveragents
include_external_packages = True
[importlinter:contract:cli-no-application-direct]
name = CLI must not import Application services directly
type = forbidden
source_modules =
cleveragents.cli
forbidden_modules =
cleveragents.application.services
ignore_imports =
cleveragents.cli.commands.plan -> cleveragents.application.services.plan_apply_service
cleveragents.cli.commands.plan -> cleveragents.application.services.plan_lifecycle_service
cleveragents.cli.commands.plan -> cleveragents.application.services.plan_service
cleveragents.cli.commands.plan -> cleveragents.application.services.project_service
cleveragents.cli.commands.plan -> cleveragents.application.services.execute_phase_context_assembler
cleveragents.cli.commands.plan -> cleveragents.application.services.llm_actors
cleveragents.cli.commands.plan -> cleveragents.application.services.plan_executor
cleveragents.cli.commands.plan -> cleveragents.application.services.strategy_actor
cleveragents.cli.commands.plan -> cleveragents.application.services.plan_preflight_guardrail
cleveragents.cli.commands.plan -> cleveragents.application.services.plan_resume_service
cleveragents.cli.commands.plan -> cleveragents.application.services.decision_service
cleveragents.cli.commands.plan -> cleveragents.application.container
cleveragents.cli.commands.context -> cleveragents.application.services.context_service
cleveragents.cli.commands.context -> cleveragents.application.services.project_service
cleveragents.cli.commands.context -> cleveragents.application.container
cleveragents.cli.commands.resource -> cleveragents.application.services.resource_registry_service
cleveragents.cli.commands.resource -> cleveragents.application.container
cleveragents.cli.commands.skill -> cleveragents.application.services.skill_service
cleveragents.cli.commands.skill -> cleveragents.application.services.config_service
cleveragents.cli.commands.skill -> cleveragents.application.container
cleveragents.cli.commands.invariant -> cleveragents.application.services.invariant_service
[importlinter:contract:application-no-presentation]
name = Application layer must not import from Presentation (CLI) layer
type = forbidden
source_modules =
cleveragents.application
forbidden_modules =
cleveragents.cli