max / makenotwork
14 files changed,
+54 insertions,
-54 deletions
| @@ -60,7 +60,7 @@ v0.3.2. Audit grade A. 225 tests. | |||
| 60 | 60 | | Routes | `src/routes/` (mod.rs, helpers.rs, forum/{mod,views,thread,posts,actions}.rs, moderation.rs, settings.rs, admin.rs, flagging.rs, tracking.rs, search.rs, uploads.rs) | | |
| 61 | 61 | | Auth (OAuth) | `src/auth.rs` | | |
| 62 | 62 | | CSRF | `src/csrf.rs` | | |
| 63 | - | | Markdown | `docengine` crate (`Shared/docengine/`) — features: mentions, quotes | | |
| 63 | + | | Markdown | `docengine` crate (`shared/docengine/`) — features: mentions, quotes | | |
| 64 | 64 | | Config | `src/config.rs` | | |
| 65 | 65 | | Seed data | `src/seed.rs` | | |
| 66 | 66 | | Entry point | `src/main.rs` | |
| @@ -25,7 +25,7 @@ Single binary, single process. Migrations auto-run on boot. Background tasks (he | |||
| 25 | 25 | ## Code Structure | |
| 26 | 26 | ||
| 27 | 27 | ``` | |
| 28 | - | MNW/src/ | |
| 28 | + | MNW/server/src/ | |
| 29 | 29 | main.rs Entry point (tracing, pool, session store, app state, graceful shutdown) | |
| 30 | 30 | lib.rs Library root (AppState, build_app, route composition) | |
| 31 | 31 | config.rs Configuration from environment variables | |
| @@ -188,11 +188,11 @@ Developer sync infrastructure hosted on MNW. JWT-authenticated API for client ap | |||
| 188 | 188 | ||
| 189 | 189 | ### DocEngine | |
| 190 | 190 | ||
| 191 | - | Extracted crate (`Shared/docengine/`) for documentation rendering. Loads markdown files from disk at startup, renders to HTML with section hierarchy, navigation, and search index. Serves `/docs/*` routes. | |
| 191 | + | Extracted crate (`shared/docengine/`) for documentation rendering. Loads markdown files from disk at startup, renders to HTML with section hierarchy, navigation, and search index. Serves `/docs/*` routes. | |
| 192 | 192 | ||
| 193 | 193 | ### TagTree | |
| 194 | 194 | ||
| 195 | - | Shared tag standard (`Shared/tagtree/`). Hierarchical tags with path column (migration 038). Per-app config: MNW allows 5 levels, 100 max tags. Used for content discovery and filtering. | |
| 195 | + | Shared tag standard (`shared/tagtree/`). Hierarchical tags with path column (migration 038). Per-app config: MNW allows 5 levels, 100 max tags. Used for content discovery and filtering. | |
| 196 | 196 | ||
| 197 | 197 | ### File Scanning | |
| 198 | 198 |
| @@ -6,14 +6,14 @@ Run after major features, monthly during active development, or when concerned a | |||
| 6 | 6 | ||
| 7 | 7 | | Harness ID | Project | Path | Stack | | |
| 8 | 8 | |------------|---------|------|-------| | |
| 9 | - | | `mnw` | MakeNotWork | MNW/ | Rust/Axum/PostgreSQL, Askama, HTMX | | |
| 10 | - | | `synckit` | SyncKit Client SDK | Shared/synckit-client/ | Rust, reqwest, ChaCha20-Poly1305, Argon2, keychain | | |
| 11 | - | | `pom` | PoM | pom/ | Rust/Axum/SQLite, MCP (rmcp), reqwest | | |
| 9 | + | | `mnw` | MakeNotWork | MNW/server/ | Rust/Axum/PostgreSQL, Askama, HTMX | | |
| 10 | + | | `synckit` | SyncKit Client SDK | MNW/shared/synckit-client/ | Rust, reqwest, ChaCha20-Poly1305, Argon2, keychain | | |
| 11 | + | | `pom` | PoM | MNW/pom/ | Rust/Axum/SQLite, MCP (rmcp), reqwest | | |
| 12 | 12 | | `af` | audiofiles | Apps/audiofiles/ | Rust, eframe, egui, cpal, rusqlite | | |
| 13 | 13 | | `bb` | Balanced Breakfast | Apps/balanced_breakfast/ | Rust/Tauri 2, SQLite, Rhai plugins, vanilla JS | | |
| 14 | 14 | | `go` | GoingsOn | Apps/goingson/ | Rust/Tauri 2, SQLite, vanilla JS, IMAP/SMTP | | |
| 15 | - | | `mt` | Multithreaded | multithreaded/ | Rust/Axum/PostgreSQL, Askama, HTMX, MNW OAuth | | |
| 16 | - | | `tagtree` | TagTree | Shared/tagtree/ | Rust library crate, no_std compatible, serde, criterion benchmarks | | |
| 15 | + | | `mt` | Multithreaded | MNW/multithreaded/ | Rust/Axum/PostgreSQL, Askama, HTMX, MNW OAuth | | |
| 16 | + | | `tagtree` | TagTree | MNW/shared/tagtree/ | Rust library crate, no_std compatible, serde, criterion benchmarks | | |
| 17 | 17 | ||
| 18 | 18 | --- | |
| 19 | 19 |
| @@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | 6 | ## Overall Grade: A | |
| 7 | 7 | ||
| 8 | - | Run 13 cross-project audit. ~1,186 tests (632 unit + ~551 integration + 17 admin + 28 health). 0 clippy warnings. v0.3.19. Grade stable at A. Major additions since Run 12: video upload/playback (migration 053), content fingerprinting (051), bundled license text (052), maintainability splits (validation/, git/, payments/ directory modules), S3 storage extraction to shared crate (`Shared/s3-storage/`). Dead code/duplication audit: ~40 lines removed. Run 12 test failures (delete_item_returns_toast, item_wizard_license_keys) resolved. | |
| 8 | + | Run 13 cross-project audit. ~1,186 tests (632 unit + ~551 integration + 17 admin + 28 health). 0 clippy warnings. v0.3.19. Grade stable at A. Major additions since Run 12: video upload/playback (migration 053), content fingerprinting (051), bundled license text (052), maintainability splits (validation/, git/, payments/ directory modules), S3 storage extraction to shared crate (`shared/s3-storage/`). Dead code/duplication audit: ~40 lines removed. Run 12 test failures (delete_item_returns_toast, item_wizard_license_keys) resolved. | |
| 9 | 9 | ||
| 10 | 10 | ## Scorecard | |
| 11 | 11 | ||
| @@ -299,7 +299,7 @@ Filed in `docs/mnw/todo.md`. | |||
| 299 | 299 | 33. **[LOW]** bincode unmaintained (RUSTSEC-2025-0141) — upstream via syntect/yara-x, warning only | |
| 300 | 300 | ||
| 301 | 301 | ### Run 13 (2026-04-06) — Maintenance | |
| 302 | - | No new action items. Dead code/duplication audit: ~40 lines removed across MNW+GO. Maintainability splits completed (validation/, git/, payments/). S3 storage extraction to `Shared/s3-storage/` shared crate (MNW + MT). | |
| 302 | + | No new action items. Dead code/duplication audit: ~40 lines removed across MNW+GO. Maintainability splits completed (validation/, git/, payments/). S3 storage extraction to `shared/s3-storage/` shared crate (MNW + MT). | |
| 303 | 303 | ||
| 304 | 304 | ### New (twenty-fifth audit) | |
| 305 | 305 | 25. ~~Split email.rs into submodules~~ -- Done (email/mod.rs + email/tokens.rs, ~800 + ~500 LOC) |
| @@ -610,8 +610,8 @@ Per-user staging dirs at `/var/lib/mnw-cli/staging/{user_id}/`. Cleaned up: | |||
| 610 | 610 | ||
| 611 | 611 | - Design doc: `docs/mnw/server/cli.md` (this file) | |
| 612 | 612 | - Project code: `mnw-cli/` | |
| 613 | - | - MNW API routes: `MNW/src/routes/api/` | |
| 614 | - | - MNW SSH key storage: `MNW/src/db/` (user_ssh_keys queries) | |
| 615 | - | - MNW internal auth: `MNW/src/routes/api/internal.rs` (to be created) | |
| 613 | + | - MNW API routes: `MNW/server/src/routes/api/` | |
| 614 | + | - MNW SSH key storage: `MNW/server/src/db/` (user_ssh_keys queries) | |
| 615 | + | - MNW internal auth: `MNW/server/src/routes/api/internal.rs` (to be created) | |
| 616 | 616 | - Staging directory: `/var/lib/mnw-cli/staging/` (on server) | |
| 617 | 617 | - Host key: `/etc/mnw-cli/host_ed25519` (on server) |
| @@ -578,16 +578,16 @@ Reply emails from users include `In-Reply-To` referencing the post they replied | |||
| 578 | 578 | ||
| 579 | 579 | ``` | |
| 580 | 580 | # MNW — existing (modify) | |
| 581 | - | MNW/src/scheduler.rs | |
| 582 | - | MNW/src/email/mod.rs | |
| 583 | - | MNW/src/routes/postmark.rs | |
| 584 | - | MNW/src/db/ | |
| 581 | + | MNW/server/src/scheduler.rs | |
| 582 | + | MNW/server/src/email/mod.rs | |
| 583 | + | MNW/server/src/routes/postmark.rs | |
| 584 | + | MNW/server/src/db/ | |
| 585 | 585 | ||
| 586 | 586 | # MNW — new | |
| 587 | - | MNW/src/db/mailing_lists.rs | |
| 588 | - | MNW/migrations/035_community_provisioning.sql | |
| 589 | - | MNW/migrations/036_thread_linking.sql | |
| 590 | - | MNW/migrations/039_mailing_lists.sql | |
| 587 | + | MNW/server/src/db/mailing_lists.rs | |
| 588 | + | MNW/server/migrations/035_community_provisioning.sql | |
| 589 | + | MNW/server/migrations/036_thread_linking.sql | |
| 590 | + | MNW/server/migrations/039_mailing_lists.sql | |
| 591 | 591 | ||
| 592 | 592 | # MT — existing (modify) | |
| 593 | 593 | multithreaded/crates/mt-db/src/mutations.rs |
| @@ -296,22 +296,22 @@ v0.3.23. Audit grade A. ~1,233 tests. | |||
| 296 | 296 | ||
| 297 | 297 | ## Key Paths | |
| 298 | 298 | ``` | |
| 299 | - | MNW/src/ | |
| 299 | + | MNW/server/src/ | |
| 300 | 300 | lib.rs, main.rs, config.rs, error.rs, auth.rs, db/ | |
| 301 | 301 | storage.rs, payments/, templates/, routes/ | |
| 302 | 302 | git/, git_issues/, synckit_auth.rs, build_runner.rs, validation/ | |
| 303 | 303 | fingerprint/ (registry, visible stamps, watermarks, streaming) | |
| 304 | 304 | import/ (CSV converter, pipeline, intermediate format) | |
| 305 | - | MNW/tests/ | |
| 305 | + | MNW/server/tests/ | |
| 306 | 306 | integration.rs, harness/, workflows/*.rs | |
| 307 | - | MNW/migrations/ (001-056) | |
| 308 | - | MNW/templates/ | |
| 309 | - | MNW/deploy/ | |
| 310 | - | MNW/site-docs/public/, MNW/site-docs/unpublished/ | |
| 307 | + | MNW/server/migrations/ (001-057) | |
| 308 | + | MNW/server/templates/ | |
| 309 | + | MNW/server/deploy/ | |
| 310 | + | MNW/server/site-docs/public/, MNW/server/site-docs/unpublished/ | |
| 311 | 311 | _meta/harness/ (codebase index: SQLite DB + MCP server) | |
| 312 | 312 | codebase.db, server/src/{index,populate,schema}.ts | |
| 313 | - | MNW/docs/audit.md (cross-project audit instructions, harness-integrated) | |
| 314 | - | MNW/docs/filetype_matrix.md (format compatibility, transcoding rules, tier strategy) | |
| 313 | + | MNW/server/docs/audit.md (cross-project audit instructions, harness-integrated) | |
| 314 | + | MNW/server/docs/filetype_matrix.md (format compatibility, transcoding rules, tier strategy) | |
| 315 | 315 | ``` | |
| 316 | 316 | ||
| 317 | 317 | ## Deps |
| @@ -53,8 +53,8 @@ All optional features are off by default. Enable what you need: | |||
| 53 | 53 | ||
| 54 | 54 | ```toml | |
| 55 | 55 | # In Cargo.toml | |
| 56 | - | docengine = { path = "../Shared/docengine" } # Core only | |
| 57 | - | docengine = { path = "../Shared/docengine", features = ["full"] } # Everything | |
| 56 | + | docengine = { path = "../shared/docengine" } # Core only (from MNW/server/) | |
| 57 | + | docengine = { path = "../../MNW/shared/docengine" } # From Apps/ | |
| 58 | 58 | ``` | |
| 59 | 59 | ||
| 60 | 60 | ## Core API |
| @@ -3,7 +3,7 @@ | |||
| 3 | 3 | - Last audited: 2026-03-28 (seventh audit, Run 12 cross-project) | |
| 4 | 4 | - Previous audit: 2026-03-18 (sixth audit, Run 9 cross-project) | |
| 5 | 5 | - Crate: `synckit-client` v0.3.0 | |
| 6 | - | - Path: `Shared/synckit-client/` | |
| 6 | + | - Path: `MNW/shared/synckit-client/` | |
| 7 | 7 | ||
| 8 | 8 | ## Overall Grade: A | |
| 9 | 9 |
| @@ -290,12 +290,12 @@ Expose these to the frontend: | |||
| 290 | 290 | ||
| 291 | 291 | | What | Where | | |
| 292 | 292 | |------|-------| | |
| 293 | - | | SDK source | `Shared/synckit-client/src/` | | |
| 294 | - | | SDK auth | `Shared/synckit-client/src/client/auth.rs` | | |
| 295 | - | | SDK push/pull | `Shared/synckit-client/src/client/sync.rs` | | |
| 296 | - | | SDK encryption | `Shared/synckit-client/src/crypto.rs` | | |
| 293 | + | | SDK source | `MNW/shared/synckit-client/src/` | | |
| 294 | + | | SDK auth | `MNW/shared/synckit-client/src/client/auth.rs` | | |
| 295 | + | | SDK push/pull | `MNW/shared/synckit-client/src/client/sync.rs` | | |
| 296 | + | | SDK encryption | `MNW/shared/synckit-client/src/crypto.rs` | | |
| 297 | 297 | | GO sync service | `Apps/goingson/src-tauri/src/sync_service.rs` | | |
| 298 | 298 | | BB sync service | `Apps/balanced_breakfast/src-tauri/src/sync_service.rs` | | |
| 299 | 299 | | AF sync service | `Apps/audiofiles/crates/audiofiles-sync/src/service.rs` | | |
| 300 | - | | Server endpoints | `MNW/src/routes/synckit.rs` | | |
| 301 | - | | Server DB | `MNW/src/db/synckit.rs` | | |
| 300 | + | | Server endpoints | `MNW/server/src/routes/synckit.rs` | | |
| 301 | + | | Server DB | `MNW/server/src/db/synckit.rs` | |
| @@ -12,8 +12,8 @@ v0.3.0. Audit grade A. 304 tests. | |||
| 12 | 12 | - [ ] C FFI layer — enables Swift/Kotlin/Python bindings. Only if non-Tauri consumers appear. | |
| 13 | 13 | ||
| 14 | 14 | ## Key Paths | |
| 15 | - | - Client: `Shared/synckit-client/src/client/` (mod, auth, encryption, sync, subscribe, blob, helpers) | |
| 16 | - | - Crypto: `Shared/synckit-client/src/crypto.rs` | |
| 17 | - | - Types: `Shared/synckit-client/src/types.rs` (includes PullFilter, FilteredPullRequest) | |
| 18 | - | - Keystore: `Shared/synckit-client/src/keystore.rs` | |
| 19 | - | - Tests: `Shared/synckit-client/tests/integration.rs` | |
| 15 | + | - Client: `MNW/shared/synckit-client/src/client/` (mod, auth, encryption, sync, subscribe, blob, helpers) | |
| 16 | + | - Crypto: `MNW/shared/synckit-client/src/crypto.rs` | |
| 17 | + | - Types: `MNW/shared/synckit-client/src/types.rs` (includes PullFilter, FilteredPullRequest) | |
| 18 | + | - Keystore: `MNW/shared/synckit-client/src/keystore.rs` | |
| 19 | + | - Tests: `MNW/shared/synckit-client/tests/integration.rs` |
| @@ -121,9 +121,9 @@ At typical corpus sizes (hundreds to low thousands), `suggest` completes in sing | |||
| 121 | 121 | ||
| 122 | 122 | | What | Path | | |
| 123 | 123 | |------|------| | |
| 124 | - | | Library source | `Shared/tagtree/src/lib.rs` | | |
| 125 | - | | Cargo manifest | `Shared/tagtree/Cargo.toml` | | |
| 126 | - | | Benchmarks | `Shared/tagtree/benches/tagtree_bench.rs` | | |
| 124 | + | | Library source | `MNW/shared/tagtree/src/lib.rs` | | |
| 125 | + | | Cargo manifest | `MNW/shared/tagtree/Cargo.toml` | | |
| 126 | + | | Benchmarks | `MNW/shared/tagtree/benches/tagtree_bench.rs` | | |
| 127 | 127 | | Audit review | `docs/shared/tagtree/audit_review.md` | | |
| 128 | 128 | ||
| 129 | 129 | ## Metrics |
| @@ -11,7 +11,7 @@ use theme_common::{load_theme, list_themes_from_dirs, dev_themes_dir}; | |||
| 11 | 11 | use std::path::PathBuf; | |
| 12 | 12 | ||
| 13 | 13 | // Set up theme directories (later entries override earlier ones) | |
| 14 | - | let bundled = PathBuf::from("/path/to/Shared/themes"); | |
| 14 | + | let bundled = PathBuf::from("/path/to/MNW/shared/themes"); | |
| 15 | 15 | let custom = PathBuf::from("/path/to/user/custom-themes"); | |
| 16 | 16 | let dirs = vec![(bundled, false), (custom, true)]; | |
| 17 | 17 | ||
| @@ -27,9 +27,9 @@ println!("Name: {}", theme.meta.name); // "Catppuccin Mocha" | |||
| 27 | 27 | println!("Variant: {}", theme.meta.variant); // "dark" | |
| 28 | 28 | println!("BG: {}", theme.colors["background.primary"]); // "#181825" | |
| 29 | 29 | ||
| 30 | - | // Dev helper: find Shared/themes/ relative to CARGO_MANIFEST_DIR | |
| 31 | - | if let Some(dev_dir) = dev_themes_dir(Path::new(env!("CARGO_MANIFEST_DIR")), 2) { | |
| 32 | - | // dev_dir = .../Code/Shared/themes | |
| 30 | + | // Dev helper: find MNW/shared/themes/ relative to CARGO_MANIFEST_DIR | |
| 31 | + | if let Some(dev_dir) = dev_themes_dir(Path::new(env!("CARGO_MANIFEST_DIR")), 3) { | |
| 32 | + | // dev_dir = .../Code/MNW/shared/themes | |
| 33 | 33 | } | |
| 34 | 34 | ``` | |
| 35 | 35 | ||
| @@ -95,14 +95,14 @@ The theme ID is the filename without `.toml` (e.g., `catppuccin-mocha.toml` has | |||
| 95 | 95 | | `parse_meta(id, table, is_custom)` | Parse `[meta]` from a TOML table into `ThemeMeta` | | |
| 96 | 96 | | `extract_colors(table)` | Flatten color sections into a `HashMap<String, String>` | | |
| 97 | 97 | | `validate_theme_id(id)` | Check that an ID contains only safe characters | | |
| 98 | - | | `dev_themes_dir(manifest_dir, levels)` | Walk up parent directories to find `Shared/themes/` (dev convenience) | | |
| 98 | + | | `dev_themes_dir(manifest_dir, levels)` | Walk up parent directories to find `MNW/shared/themes/` (dev convenience) | | |
| 99 | 99 | ||
| 100 | 100 | ## Directory Priority | |
| 101 | 101 | ||
| 102 | 102 | `list_themes_from_dirs` and `load_theme` accept a list of `(PathBuf, bool)` pairs. Later directories override earlier ones by theme ID. The `bool` marks whether the directory contains user-custom themes (`is_custom` on `ThemeMeta`). | |
| 103 | 103 | ||
| 104 | 104 | Typical setup for a Tauri app: | |
| 105 | - | 1. Bundled themes from `Shared/themes/` (is_custom = false) | |
| 105 | + | 1. Bundled themes from `MNW/shared/themes/` (is_custom = false) | |
| 106 | 106 | 2. User themes from an app data directory (is_custom = true) | |
| 107 | 107 | ||
| 108 | 108 | ## License |
| @@ -78,7 +78,7 @@ The filename without `.toml` is the theme ID. IDs must contain only alphanumeric | |||
| 78 | 78 | | Balanced Breakfast | Runtime from disk via Tauri resource glob | `theme-common` | | |
| 79 | 79 | | audiofiles | Compile-time embed via `include_str!` | Direct TOML parsing | | |
| 80 | 80 | ||
| 81 | - | GoingsOn and Balanced Breakfast include this directory as a Tauri resource (`../../../Shared/themes/*.toml` in `tauri.conf.json`). The `theme-common` crate handles parsing and color extraction at runtime. | |
| 81 | + | GoingsOn and Balanced Breakfast include this directory as a Tauri resource (`../../../MNW/shared/themes/*.toml` in `tauri.conf.json`). The `theme-common` crate handles parsing and color extraction at runtime. | |
| 82 | 82 | ||
| 83 | 83 | audiofiles embeds theme files at compile time and parses TOML directly without the `theme-common` crate. | |
| 84 | 84 |