factorio-mod-workshop 0.1.0__py3-none-any.whl
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.
- factorio_mod_workshop-0.1.0.dist-info/METADATA +189 -0
- factorio_mod_workshop-0.1.0.dist-info/RECORD +20 -0
- factorio_mod_workshop-0.1.0.dist-info/WHEEL +4 -0
- factorio_mod_workshop-0.1.0.dist-info/entry_points.txt +2 -0
- factorio_mod_workshop-0.1.0.dist-info/licenses/LICENSE +617 -0
- fmw/__init__.py +3 -0
- fmw/cli.py +1431 -0
- fmw/config.py +187 -0
- fmw/discover.py +193 -0
- fmw/help.py +387 -0
- fmw/portal.py +336 -0
- fmw/store.py +141 -0
- fmw/templates/workspace/.gitignore +5 -0
- fmw/templates/workspace/README.md +31 -0
- fmw/templates/workspace/config.example.yaml +11 -0
- fmw/templates/workspace/config.yaml +11 -0
- fmw/templates/workspace/mods.yaml +6 -0
- fmw/templates/workspace/tracker/README.md +40 -0
- fmw/threadstate.py +150 -0
- fmw/tracker.py +223 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: factorio-mod-workshop
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A workshop for maintaining Factorio mods: portal discussions, triage, tickets and release follow-up
|
|
5
|
+
Project-URL: Homepage, https://github.com/AivanF/factorio-mod-workshop
|
|
6
|
+
Project-URL: Repository, https://github.com/AivanF/factorio-mod-workshop
|
|
7
|
+
Project-URL: Issues, https://github.com/AivanF/factorio-mod-workshop/issues
|
|
8
|
+
Author: AivanF
|
|
9
|
+
License-Expression: AGPL-3.0-or-later
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: cli,factorio,issue-tracker,maintenance,mod-portal,modding
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Games/Entertainment
|
|
22
|
+
Classifier: Topic :: Software Development :: Bug Tracking
|
|
23
|
+
Classifier: Topic :: Utilities
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Requires-Dist: beautifulsoup4>=4.12
|
|
26
|
+
Requires-Dist: httpx>=0.27
|
|
27
|
+
Requires-Dist: pyyaml>=6.0
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
# Factorio Mod Workshop
|
|
33
|
+
|
|
34
|
+
**A maintainer's workbench for Factorio mods.** Keeps track of everything you owe your mods — bugs to fix, features you meant to build, questions to answer — across every mod you own, from one place.
|
|
35
|
+
|
|
36
|
+
Built for maintainers with more mods than time, and for the AI agents helping them.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
$ fmw inbox
|
|
40
|
+
== You owe a reply (1) ==
|
|
41
|
+
TR [bug ] 2026-08-31 0r Incompatibility with my favorite mod
|
|
42
|
+
6a93b26dead0beef42cd3c3b WH40k-Titans
|
|
43
|
+
fix shipped, reporter not told - released: 3d33eb
|
|
44
|
+
|
|
45
|
+
== Awaiting your testing (2) - run `fmw testplan` ==
|
|
46
|
+
c341fd WH40k-Titans: Error loading mods after update
|
|
47
|
+
|
|
48
|
+
== Threads awaiting triage (123, 28 hidden as resolved on the portal) ==
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 1. What it holds
|
|
52
|
+
|
|
53
|
+
**Tickets** are the centre: a bug to fix, a feature to build, an idea worth keeping. They stand on their own — many begin as a thought of yours or a message on Discord, and never touch the mod portal at all.
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
fmw track new Lightning "Configurable strike frequency" --kind feature
|
|
57
|
+
fmw track new WH40k-Titans "Pathfinding stalls on cliffs" --source discord:<url>
|
|
58
|
+
fmw track new 6a963b26... # or from a portal thread, title filled in
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
A ticket carries its analysis, the fix, and a test plan for when you next launch the game. One ticket can cover several mods, because large mods share code.
|
|
62
|
+
|
|
63
|
+
**Discussions** are one input among several — but the noisiest, and the only one with no tooling of its own.
|
|
64
|
+
|
|
65
|
+
## 2. Why the portal needs help
|
|
66
|
+
|
|
67
|
+
The mod portal has no API for discussions, no notion of a thread being handled, and no quick way to tell that four reports describe one bug. So a popular mod accumulates a hundred conversations you can neither search nor close, and every visit starts from scratch.
|
|
68
|
+
|
|
69
|
+
`fmw` gives that a memory.
|
|
70
|
+
|
|
71
|
+
- **Nothing gets lost.** Every discussion is mirrored locally with exact timestamps, so each sync reports precisely what is new. Repeat runs print nothing when nothing happened.
|
|
72
|
+
- **Duplicates become one thing.** `fmw search` finds every thread describing a problem; one ticket cites them all — across mods, since large mods share code.
|
|
73
|
+
- **Most threads never need a ticket.** A question you answered, a duplicate, a mistaken report: record the judgement and it leaves your inbox. Tickets stay for code changes.
|
|
74
|
+
- **Shipping closes the loop.** Mark a fix released and every thread that reported it comes back, once, asking you to tell the reporter.
|
|
75
|
+
- **Agents stop where they must.** An AI can triage, group and write fixes — it cannot launch Factorio. Fixes park in `needs-testing` and `fmw testplan` batches them into a single play session.
|
|
76
|
+
- **Your data is yours.** Plain YAML and Markdown in a directory you choose, outside this repo, ready to be its own git repository.
|
|
77
|
+
|
|
78
|
+
## 3. Install
|
|
79
|
+
### 3.1. As a User
|
|
80
|
+
|
|
81
|
+
Install `uv` if you don't have it yet:
|
|
82
|
+
|
|
83
|
+
| OS | |
|
|
84
|
+
| --- | --- |
|
|
85
|
+
| MacOS & Linux | `curl -LsSf https://astral.sh/uv/install.sh \| sh` |
|
|
86
|
+
| Windows | `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 \| iex"` |
|
|
87
|
+
|
|
88
|
+
Install `fmw` using `uv`:
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
uv tool install git+https://github.com/AivanF/factorio-mod-workshop
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Create your workspace repository:
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
fmw init ~/factorio-workspace
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Optional but recommended: specify the workspace location globally once, by setting `FMW_WORKSPACE` in your shell profile:
|
|
101
|
+
|
|
102
|
+
| Shell | |
|
|
103
|
+
| --- | --- |
|
|
104
|
+
| bash | `echo 'export FMW_WORKSPACE=~/factorio-workspace' >> ~/.bashrc` |
|
|
105
|
+
| zsh | `echo 'export FMW_WORKSPACE=~/factorio-workspace' >> ~/.zshrc` |
|
|
106
|
+
| fish | `set -Ux FMW_WORKSPACE ~/factorio-workspace` |
|
|
107
|
+
| PowerShell | `setx FMW_WORKSPACE "$HOME\factorio-workspace"` |
|
|
108
|
+
|
|
109
|
+
Or skip it and pass `FMW_WORKSPACE` env var or `--workspace <path>` arg to any command.
|
|
110
|
+
|
|
111
|
+
Then point it at your mods and pull everything in:
|
|
112
|
+
|
|
113
|
+
Finally, point it at your mods:
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
fmw repo add ~/code/my-factorio-mods # a monorepo, or one repo per mod
|
|
117
|
+
fmw discover # find them, read their portal metadata
|
|
118
|
+
fmw sync --all # fetch every discussion
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 3.2. Working on FMW itself
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
git clone https://github.com/AivanF/factorio-mod-workshop && cd factorio-mod-workshop
|
|
125
|
+
uv venv && uv pip install -e .
|
|
126
|
+
./.venv/bin/fmw init ~/factorio-workspace
|
|
127
|
+
./.venv/bin/fmw launcher --workspace ~/factorio-workspace
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`fmw launcher` installs a small wrapper on your PATH that pins a workspace, so `fmw` works from any directory without setting anything — a POSIX `sh` script on Linux and macOS, a `.cmd` on Windows. Edits to the source take effect immediately.
|
|
131
|
+
|
|
132
|
+
Requires Python 3.10+. Developed on macOS and used on Linux; the Windows paths are implemented but untested — reports welcome.
|
|
133
|
+
|
|
134
|
+
## 4. Daily loop
|
|
135
|
+
|
|
136
|
+
```sh
|
|
137
|
+
fmw inbox # what needs a decision
|
|
138
|
+
fmw track new <mod> "..." # capture a bug, a feature, an idea
|
|
139
|
+
fmw sync # pull in what users posted
|
|
140
|
+
fmw thread <id> # read one discussion
|
|
141
|
+
fmw mark <id> ... # settle a conversation without a ticket
|
|
142
|
+
fmw testplan # batch pending fixes into one play session
|
|
143
|
+
fmw status # show workspace path & FMW statistics
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Run it from inside a mod repository and it scopes itself to that mod, saying which one it picked.
|
|
147
|
+
|
|
148
|
+
## 5. Help
|
|
149
|
+
|
|
150
|
+
Every command carries its own prose — no need for this page or a checkout:
|
|
151
|
+
|
|
152
|
+
```sh
|
|
153
|
+
fmw help # overview and the daily loop
|
|
154
|
+
fmw sync --help # what a command is for, and its gotchas
|
|
155
|
+
fmw help --all # everything at once, for agents
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Every command also takes `--json`.
|
|
159
|
+
|
|
160
|
+
## 6. Design
|
|
161
|
+
|
|
162
|
+
Three layers, deliberately separate:
|
|
163
|
+
|
|
164
|
+
| | |
|
|
165
|
+
| --- | --- |
|
|
166
|
+
| `cache/` | what users actually said — disposable, refetched in minutes |
|
|
167
|
+
| `threads/<mod>.yaml` | what you decided about a conversation |
|
|
168
|
+
| `tracker/<mod>/*.md` | the work itself — tickets, whatever their origin |
|
|
169
|
+
|
|
170
|
+
A network sync writes only to the first, so it can never overwrite a judgement. `fmw` never writes to the mod portal: there is no write API, and replying is the maintainer's job.
|
|
171
|
+
|
|
172
|
+
## 7. Documentation
|
|
173
|
+
|
|
174
|
+
**Using `fmw`** — everything ships with the package, so it works from a `uv tool install` with no checkout:
|
|
175
|
+
|
|
176
|
+
```sh
|
|
177
|
+
fmw help workspace # file formats and every field value
|
|
178
|
+
fmw help workflow # the loop, and the mistakes it prevents
|
|
179
|
+
fmw help --all # the lot, in one call
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**Working on `fmw`:**
|
|
183
|
+
|
|
184
|
+
- [docs/portal-notes.md](docs/portal-notes.md) — how the mod portal behaves, including its traps
|
|
185
|
+
- [CLAUDE.md](CLAUDE.md) — conventions for coding agents changing this repo
|
|
186
|
+
|
|
187
|
+
## 8. License
|
|
188
|
+
|
|
189
|
+
AGPLv3
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
fmw/__init__.py,sha256=Izkjev-yIJdaqgDsV0Dd-on67WqPRBeLg-exO4Pwec4,66
|
|
2
|
+
fmw/cli.py,sha256=eo31sOe4CC9bbAcoYLbs8pS0C6mQQmTNkBKOS2OZwLo,58777
|
|
3
|
+
fmw/config.py,sha256=uiNoW37Lo920HzTC85fJNf1nzVuyea22lIw5Get0CQ0,6580
|
|
4
|
+
fmw/discover.py,sha256=BkeNGhtSb_jnf9WIKMYuGUOIAsfe_v4Asa6n5QWWd6w,7400
|
|
5
|
+
fmw/help.py,sha256=JGDNnPQlQ5dx4mrPBHz81zFn5XbbfnFdt6Nv2Rp6el4,17886
|
|
6
|
+
fmw/portal.py,sha256=izghuFB8Tb511AWst_-HhhqQanda-q9n4IbB7cuYgIk,12225
|
|
7
|
+
fmw/store.py,sha256=dJi4tC6csAjIGVe_JbxbPbJeNtufNihFL_h-04cJRmY,4713
|
|
8
|
+
fmw/threadstate.py,sha256=klPFTKf2_f2rrfcsZ9LklJ7mvLpzDPg5p0obKgpAcsc,5300
|
|
9
|
+
fmw/tracker.py,sha256=qawhqoCPTp-PcmP19AbI5TZAZCUMCPUVSi3RgOUdKPE,6269
|
|
10
|
+
fmw/templates/workspace/.gitignore,sha256=ucA6BW_qiaxhp13d1BBZz3-H6WT4Lk6sPLU3A759lGM,251
|
|
11
|
+
fmw/templates/workspace/README.md,sha256=Ga_vaObtbMCAUJsZSia6gSSCc1oAoxFSguLyvmQFasY,1516
|
|
12
|
+
fmw/templates/workspace/config.example.yaml,sha256=5yABF75IPfrtSjvW_RhZ5FUChqWpaCjXwyxlxVuF7ug,332
|
|
13
|
+
fmw/templates/workspace/config.yaml,sha256=IMz4LSB6mhxhSjJ03fjs8mqjFMHpJdz3E5T2JK54mB4,338
|
|
14
|
+
fmw/templates/workspace/mods.yaml,sha256=N6RUcL42bAZ5oXm5SKjVADQ0ogmBvjeDd3nTSGoA02A,331
|
|
15
|
+
fmw/templates/workspace/tracker/README.md,sha256=ueavRdQilmAHa4CZBGedpywQmZz5aSFgglXJ6nF6HJw,1918
|
|
16
|
+
factorio_mod_workshop-0.1.0.dist-info/METADATA,sha256=TLxJvpoWJRQJHXpgOxhjFLCoNt2ku-4Kn9-ff5rkWaY,7890
|
|
17
|
+
factorio_mod_workshop-0.1.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
18
|
+
factorio_mod_workshop-0.1.0.dist-info/entry_points.txt,sha256=HkwoRaKqbIKhthrDUxxlni94E4g_oIOaFYQZIQ1TZMY,37
|
|
19
|
+
factorio_mod_workshop-0.1.0.dist-info/licenses/LICENSE,sha256=WEObbd_91P7zZzIuK4KP2Eok6ntOFIKsvQhryhtPf8o,31864
|
|
20
|
+
factorio_mod_workshop-0.1.0.dist-info/RECORD,,
|