modforge-cli 0.2.8__tar.gz → 0.2.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/PKG-INFO +1 -1
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/pyproject.toml +1 -1
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/__version__.py +1 -1
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/modpack.py +19 -4
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/downloader.py +3 -3
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/models.py +1 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/resolver.py +11 -4
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/LICENSE +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/README.md +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/__init__.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/__main__.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/api/__init__.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/api/modrinth.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/__init__.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/export.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/mods.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/project.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/setup.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/shared.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/sklauncher.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/utils.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/__init__.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/policy.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/utils.py +0 -0
- {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/test.py +0 -0
|
@@ -61,7 +61,14 @@ def add(name: str, project_type: str = "mod", pack_name: str | None = None) -> N
|
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
@app.command()
|
|
64
|
-
def resolve(
|
|
64
|
+
def resolve(
|
|
65
|
+
pack_name: str | None = None,
|
|
66
|
+
include_optional: bool = typer.Option(
|
|
67
|
+
False,
|
|
68
|
+
"--include-optional",
|
|
69
|
+
help="Include optional dependencies (e.g., ViaFabric multi-version sub-mods)",
|
|
70
|
+
),
|
|
71
|
+
) -> None:
|
|
65
72
|
"""Resolve all mod dependencies"""
|
|
66
73
|
api = ModrinthAPIConfig(MODRINTH_API)
|
|
67
74
|
|
|
@@ -87,14 +94,22 @@ def resolve(pack_name: str | None = None) -> None:
|
|
|
87
94
|
console.print("[red]Could not load manifest[/red]")
|
|
88
95
|
raise typer.Exit(1)
|
|
89
96
|
|
|
90
|
-
|
|
97
|
+
if include_optional:
|
|
98
|
+
console.print(f"[cyan]Resolving dependencies for {pack_name} (including optional)...[/cyan]")
|
|
99
|
+
else:
|
|
100
|
+
console.print(f"[cyan]Resolving dependencies for {pack_name} (required only)...[/cyan]")
|
|
101
|
+
console.print("[dim]Tip: Use --include-optional to add optional dependencies[/dim]")
|
|
91
102
|
|
|
92
103
|
policy = ModPolicy(POLICY_PATH)
|
|
93
104
|
resolver = ModResolver(
|
|
94
|
-
policy=policy,
|
|
105
|
+
policy=policy,
|
|
106
|
+
api=api,
|
|
107
|
+
mc_version=manifest.minecraft,
|
|
108
|
+
loader=manifest.loader,
|
|
109
|
+
include_optional_deps=include_optional,
|
|
95
110
|
)
|
|
96
111
|
|
|
97
|
-
async def do_resolve():
|
|
112
|
+
async def do_resolve() -> set[str]:
|
|
98
113
|
async with await get_api_session() as session:
|
|
99
114
|
return await resolver.resolve(manifest.mods, session)
|
|
100
115
|
|
|
@@ -69,9 +69,9 @@ class ModDownloader:
|
|
|
69
69
|
|
|
70
70
|
def version_score(v: Any) -> tuple[int, str]:
|
|
71
71
|
vtype = version_priority.get(v.get("version_type", "alpha"), 0)
|
|
72
|
-
# Use
|
|
73
|
-
|
|
74
|
-
return (vtype,
|
|
72
|
+
# Use date_published for chronological ordering (ISO 8601, sortable)
|
|
73
|
+
vdate = v.get("date_published", "") or ""
|
|
74
|
+
return (vtype, str(vdate))
|
|
75
75
|
|
|
76
76
|
# Filter compatible versions
|
|
77
77
|
compatible = []
|
|
@@ -55,6 +55,7 @@ class ProjectVersion(BaseAPIModel):
|
|
|
55
55
|
files: list[File] = Field(default_factory=list)
|
|
56
56
|
game_versions: list[str] = Field(default_factory=list)
|
|
57
57
|
loaders: list[str] = Field(default_factory=list)
|
|
58
|
+
date_published: str | None = None
|
|
58
59
|
|
|
59
60
|
@property
|
|
60
61
|
def is_release(self) -> bool:
|
|
@@ -28,11 +28,13 @@ class ModResolver:
|
|
|
28
28
|
api: ModrinthAPIConfig,
|
|
29
29
|
mc_version: str,
|
|
30
30
|
loader: str,
|
|
31
|
+
include_optional_deps: bool = False,
|
|
31
32
|
) -> None:
|
|
32
33
|
self.policy = policy
|
|
33
34
|
self.api = api
|
|
34
35
|
self.mc_version = mc_version
|
|
35
36
|
self.loader = loader
|
|
37
|
+
self.include_optional_deps = include_optional_deps
|
|
36
38
|
|
|
37
39
|
self._headers = {"User-Agent": f"{__author__}/ModForge-CLI/{__version__}"}
|
|
38
40
|
|
|
@@ -48,8 +50,9 @@ class ModResolver:
|
|
|
48
50
|
|
|
49
51
|
def version_score(v: ProjectVersion) -> tuple[int, str]:
|
|
50
52
|
vtype = version_priority.get(v.version_type, 0)
|
|
51
|
-
# Use
|
|
52
|
-
|
|
53
|
+
# Use date_published for chronological ordering (ISO 8601, sortable)
|
|
54
|
+
vdate = v.date_published or ""
|
|
55
|
+
return (vtype, vdate)
|
|
53
56
|
|
|
54
57
|
# Filter compatible versions
|
|
55
58
|
compatible = [
|
|
@@ -60,7 +63,7 @@ class ModResolver:
|
|
|
60
63
|
if not compatible:
|
|
61
64
|
return None
|
|
62
65
|
|
|
63
|
-
# Sort by version type (release > beta > alpha), then by
|
|
66
|
+
# Sort by version type (release > beta > alpha), then by date (newest first)
|
|
64
67
|
compatible.sort(key=version_score, reverse=True)
|
|
65
68
|
return compatible[0]
|
|
66
69
|
|
|
@@ -231,9 +234,13 @@ class ModResolver:
|
|
|
231
234
|
f"(conflicts with '{pid}')[/yellow]"
|
|
232
235
|
)
|
|
233
236
|
|
|
234
|
-
if dtype
|
|
237
|
+
if dtype == "required" and dep_id not in resolved:
|
|
235
238
|
resolved.add(dep_id)
|
|
236
239
|
queue.append(dep_id)
|
|
240
|
+
elif dtype == "optional" and self.include_optional_deps and dep_id not in resolved:
|
|
241
|
+
resolved.add(dep_id)
|
|
242
|
+
queue.append(dep_id)
|
|
243
|
+
console.print(f"[dim] + Optional dep added: {dep_id}[/dim]")
|
|
237
244
|
|
|
238
245
|
# Report failed slugs
|
|
239
246
|
if failed_slugs:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|