# =============================================================================
# Import Linter Configuration
# =============================================================================
# Enforces architectural boundaries to maintain clean code structure.
# Run with: lint-imports (or tools/lint_imports.bat)
# =============================================================================

[importlinter]
root_packages =
    mcp_workspace
    tests
root_package_paths =
    src
    .
include_external_packages = True

# -----------------------------------------------------------------------------
# Contract: Layered Architecture
# -----------------------------------------------------------------------------
# Ensures dependencies flow in one direction:
#   main -> server -> file_tools -> (no internal dependencies)
#
# Why this matters:
# - Prevents circular dependencies
# - Keeps entry point (main) as thin orchestration layer
# - Server focuses on MCP protocol, delegates to file_tools
# - File tools are independent, reusable utilities
# -----------------------------------------------------------------------------
[importlinter:contract:layered_architecture]
name = Layered Architecture
type = layers
layers =
    mcp_workspace.main
    mcp_workspace.server
    mcp_workspace.server_reference_tools
    mcp_workspace.checks
    mcp_workspace.file_tools | mcp_workspace.github_operations | mcp_workspace.reference_projects
    mcp_workspace.git_operations | mcp_workspace.workflows
    mcp_workspace.config | mcp_workspace.constants | mcp_workspace.utils | mcp_workspace._ssl
ignore_imports =
    mcp_workspace.git_operations.base_branch -> mcp_workspace.github_operations.issues
    mcp_workspace.git_operations.base_branch -> mcp_workspace.github_operations.pr_manager

# -----------------------------------------------------------------------------
# Contract: MCP Library Isolation
# -----------------------------------------------------------------------------
# The 'mcp' package should only be imported by main.py and server.py.
# File tools should remain MCP-agnostic for reusability.
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# Contract: PyGithub Library Isolation
# -----------------------------------------------------------------------------
# The 'github' package should only be used by github_operations module.
# -----------------------------------------------------------------------------
[importlinter:contract:pygithub_isolation]
name = PyGithub Library Isolation
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    github
ignore_imports =
    mcp_workspace.github_operations.* -> github
    mcp_workspace.github_operations.** -> github

# -----------------------------------------------------------------------------
# Contract: Requests Library Isolation
# -----------------------------------------------------------------------------
# The 'requests' library should only be used by github_operations module.
# -----------------------------------------------------------------------------
[importlinter:contract:requests_isolation]
name = Requests Library Isolation
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    requests
ignore_imports =
    mcp_workspace.github_operations.* -> requests
    mcp_workspace.github_operations.** -> requests

[importlinter:contract:mcp_library_isolation]
name = MCP Library Isolation
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    mcp
ignore_imports =
    mcp_workspace.server -> mcp
    mcp_workspace.server_reference_tools -> mcp

# -----------------------------------------------------------------------------
# Contract: GitPython Library Isolation
# -----------------------------------------------------------------------------
# The 'git' package should only be used by git_operations module.
# -----------------------------------------------------------------------------
[importlinter:contract:gitpython_isolation]
name = GitPython Library Isolation
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    git
ignore_imports =
    mcp_workspace.git_operations.* -> git

# -----------------------------------------------------------------------------
# Contract: Structlog Library Isolation
# -----------------------------------------------------------------------------
# Structured logging should only be configured in log_utils.
# Other modules should use standard logging.
# -----------------------------------------------------------------------------
[importlinter:contract:structlog_isolation]
name = Structlog Library Isolation
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    structlog

# -----------------------------------------------------------------------------
# Contract: Python JSON Logger Isolation
# -----------------------------------------------------------------------------
# python-json-logger should only be used via mcp_coder_utils (external).
# No direct imports allowed from mcp_workspace.
# -----------------------------------------------------------------------------
[importlinter:contract:pythonjsonlogger_isolation]
name = Python JSON Logger Isolation
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    pythonjsonlogger

# -----------------------------------------------------------------------------
# Contract: Subprocess Ban
# -----------------------------------------------------------------------------
# Production code must not use subprocess directly.
# Use GitPython for git operations instead.
# Note: mcp_coder_utils.subprocess_runner/streaming are banned via tach.toml
# (not listed in depends_on for any production module).
# -----------------------------------------------------------------------------
[importlinter:contract:subprocess_ban]
name = Subprocess Ban (use GitPython instead)
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    subprocess
ignore_imports =
    mcp_workspace.git_operations.verification -> subprocess

# -----------------------------------------------------------------------------
# Contract: Source Code Independence from Tests
# -----------------------------------------------------------------------------
# Production code should never import from test modules.
# -----------------------------------------------------------------------------
[importlinter:contract:no_test_imports_in_source]
name = Source Code Independence from Tests
type = forbidden
source_modules =
    mcp_workspace
forbidden_modules =
    tests
