Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions adr_kit/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,10 +280,10 @@ def mcp_health() -> None:

# Test workflow system (the real business logic)
try:
from .workflows.analyze import AnalyzeProjectWorkflow # noqa: F401
from .workflows.approval import ApprovalWorkflow # noqa: F401
from .workflows.creation import CreationWorkflow # noqa: F401
from .workflows.preflight import PreflightWorkflow # noqa: F401
from .decision.workflows.analyze import AnalyzeProjectWorkflow # noqa: F401
from .decision.workflows.approval import ApprovalWorkflow # noqa: F401
from .decision.workflows.creation import CreationWorkflow # noqa: F401
from .decision.workflows.preflight import PreflightWorkflow # noqa: F401

console.print("✅ Workflow backend system: OK")
workflow_available = True
Expand Down Expand Up @@ -652,7 +652,7 @@ def info() -> None:

def _setup_enforcement_hooks() -> None:
"""Set up git hooks for staged ADR enforcement (called from init --with-enforcement)."""
from .enforce.hooks import HookGenerator
from .enforcement.generation.hooks import HookGenerator

gen = HookGenerator()
results = gen.generate()
Expand Down Expand Up @@ -744,7 +744,7 @@ def setup_enforcement(
.git/hooks/pre-push. Safe on existing hooks — appends only.
Re-running is idempotent.
"""
from .enforce.hooks import HookGenerator
from .enforcement.generation.hooks import HookGenerator

try:
gen = HookGenerator()
Expand Down Expand Up @@ -775,7 +775,7 @@ def enforce_status(
),
) -> None:
"""Show status of ADR enforcement hooks."""
from .enforce.hooks import HookGenerator
from .enforcement.generation.hooks import HookGenerator

try:
gen = HookGenerator()
Expand Down Expand Up @@ -1010,7 +1010,7 @@ def preflight(
before implementation, helping enforce architectural governance.
"""
try:
from .gate import PolicyGate, create_technical_choice
from .decision.gate import PolicyGate, create_technical_choice

gate = PolicyGate(adr_dir)

Expand Down Expand Up @@ -1083,7 +1083,7 @@ def gate_status(
) -> None:
"""Show current preflight gate status and configuration."""
try:
from .gate import PolicyGate
from .decision.gate import PolicyGate

gate = PolicyGate(adr_dir)
status = gate.get_gate_status()
Expand Down Expand Up @@ -1146,7 +1146,7 @@ def guardrail_apply(
"""Apply automatic guardrails based on ADR policies."""

try:
from .guardrail import GuardrailManager
from .enforcement.config.manager import GuardrailManager

adr_path = Path(adr_dir)
manager = GuardrailManager(adr_path)
Expand Down Expand Up @@ -1188,7 +1188,7 @@ def guardrail_status(
"""Show status of the automatic guardrail system."""

try:
from .guardrail import GuardrailManager
from .enforcement.config.manager import GuardrailManager

adr_path = Path(adr_dir)
manager = GuardrailManager(adr_path)
Expand Down Expand Up @@ -1275,8 +1275,8 @@ def enforce(

Exit codes: 0 = pass, 1 = violations found, 2 = warnings only, 3 = error
"""
from .enforce.stages import EnforcementLevel
from .enforce.validator import StagedValidator
from .enforcement.validation.staged import StagedValidator
from .enforcement.validation.stages import EnforcementLevel

try:
try:
Expand All @@ -1292,7 +1292,7 @@ def enforce(

# JSON output mode — structured report for agents and CI
if output_format.lower() == "json":
from .enforce.reporter import build_report
from .enforcement.reporter import build_report

report = build_report(result)
# Print to stdout (not via Rich console) so JSON is clean
Expand Down Expand Up @@ -1368,7 +1368,7 @@ def generate_scripts(
Each script supports --quick (staged files) and --full (all files) modes
and outputs JSON matching the EnforcementReport schema.
"""
from .enforce.script_generator import ScriptGenerator
from .enforcement.generation.scripts import ScriptGenerator

try:
generator = ScriptGenerator(adr_dir=adr_dir)
Expand Down Expand Up @@ -1408,7 +1408,7 @@ def generate_ci(

Safe to re-run — only overwrites files it previously generated.
"""
from .enforce.ci import CIWorkflowGenerator
from .enforcement.generation.ci import CIWorkflowGenerator

try:
generator = CIWorkflowGenerator()
Expand Down
Empty file added adr_kit/decision/__init__.py
Empty file.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from pathlib import Path
from typing import Any

from ..contract import ConstraintsContractBuilder
from ...contract import ConstraintsContractBuilder
from .models import GateConfig, GateDecision
from .technical_choice import ChoiceType, TechnicalChoice

Expand Down
File renamed without changes.
Empty file.
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from pathlib import Path
from typing import Any

from ..core.parse import find_adr_files
from ...core.parse import find_adr_files
from .base import BaseWorkflow, WorkflowError, WorkflowResult, WorkflowStatus


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
from pathlib import Path
from typing import Any

from ..contract.builder import ConstraintsContractBuilder
from ..core.model import ADR
from ..core.parse import find_adr_files, parse_adr_file
from ..core.validate import validate_adr
from ..enforce.eslint import generate_eslint_config
from ..enforce.ruff import generate_ruff_config
from ..guardrail.manager import GuardrailManager
from ..index.json_index import generate_adr_index
from ...contract.builder import ConstraintsContractBuilder
from ...core.model import ADR
from ...core.parse import find_adr_files, parse_adr_file
from ...core.validate import validate_adr
from ...enforcement.adapters.eslint import generate_eslint_config
from ...enforcement.adapters.ruff import generate_ruff_config
from ...enforcement.config.manager import GuardrailManager
from ...index.json_index import generate_adr_index
from .base import BaseWorkflow, WorkflowResult


Expand Down Expand Up @@ -284,7 +284,7 @@ def _update_adr_status(
f.write(new_content)

# Return updated ADR object - create a new one with updated status
from ..core.model import ADRStatus
from ...core.model import ADRStatus

updated_front_matter = adr.front_matter.model_copy(
update={"status": ADRStatus.ACCEPTED}
Expand Down Expand Up @@ -380,7 +380,7 @@ def _generate_enforcement_rules(self, adr: ADR) -> dict[str, Any]:
def _generate_validation_scripts(self, adr: ADR) -> dict[str, Any]:
"""Generate standalone validation scripts for an ADR's policies."""
try:
from ..enforce.script_generator import ScriptGenerator
from ...enforcement.generation.scripts import ScriptGenerator

generator = ScriptGenerator(adr_dir=self.adr_dir)
output_dir = Path.cwd() / "scripts" / "adr"
Expand All @@ -407,7 +407,7 @@ def _generate_validation_scripts(self, adr: ADR) -> dict[str, Any]:
def _update_git_hooks(self) -> dict[str, Any]:
"""Update git hooks to run staged enforcement checks."""
try:
from ..enforce.hooks import HookGenerator
from ...enforcement.generation.hooks import HookGenerator

generator = HookGenerator()
hook_results = generator.generate(project_root=Path.cwd())
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
from pathlib import Path
from typing import Any

from ..contract.builder import ConstraintsContractBuilder
from ..core.model import ADR, ADRFrontMatter, ADRStatus, PolicyModel
from ..core.parse import find_adr_files, parse_adr_file
from ..core.validate import validate_adr
from ...contract.builder import ConstraintsContractBuilder
from ...core.model import ADR, ADRFrontMatter, ADRStatus, PolicyModel
from ...core.parse import find_adr_files, parse_adr_file
from ...core.validate import validate_adr
from .base import BaseWorkflow, WorkflowError, WorkflowResult, WorkflowStatus


Expand Down Expand Up @@ -552,7 +552,7 @@ def _validate_policy_completeness(
Note: This is a lightweight check. Policy construction guidance is provided
via the policy_guidance promptlet, which agents can use to construct policies.
"""
from ..core.policy_extractor import PolicyExtractor
from ...core.policy_extractor import PolicyExtractor

extractor = PolicyExtractor()
warnings = []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from dataclasses import dataclass
from typing import Any

from ..contract.builder import ConstraintsContractBuilder
from ..contract.models import ConstraintsContract
from ...contract.builder import ConstraintsContractBuilder
from ...contract.models import ConstraintsContract
from .base import BaseWorkflow, WorkflowResult


Expand Down Expand Up @@ -154,7 +154,7 @@ def _load_constraints_contract(self) -> ConstraintsContract:
# If no contract exists, return empty contract
from pathlib import Path

from ..contract.models import ConstraintsContract
from ...contract.models import ConstraintsContract

# Use the proper create_empty method instead of incorrect constructor
return ConstraintsContract.create_empty(Path("."))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from pathlib import Path
from typing import Any

from ..core.model import ADR
from ..core.parse import find_adr_files, parse_adr_file
from ...core.model import ADR
from ...core.parse import find_adr_files, parse_adr_file
from .approval import ApprovalInput, ApprovalWorkflow
from .base import BaseWorkflow, WorkflowResult, WorkflowStatus
from .creation import CreationInput, CreationWorkflow
Expand Down
6 changes: 0 additions & 6 deletions adr_kit/enforce/__init__.py

This file was deleted.

Empty file added adr_kit/enforcement/__init__.py
Empty file.
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
from pathlib import Path
from typing import Any, TypedDict

from ..core.model import ADR, ADRStatus
from ..core.parse import ParseError, find_adr_files, parse_adr_file
from ..core.policy_extractor import PolicyExtractor
from ...core.model import ADR, ADRStatus
from ...core.parse import ParseError, find_adr_files, parse_adr_file
from ...core.policy_extractor import PolicyExtractor


class ADRMetadata(TypedDict):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@

import toml

from ..core.model import ADR, ADRStatus
from ..core.parse import ParseError, find_adr_files, parse_adr_file
from ...core.model import ADR, ADRStatus
from ...core.parse import ParseError, find_adr_files, parse_adr_file


class PythonRuleExtractor:
Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
from pathlib import Path
from typing import Any

from ..contract import ConstraintsContractBuilder
from .config_writer import ConfigWriter
from .file_monitor import ChangeEvent, ChangeType, FileMonitor
from ...contract import ConstraintsContractBuilder
from .models import (
ApplicationStatus,
ApplyResult,
Expand All @@ -16,6 +14,8 @@
FragmentType,
GuardrailConfig,
)
from .monitor import ChangeEvent, ChangeType, FileMonitor
from .writer import ConfigWriter


class GuardrailManager:
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from enum import Enum
from pathlib import Path

from ..core.model import ADR
from ..core.parse import ParseError, find_adr_files, parse_adr_file
from ...core.model import ADR
from ...core.parse import ParseError, find_adr_files, parse_adr_file


class ChangeType(str, Enum):
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
from pathlib import Path
from typing import Any

from ..core.model import ADR
from ..core.parse import ParseError, find_adr_files, parse_adr_file
from ..core.policy_extractor import PolicyExtractor
from ..semantic.retriever import SemanticIndex, SemanticMatch
from ...core.model import ADR
from ...core.parse import ParseError, find_adr_files, parse_adr_file
from ...core.policy_extractor import PolicyExtractor
from ...semantic.retriever import SemanticIndex, SemanticMatch


@dataclass
Expand Down
Empty file.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
import stat
from pathlib import Path

from ..core.model import ADR, ADRStatus
from ..core.parse import ParseError, find_adr_files, parse_adr_file
from .stages import StagedCheck, classify_adr_checks
from ...core.model import ADR, ADRStatus
from ...core.parse import ParseError, find_adr_files, parse_adr_file
from ..validation.stages import StagedCheck, classify_adr_checks


class ScriptGenerator:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

from pydantic import BaseModel

from .validator import ValidationResult
from .validation.staged import ValidationResult


class ViolationEntry(BaseModel):
Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
from dataclasses import dataclass, field
from pathlib import Path

from ..core.model import ADR, ADRStatus
from ..core.parse import ParseError, find_adr_files, parse_adr_file
from ...core.model import ADR, ADRStatus
from ...core.parse import ParseError, find_adr_files, parse_adr_file
from .stages import EnforcementLevel, StagedCheck, checks_for_level, classify_adr_checks

# Source file extensions scanned during CI full-codebase pass
Expand Down
File renamed without changes.
32 changes: 0 additions & 32 deletions adr_kit/guardrail/__init__.py

This file was deleted.

10 changes: 5 additions & 5 deletions adr_kit/mcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
from fastmcp import FastMCP

# Import the full workflow system (this is where the real business logic lives)
from ..workflows.analyze import AnalyzeProjectWorkflow
from ..workflows.approval import ApprovalInput, ApprovalWorkflow
from ..workflows.creation import CreationInput, CreationWorkflow
from ..decision.workflows.analyze import AnalyzeProjectWorkflow
from ..decision.workflows.approval import ApprovalInput, ApprovalWorkflow
from ..decision.workflows.creation import CreationInput, CreationWorkflow
from ..decision.workflows.preflight import PreflightInput, PreflightWorkflow
from ..decision.workflows.supersede import SupersedeInput, SupersedeWorkflow
from ..workflows.planning import PlanningInput, PlanningWorkflow
from ..workflows.preflight import PreflightInput, PreflightWorkflow
from ..workflows.supersede import SupersedeInput, SupersedeWorkflow
from .middleware import StringifiedParameterFixMiddleware
from .models import (
AnalyzeProjectRequest,
Expand Down
Loading
Loading