refactor(manifest): break import cycle by extracting ManifestBottle to a leaf module
test / unit (pull_request) Successful in 57s
test / integration (pull_request) Successful in 27s
test / coverage (pull_request) Successful in 1m23s
lint / lint (push) Successful in 2m24s
test / unit (push) Successful in 59s
test / integration (push) Successful in 26s
test / coverage (push) Successful in 1m17s
Update Quality Badges / update-badges (push) Successful in 1m13s
test / unit (pull_request) Successful in 57s
test / integration (pull_request) Successful in 27s
test / coverage (pull_request) Successful in 1m23s
lint / lint (push) Successful in 2m24s
test / unit (push) Successful in 59s
test / integration (push) Successful in 26s
test / coverage (push) Successful in 1m17s
Update Quality Badges / update-badges (push) Successful in 1m13s
manifest.py imported the extends/loader resolvers, while those resolvers needed ManifestBottle back from manifest.py — a true bidirectional cycle papered over with in-function imports and TYPE_CHECKING guards (not clear dependency inversion). Extract ManifestBottle into a new leaf module manifest_bottle.py that depends only on the other leaf modules (manifest_util/agent/egress/git/schema). manifest.py re-exports ManifestBottle, so `from .manifest import ManifestBottle` callers are unaffected. With the cycle gone: - manifest_extends and manifest_loader import ManifestBottle from manifest_bottle and their other deps from the real source modules, all at top level (TYPE_CHECKING block removed). - manifest.py imports the extends/loader/schema/yaml_subset/log helpers at module top; all per-function lazy imports in the cluster are removed. No behavior change; full unit suite green, pyright clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NkwFXLFff9PYPy4wgVBJp9
This commit was merged in pull request #314.
This commit is contained in:
@@ -3,9 +3,10 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from .log import warn
|
||||
from .manifest_bottle import ManifestBottle
|
||||
from .manifest_extends import resolve_bottles
|
||||
from .manifest_schema import (
|
||||
entity_name_from_path,
|
||||
validate_bottle_frontmatter_keys,
|
||||
@@ -13,9 +14,6 @@ from .manifest_schema import (
|
||||
from .manifest_util import ManifestError
|
||||
from .yaml_subset import YamlSubsetError, parse_frontmatter
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .manifest import ManifestBottle
|
||||
|
||||
|
||||
def check_stale_json(dir_path: Path, md_dir: Path, label: str) -> None:
|
||||
"""Die if `<dir_path>/bot-bottle.json` exists but `md_dir` does
|
||||
@@ -78,8 +76,6 @@ def load_bottle_chain_from_dir(
|
||||
|
||||
Only the files in the extends chain are read — unrelated bottle files
|
||||
are never touched. Raises ManifestError on parse or validation failure."""
|
||||
from .manifest_extends import resolve_bottles
|
||||
|
||||
raws: dict[str, dict[str, object]] = {}
|
||||
to_load = [bottle_name]
|
||||
while to_load:
|
||||
|
||||
Reference in New Issue
Block a user