rimpack 0.1.0__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.
- rimpack-0.1.0/.github/workflows/docs.yml +48 -0
- rimpack-0.1.0/.gitignore +220 -0
- rimpack-0.1.0/.python-version +1 -0
- rimpack-0.1.0/AGENTS.md +287 -0
- rimpack-0.1.0/PKG-INFO +119 -0
- rimpack-0.1.0/README.md +107 -0
- rimpack-0.1.0/docs/Gemfile +3 -0
- rimpack-0.1.0/docs/_config.yml +11 -0
- rimpack-0.1.0/docs/assets/css/style.scss +17 -0
- rimpack-0.1.0/docs/cli.md +130 -0
- rimpack-0.1.0/docs/configuration.md +57 -0
- rimpack-0.1.0/docs/getting-started.md +125 -0
- rimpack-0.1.0/docs/index.md +64 -0
- rimpack-0.1.0/docs/modpack-format.md +169 -0
- rimpack-0.1.0/main.py +5 -0
- rimpack-0.1.0/pyproject.toml +34 -0
- rimpack-0.1.0/rimpack/__init__.py +75 -0
- rimpack-0.1.0/rimpack/cli/__init__.py +3 -0
- rimpack-0.1.0/rimpack/cli/init_modpack.py +232 -0
- rimpack-0.1.0/rimpack/cli/main.py +1081 -0
- rimpack-0.1.0/rimpack/config.py +112 -0
- rimpack-0.1.0/rimpack/constants.py +17 -0
- rimpack-0.1.0/rimpack/core/__init__.py +131 -0
- rimpack-0.1.0/rimpack/core/modpack/__init__.py +153 -0
- rimpack-0.1.0/rimpack/core/modpack/_text.py +17 -0
- rimpack-0.1.0/rimpack/core/modpack/activation_toml.py +217 -0
- rimpack-0.1.0/rimpack/core/modpack/list_file.py +233 -0
- rimpack-0.1.0/rimpack/core/modpack/modpack.py +1449 -0
- rimpack-0.1.0/rimpack/core/modpack/ordering_toml.py +212 -0
- rimpack-0.1.0/rimpack/core/modpack/pack_toml.py +836 -0
- rimpack-0.1.0/rimpack/core/mods/__init__.py +41 -0
- rimpack-0.1.0/rimpack/core/mods/about_xml.py +383 -0
- rimpack-0.1.0/rimpack/core/mods/load_folders.py +209 -0
- rimpack-0.1.0/rimpack/core/mods/mod_folder.py +48 -0
- rimpack-0.1.0/rimpack/launching.py +493 -0
- rimpack-0.1.0/rimpack/steam_installation.py +142 -0
- rimpack-0.1.0/rimpack/steamworks.py +385 -0
- rimpack-0.1.0/rimpack/ui/__init__.py +1 -0
- rimpack-0.1.0/specs/README.md +114 -0
- rimpack-0.1.0/specs/activation_toml_spec.md +427 -0
- rimpack-0.1.0/specs/modpack_folder_layout_spec.md +479 -0
- rimpack-0.1.0/specs/ordering_toml_spec.md +353 -0
- rimpack-0.1.0/specs/pack_toml_spec.md +548 -0
- rimpack-0.1.0/specs/rimworld_modpack_list_format_spec.md +449 -0
- rimpack-0.1.0/specs/tool_config_spec.md +122 -0
- rimpack-0.1.0/tests/__init__.py +1 -0
- rimpack-0.1.0/tests/_helpers.py +29 -0
- rimpack-0.1.0/tests/test_about_xml.py +446 -0
- rimpack-0.1.0/tests/test_activation_toml.py +152 -0
- rimpack-0.1.0/tests/test_cli_main.py +1614 -0
- rimpack-0.1.0/tests/test_launching.py +593 -0
- rimpack-0.1.0/tests/test_load_folders_xml.py +207 -0
- rimpack-0.1.0/tests/test_mod_folder.py +107 -0
- rimpack-0.1.0/tests/test_modpack.py +653 -0
- rimpack-0.1.0/tests/test_modpack_list_file.py +268 -0
- rimpack-0.1.0/tests/test_ordering_toml.py +202 -0
- rimpack-0.1.0/tests/test_pack_toml.py +399 -0
- rimpack-0.1.0/tests/test_steamworks.py +399 -0
- rimpack-0.1.0/uv.lock +365 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pages: write
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: pages
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
build:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- name: Check out repository
|
|
23
|
+
uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- name: Configure GitHub Pages
|
|
26
|
+
uses: actions/configure-pages@v5
|
|
27
|
+
|
|
28
|
+
- name: Build docs site
|
|
29
|
+
uses: actions/jekyll-build-pages@v1
|
|
30
|
+
with:
|
|
31
|
+
source: docs
|
|
32
|
+
destination: ./_site
|
|
33
|
+
|
|
34
|
+
- name: Upload Pages artifact
|
|
35
|
+
uses: actions/upload-pages-artifact@v3
|
|
36
|
+
with:
|
|
37
|
+
path: ./_site
|
|
38
|
+
|
|
39
|
+
deploy:
|
|
40
|
+
environment:
|
|
41
|
+
name: github-pages
|
|
42
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
needs: build
|
|
45
|
+
steps:
|
|
46
|
+
- name: Deploy to GitHub Pages
|
|
47
|
+
id: deployment
|
|
48
|
+
uses: actions/deploy-pages@v4
|
rimpack-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
.pytest-tmp/
|
|
53
|
+
cover/
|
|
54
|
+
|
|
55
|
+
# Translations
|
|
56
|
+
*.mo
|
|
57
|
+
*.pot
|
|
58
|
+
|
|
59
|
+
# Django stuff:
|
|
60
|
+
*.log
|
|
61
|
+
local_settings.py
|
|
62
|
+
db.sqlite3
|
|
63
|
+
db.sqlite3-journal
|
|
64
|
+
|
|
65
|
+
# Flask stuff:
|
|
66
|
+
instance/
|
|
67
|
+
.webassets-cache
|
|
68
|
+
|
|
69
|
+
# Scrapy stuff:
|
|
70
|
+
.scrapy
|
|
71
|
+
|
|
72
|
+
# Sphinx documentation
|
|
73
|
+
docs/_build/
|
|
74
|
+
|
|
75
|
+
# PyBuilder
|
|
76
|
+
.pybuilder/
|
|
77
|
+
target/
|
|
78
|
+
|
|
79
|
+
# Jupyter Notebook
|
|
80
|
+
.ipynb_checkpoints
|
|
81
|
+
|
|
82
|
+
# IPython
|
|
83
|
+
profile_default/
|
|
84
|
+
ipython_config.py
|
|
85
|
+
|
|
86
|
+
# pyenv
|
|
87
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
88
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
89
|
+
# .python-version
|
|
90
|
+
|
|
91
|
+
# pipenv
|
|
92
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
93
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
94
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
95
|
+
# install all needed dependencies.
|
|
96
|
+
# Pipfile.lock
|
|
97
|
+
|
|
98
|
+
# UV
|
|
99
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
100
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
101
|
+
# commonly ignored for libraries.
|
|
102
|
+
# uv.lock
|
|
103
|
+
|
|
104
|
+
# poetry
|
|
105
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
106
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
107
|
+
# commonly ignored for libraries.
|
|
108
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
109
|
+
# poetry.lock
|
|
110
|
+
# poetry.toml
|
|
111
|
+
|
|
112
|
+
# pdm
|
|
113
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
114
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
115
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
116
|
+
# pdm.lock
|
|
117
|
+
# pdm.toml
|
|
118
|
+
.pdm-python
|
|
119
|
+
.pdm-build/
|
|
120
|
+
|
|
121
|
+
# pixi
|
|
122
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
123
|
+
# pixi.lock
|
|
124
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
125
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
126
|
+
.pixi
|
|
127
|
+
|
|
128
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
129
|
+
__pypackages__/
|
|
130
|
+
|
|
131
|
+
# Celery stuff
|
|
132
|
+
celerybeat-schedule
|
|
133
|
+
celerybeat.pid
|
|
134
|
+
|
|
135
|
+
# Redis
|
|
136
|
+
*.rdb
|
|
137
|
+
*.aof
|
|
138
|
+
*.pid
|
|
139
|
+
|
|
140
|
+
# RabbitMQ
|
|
141
|
+
mnesia/
|
|
142
|
+
rabbitmq/
|
|
143
|
+
rabbitmq-data/
|
|
144
|
+
|
|
145
|
+
# ActiveMQ
|
|
146
|
+
activemq-data/
|
|
147
|
+
|
|
148
|
+
# SageMath parsed files
|
|
149
|
+
*.sage.py
|
|
150
|
+
|
|
151
|
+
# Environments
|
|
152
|
+
.env
|
|
153
|
+
.envrc
|
|
154
|
+
.venv
|
|
155
|
+
env/
|
|
156
|
+
venv/
|
|
157
|
+
ENV/
|
|
158
|
+
env.bak/
|
|
159
|
+
venv.bak/
|
|
160
|
+
|
|
161
|
+
# Spyder project settings
|
|
162
|
+
.spyderproject
|
|
163
|
+
.spyproject
|
|
164
|
+
|
|
165
|
+
# Rope project settings
|
|
166
|
+
.ropeproject
|
|
167
|
+
|
|
168
|
+
# mkdocs documentation
|
|
169
|
+
/site
|
|
170
|
+
|
|
171
|
+
# mypy
|
|
172
|
+
.mypy_cache/
|
|
173
|
+
.dmypy.json
|
|
174
|
+
dmypy.json
|
|
175
|
+
|
|
176
|
+
# Pyre type checker
|
|
177
|
+
.pyre/
|
|
178
|
+
|
|
179
|
+
# pytype static type analyzer
|
|
180
|
+
.pytype/
|
|
181
|
+
|
|
182
|
+
# Cython debug symbols
|
|
183
|
+
cython_debug/
|
|
184
|
+
|
|
185
|
+
# PyCharm
|
|
186
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
187
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
188
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
189
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
190
|
+
# .idea/
|
|
191
|
+
|
|
192
|
+
# Abstra
|
|
193
|
+
# Abstra is an AI-powered process automation framework.
|
|
194
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
195
|
+
# Learn more at https://abstra.io/docs
|
|
196
|
+
.abstra/
|
|
197
|
+
|
|
198
|
+
# Visual Studio Code
|
|
199
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
200
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
201
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
202
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
203
|
+
# .vscode/
|
|
204
|
+
|
|
205
|
+
# Ruff stuff:
|
|
206
|
+
.ruff_cache/
|
|
207
|
+
|
|
208
|
+
# PyPI configuration file
|
|
209
|
+
.pypirc
|
|
210
|
+
|
|
211
|
+
# Marimo
|
|
212
|
+
marimo/_static/
|
|
213
|
+
marimo/_lsp/
|
|
214
|
+
__marimo__/
|
|
215
|
+
|
|
216
|
+
# Streamlit
|
|
217
|
+
.streamlit/secrets.toml
|
|
218
|
+
|
|
219
|
+
# Repository-local test scratch files
|
|
220
|
+
tests/__tmp_*.xml
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
rimpack-0.1.0/AGENTS.md
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
This repository contains a Python-based RimWorld modpack tool.
|
|
6
|
+
|
|
7
|
+
Agents working in this repository must treat the project as a spec-driven implementation. Code, tests, and documentation should follow the spec files in `specs/`.
|
|
8
|
+
|
|
9
|
+
Primary tooling assumptions:
|
|
10
|
+
|
|
11
|
+
- Python
|
|
12
|
+
- strict `basedpyright`
|
|
13
|
+
- `ruff`
|
|
14
|
+
- `pytest`
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Core working rules
|
|
19
|
+
|
|
20
|
+
1. Read the relevant spec files before changing code.
|
|
21
|
+
2. Treat the spec files in `specs/` as authoritative unless the task explicitly changes the spec.
|
|
22
|
+
3. Keep changes small, local, and easy to review.
|
|
23
|
+
4. Prefer explicit, simple designs over clever or implicit ones.
|
|
24
|
+
5. Do not introduce format or schema changes silently.
|
|
25
|
+
6. When behavior changes, update tests and docs in the same change.
|
|
26
|
+
7. Preserve determinism and diff-friendliness in generated outputs.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Authoritative spec files
|
|
31
|
+
|
|
32
|
+
Agents should treat these files as the primary source of truth for data formats and behavior:
|
|
33
|
+
|
|
34
|
+
- `specs/modpack_folder_layout_spec.md`
|
|
35
|
+
- `specs/rimworld_modpack_list_format_spec.md`
|
|
36
|
+
- `specs/pack_toml_spec.md`
|
|
37
|
+
- `specs/ordering_toml_spec.md`
|
|
38
|
+
- `specs/activation_toml_spec.md`
|
|
39
|
+
|
|
40
|
+
If `specs/README.md` exists, read it first for reading order and relationships between specs.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Repository expectations
|
|
45
|
+
|
|
46
|
+
This project should be implemented as a Python codebase with:
|
|
47
|
+
|
|
48
|
+
- strong static typing
|
|
49
|
+
- strict `basedpyright` compliance
|
|
50
|
+
- `ruff` compliance
|
|
51
|
+
- `pytest` test coverage
|
|
52
|
+
|
|
53
|
+
Agents should write code that is:
|
|
54
|
+
|
|
55
|
+
- typed
|
|
56
|
+
- modular
|
|
57
|
+
- readable
|
|
58
|
+
- deterministic
|
|
59
|
+
- easy to test
|
|
60
|
+
|
|
61
|
+
Avoid magical behavior, hidden global state, and unnecessary abstraction.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Python standards
|
|
66
|
+
|
|
67
|
+
### Typing
|
|
68
|
+
- All new Python code should include explicit type annotations.
|
|
69
|
+
- Code must pass strict `basedpyright`.
|
|
70
|
+
- Prefer precise types over `Any`.
|
|
71
|
+
- Avoid untyped dictionaries for structured data when a `dataclass`, `TypedDict`, or protocol is more appropriate.
|
|
72
|
+
- Keep public function signatures stable and explicit.
|
|
73
|
+
|
|
74
|
+
### Style
|
|
75
|
+
- Follow `ruff` rules configured by the repository.
|
|
76
|
+
- Prefer clear, boring code over compact cleverness.
|
|
77
|
+
- Keep functions focused.
|
|
78
|
+
- Prefer `pathlib.Path` over raw path strings in Python code where practical.
|
|
79
|
+
- Prefer `dataclasses` for structured internal models unless a different choice is clearly justified.
|
|
80
|
+
|
|
81
|
+
### Testing
|
|
82
|
+
- All behavior changes should include or update tests.
|
|
83
|
+
- Use `pytest`.
|
|
84
|
+
- Favor small, targeted unit tests.
|
|
85
|
+
- Add regression tests for parser, resolver, activation, and ordering behavior when relevant.
|
|
86
|
+
- Keep tests deterministic.
|
|
87
|
+
- When tests exercise config loading or install-path discovery, isolate them from machine-local state by overriding the config path and clearing or setting relevant environment variables explicitly.
|
|
88
|
+
- Whenever changing Python source files, run both `ruff` and `basedpyright` before finishing the task.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Implementation priorities
|
|
93
|
+
|
|
94
|
+
When implementing features, preserve these priorities:
|
|
95
|
+
|
|
96
|
+
1. Correctness against spec
|
|
97
|
+
2. Deterministic output
|
|
98
|
+
3. Preservation of user-authored text where required
|
|
99
|
+
4. Readability and maintainability
|
|
100
|
+
5. Performance only after correctness and clarity
|
|
101
|
+
|
|
102
|
+
Do not trade away spec correctness for speculative optimization.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Format-specific guidance
|
|
107
|
+
|
|
108
|
+
### `.list` files
|
|
109
|
+
- Treat `.list` files as text-first authored documents.
|
|
110
|
+
- Preserve untouched lines exactly.
|
|
111
|
+
- Preserve comments and blank lines.
|
|
112
|
+
- Preserve unknown lines unchanged.
|
|
113
|
+
- Do not rewrite whole files just to normalize formatting.
|
|
114
|
+
- Apply the smallest practical edit for UI-driven changes.
|
|
115
|
+
- Parsers and editors for `.list` files should retain enough source structure to support comment- and formatting-preserving edits later, including raw line text and original line endings.
|
|
116
|
+
|
|
117
|
+
### `pack.toml`
|
|
118
|
+
- Treat `pack.toml` as a small root manifest.
|
|
119
|
+
- Do not store full mod lists in it.
|
|
120
|
+
- Do not store generated lock data, diagnostics payloads, caches, or UI state in it.
|
|
121
|
+
- Preserve comments and unrelated fields when editing if the TOML library supports it.
|
|
122
|
+
- Prefer preservation-friendly parsing/editing models over lossy deserialize-then-reserialize approaches, because future programmatic edits must keep comments, section layout, and formatting stable where possible.
|
|
123
|
+
|
|
124
|
+
### ordering and activation rules
|
|
125
|
+
- Keep ordering rules separate from activation rules.
|
|
126
|
+
- Ordering rules constrain relative order.
|
|
127
|
+
- Activation rules control whether candidate entries are active.
|
|
128
|
+
- Do not merge these concepts into one file or one resolver stage unless the spec is explicitly changed.
|
|
129
|
+
- The central load-order implementation lives in `rimpack.core.modpack.modpack.generate_modpack_load_order`; update that function whenever ordering behavior changes, including authored ordering rules or `About.xml`-derived ordering metadata.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Change management rules
|
|
134
|
+
|
|
135
|
+
### If code changes require a spec change
|
|
136
|
+
Update the relevant file in `specs/` in the same change.
|
|
137
|
+
|
|
138
|
+
### If a spec is ambiguous
|
|
139
|
+
Do not invent a large interpretation silently.
|
|
140
|
+
Prefer the smallest reasonable implementation that matches the current wording.
|
|
141
|
+
If necessary, leave a clear note in code comments or task notes about the ambiguity.
|
|
142
|
+
|
|
143
|
+
### If a requested change conflicts with the existing spec
|
|
144
|
+
Update the spec first or as part of the same change. Do not leave code and spec drifting apart.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## File organization guidance
|
|
149
|
+
|
|
150
|
+
Agents should respect the intended separation between:
|
|
151
|
+
|
|
152
|
+
- authored project files
|
|
153
|
+
- generated files
|
|
154
|
+
- rules
|
|
155
|
+
- lock data
|
|
156
|
+
- tests
|
|
157
|
+
- implementation code
|
|
158
|
+
|
|
159
|
+
Do not mix generated artifacts into authored source directories.
|
|
160
|
+
|
|
161
|
+
Do not place agent scratch files, temporary exports, or local caches into the repository unless explicitly asked.
|
|
162
|
+
|
|
163
|
+
### Namespace boundaries
|
|
164
|
+
- `rimpack.core.mods` is reserved for parsing RimWorld mod files and folders such as `About.xml`, `LoadFolders.xml`, and on-disk mod directories.
|
|
165
|
+
- Modpack-authored project formats such as `.list`, `pack.toml`, and rule files should live outside `rimpack.core.mods`.
|
|
166
|
+
- Do not place modpack project parsers into the RimWorld mod metadata namespace.
|
|
167
|
+
- Whenever modpack parsing or editing code changes for `.list`, `pack.toml`, or rule files, also check whether `rimpack init` still creates the right authored structure and update it in the same change if needed.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Testing expectations by area
|
|
172
|
+
|
|
173
|
+
### Parser changes
|
|
174
|
+
Add tests for:
|
|
175
|
+
- valid entries
|
|
176
|
+
- disabled entries
|
|
177
|
+
- comments
|
|
178
|
+
- blank lines
|
|
179
|
+
- unknown lines
|
|
180
|
+
- preservation-sensitive behavior
|
|
181
|
+
|
|
182
|
+
When changing code that parses RimWorld mod files or folders, also check for a local Steam RimWorld installation or workshop library and, if available, test the change against real mods in addition to unit tests. Prefer using the repository CLI command `rimpack load-mods` for this real-life parser verification.
|
|
183
|
+
|
|
184
|
+
### Manifest changes
|
|
185
|
+
Add tests for:
|
|
186
|
+
- required fields
|
|
187
|
+
- path handling
|
|
188
|
+
- ordering of `mod_files`
|
|
189
|
+
- ordering of rule file arrays
|
|
190
|
+
- invalid manifest shapes
|
|
191
|
+
|
|
192
|
+
### Ordering changes
|
|
193
|
+
Add tests for:
|
|
194
|
+
- stable ordering
|
|
195
|
+
- before/after constraints
|
|
196
|
+
- missing references
|
|
197
|
+
- cycle diagnostics
|
|
198
|
+
|
|
199
|
+
### Activation changes
|
|
200
|
+
Add tests for:
|
|
201
|
+
- `when_all_present`
|
|
202
|
+
- `when_all_absent`
|
|
203
|
+
- `when_any_present`
|
|
204
|
+
- `when_any_absent`
|
|
205
|
+
- inactive-by-rule behavior
|
|
206
|
+
- duplicate rules for the same mod if applicable
|
|
207
|
+
|
|
208
|
+
### Lock-file changes
|
|
209
|
+
Add tests for:
|
|
210
|
+
- deterministic output
|
|
211
|
+
- resolved entries
|
|
212
|
+
- unresolved entries
|
|
213
|
+
- disabled entries
|
|
214
|
+
- final load order contents
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Preferred implementation style
|
|
219
|
+
|
|
220
|
+
Prefer code that is easy for another agent or human to continue.
|
|
221
|
+
|
|
222
|
+
Good traits:
|
|
223
|
+
|
|
224
|
+
- small modules
|
|
225
|
+
- explicit models
|
|
226
|
+
- pure functions where practical
|
|
227
|
+
- thin I/O boundaries
|
|
228
|
+
- minimal hidden coupling
|
|
229
|
+
- resolve external context once at the boundary, then pass it into helpers explicitly instead of having deep helpers rediscover config, environment, or filesystem state
|
|
230
|
+
|
|
231
|
+
Avoid:
|
|
232
|
+
|
|
233
|
+
- giant all-in-one classes
|
|
234
|
+
- vague helper utilities with mixed responsibilities
|
|
235
|
+
- schema logic duplicated across multiple modules
|
|
236
|
+
- silent fallback behavior that hides invalid states
|
|
237
|
+
- helpers that reach back into config or environment discovery when the needed value can be passed as an argument
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## When editing generated-output logic
|
|
242
|
+
|
|
243
|
+
Generated files should be:
|
|
244
|
+
|
|
245
|
+
- reproducible
|
|
246
|
+
- stable in ordering
|
|
247
|
+
- low-noise in diffs
|
|
248
|
+
- straightforward to inspect
|
|
249
|
+
|
|
250
|
+
Avoid timestamps or nondeterministic identifiers unless explicitly required by spec.
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Documentation expectations
|
|
255
|
+
|
|
256
|
+
When introducing a new persistent format, schema field, rule type, or pipeline stage:
|
|
257
|
+
|
|
258
|
+
1. update the relevant spec in `specs/`
|
|
259
|
+
2. update tests
|
|
260
|
+
3. update any code-level docs or README references if needed
|
|
261
|
+
|
|
262
|
+
Do not let implementation-only knowledge become the source of truth for a persisted format.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Command assumptions
|
|
267
|
+
|
|
268
|
+
Use repository-configured commands for:
|
|
269
|
+
|
|
270
|
+
- linting with `ruff`
|
|
271
|
+
- type checking with `basedpyright`
|
|
272
|
+
- tests with `pytest`
|
|
273
|
+
|
|
274
|
+
If command names are defined in project files such as `pyproject.toml`, follow those definitions rather than inventing new ones.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Summary for agents
|
|
279
|
+
|
|
280
|
+
When in doubt:
|
|
281
|
+
|
|
282
|
+
- read the relevant spec first
|
|
283
|
+
- keep code explicit
|
|
284
|
+
- preserve authored text carefully
|
|
285
|
+
- keep generated output deterministic
|
|
286
|
+
- update tests with behavior changes
|
|
287
|
+
- keep code, tests, and specs aligned
|
rimpack-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rimpack
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Requires-Dist: platformdirs>=4.4.0
|
|
7
|
+
Requires-Dist: pydantic>=2.12.0
|
|
8
|
+
Requires-Dist: rich>=14.3.3
|
|
9
|
+
Requires-Dist: steamworkspy>=0.0.2
|
|
10
|
+
Requires-Dist: typer>=0.19.2
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
|
|
13
|
+
# rimpack
|
|
14
|
+
|
|
15
|
+
`rimpack` is a Python CLI for building, validating, and launching RimWorld modpacks from
|
|
16
|
+
human-authored project files.
|
|
17
|
+
|
|
18
|
+
It treats a modpack as a normal project directory:
|
|
19
|
+
|
|
20
|
+
- `pack.toml` is the root manifest.
|
|
21
|
+
- `mods/*.list` files define authored mod intent.
|
|
22
|
+
- `rules/` contains optional activation and ordering rules.
|
|
23
|
+
- `generated/` contains outputs that can be regenerated.
|
|
24
|
+
- launch state stays machine-local instead of mutating the real RimWorld install.
|
|
25
|
+
|
|
26
|
+
The repository is spec-driven. The authoritative behavior and file-format definitions live in
|
|
27
|
+
[`specs/`](./specs).
|
|
28
|
+
|
|
29
|
+
## Current Capabilities
|
|
30
|
+
|
|
31
|
+
Today, `rimpack` can:
|
|
32
|
+
|
|
33
|
+
- initialize a new modpack project with `rimpack init`
|
|
34
|
+
- inspect RimWorld mods with `rimpack load-mods`
|
|
35
|
+
- resolve Steam Workshop items with `rimpack resolve steam`
|
|
36
|
+
- subscribe and unsubscribe Workshop mods
|
|
37
|
+
- add mod references to a declared `.list` file with `rimpack add`
|
|
38
|
+
- append ordering rules with `rimpack add-ordering-rule`
|
|
39
|
+
- validate a modpack before launch with `rimpack validate`
|
|
40
|
+
- launch a modpack through a symlinked runtime tree with `rimpack launch`
|
|
41
|
+
|
|
42
|
+
Activation rule files are supported by the project format and validation pipeline, but there is
|
|
43
|
+
not yet a dedicated CLI command to author them.
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
The project uses Python 3.12+ and `uv`.
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
uv sync --dev
|
|
51
|
+
uv run rimpack --help
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
You can also run the console script directly after syncing:
|
|
55
|
+
|
|
56
|
+
```powershell
|
|
57
|
+
rimpack --help
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## First Run
|
|
61
|
+
|
|
62
|
+
Running `rimpack` with no command creates a user-local config file if one does not already exist.
|
|
63
|
+
That config stores absolute machine-local paths such as:
|
|
64
|
+
|
|
65
|
+
- the RimWorld install directory
|
|
66
|
+
- the Steam Workshop content directory for app `294100`
|
|
67
|
+
|
|
68
|
+
You can also provide them through environment variables:
|
|
69
|
+
|
|
70
|
+
- `RIMWORLD_FOLDER`
|
|
71
|
+
- `STEAM_WORKSHOP_FOLDER`
|
|
72
|
+
|
|
73
|
+
## Quick Start
|
|
74
|
+
|
|
75
|
+
Initialize a new pack:
|
|
76
|
+
|
|
77
|
+
```powershell
|
|
78
|
+
uv run rimpack init .\MyPack
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Add a Workshop mod to the `@libraries` list:
|
|
82
|
+
|
|
83
|
+
```powershell
|
|
84
|
+
uv run rimpack add @libraries steam:2009463077
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Validate the pack:
|
|
88
|
+
|
|
89
|
+
```powershell
|
|
90
|
+
uv run rimpack validate
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Launch it:
|
|
94
|
+
|
|
95
|
+
```powershell
|
|
96
|
+
uv run rimpack launch
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Documentation
|
|
100
|
+
|
|
101
|
+
Browsable project documentation lives in [`docs/`](./docs):
|
|
102
|
+
|
|
103
|
+
- [`docs/index.md`](./docs/index.md)
|
|
104
|
+
- [`docs/getting-started.md`](./docs/getting-started.md)
|
|
105
|
+
- [`docs/cli.md`](./docs/cli.md)
|
|
106
|
+
- [`docs/modpack-format.md`](./docs/modpack-format.md)
|
|
107
|
+
- [`docs/configuration.md`](./docs/configuration.md)
|
|
108
|
+
|
|
109
|
+
A GitHub Actions workflow publishes those docs to GitHub Pages on pushes to `main`.
|
|
110
|
+
|
|
111
|
+
## Development
|
|
112
|
+
|
|
113
|
+
The expected local checks are:
|
|
114
|
+
|
|
115
|
+
```powershell
|
|
116
|
+
uv run ruff check .
|
|
117
|
+
uv run basedpyright
|
|
118
|
+
uv run pytest
|
|
119
|
+
```
|