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
13 changes: 8 additions & 5 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
---
# ONEX Core Pre-commit Configuration
# Uses shared ONEX hook templates to demonstrate ecosystem integration
#
Expand Down Expand Up @@ -40,15 +41,17 @@ repos:
language: system
types: [python]
exclude: ^(tests/fixtures/validation/edge_cases/syntax_error\.py|\.github/workflows/|archived/).*$
stages: [commit]
stages: [pre-commit]

- id: ruff-fix
name: ruff check (auto-fix linting + import sorting)
entry: poetry run ruff check --fix
entry: poetry run ruff check --fix --exit-non-zero-on-fix
language: system
types: [python]
exclude: ^(tests/fixtures/validation/edge_cases/syntax_error\.py|\.github/workflows/|archived/).*$
stages: [commit]
stages: [pre-commit]
# Note: --exit-non-zero-on-fix ensures pre-commit fails if files were modified,
# forcing you to re-stage the changes. This keeps pre-commit and CI in sync.

- id: mypy-type-check
name: mypy (type checking - strict)
Expand All @@ -58,7 +61,7 @@ repos:
args: [--show-error-codes, --no-error-summary]
files: ^src/omnibase_core/.*\.py$
exclude: ^(tests/|src/omnibase_core/examples|archive/|archived/).*\.py$
stages: [commit]
stages: [pre-commit]

# Cleanup: Clear tmp/ directory before commits
# Prevents accumulation of temporary files from custom commands
Expand All @@ -68,7 +71,7 @@ repos:
language: system
always_run: true
pass_filenames: false
stages: [commit]
stages: [pre-commit]

# ONEX Framework Validation (from shared templates)
- repo: local
Expand Down
16 changes: 11 additions & 5 deletions scripts/validation/validate_structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -361,19 +361,25 @@ def validate_protocol_locations(self):
"""Validate protocol file locations."""
protocols_path = self.src_path / "protocols"

if self.repo_name != "omnibase_spi" and protocols_path.exists():
# Protocol directories are allowed in:
# - omnibase_spi: Higher-level protocol abstractions
# - omnibase_core: Core-native protocols for self-contained operation (v0.3.6+)
# See CLAUDE.md: "dependency inversion - SPI now depends on Core, not vice versa"
PROTOCOL_ALLOWED_REPOS = {"omnibase_spi", "omnibase_core"}

if self.repo_name not in PROTOCOL_ALLOWED_REPOS and protocols_path.exists():
self.violations.append(
StructureViolation(
level=ViolationLevel.ERROR,
category="Protocol Location",
message="Only omnibase_spi should contain protocols directory",
message="Only omnibase_spi and omnibase_core should contain protocols directory",
path=f"src/{self.repo_name}/protocols/",
suggestion="Remove local protocols, import from omnibase_spi instead",
suggestion="Remove local protocols, import from omnibase_spi or omnibase_core instead",
)
)

# Count protocol files in non-SPI repositories
if self.repo_name != "omnibase_spi":
# Count protocol files in repositories that don't have explicit protocol allowance
if self.repo_name not in PROTOCOL_ALLOWED_REPOS:
Comment on lines +364 to +382

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Logical inconsistency: omnibase_core special handling at line 406 is now dead code.

Since omnibase_core is now in PROTOCOL_ALLOWED_REPOS (line 368), the protocol counting block (lines 382-417) is entirely skipped for omnibase_core. This makes the special case at line 406 (max_protocols = 7 if self.repo_name == "omnibase_core" else 3) unreachable.

If this is intentional (protocol counting should not apply to allowed repos), consider removing the dead code for clarity. If protocol counting should still apply to omnibase_core, the condition needs adjustment.

-        # Count protocol files in repositories that don't have explicit protocol allowance
-        if self.repo_name not in PROTOCOL_ALLOWED_REPOS:
+        # Count protocol files in repositories that don't have explicit protocol allowance
+        # Note: omnibase_core has a temporary allowance for up to 7 protocols during migration
+        if self.repo_name not in PROTOCOL_ALLOWED_REPOS or self.repo_name == "omnibase_core":

Alternatively, if protocol counting should be completely disabled for allowed repos, remove lines 396-417 (the omnibase_core special case comment and handling).

