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.
@@ -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
+ ![FMW logo](https://raw.githubusercontent.com/AivanF/factorio-mod-workshop/main/docs/logo/FMW-blueprint.jpg)
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,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ fmw = fmw.cli:main