Skip to content

Commit 3c0302b

Browse files
authored
Add files via upload
more updates
1 parent c9e2a05 commit 3c0302b

12 files changed

Lines changed: 1897 additions & 190 deletions

File tree

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2026 Honor Bound Innovation, LLC
3+
Copyright (c) 2024 ModSanity Contributors
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

Questions.md

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
ModSanity Comment-Derived Roadmap (Verification-First)
2+
How Codex should respond (required format)
3+
4+
For every bullet below, Codex should output:
5+
6+
Status: Implemented | Partial | Not Implemented
7+
8+
Evidence: file paths + symbols (functions/structs/modules/commands)
9+
10+
How to reproduce: exact CLI command(s)
11+
12+
Gaps: what still fails / missing UX / missing docs / missing edge case
13+
14+
Tests: test name(s) or “none”
15+
16+
Phase 0 — Baseline Inventory & Truth Pass
17+
18+
Goal: establish what exists before implementing anything.
19+
20+
0.1 CLI Capability Map
21+
22+
Q: Is there a single command that prints all supported operations and their flags (e.g., modsanity --help plus subcommand help)?
23+
24+
Q: Is there a modsanity doctor or modsanity diagnose command that audits system state (Steam/GOG detection, game paths, tool runtimes, permissions, proton availability)?
25+
26+
Q: Is there a “first run” state persisted anywhere (config + initialization marker)?
27+
28+
0.2 Config Surface Area
29+
30+
Q: Is there a single .toml (or config) source-of-truth with documented keys?
31+
32+
Q: Are config keys validated, with defaults, and clear error messages on invalid paths?
33+
34+
Deliverable: docs/verification/phase0_inventory.md containing:
35+
36+
command list
37+
38+
config keys
39+
40+
folder layout
41+
42+
tool detection logic list
43+
44+
Phase 1 — Installation & Onboarding (Linux Newbie Friction)
45+
46+
Driven by: “ran install.sh, don’t know what to do next”, scan not working.
47+
48+
1.1 Guided First-Run
49+
50+
Q: Does modsanity init exist?
51+
52+
Q: Does it guide the user through:
53+
54+
selecting game source (Steam, GOG, Manual)
55+
56+
detecting game install path
57+
58+
confirming writable mod staging paths
59+
60+
saving config
61+
62+
Q: Does it print “next commands to run” at the end?
63+
64+
1.2 Game Scan Reliability
65+
66+
Q: Does modsanity scan exist and succeed without requiring the user to memorize bash lines?
67+
68+
Q: If scan fails, does it provide actionable next steps (paths searched, permissions, expected directories)?
69+
70+
1.3 Documentation for Day-1 Users
71+
72+
Q: Is there a minimal quickstart that matches current CLI exactly?
73+
74+
Q: Are install + first run instructions validated against the actual code paths?
75+
76+
Deliverable: docs/quickstart.md + a smoke test script (optional).
77+
78+
Phase 2 — Path Flexibility & Non-Data Installs (SKSE-class)
79+
80+
Driven by: move mods folder from ~/.local, and mods that install outside Data/.
81+
82+
2.1 Mods Folder Relocation
83+
84+
Q: Is the mods folder location configurable via .toml (e.g., mods_dir)?
85+
86+
Q: Is there a CLI override flag (e.g., --mods-dir)?
87+
88+
Q: Does the tool migrate/handle existing content safely if the path changes?
89+
90+
2.2 Non-Data Deployment Classes
91+
92+
Q: Is there a concept of “install target” (Data dir vs game root vs other)?
93+
94+
Q: Are SKSE-like mods supported as first-class installs (not “manual required”)?
95+
96+
Q: Are there rules/manifest logic to place files correctly?
97+
98+
Deliverable: Install target model documented (even if minimal):
99+
100+
data/
101+
102+
game root
103+
104+
specific subpaths (SKSE plugins, ENB, etc.)
105+
106+
Phase 3 — Toolchain Support (The Big One)
107+
108+
Driven by repeated asks: xEdit, Bodyslide, Synthesis, Nemesis/Pandora, Skypatcher.
109+
110+
3A — Tool Runner Architecture (Foundation)
111+
112+
Q: Is there a unified tool runner subsystem (registry + launcher)?
113+
114+
Q: Can tools be defined declaratively (config) + invoked consistently (CLI)?
115+
116+
Q: Is runtime selection supported (Native vs Proton/Wine)?
117+
118+
Q: Are environment variables + working directory + load order context injected?
119+
120+
3B — Specific Tool Integrations
121+
122+
Each tool below must answer: “can I run it from ModSanity and it sees the correct mod environment?”
123+
124+
xEdit / SSEEdit
125+
126+
Q: Does modsanity tools run xedit exist (or equivalent)?
127+
128+
Q: Does it work under Proton/Wine with required runtimes present?
129+
130+
Q: Are xEdit arguments configurable?
131+
132+
Bodyslide
133+
134+
Q: Is Bodyslide supported with correct output paths?
135+
136+
Q: Does it respect profiles / mod staging?
137+
138+
Synthesis
139+
140+
Q: Is Synthesis supported either natively (dotnet) or via Proton?
141+
142+
Q: Are the “root cert / dotnet restore” proton issues handled via helper script or doctor flow?
143+
144+
Q: Does ModSanity provide the “mods installed environment” Synthesis expects?
145+
146+
Nemesis / Pandora / animation tools
147+
148+
Q: Is there an integration path to run these tools with correct mod list + outputs?
149+
150+
Q: Are outputs placed correctly and tracked?
151+
152+
Skypatcher / patchers
153+
154+
Q: Is there a general “patcher” framework, or is each patcher bespoke?
155+
156+
Q: Are patch outputs tracked and reversible?
157+
158+
Deliverables:
159+
160+
modsanity tools list
161+
162+
modsanity tools run <tool>
163+
164+
modsanity doctor checks: proton prefix, dotnet, wine deps, certificates
165+
166+
Phase 4 — MO2 Interoperability & Migration
167+
168+
Driven by: import load order, handling VFS, migration blockers.
169+
170+
4.1 Import Load Order / Profile
171+
172+
Q: Can ModSanity import:
173+
174+
mod list (enabled/disabled)
175+
176+
plugin load order
177+
178+
profile-specific settings
179+
180+
Q: Does it support a read-only “preview import” mode?
181+
182+
4.2 VFS Explanation & Bridging
183+
184+
Q: Does ModSanity clearly define its model vs MO2 VFS?
185+
186+
Q: Is there any bridging mode to reduce migration pain (even if limited)?
187+
188+
Q: Are there docs that specifically answer: “How do you handle VFS?”
189+
190+
Deliverable:
191+
192+
docs/migration/mo2.md including “what transfers” and “what doesn’t”.
193+
194+
Phase 5 — Platform Coverage: GOG & Non-Steam
195+
196+
Driven by multiple users asking about GOG.
197+
198+
5.1 GOG Detection & Pathing
199+
200+
Q: Is GOG explicitly supported (not just “might work”)?
201+
202+
Q: Can the user select platform in config and have consistent folder/compatdata handling?
203+
204+
5.2 Manual Install Support (Fallback)
205+
206+
Q: Can a user provide a game path and have everything work without Steam metadata?
207+
208+
Deliverable:
209+
210+
modsanity init supports Steam/GOG/Manual
211+
212+
modsanity doctor reports platform status
213+
214+
Phase 6 — Packaging & Distribution (Arch / AUR)
215+
216+
Driven by repeated Arch+AUR asks.
217+
218+
6.1 AUR Packaging Readiness
219+
220+
Q: Is there an AUR-ready PKGBUILD (or release artifacts) maintained?
221+
222+
Q: Are versioning and releases consistent and reproducible?
223+
224+
Deliverable:
225+
226+
/packaging/arch/PKGBUILD (or community docs)
227+
228+
Phase 7 — UX Accessibility without Abandoning TUI
229+
230+
Driven by “terminal is a big no”, migraine/contrast concerns, while others love TUI.
231+
232+
7.1 Theme / Color Handling
233+
234+
Q: Are colors strictly terminal-driven (no hardcoding), and documented?
235+
236+
Q: Is there an optional “minimal color” mode?
237+
238+
7.2 Windows Refugee Mitigation (Without GUI)
239+
240+
Q: Does the tool provide discoverability:
241+
242+
modsanity help getting-started
243+
244+
“suggested next command” hints
245+
246+
Q: Are error messages “human first”?
247+
248+
Deliverable:
249+
250+
docs/ui/accessibility.md
251+
252+
Phase 8 — Scale Confidence: Huge Mod Lists
253+
254+
Driven by fear of testing on main list, “huge and confuse”.
255+
256+
8.1 Dry-Run / Audit Mode
257+
258+
Q: Is there a no-write analysis mode (dry-run)?
259+
260+
Q: Does it summarize:
261+
262+
number of mods/plugins found
263+
264+
missing masters / dependency issues
265+
266+
conflicts detected (even basic)
267+
268+
8.2 Safe Experiment Support
269+
270+
Q: Is there support for “profiles” (separate mod lists under one profile)?
271+
272+
(You already mentioned this is being worked on / needed.)
273+
274+
Deliverable:
275+
276+
modsanity audit --dry-run
277+
278+
profile/list isolation validation
279+
280+
Output Format for Codex 5.3 (paste this directly)
281+
282+
Use this exact structure so you can diff results between versions:
283+
284+
PHASE X.Y — <Title>
285+
Item: <exact question>
286+
Status: Implemented | Partial | Not Implemented
287+
Evidence:
288+
- <file_path>:<line or symbol>
289+
- <module::type::function>
290+
Reproduce:
291+
- <command>
292+
Notes:
293+
- <what works>
294+
- <what fails>
295+
Gaps:
296+
- <missing behavior>
297+
Tests:
298+
- <test name(s)> | none
299+
300+
Minimal “What to check first” order (fastest truth pass)
301+
302+
Phase 0 (inventory)
303+
304+
Phase 2 (paths + SKSE class)
305+
306+
Phase 3 (tool runner foundation)
307+
308+
Phase 4 (MO2 import + VFS answer)
309+
310+
Phase 5 (GOG)

