From 193f84883ebee957590144ba77f16f453a547803 Mon Sep 17 00:00:00 2001 From: murashit Date: Sat, 27 Jun 2026 23:28:16 +0900 Subject: [PATCH] Organize Biome plugin policy configuration --- biome.jsonc | 143 +++++++++--------- ...pp-server-connection-boundary-imports.grit | 0 ...-app-server-protocol-boundary-imports.grit | 0 .../no-app-server-root-module-imports.grit | 0 .../no-app-server-subfolder-root-imports.grit | 0 ...o-chat-app-server-outer-layer-imports.grit | 0 ...-chat-application-outer-layer-imports.grit | 0 .../no-chat-host-rendering-layer-imports.grit | 0 ...o-chat-panel-runtime-boundary-imports.grit | 0 ...chat-presentation-outer-layer-imports.grit | 0 .../no-chat-ui-outer-layer-imports.grit | 0 .../no-chat-workspace-boundary-imports.grit | 0 .../no-domain-outer-layer-imports.grit | 0 ...no-feature-workspace-boundary-imports.grit | 0 ...generated-app-server-boundary-imports.grit | 0 .../no-lower-level-feature-imports.grit | 0 .../no-preact-signal-imports.grit | 0 ...-settings-app-server-boundary-imports.grit | 0 .../no-workspace-chat-internal-imports.grit | 0 .../no-app-server-projection-rpcs.grit | 0 .../no-state-module-side-effects.grit | 0 tests/scripts/grit-policy.test.mjs | 2 +- 22 files changed, 74 insertions(+), 71 deletions(-) rename scripts/grit/{architecture => import-boundaries}/no-app-server-connection-boundary-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-app-server-protocol-boundary-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-app-server-root-module-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-app-server-subfolder-root-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-chat-app-server-outer-layer-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-chat-application-outer-layer-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-chat-host-rendering-layer-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-chat-panel-runtime-boundary-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-chat-presentation-outer-layer-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-chat-ui-outer-layer-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-chat-workspace-boundary-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-domain-outer-layer-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-feature-workspace-boundary-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-generated-app-server-boundary-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-lower-level-feature-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-preact-signal-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-settings-app-server-boundary-imports.grit (100%) rename scripts/grit/{architecture => import-boundaries}/no-workspace-chat-internal-imports.grit (100%) rename scripts/grit/{architecture => runtime}/no-app-server-projection-rpcs.grit (100%) rename scripts/grit/{architecture => runtime}/no-state-module-side-effects.grit (100%) diff --git a/biome.jsonc b/biome.jsonc index d5e5d604..0ad3de07 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -6,7 +6,11 @@ "useIgnoreFile": true }, "plugins": [ - // Shared source-shape boundaries. + // Project-wide source shape and placement. + { + "path": "./scripts/grit/source-shape/no-handwritten-reexports.grit", + "includes": ["**/*.ts", "**/*.tsx", "**/*.mjs"] + }, { "path": "./scripts/grit/source-shape/no-responsibility-root-module-files.grit", "includes": [ @@ -22,93 +26,123 @@ "**/src/shared/*.tsx" ] }, - // App-server protocol and generated binding boundaries. { - "path": "./scripts/grit/architecture/no-app-server-root-module-imports.grit", - "includes": ["**/src/**/*.ts", "**/src/**/*.tsx"] + "path": "./scripts/grit/source-shape/no-misplaced-tsx.grit", + "includes": [ + "**/src/**/*.tsx", + "!**/src/features/chat/panel/**", + "!**/src/features/chat/ui/**", + "!**/src/features/selection-rewrite/*.dom.tsx", + "!**/src/features/turn-diff/*.dom.tsx", + "!**/src/features/threads-view/*.dom.tsx", + "!**/src/settings/**", + "!**/src/shared/ui/**" + ] }, { - "path": "./scripts/grit/architecture/no-app-server-subfolder-root-imports.grit", - "includes": ["**/src/app-server/**/*.ts"] + "path": "./scripts/grit/source-shape/no-self-referential-initializer-callback.grit", + "includes": ["**/*.ts", "**/*.tsx", "**/*.mjs"] }, { - "path": "./scripts/grit/architecture/no-app-server-projection-rpcs.grit", - "includes": ["**/src/features/chat/application/**/*.ts"] + "path": "./scripts/grit/source-shape/no-unsafe-iterator-value.grit", + "includes": ["**/*.ts", "**/*.tsx", "**/*.mjs"] }, { - "path": "./scripts/grit/architecture/no-app-server-protocol-boundary-imports.grit", - "includes": ["**/src/**/*.ts", "**/src/**/*.tsx", "!**/src/app-server/**"] - }, - { - "path": "./scripts/grit/architecture/no-generated-app-server-boundary-imports.grit", - "includes": ["**/src/**/*.ts", "**/src/**/*.tsx", "!**/src/app-server/connection/**"] - }, - { - "path": "./scripts/grit/architecture/no-settings-app-server-boundary-imports.grit", - "includes": ["**/src/settings/**/*.ts", "**/src/settings/**/*.tsx", "!**/src/settings/app-server/**"] + "path": "./scripts/grit/source-shape/no-uncontrolled-preact-form-state.grit", + "includes": ["**/src/**/*.tsx"] }, - // Shared source layering boundaries. + // Cross-cutting source-layer import boundaries. { - "path": "./scripts/grit/architecture/no-domain-outer-layer-imports.grit", + "path": "./scripts/grit/import-boundaries/no-domain-outer-layer-imports.grit", "includes": ["**/src/domain/**/*.ts", "**/src/features/chat/domain/**/*.ts"] }, { - "path": "./scripts/grit/architecture/no-lower-level-feature-imports.grit", + "path": "./scripts/grit/import-boundaries/no-lower-level-feature-imports.grit", "includes": ["**/src/app-server/**/*.ts", "**/src/shared/**/*.ts", "**/src/shared/**/*.tsx"] }, + + // App-server and generated protocol boundaries. { - "path": "./scripts/grit/architecture/no-app-server-connection-boundary-imports.grit", + "path": "./scripts/grit/import-boundaries/no-app-server-root-module-imports.grit", + "includes": ["**/src/**/*.ts", "**/src/**/*.tsx"] + }, + { + "path": "./scripts/grit/import-boundaries/no-app-server-subfolder-root-imports.grit", + "includes": ["**/src/app-server/**/*.ts"] + }, + { + "path": "./scripts/grit/import-boundaries/no-app-server-connection-boundary-imports.grit", "includes": ["**/src/app-server/protocol/**/*.ts", "**/src/domain/**/*.ts", "**/src/shared/**/*.ts", "**/src/shared/**/*.tsx"] }, - - // Chat feature architecture. { - "path": "./scripts/grit/architecture/no-preact-signal-imports.grit", - "includes": ["**/src/**/*.ts", "**/src/**/*.tsx", "!**/src/features/chat/panel/shell-state.tsx"] + "path": "./scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit", + "includes": ["**/src/**/*.ts", "**/src/**/*.tsx", "!**/src/app-server/**"] }, { - "path": "./scripts/grit/architecture/no-state-module-side-effects.grit", - "includes": ["**/src/features/chat/application/state/**/*.ts"] + "path": "./scripts/grit/import-boundaries/no-generated-app-server-boundary-imports.grit", + "includes": ["**/src/**/*.ts", "**/src/**/*.tsx", "!**/src/app-server/connection/**"] }, { - "path": "./scripts/grit/architecture/no-chat-application-outer-layer-imports.grit", + "path": "./scripts/grit/runtime/no-app-server-projection-rpcs.grit", "includes": ["**/src/features/chat/application/**/*.ts"] }, { - "path": "./scripts/grit/architecture/no-chat-app-server-outer-layer-imports.grit", - "includes": ["**/src/features/chat/app-server/**/*.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/architecture/no-chat-workspace-boundary-imports.grit", + "path": "./scripts/grit/import-boundaries/no-chat-workspace-boundary-imports.grit", "includes": ["**/src/features/chat/**/*.ts", "**/src/features/chat/**/*.tsx"] }, { - "path": "./scripts/grit/architecture/no-feature-workspace-boundary-imports.grit", + "path": "./scripts/grit/import-boundaries/no-feature-workspace-boundary-imports.grit", "includes": ["**/src/features/**/*.ts", "**/src/features/**/*.tsx", "!**/src/features/chat/**"] }, { - "path": "./scripts/grit/architecture/no-workspace-chat-internal-imports.grit", + "path": "./scripts/grit/import-boundaries/no-workspace-chat-internal-imports.grit", "includes": ["**/src/workspace/**/*.ts"] }, + + // Chat feature layer boundaries. { - "path": "./scripts/grit/architecture/no-chat-host-rendering-layer-imports.grit", + "path": "./scripts/grit/import-boundaries/no-chat-application-outer-layer-imports.grit", + "includes": ["**/src/features/chat/application/**/*.ts"] + }, + { + "path": "./scripts/grit/import-boundaries/no-chat-app-server-outer-layer-imports.grit", + "includes": ["**/src/features/chat/app-server/**/*.ts"] + }, + { + "path": "./scripts/grit/import-boundaries/no-chat-host-rendering-layer-imports.grit", "includes": ["**/src/features/chat/host/**/*.ts"] }, { - "path": "./scripts/grit/architecture/no-chat-panel-runtime-boundary-imports.grit", + "path": "./scripts/grit/import-boundaries/no-chat-panel-runtime-boundary-imports.grit", "includes": ["**/src/features/chat/panel/**/*.ts", "**/src/features/chat/panel/**/*.tsx"] }, { - "path": "./scripts/grit/architecture/no-chat-presentation-outer-layer-imports.grit", + "path": "./scripts/grit/import-boundaries/no-chat-presentation-outer-layer-imports.grit", "includes": ["**/src/features/chat/presentation/**/*.ts"] }, { - "path": "./scripts/grit/architecture/no-chat-ui-outer-layer-imports.grit", + "path": "./scripts/grit/import-boundaries/no-chat-ui-outer-layer-imports.grit", "includes": ["**/src/features/chat/ui/**/*.ts", "**/src/features/chat/ui/**/*.tsx"] }, - // UI and DOM source boundaries. + // Chat state and runtime ownership. + { + "path": "./scripts/grit/import-boundaries/no-preact-signal-imports.grit", + "includes": ["**/src/**/*.ts", "**/src/**/*.tsx", "!**/src/features/chat/panel/shell-state.tsx"] + }, + { + "path": "./scripts/grit/runtime/no-state-module-side-effects.grit", + "includes": ["**/src/features/chat/application/state/**/*.ts"] + }, + + // DOM bridge and Preact root boundaries. { "path": "./scripts/grit/dom/no-implicit-dom-bridges.grit", "includes": [ @@ -146,37 +180,6 @@ "!**/src/**/*.obsidian.tsx" ] }, - { - "path": "./scripts/grit/source-shape/no-uncontrolled-preact-form-state.grit", - "includes": ["**/src/**/*.tsx"] - }, - - // Project-wide source shape. - { - "path": "./scripts/grit/source-shape/no-misplaced-tsx.grit", - "includes": [ - "**/src/**/*.tsx", - "!**/src/features/chat/panel/**", - "!**/src/features/chat/ui/**", - "!**/src/features/selection-rewrite/*.dom.tsx", - "!**/src/features/turn-diff/*.dom.tsx", - "!**/src/features/threads-view/*.dom.tsx", - "!**/src/settings/**", - "!**/src/shared/ui/**" - ] - }, - { - "path": "./scripts/grit/source-shape/no-handwritten-reexports.grit", - "includes": ["**/*.ts", "**/*.tsx", "**/*.mjs"] - }, - { - "path": "./scripts/grit/source-shape/no-self-referential-initializer-callback.grit", - "includes": ["**/*.ts", "**/*.tsx", "**/*.mjs"] - }, - { - "path": "./scripts/grit/source-shape/no-unsafe-iterator-value.grit", - "includes": ["**/*.ts", "**/*.tsx", "**/*.mjs"] - }, // CSS source policy. { diff --git a/scripts/grit/architecture/no-app-server-connection-boundary-imports.grit b/scripts/grit/import-boundaries/no-app-server-connection-boundary-imports.grit similarity index 100% rename from scripts/grit/architecture/no-app-server-connection-boundary-imports.grit rename to scripts/grit/import-boundaries/no-app-server-connection-boundary-imports.grit diff --git a/scripts/grit/architecture/no-app-server-protocol-boundary-imports.grit b/scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit similarity index 100% rename from scripts/grit/architecture/no-app-server-protocol-boundary-imports.grit rename to scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit diff --git a/scripts/grit/architecture/no-app-server-root-module-imports.grit b/scripts/grit/import-boundaries/no-app-server-root-module-imports.grit similarity index 100% rename from scripts/grit/architecture/no-app-server-root-module-imports.grit rename to scripts/grit/import-boundaries/no-app-server-root-module-imports.grit diff --git a/scripts/grit/architecture/no-app-server-subfolder-root-imports.grit b/scripts/grit/import-boundaries/no-app-server-subfolder-root-imports.grit similarity index 100% rename from scripts/grit/architecture/no-app-server-subfolder-root-imports.grit rename to scripts/grit/import-boundaries/no-app-server-subfolder-root-imports.grit diff --git a/scripts/grit/architecture/no-chat-app-server-outer-layer-imports.grit b/scripts/grit/import-boundaries/no-chat-app-server-outer-layer-imports.grit similarity index 100% rename from scripts/grit/architecture/no-chat-app-server-outer-layer-imports.grit rename to scripts/grit/import-boundaries/no-chat-app-server-outer-layer-imports.grit diff --git a/scripts/grit/architecture/no-chat-application-outer-layer-imports.grit b/scripts/grit/import-boundaries/no-chat-application-outer-layer-imports.grit similarity index 100% rename from scripts/grit/architecture/no-chat-application-outer-layer-imports.grit rename to scripts/grit/import-boundaries/no-chat-application-outer-layer-imports.grit diff --git a/scripts/grit/architecture/no-chat-host-rendering-layer-imports.grit b/scripts/grit/import-boundaries/no-chat-host-rendering-layer-imports.grit similarity index 100% rename from scripts/grit/architecture/no-chat-host-rendering-layer-imports.grit rename to scripts/grit/import-boundaries/no-chat-host-rendering-layer-imports.grit diff --git a/scripts/grit/architecture/no-chat-panel-runtime-boundary-imports.grit b/scripts/grit/import-boundaries/no-chat-panel-runtime-boundary-imports.grit similarity index 100% rename from scripts/grit/architecture/no-chat-panel-runtime-boundary-imports.grit rename to scripts/grit/import-boundaries/no-chat-panel-runtime-boundary-imports.grit diff --git a/scripts/grit/architecture/no-chat-presentation-outer-layer-imports.grit b/scripts/grit/import-boundaries/no-chat-presentation-outer-layer-imports.grit similarity index 100% rename from scripts/grit/architecture/no-chat-presentation-outer-layer-imports.grit rename to scripts/grit/import-boundaries/no-chat-presentation-outer-layer-imports.grit diff --git a/scripts/grit/architecture/no-chat-ui-outer-layer-imports.grit b/scripts/grit/import-boundaries/no-chat-ui-outer-layer-imports.grit similarity index 100% rename from scripts/grit/architecture/no-chat-ui-outer-layer-imports.grit rename to scripts/grit/import-boundaries/no-chat-ui-outer-layer-imports.grit diff --git a/scripts/grit/architecture/no-chat-workspace-boundary-imports.grit b/scripts/grit/import-boundaries/no-chat-workspace-boundary-imports.grit similarity index 100% rename from scripts/grit/architecture/no-chat-workspace-boundary-imports.grit rename to scripts/grit/import-boundaries/no-chat-workspace-boundary-imports.grit diff --git a/scripts/grit/architecture/no-domain-outer-layer-imports.grit b/scripts/grit/import-boundaries/no-domain-outer-layer-imports.grit similarity index 100% rename from scripts/grit/architecture/no-domain-outer-layer-imports.grit rename to scripts/grit/import-boundaries/no-domain-outer-layer-imports.grit diff --git a/scripts/grit/architecture/no-feature-workspace-boundary-imports.grit b/scripts/grit/import-boundaries/no-feature-workspace-boundary-imports.grit similarity index 100% rename from scripts/grit/architecture/no-feature-workspace-boundary-imports.grit rename to scripts/grit/import-boundaries/no-feature-workspace-boundary-imports.grit diff --git a/scripts/grit/architecture/no-generated-app-server-boundary-imports.grit b/scripts/grit/import-boundaries/no-generated-app-server-boundary-imports.grit similarity index 100% rename from scripts/grit/architecture/no-generated-app-server-boundary-imports.grit rename to scripts/grit/import-boundaries/no-generated-app-server-boundary-imports.grit diff --git a/scripts/grit/architecture/no-lower-level-feature-imports.grit b/scripts/grit/import-boundaries/no-lower-level-feature-imports.grit similarity index 100% rename from scripts/grit/architecture/no-lower-level-feature-imports.grit rename to scripts/grit/import-boundaries/no-lower-level-feature-imports.grit diff --git a/scripts/grit/architecture/no-preact-signal-imports.grit b/scripts/grit/import-boundaries/no-preact-signal-imports.grit similarity index 100% rename from scripts/grit/architecture/no-preact-signal-imports.grit rename to scripts/grit/import-boundaries/no-preact-signal-imports.grit diff --git a/scripts/grit/architecture/no-settings-app-server-boundary-imports.grit b/scripts/grit/import-boundaries/no-settings-app-server-boundary-imports.grit similarity index 100% rename from scripts/grit/architecture/no-settings-app-server-boundary-imports.grit rename to scripts/grit/import-boundaries/no-settings-app-server-boundary-imports.grit diff --git a/scripts/grit/architecture/no-workspace-chat-internal-imports.grit b/scripts/grit/import-boundaries/no-workspace-chat-internal-imports.grit similarity index 100% rename from scripts/grit/architecture/no-workspace-chat-internal-imports.grit rename to scripts/grit/import-boundaries/no-workspace-chat-internal-imports.grit diff --git a/scripts/grit/architecture/no-app-server-projection-rpcs.grit b/scripts/grit/runtime/no-app-server-projection-rpcs.grit similarity index 100% rename from scripts/grit/architecture/no-app-server-projection-rpcs.grit rename to scripts/grit/runtime/no-app-server-projection-rpcs.grit diff --git a/scripts/grit/architecture/no-state-module-side-effects.grit b/scripts/grit/runtime/no-state-module-side-effects.grit similarity index 100% rename from scripts/grit/architecture/no-state-module-side-effects.grit rename to scripts/grit/runtime/no-state-module-side-effects.grit diff --git a/tests/scripts/grit-policy.test.mjs b/tests/scripts/grit-policy.test.mjs index 8c33c4b9..1b1cb54b 100644 --- a/tests/scripts/grit-policy.test.mjs +++ b/tests/scripts/grit-policy.test.mjs @@ -175,7 +175,7 @@ runner = new Runner(() => runner.stop()); expect(pluginDiagnostics(report, "src/plugin-runtime-declared.ts")).toEqual([]); }); - it("keeps chat architecture policies behind their intended boundaries", async () => { + it("keeps chat runtime and DOM policies behind their intended boundaries", async () => { const cwd = await tempBiomeWorkspace([ "no-implicit-dom-bridges.grit", "no-dom-events-imports.grit",