From 7fd1d8e254d124ce3ecc8c09bd87ad9414da0e3d Mon Sep 17 00:00:00 2001 From: murashit Date: Tue, 30 Jun 2026 10:32:23 +0900 Subject: [PATCH] Flatten settings app-server adapter --- biome.jsonc | 5 --- ...-settings-app-server-boundary-imports.grit | 15 ------- src/plugin-runtime.ts | 2 +- ...mic-data.ts => app-server-dynamic-data.ts} | 18 ++++----- tests/scripts/grit-policy.test.mjs | 40 ------------------- tests/settings/settings-tab.test.ts | 2 +- 6 files changed, 11 insertions(+), 71 deletions(-) delete mode 100644 scripts/grit/import-boundaries/no-settings-app-server-boundary-imports.grit rename src/settings/{app-server/dynamic-data.ts => app-server-dynamic-data.ts} (85%) diff --git a/biome.jsonc b/biome.jsonc index 3728f79f..0bea0352 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -89,11 +89,6 @@ "path": "./scripts/grit/runtime/no-app-server-projection-rpcs.grit", "includes": ["**/src/features/chat/application/**/*.ts"] }, - { - "path": "./scripts/grit/import-boundaries/no-settings-app-server-boundary-imports.grit", - "includes": ["**/src/settings/**/*.ts", "**/src/settings/**/*.tsx", "!**/src/settings/app-server/**"] - }, - // Workspace and feature coordination boundaries. { "path": "./scripts/grit/import-boundaries/no-chat-workspace-boundary-imports.grit", diff --git a/scripts/grit/import-boundaries/no-settings-app-server-boundary-imports.grit b/scripts/grit/import-boundaries/no-settings-app-server-boundary-imports.grit deleted file mode 100644 index 0537e57d..00000000 --- a/scripts/grit/import-boundaries/no-settings-app-server-boundary-imports.grit +++ /dev/null @@ -1,15 +0,0 @@ -language js - -private pattern js_module_reference() { - or { - JsImport(), - JsImportCallExpression() - } -} - -js_module_reference() as $stmt where { - $stmt <: contains `$source` where { - $source <: r"^[\"'](?:(?:\.\./)+app-server|src/app-server|\./app-server|(?:\.\./)+settings/app-server|src/settings/app-server)(?:/.*)?[\"']$" - }, - register_diagnostic(span=$stmt, message="Settings modules must depend on settings-owned dynamic data ports instead of importing app-server modules or settings app-server adapters.", severity="error") -} diff --git a/src/plugin-runtime.ts b/src/plugin-runtime.ts index dd52687a..389e7c82 100644 --- a/src/plugin-runtime.ts +++ b/src/plugin-runtime.ts @@ -22,7 +22,7 @@ import type { ThreadsViewPanelActivity } from "./features/threads-view/state"; import { CodexThreadsView } from "./features/threads-view/view.obsidian"; import { persistedTurnDiffViewState, type TurnDiffViewState } from "./features/turn-diff/model"; import { CodexTurnDiffView } from "./features/turn-diff/view.obsidian"; -import { createSettingsAppServerDynamicData } from "./settings/app-server/dynamic-data"; +import { createSettingsAppServerDynamicData } from "./settings/app-server-dynamic-data"; import type { CodexPanelSettingTabHost } from "./settings/host"; import type { CodexPanelSettings } from "./settings/model"; import { WorkspacePanelCoordinator } from "./workspace/panel-coordinator"; diff --git a/src/settings/app-server/dynamic-data.ts b/src/settings/app-server-dynamic-data.ts similarity index 85% rename from src/settings/app-server/dynamic-data.ts rename to src/settings/app-server-dynamic-data.ts index 6ae79a4e..2da28c9a 100644 --- a/src/settings/app-server/dynamic-data.ts +++ b/src/settings/app-server-dynamic-data.ts @@ -1,12 +1,12 @@ -import type { AppServerClient } from "../../app-server/connection/client"; -import type { AppServerClientAccess } from "../../app-server/connection/client-access"; -import { isStaleAppServerSharedQueryContextError } from "../../app-server/query/shared-queries"; -import type { ThreadCatalogArchivedReader, ThreadCatalogEventSink } from "../../app-server/query/thread-catalog"; -import { listHookCatalog, setHookItemEnabled, trustHookItem } from "../../app-server/services/catalog"; -import { deleteThread, restoreArchivedThread as restoreArchivedThreadOnAppServer } from "../../app-server/services/threads"; -import type { ModelMetadata } from "../../domain/catalog/metadata"; -import type { ObservedResultListener } from "../../shared/query/observed-result"; -import { type SettingsDynamicDataAccess, type SettingsHookCatalog, StaleSettingsDynamicDataContextError } from "../dynamic-data"; +import type { AppServerClient } from "../app-server/connection/client"; +import type { AppServerClientAccess } from "../app-server/connection/client-access"; +import { isStaleAppServerSharedQueryContextError } from "../app-server/query/shared-queries"; +import type { ThreadCatalogArchivedReader, ThreadCatalogEventSink } from "../app-server/query/thread-catalog"; +import { listHookCatalog, setHookItemEnabled, trustHookItem } from "../app-server/services/catalog"; +import { deleteThread, restoreArchivedThread as restoreArchivedThreadOnAppServer } from "../app-server/services/threads"; +import type { ModelMetadata } from "../domain/catalog/metadata"; +import type { ObservedResultListener } from "../shared/query/observed-result"; +import { type SettingsDynamicDataAccess, type SettingsHookCatalog, StaleSettingsDynamicDataContextError } from "./dynamic-data"; interface SettingsAppServerQueries { modelsSnapshot(): readonly ModelMetadata[] | null; diff --git a/tests/scripts/grit-policy.test.mjs b/tests/scripts/grit-policy.test.mjs index 4baa5d3c..936d79d1 100644 --- a/tests/scripts/grit-policy.test.mjs +++ b/tests/scripts/grit-policy.test.mjs @@ -21,8 +21,6 @@ const RESPONSIBILITY_ROOT_MODULE_FILE_MESSAGE = "Keep responsibility-split source roots free of module files; add modules to the matching subfolder instead of the root."; const APP_SERVER_SUBFOLDER_ROOT_IMPORT_MESSAGE = "App-server subfolders must not import sibling root modules; move the dependency into a responsibility subfolder."; -const SETTINGS_APP_SERVER_BOUNDARY_MESSAGE = - "Settings modules must depend on settings-owned dynamic data ports instead of importing app-server modules or settings app-server adapters."; const CHAT_APPLICATION_OUTER_LAYER_MESSAGE = "Chat application modules must not import app-server, host, panel, presentation, or UI layers; expose state and workflow contracts instead."; const CHAT_APP_SERVER_OUTER_LAYER_MESSAGE = "Chat app-server adapters must not import chat host, panel, presentation, or UI layers."; @@ -879,14 +877,6 @@ export const value = statusText; ]); }); - it("keeps settings app-server access behind settings app-server adapters", async () => { - const report = await appServerBoundaryPolicyReport(); - - expect(pluginMessages(report, "src/settings/dynamic-sections-controller.ts")).toEqual([SETTINGS_APP_SERVER_BOUNDARY_MESSAGE]); - expect(pluginMessages(report, "src/settings/adapter-leak.ts")).toEqual([SETTINGS_APP_SERVER_BOUNDARY_MESSAGE]); - expect(pluginDiagnostics(report, "src/settings/app-server/dynamic-data.ts")).toEqual([]); - }); - it("keeps app-server root modules from becoming boundary escape hatches", async () => { const cwd = await tempBiomeWorkspace(["no-responsibility-root-module-files.grit", "no-app-server-subfolder-root-imports.grit"]); await writeFile( @@ -1137,7 +1127,6 @@ async function createAppServerBoundaryPolicyReport() { "no-lower-level-feature-imports.grit", "no-app-server-connection-boundary-imports.grit", "no-app-server-projection-rpcs.grit", - "no-settings-app-server-boundary-imports.grit", ]); await writeFile( path.join(cwd, "src/features/chat/domain/generated-thread.ts"), @@ -1410,31 +1399,6 @@ export async function resume(client: AppServerClient): Promise { } `.trimStart(), ); - await writeFile( - path.join(cwd, "src/settings/dynamic-sections-controller.ts"), - ` -import { listHookCatalog } from "../app-server/services/catalog"; - -export const load = listHookCatalog; -`.trimStart(), - ); - await writeFile( - path.join(cwd, "src/settings/adapter-leak.ts"), - ` -import { createSettingsAppServerDynamicData } from "./app-server/dynamic-data"; - -export const create = createSettingsAppServerDynamicData; -`.trimStart(), - ); - await writeFile( - path.join(cwd, "src/settings/app-server/dynamic-data.ts"), - ` -import { listHookCatalog } from "../../app-server/services/catalog"; - -export const load = listHookCatalog; -`.trimStart(), - ); - return biomeLint( [ "src/features/chat/domain/generated-thread.ts", @@ -1467,9 +1431,6 @@ export const load = listHookCatalog; "src/features/chat/application/threads/history.ts", "src/app-server/services/threads.ts", "src/features/chat/host/bundles/connection-bundle.ts", - "src/settings/dynamic-sections-controller.ts", - "src/settings/adapter-leak.ts", - "src/settings/app-server/dynamic-data.ts", ], cwd, ); @@ -1497,7 +1458,6 @@ async function tempBiomeWorkspace(plugins) { await mkdir(path.join(cwd, "src/features/threads-view"), { recursive: true }); await mkdir(path.join(cwd, "src/features/turn-diff"), { recursive: true }); await mkdir(path.join(cwd, "src/settings"), { recursive: true }); - await mkdir(path.join(cwd, "src/settings/app-server"), { recursive: true }); await mkdir(path.join(cwd, "src/domain/threads"), { recursive: true }); await mkdir(path.join(cwd, "src/app-server/connection"), { recursive: true }); await mkdir(path.join(cwd, "src/app-server/protocol"), { recursive: true }); diff --git a/tests/settings/settings-tab.test.ts b/tests/settings/settings-tab.test.ts index 43d4121d..e05b83d2 100644 --- a/tests/settings/settings-tab.test.ts +++ b/tests/settings/settings-tab.test.ts @@ -9,7 +9,7 @@ import type { ThreadRecord } from "../../src/app-server/protocol/thread"; import type { ThreadCatalogEvent } from "../../src/app-server/query/thread-catalog"; import type { ModelMetadata, ReasoningEffort } from "../../src/domain/catalog/metadata"; import type { Thread } from "../../src/domain/threads/model"; -import { createSettingsAppServerDynamicData } from "../../src/settings/app-server/dynamic-data"; +import { createSettingsAppServerDynamicData } from "../../src/settings/app-server-dynamic-data"; import type { SettingsDynamicDataAccess } from "../../src/settings/dynamic-data"; import { SettingsDynamicSectionsController, type SettingsDynamicSectionsSnapshot } from "../../src/settings/dynamic-sections-controller"; import type { CodexPanelSettingTabHost } from "../../src/settings/host";