src/app/actions.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ impl App {
175175
};
176176

177177
println!("Installing mod from: {}", path);
178-
match self.mods.install_from_archive(&game.id, path, None, None, None).await? {
178+
match self.mods.install_from_archive(&game.id, path, None, None, None, None).await? {
179179
crate::mods::InstallResult::Completed(installed) => {
180180
println!("Installed: {} (v{})", installed.name, installed.version);
181181
println!("Run 'modsanity deploy' to apply changes.");
@@ -1433,7 +1433,13 @@ impl App {
14331433

14341434
match format {
14351435
"native" | "json" => {
1436-
let mods = self.mods.list_mods(&game.id).await?;
1436+
let mods: Vec<_> = self
1437+
.mods
1438+
.list_mods(&game.id)
1439+
.await?
1440+
.into_iter()
1441+
.filter(|m| m.enabled)
1442+
.collect();
14371443

14381444
// Get category names for installed mods
14391445
let categories = self.db.get_all_categories()?;
@@ -1522,7 +1528,13 @@ impl App {
15221528
std::fs::write(out_path, lines.join("\n"))
15231529
.context("Failed to write MO2 modlist file")?;
15241530

1525-
let mods = self.mods.list_mods(&game.id).await?;
1531+
let mods: Vec<_> = self
1532+
.mods
1533+
.list_mods(&game.id)
1534+
.await?
1535+
.into_iter()
1536+
.filter(|m| m.enabled)
1537+
.collect();
15261538
let db_entries: Vec<crate::db::ModlistEntryRecord> = mods
15271539
.iter()
15281540
.enumerate()

src/app/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
mod actions;
44
pub mod state;
55

6-
pub use state::{AppState, ConfirmAction, ConfirmDialog, InputMode, Screen};
6+
pub use state::{AppState, ConfirmAction, ConfirmDialog, InputMode, Screen, UiMode};
77

88
use crate::config::{Config, DeploymentMethod, ExternalTool, ToolRuntimeMode};
99
use crate::db::Database;

0 commit comments

Comments
 (0)