diff --git a/biome.jsonc b/biome.jsonc index a437355f..7afbd8a7 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -60,7 +60,11 @@ }, { "path": "./scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit", - "includes": ["**/src/**/*.{ts,tsx}", "!**/src/app-server/**"] + "includes": ["**/src/**/*.{ts,tsx}", "!**/src/app-server/**", "!**/src/features/chat/app-server/mappers/message-stream/turn-items.ts"] + }, + { + "path": "./scripts/grit/import-boundaries/no-chat-turn-item-non-turn-protocol-imports.grit", + "includes": ["**/src/features/chat/app-server/mappers/message-stream/turn-items.ts"] }, { "path": "./scripts/grit/import-boundaries/no-generated-app-server-boundary-imports.grit", diff --git a/scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit b/scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit index f85aeaaf..b71e2a25 100644 --- a/scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit +++ b/scripts/grit/import-boundaries/no-app-server-protocol-boundary-imports.grit @@ -9,12 +9,7 @@ private pattern js_module_reference() { private pattern app_server_protocol_source() { r"^[\"'](?:(?:\.\./)+app-server/protocol|src/app-server/protocol)/[^/\"']+(?:/.*)?[\"']$" } -private pattern turn_protocol_source() { r"^[\"'](?:(?:\.\./)+app-server/protocol/turn|src/app-server/protocol/turn)(?:/.*)?[\"']$" } - js_module_reference() as $stmt where { - $stmt <: contains `$source` where { - $source <: app_server_protocol_source(), - not { $filename <: r".*/src/features/chat/app-server/mappers/message-stream/turn-items\.ts$", $source <: turn_protocol_source() } - }, + $stmt <: contains `$source` where { $source <: app_server_protocol_source() }, register_diagnostic(span=$stmt, message="Source modules outside root src/app-server must use domain models and app-server services instead of app-server protocol modules. Chat turn-item conversion may consume turn protocol at its app-server boundary; feature state and UI must use Panel-owned models.", severity="error") } diff --git a/scripts/grit/import-boundaries/no-chat-turn-item-non-turn-protocol-imports.grit b/scripts/grit/import-boundaries/no-chat-turn-item-non-turn-protocol-imports.grit new file mode 100644 index 00000000..8e6dce98 --- /dev/null +++ b/scripts/grit/import-boundaries/no-chat-turn-item-non-turn-protocol-imports.grit @@ -0,0 +1,17 @@ +language js + +private pattern js_module_reference() { + or { + JsImport(), + JsImportCallExpression() + } +} + +private pattern app_server_protocol_source() { r"^[\"'](?:(?:\.\./)+app-server/protocol|src/app-server/protocol)/[^/\"']+(?:/.*)?[\"']$" } + +private pattern turn_protocol_source() { r"^[\"'](?:(?:\.\./)+app-server/protocol/turn|src/app-server/protocol/turn)(?:/.*)?[\"']$" } + +js_module_reference() as $stmt where { + $stmt <: contains `$source` where { $source <: app_server_protocol_source(), not { $source <: turn_protocol_source() } }, + register_diagnostic(span=$stmt, message="Source modules outside root src/app-server must use domain models and app-server services instead of app-server protocol modules. Chat turn-item conversion may consume turn protocol at its app-server boundary; feature state and UI must use Panel-owned models.", severity="error") +} diff --git a/tests/scripts/grit-policy.test.mjs b/tests/scripts/grit-policy.test.mjs index c2748d19..0eb02a33 100644 --- a/tests/scripts/grit-policy.test.mjs +++ b/tests/scripts/grit-policy.test.mjs @@ -1156,6 +1156,7 @@ async function createAppServerBoundaryPolicyReport() { const cwd = await tempBiomeWorkspace([ "no-generated-app-server-boundary-imports.grit", "no-app-server-protocol-boundary-imports.grit", + "no-chat-turn-item-non-turn-protocol-imports.grit", "no-domain-outer-layer-imports.grit", "no-lower-level-feature-imports.grit", "no-app-server-connection-boundary-imports.grit",