protocol_count = 0
try:
for _root, dirs, files in os.walk(self.src_path):
Expand Down
2 changes: 2 additions & 0 deletions src/omnibase_core/mixins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
from omnibase_core.mixins.mixin_node_executor import MixinNodeExecutor
from omnibase_core.mixins.mixin_node_id_from_contract import MixinNodeIdFromContract
from omnibase_core.mixins.mixin_node_lifecycle import MixinNodeLifecycle
from omnibase_core.mixins.mixin_node_type_validator import MixinNodeTypeValidator
from omnibase_core.mixins.mixin_node_setup import MixinNodeSetup
from omnibase_core.mixins.mixin_redaction import MixinSensitiveFieldRedaction
from omnibase_core.mixins.mixin_request_response_introspection import (
Expand Down Expand Up @@ -94,6 +95,7 @@
"MixinLazyEvaluation",
"MixinNodeIdFromContract",
"MixinNodeLifecycle",
"MixinNodeTypeValidator",
"MixinNodeExecutor",
"MixinNodeSetup",
"MixinRequestResponseIntrospection",
Expand Down
7 changes: 4 additions & 3 deletions src/omnibase_core/models/contracts/__init__.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
from omnibase_core.models.core.model_workflow import ModelWorkflow

"""
Contract Models

Models for validating various contract formats and subcontract compositions.
"""

from omnibase_core.mixins.mixin_node_type_validator import MixinNodeTypeValidator
from omnibase_core.models.core.model_workflow import ModelWorkflow
from omnibase_core.models.discovery.model_event_descriptor import ModelEventDescriptor
from omnibase_core.models.security.model_condition_value import ModelConditionValue
from omnibase_core.models.service.model_external_service_config import (
ModelExternalServiceConfig,
)

from . import subcontracts
from .mixin_node_type_validator import MixinNodeTypeValidator
from .model_action_emission_config import ModelActionEmissionConfig
from .model_algorithm_config import ModelAlgorithmConfig
from .model_algorithm_factor_config import ModelAlgorithmFactorConfig
Expand All @@ -28,6 +27,7 @@
from .model_contract_effect import ModelContractEffect
from .model_contract_orchestrator import ModelContractOrchestrator
from .model_contract_reducer import ModelContractReducer
from .model_contract_version import ModelContractVersion
from .model_dependency import ModelDependency
from .model_effect_retry_config import ModelEffectRetryConfig
from .model_event_coordination_config import ModelEventCoordinationConfig
Expand Down Expand Up @@ -57,6 +57,7 @@
"MixinNodeTypeValidator",
# Foundation models
"ModelContractBase",
"ModelContractVersion",
"ModelDependency",
# Primary contract models
"ModelContractCompute",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,9 @@

from omnibase_core.enums import EnumNodeType
from omnibase_core.enums.enum_core_error_code import EnumCoreErrorCode
from omnibase_core.mixins.mixin_node_type_validator import MixinNodeTypeValidator
from omnibase_core.models.common.model_error_context import ModelErrorContext
from omnibase_core.models.common.model_schema_value import ModelSchemaValue
from omnibase_core.models.contracts.mixin_node_type_validator import (
MixinNodeTypeValidator,
)
from omnibase_core.models.contracts.model_contract_base import ModelContractBase
from omnibase_core.models.contracts.model_validation_rules import ModelValidationRules

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,9 @@

from omnibase_core.enums import EnumNodeType
from omnibase_core.enums.enum_core_error_code import EnumCoreErrorCode
from omnibase_core.mixins.mixin_node_type_validator import MixinNodeTypeValidator
from omnibase_core.models.common.model_error_context import ModelErrorContext
from omnibase_core.models.common.model_schema_value import ModelSchemaValue
from omnibase_core.models.contracts.mixin_node_type_validator import (
MixinNodeTypeValidator,
)
from omnibase_core.models.contracts.model_backup_config import ModelBackupConfig
from omnibase_core.models.contracts.model_contract_base import ModelContractBase
from omnibase_core.models.contracts.model_effect_retry_config import (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@

from omnibase_core.enums.enum_core_error_code import EnumCoreErrorCode
from omnibase_core.enums.enum_node_type import EnumNodeType
from omnibase_core.models.contracts.mixin_node_type_validator import (
MixinNodeTypeValidator,
)
from omnibase_core.mixins.mixin_node_type_validator import MixinNodeTypeValidator
from omnibase_core.models.contracts.model_action_emission_config import (
ModelActionEmissionConfig,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,9 @@

from omnibase_core.enums import EnumNodeType
from omnibase_core.enums.enum_core_error_code import EnumCoreErrorCode
from omnibase_core.mixins.mixin_node_type_validator import MixinNodeTypeValidator
from omnibase_core.models.common.model_error_context import ModelErrorContext
from omnibase_core.models.common.model_schema_value import ModelSchemaValue
from omnibase_core.models.contracts.mixin_node_type_validator import (
MixinNodeTypeValidator,
)
from omnibase_core.models.contracts.model_conflict_resolution_config import (
ModelConflictResolutionConfig,
)
Expand Down
Loading