[importlinter]
root_package = envctl
exclude_type_checking_imports = True

# ==============================================================
# Core layered architecture
# ==============================================================

[importlinter:contract:architecture_layers]
name = Core layered architecture
type = layers
layers =
    envctl.cli
    envctl.services
    envctl.repository
    envctl.adapters
    envctl.domain

# ==============================================================
# Domain purity
# ==============================================================

[importlinter:contract:domain_is_independent]
name = Domain must remain independent
type = independence
modules =
    envctl.domain

# ==============================================================
# Explicit architectural guards
# ==============================================================

[importlinter:contract:adapters_do_not_import_services]
name = Adapters must not import services
type = forbidden
source_modules =
    envctl.adapters
forbidden_modules =
    envctl.services

[importlinter:contract:adapters_do_not_import_repository]
name = Adapters must not import repository
type = forbidden
source_modules =
    envctl.adapters
forbidden_modules =
    envctl.repository

[importlinter:contract:repository_do_not_import_services]
name = Repository must not import services
type = forbidden
source_modules =
    envctl.repository
forbidden_modules =
    envctl.services

# ==============================================================
# Config and utils discipline
# ==============================================================

[importlinter:contract:utils_do_not_import_cli]
name = Utils must not depend on CLI
type = forbidden
source_modules =
    envctl.utils
forbidden_modules =
    envctl.cli

[importlinter:contract:utils_do_not_import_services]
name = Utils must not depend on services
type = forbidden
source_modules =
    envctl.utils
forbidden_modules =
    envctl.services

[importlinter:contract:utils_do_not_import_repository]
name = Utils must not depend on repository
type = forbidden
source_modules =
    envctl.utils
forbidden_modules =
    envctl.repository

[importlinter:contract:config_do_not_import_cli]
name = Config must not depend on CLI
type = forbidden
source_modules =
    envctl.config
forbidden_modules =
    envctl.cli

[importlinter:contract:config_do_not_import_services]
name = Config must not depend on services
type = forbidden
source_modules =
    envctl.config
forbidden_modules =
    envctl.services

[importlinter:contract:config_do_not_import_repository]
name = Config must not depend on repository
type = forbidden
source_modules =
    envctl.config
forbidden_modules =
    envctl.repository

# ==============================================================
# CLI internal structure
# ==============================================================

[importlinter:contract:presenters_do_not_import_services]
name = Presenters must not import services
type = forbidden
source_modules =
    envctl.cli.presenters
forbidden_modules =
    envctl.services

[importlinter:contract:serializers_do_not_import_services]
name = Serializers must not import services
type = forbidden
source_modules =
    envctl.cli.serializers
forbidden_modules =
    envctl.services

# ==============================================================
# Observability is infrastructure
# ==============================================================

[importlinter:contract:observability_is_infrastructure]
name = Observability must not depend on business layers
type = forbidden
source_modules = envctl.observability
forbidden_modules =
    envctl.cli
    envctl.services
    envctl.repository
    envctl.config