mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-19 13:59:28 +00:00
## Summary - Add `import-x/no-restricted-paths` ESLint rule enforcing the `base → platform → workbench → renderer` layer hierarchy - Set to `error` with eslint-disable comments on existing violations (~11 suppressions) - Consolidate zone definitions using array syntax for `from`/`target` - Add `layer-audit` Claude skill for auditing violations - Fix knip false positive for `zod` dependency in ingest-types ## Context Ref: https://github.com/Comfy-Org/ComfyUI_frontend/pull/10021#discussion_r2939392141 The codebase is migrating toward a layered architecture. This adds static enforcement so new violations are caught in PR CI. ### Layer rules | Layer | Can import from | |---|---| | `base/` | nothing | | `platform/` | `base/` | | `workbench/` | `platform/`, `base/` | | `renderer/` | `workbench/`, `platform/`, `base/` | ### Current violations (pre-existing, suppressed with eslint-disable) | Direction | Count | |---|---| | base → platform | 2 | | platform → workbench | 3 | | platform → renderer | 5 | | workbench → renderer | 1 | ## Test plan - [x] `pnpm lint` passes (0 errors, 0 warnings) - [x] `pnpm typecheck` passes - [x] `pnpm knip` passes - [ ] CI green --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
46 lines
1.7 KiB
TypeScript
46 lines
1.7 KiB
TypeScript
import { LiteGraph } from '@/lib/litegraph/src/litegraph'
|
|
import type { LGraph } from '@/lib/litegraph/src/litegraph'
|
|
import { useNodeReplacementStore } from '@/platform/nodeReplacement/nodeReplacementStore'
|
|
import { useExecutionErrorStore } from '@/stores/executionErrorStore'
|
|
import type { MissingNodeType } from '@/types/comfy'
|
|
import {
|
|
collectAllNodes,
|
|
getExecutionIdByNode
|
|
} from '@/utils/graphTraversalUtil'
|
|
// eslint-disable-next-line import-x/no-restricted-paths
|
|
import { getCnrIdFromNode } from '@/workbench/extensions/manager/utils/missingNodeErrorUtil'
|
|
|
|
/** Scan the live graph for unregistered node types and build a full MissingNodeType list. */
|
|
function scanMissingNodes(rootGraph: LGraph): MissingNodeType[] {
|
|
const nodeReplacementStore = useNodeReplacementStore()
|
|
const missingNodeTypes: MissingNodeType[] = []
|
|
|
|
const allNodes = collectAllNodes(rootGraph)
|
|
|
|
for (const node of allNodes) {
|
|
const originalType = node.last_serialization?.type ?? node.type ?? 'Unknown'
|
|
|
|
if (originalType in LiteGraph.registered_node_types) continue
|
|
|
|
const cnrId = getCnrIdFromNode(node)
|
|
const replacement = nodeReplacementStore.getReplacementFor(originalType)
|
|
const executionId = getExecutionIdByNode(rootGraph, node)
|
|
|
|
missingNodeTypes.push({
|
|
type: originalType,
|
|
nodeId: executionId ?? String(node.id),
|
|
cnrId,
|
|
isReplaceable: replacement !== null,
|
|
replacement: replacement ?? undefined
|
|
})
|
|
}
|
|
|
|
return missingNodeTypes
|
|
}
|
|
|
|
/** Re-scan the graph for missing nodes and update the error store. */
|
|
export function rescanAndSurfaceMissingNodes(rootGraph: LGraph): void {
|
|
const types = scanMissingNodes(rootGraph)
|
|
useExecutionErrorStore().surfaceMissingNodes(types)
|
|
}
|