diff --git a/crates/nyaterm-desktop/src/features/pages/settings/ai/mod.rs b/crates/nyaterm-desktop/src/features/pages/settings/ai/mod.rs index 7427a0e07..e05c4cb0f 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/ai/mod.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/ai/mod.rs @@ -1,5 +1,3 @@ -use super::*; - mod models; mod rules; mod section; diff --git a/crates/nyaterm-desktop/src/features/pages/settings/ai/models/credential_rows.rs b/crates/nyaterm-desktop/src/features/pages/settings/ai/models/credential_rows.rs index 6f14972a1..b2fc18191 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/ai/models/credential_rows.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/ai/models/credential_rows.rs @@ -1,4 +1,11 @@ -use super::*; +use gpui::{ + Context, FontWeight, IntoElement, KeyDownEvent, SharedString, div, prelude::*, px, rgb, +}; + +use crate::features::{NyaTermApp, TextInputSetup}; +use crate::widgets::small_button; + +use super::super::super::settings_switch; impl NyaTermApp { pub(super) fn ai_credential_rows( diff --git a/crates/nyaterm-desktop/src/features/pages/settings/ai/models/mod.rs b/crates/nyaterm-desktop/src/features/pages/settings/ai/models/mod.rs index dad647c6d..9752c9a0e 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/ai/models/mod.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/ai/models/mod.rs @@ -1,5 +1,10 @@ -use super::*; -use gpui::MouseButton; +use gpui::{Context, IntoElement, KeyDownEvent, MouseButton, div, prelude::*, px, rgb}; + +use crate::features::{NyaTermApp, TextInputSetup}; +use crate::theme::ThemePalette; +use crate::widgets::small_button; + +use super::super::settings_form_section; mod credential_rows; mod model_groups; diff --git a/crates/nyaterm-desktop/src/features/pages/settings/ai/models/model_groups.rs b/crates/nyaterm-desktop/src/features/pages/settings/ai/models/model_groups.rs index 7de65d070..dfe4100bf 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/ai/models/model_groups.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/ai/models/model_groups.rs @@ -1,4 +1,13 @@ -use super::*; +use gpui::{ + AnyElement, Context, FontWeight, IntoElement, KeyDownEvent, SharedString, div, prelude::*, px, + rgb, +}; +use nyaterm_core::truncate_preview; + +use crate::features::{NyaTermApp, TextInputSetup}; +use crate::widgets::small_button; + +use super::super::super::settings_switch; impl NyaTermApp { pub(super) fn ai_model_groups( diff --git a/crates/nyaterm-desktop/src/features/pages/settings/ai/rules.rs b/crates/nyaterm-desktop/src/features/pages/settings/ai/rules.rs index b82acecd5..fe5d9d84c 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/ai/rules.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/ai/rules.rs @@ -1,6 +1,14 @@ -use super::*; +use gpui::{ + AnyElement, App, ClickEvent, Context, FontWeight, IntoElement, KeyDownEvent, SharedString, + Window, div, prelude::*, px, rgb, +}; +use crate::features::{NyaTermApp, TextInputSetup}; use crate::models::{AiActionEditorField, AiActionListKind}; +use crate::theme::ThemePalette; +use crate::widgets::small_button; + +use super::super::{settings_form_row, settings_form_section, settings_switch}; impl NyaTermApp { pub(in crate::features) fn ai_rules_settings_section( diff --git a/crates/nyaterm-desktop/src/features/pages/settings/ai/section.rs b/crates/nyaterm-desktop/src/features/pages/settings/ai/section.rs index 98f2cbebc..9423fb662 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/ai/section.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/ai/section.rs @@ -1,6 +1,15 @@ -use super::*; +use gpui::{ + AnyElement, App, ClickEvent, Context, IntoElement, SharedString, Window, div, prelude::*, px, + rgb, +}; +use nyaterm_core::RiskLevel; +use crate::features::{NyaTermApp, TextInputSetup}; use crate::models::AiInputField; +use crate::theme::ThemePalette; +use crate::widgets::small_button; + +use super::super::{settings_form_row, settings_form_section, settings_switch}; impl NyaTermApp { pub(in crate::features) fn ai_input( diff --git a/crates/nyaterm-desktop/src/features/pages/settings/mod.rs b/crates/nyaterm-desktop/src/features/pages/settings/mod.rs index c6204854e..ad4bde8f1 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/mod.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/mod.rs @@ -1,20 +1,12 @@ use gpui::{ - AnyElement, App, ClickEvent, Context, FontWeight, IntoElement, KeyDownEvent, SharedString, - Window, div, prelude::*, px, rgb, rgba, svg, + AnyElement, App, ClickEvent, Context, FontWeight, IntoElement, SharedString, Window, div, + prelude::*, px, rgb, rgba, svg, }; -use nyaterm_core::{CloudSyncSettings, RiskLevel}; -use crate::models::{ - CloudSyncConflictState, CloudSyncInputField, SettingsTab, SnapshotPasswordPromptKind, - SnapshotPasswordPromptState, TranslateInputField, -}; +use crate::models::{SettingsTab, SnapshotPasswordPromptKind, SnapshotPasswordPromptState}; use crate::theme::ThemePalette; -use crate::widgets::{small_button, status_pill}; -use super::super::{ - ChromeTooltip, NyaTermApp, TextInputSetup, compact_id, configured_cloud_sync_provider, - format_history_timestamp_ms, secret_input_setup, truncate_preview, -}; +use super::super::{ChromeTooltip, NyaTermApp}; mod ai; mod security; diff --git a/crates/nyaterm-desktop/src/features/pages/settings/security.rs b/crates/nyaterm-desktop/src/features/pages/settings/security.rs index d4ccc0eac..dcfd1961d 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/security.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/security.rs @@ -1,4 +1,12 @@ -use super::*; +use gpui::{Context, FontWeight, IntoElement, SharedString, div, prelude::*, px, rgb}; + +use crate::features::{ChromeTooltip, NyaTermApp, TextInputSetup}; +use crate::widgets::small_button; + +use super::{ + settings_choice_chip, settings_form_row, settings_form_section, settings_switch, + settings_switch_with_enabled, +}; impl NyaTermApp { pub(in crate::features) fn security_settings_section( diff --git a/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/mod.rs b/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/mod.rs index 71bc2ba79..5af70ff6f 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/mod.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/mod.rs @@ -1,7 +1,20 @@ -use super::*; +use gpui::{ + AnyElement, App, ClickEvent, Context, FontWeight, IntoElement, SharedString, Window, div, + prelude::*, px, rgb, rgba, svg, +}; +use nyaterm_core::CloudSyncSettings; -use crate::features::{dialog_action_button, format_cloud_provider}; -use crate::models::{SettingsTab, SnapshotPasswordPromptKind}; +use crate::features::{ + NyaTermApp, compact_id, configured_cloud_sync_provider, dialog_action_button, + format_cloud_provider, format_history_timestamp_ms, secret_input_setup, +}; +use crate::models::{ + CloudSyncConflictState, CloudSyncInputField, SettingsTab, SnapshotPasswordPromptKind, +}; +use crate::theme::ThemePalette; +use crate::widgets::small_button; + +use super::super::{settings_form_row, settings_form_section, settings_switch_with_enabled}; mod providers; impl NyaTermApp { diff --git a/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/providers.rs b/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/providers.rs index ebb5d9411..1dbd598f9 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/providers.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/providers.rs @@ -1,4 +1,11 @@ -use super::*; +use gpui::{AnyElement, Context, FontWeight, IntoElement, SharedString, div, prelude::*, px, rgb}; +use nyaterm_core::truncate_preview; + +use crate::features::NyaTermApp; +use crate::models::CloudSyncInputField; + +use super::super::super::{settings_form_row, settings_switch_with_enabled}; +use super::cloud_sync_action_button; impl NyaTermApp { pub(super) fn cloud_sync_webdav_provider_fields( diff --git a/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/mod.rs b/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/mod.rs index c24c4a3c9..7c1f4a454 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/mod.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/sync_backup/mod.rs @@ -1,3 +1 @@ -use super::*; - mod cloud_sync; diff --git a/crates/nyaterm-desktop/src/features/pages/settings/translation.rs b/crates/nyaterm-desktop/src/features/pages/settings/translation.rs index 970f077ae..c1cbb5ee2 100644 --- a/crates/nyaterm-desktop/src/features/pages/settings/translation.rs +++ b/crates/nyaterm-desktop/src/features/pages/settings/translation.rs @@ -1,4 +1,10 @@ -use super::*; +use gpui::{AnyElement, Context, FontWeight, IntoElement, div, prelude::*, px, rgb}; + +use crate::features::{NyaTermApp, TextInputSetup, secret_input_setup}; +use crate::models::TranslateInputField; +use crate::widgets::{small_button, status_pill}; + +use super::{settings_choice_chip, settings_form_section}; impl NyaTermApp { fn translation_input( diff --git a/docs/architecture/gpui-migration-status.md b/docs/architecture/gpui-migration-status.md index 704cd9666..c57d09646 100644 --- a/docs/architecture/gpui-migration-status.md +++ b/docs/architecture/gpui-migration-status.md @@ -12,7 +12,7 @@ Last updated from the working tree on 2026-07-28. | `NyaTermApp` fields | 261 | Counted from `features/app_state/mod.rs`; down from 585, still transitional. | | `impl NyaTermApp` blocks | 240 | Spread across 235 files under `crates/nyaterm-desktop/src`. | | `#[path = "..."]` declarations in desktop | 0 | Cleared. Every directory is a real module; the boundary script fails on any new occurrence. | -| `use super::*` imports in desktop | 255 | Includes indented test-module imports; historical migration debt, do not add new occurrences. | +| `use super::*` imports in desktop | 244 | Includes indented test-module imports; historical migration debt, do not add new occurrences. | | `features/prelude.rs` rough exported-token count | 221 | Still a broad shared prelude; two hundred twenty-four low-frequency transport/core/http/model/helper exports are now explicit imports. | | Entity Store structs | 4 | `Runtime`, `WindowRuntime`, `StartupRestore`, `Overlay`. Each owns state the app does not. | | Snapshot structs | 0 | Cleared. No store is a projection of `NyaTermApp` any more. | @@ -418,13 +418,15 @@ these as staged extraction candidates, not as formatting-only refactor targets. `pages/remote/mod.rs` as a pure module entry point. All 13 wildcard imports were removed across roughly 3,800 lines, so the boundary script now governs the complete `pages/remote` tree. -- The settings `transfer`, `terminal` and `workspace` subtrees no longer use - wildcard imports. Fourteen module boundaries across roughly 4,773 lines now - name their GPUI traits, settings form helpers, text-input setup, shortcut, - theme and transport model dependencies directly. Their `mod.rs` files are - module entry points rather than implicit child preludes, and `settings/mod.rs` - no longer carries the SFTP duplicate policy or tab-mouse models used only by - those children. The boundary script governs all three complete subtrees. +- The complete settings page tree no longer uses wildcard imports. Its AI, + security, translation, cloud-sync/backup, transfer, terminal and workspace + modules name their GPUI traits, settings form helpers, text-input setup, + theme, core and model dependencies directly. The nested AI and sync/backup + `mod.rs` files are pure module entry points, and `settings/mod.rs` no longer + carries child-only AI, translation, cloud-sync or widget imports. The + boundary script governs all 27 Rust modules under `pages/settings` at zero + `use super::*` imports. Cloud-sync provider fields, secret masking, + validation and request/storage behavior are unchanged. - The quick-command import runtime no longer uses wildcard imports or flattened child-module globs. Its dialog calls the source adapter directly; source parsing depends directionally on JSON, merge and helper modules; merge names @@ -1205,7 +1207,7 @@ Items 1, 3 and 4 are done. What follows is the honest remaining list. cohesive, while still resolving each file's dependency set explicitly with compiler guidance. Run formatting, boundary checks, compilation and tests once for the completed batch rather than committing one file at a time. -3. Largely done. `NyaTermApp` is down from 585 fields to 284, across eight +3. Largely done. `NyaTermApp` is down from 585 fields to 261, across eight feature-state structs. What is left is a long tail — the biggest remaining domain is eighteen fields, and much of the rest is genuinely app-level (stores, runtime, services, persisted collections). Group by cohesion where diff --git a/scripts/check-architecture-boundaries.sh b/scripts/check-architecture-boundaries.sh index bc0fecde8..f8435a145 100755 --- a/scripts/check-architecture-boundaries.sh +++ b/scripts/check-architecture-boundaries.sh @@ -565,12 +565,25 @@ declare -A SUPER_BASELINE=( [crates/nyaterm-desktop/src/features/pages/remote/docker_view.rs]=0 [crates/nyaterm-desktop/src/features/pages/remote/mod.rs]=0 [crates/nyaterm-desktop/src/features/pages/remote/stats_view.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/mod.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/ai/mod.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/ai/models/credential_rows.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/ai/models/mod.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/ai/models/model_groups.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/ai/rules.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/ai/section.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/security.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/sync_backup/mod.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/mod.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/sync_backup/cloud_sync/providers.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/translation.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/transfer/advanced.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/transfer/editor.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/transfer/files.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/transfer/mod.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/transfer/recording.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/terminal/general.rs]=0 + [crates/nyaterm-desktop/src/features/pages/settings/terminal/helpers.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/terminal/keywords.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/terminal/mod.rs]=0 [crates/nyaterm-desktop/src/features/pages/settings/terminal/search.rs]=0 @@ -650,9 +663,7 @@ done < <(rg -n --path-separator / '^[[:space:]]*use super::\*;' \ crates/nyaterm-desktop/src/features/pages/tunnels \ crates/nyaterm-desktop/src/features/pages/transfers \ crates/nyaterm-desktop/src/features/pages/remote \ - crates/nyaterm-desktop/src/features/pages/settings/transfer \ - crates/nyaterm-desktop/src/features/pages/settings/terminal \ - crates/nyaterm-desktop/src/features/pages/settings/workspace \ + crates/nyaterm-desktop/src/features/pages/settings \ crates/nyaterm-desktop/src/features/shell/mod.rs \ crates/nyaterm-desktop/src/features/shell/activity_bar_runtime.rs \ crates/nyaterm-desktop/src/features/shell/appearance.rs \