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.
Files changed (59) hide show
  1. rimpack-0.1.0/.github/workflows/docs.yml +48 -0
  2. rimpack-0.1.0/.gitignore +220 -0
  3. rimpack-0.1.0/.python-version +1 -0
  4. rimpack-0.1.0/AGENTS.md +287 -0
  5. rimpack-0.1.0/PKG-INFO +119 -0
  6. rimpack-0.1.0/README.md +107 -0
  7. rimpack-0.1.0/docs/Gemfile +3 -0
  8. rimpack-0.1.0/docs/_config.yml +11 -0
  9. rimpack-0.1.0/docs/assets/css/style.scss +17 -0
  10. rimpack-0.1.0/docs/cli.md +130 -0
  11. rimpack-0.1.0/docs/configuration.md +57 -0
  12. rimpack-0.1.0/docs/getting-started.md +125 -0
  13. rimpack-0.1.0/docs/index.md +64 -0
  14. rimpack-0.1.0/docs/modpack-format.md +169 -0
  15. rimpack-0.1.0/main.py +5 -0
  16. rimpack-0.1.0/pyproject.toml +34 -0
  17. rimpack-0.1.0/rimpack/__init__.py +75 -0
  18. rimpack-0.1.0/rimpack/cli/__init__.py +3 -0
  19. rimpack-0.1.0/rimpack/cli/init_modpack.py +232 -0
  20. rimpack-0.1.0/rimpack/cli/main.py +1081 -0
  21. rimpack-0.1.0/rimpack/config.py +112 -0
  22. rimpack-0.1.0/rimpack/constants.py +17 -0
  23. rimpack-0.1.0/rimpack/core/__init__.py +131 -0
  24. rimpack-0.1.0/rimpack/core/modpack/__init__.py +153 -0
  25. rimpack-0.1.0/rimpack/core/modpack/_text.py +17 -0
  26. rimpack-0.1.0/rimpack/core/modpack/activation_toml.py +217 -0
  27. rimpack-0.1.0/rimpack/core/modpack/list_file.py +233 -0
  28. rimpack-0.1.0/rimpack/core/modpack/modpack.py +1449 -0
  29. rimpack-0.1.0/rimpack/core/modpack/ordering_toml.py +212 -0
  30. rimpack-0.1.0/rimpack/core/modpack/pack_toml.py +836 -0
  31. rimpack-0.1.0/rimpack/core/mods/__init__.py +41 -0
  32. rimpack-0.1.0/rimpack/core/mods/about_xml.py +383 -0
  33. rimpack-0.1.0/rimpack/core/mods/load_folders.py +209 -0
  34. rimpack-0.1.0/rimpack/core/mods/mod_folder.py +48 -0
  35. rimpack-0.1.0/rimpack/launching.py +493 -0
  36. rimpack-0.1.0/rimpack/steam_installation.py +142 -0
  37. rimpack-0.1.0/rimpack/steamworks.py +385 -0
  38. rimpack-0.1.0/rimpack/ui/__init__.py +1 -0
  39. rimpack-0.1.0/specs/README.md +114 -0
  40. rimpack-0.1.0/specs/activation_toml_spec.md +427 -0
  41. rimpack-0.1.0/specs/modpack_folder_layout_spec.md +479 -0
  42. rimpack-0.1.0/specs/ordering_toml_spec.md +353 -0
  43. rimpack-0.1.0/specs/pack_toml_spec.md +548 -0
  44. rimpack-0.1.0/specs/rimworld_modpack_list_format_spec.md +449 -0
  45. rimpack-0.1.0/specs/tool_config_spec.md +122 -0
  46. rimpack-0.1.0/tests/__init__.py +1 -0
  47. rimpack-0.1.0/tests/_helpers.py +29 -0
  48. rimpack-0.1.0/tests/test_about_xml.py +446 -0
  49. rimpack-0.1.0/tests/test_activation_toml.py +152 -0
  50. rimpack-0.1.0/tests/test_cli_main.py +1614 -0
  51. rimpack-0.1.0/tests/test_launching.py +593 -0
  52. rimpack-0.1.0/tests/test_load_folders_xml.py +207 -0
  53. rimpack-0.1.0/tests/test_mod_folder.py +107 -0
  54. rimpack-0.1.0/tests/test_modpack.py +653 -0
  55. rimpack-0.1.0/tests/test_modpack_list_file.py +268 -0
  56. rimpack-0.1.0/tests/test_ordering_toml.py +202 -0
  57. rimpack-0.1.0/tests/test_pack_toml.py +399 -0
  58. rimpack-0.1.0/tests/test_steamworks.py +399 -0
  59. 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
@@ -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
@@ -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
+ ```