A flow chart editing framework focus on business customization. 专注于业务自定义的流程图编辑框架,支持实现脑图、ER图、UML、工作流等各种图编辑场景。
This report summarizes scanner evidence for didi/LogicFlow, a TypeScript project with 11,763 GitHub stars. SynthScan examined 161,597 lines of code across 1178 source files, recording 111 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 0.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 103 finding(s).
Are imports declared and package/API names verified? 8 finding(s).
Are wrappers, guards, and repeated structures necessary? 28 finding(s).
Which changes need focused human review? 111 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 111 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sites/docs/.dumirc.ts | 261 | companyGallery: { | COMMENT |
| LOW | sites/docs/.dumirc.ts | 281 | // img: 'https://cdn.jsdelivr.net/gh/Logic-Flow/static@latest/docs/homepage/MTLogo.svg', | COMMENT |
| LOW | sites/docs/.dumirc.ts | 301 | // img: 'https://cdn.jsdelivr.net/gh/Logic-Flow/static@latest/docs/homepage/HXLogo.svg', | COMMENT |
| LOW | sites/docs/docs/api/type/MainTypes.zh.md | 361 | // x: 100, | COMMENT |
| LOW | …s/docs/examples/extension/native/demo/dynamicGroup.tsx | 41 | icon: 'https://cdn.jsdelivr.net/gh/Logic-Flow/static@latest/docs/examples/extension/group/circle.png', | COMMENT |
| LOW | sites/docs/examples/graph/basic/demo/graph.tsx | 501 | // isSilentMode: true, | COMMENT |
| LOW | sites/docs/examples/graph/basic/demo/graph.tsx | 521 | // callback: () => { | COMMENT |
| LOW | sites/docs/examples/graph/basic/demo/graph.tsx | 541 | // size: 1, | COMMENT |
| LOW | sites/docs/examples/showcase/bussiness/demo/approve.tsx | 541 | // .node-panel { | COMMENT |
| LOW | sites/docs/examples/showcase/bussiness/demo/approve.tsx | 561 | // .node-jugement .node-label { | COMMENT |
| LOW | sites/docs/examples/showcase/bussiness/demo/approve.tsx | 581 | // .property-panel-footer .property-panel-footer-hide { | COMMENT |
| LOW | …mples/src/components/nodes/freeAnchor-circle/index.tsx | 61 | // canvasOverlayPosition: { x, y }, | COMMENT |
| LOW | …feature-examples/src/pages/nodes/custom/rect/index.tsx | 21 | }, | COMMENT |
| LOW | …s/feature-examples/src/pages/nodes/custom/pool/data.ts | 1 | // const data = { | COMMENT |
| LOW | …s/feature-examples/src/pages/nodes/custom/pool/data.ts | 21 | // width: 300, | COMMENT |
| LOW | examples/feature-examples/src/pages/graph/index.tsx | 61 | // }, | COMMENT |
| LOW | examples/feature-examples/src/pages/graph/index.tsx | 81 | // }, | COMMENT |
| LOW | examples/feature-examples/src/pages/graph/index.tsx | 101 | // lineHeight: 1.5, | COMMENT |
| LOW | examples/feature-examples/src/pages/graph/index.tsx | 621 | container: containerRef.current as HTMLElement, | COMMENT |
| LOW | …/feature-examples/src/pages/extensions/group/index.tsx | 101 | y: 400, | COMMENT |
| LOW | examples/feature-examples/src/pages/theme/config.ts | 41 | }, | COMMENT |
| LOW | examples/feature-examples/src/pages/theme/config.ts | 61 | // radius: 20, | COMMENT |
| LOW | examples/feature-examples/src/pages/theme/config.ts | 101 | startArrowType: 'hollow', | COMMENT |
| LOW | examples/feature-examples/src/pages/theme/config.ts | 121 | // type: 'polyline', | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 181 | // }, | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 201 | // x: 580, | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 221 | // ], | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 241 | // y: 197, | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 261 | // ], | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 281 | // // y: 458, | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 301 | // // ], | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 321 | // // y: 114, | COMMENT |
| LOW | …ure-examples/src/pages/edges/custom/polyline/index.tsx | 341 | // // { | COMMENT |
| LOW | examples/feature-examples/src/pages/grid/index.tsx | 21 | // circle: { | COMMENT |
| LOW | examples/material-ui-demo/src/serviceWorker.js | 1 | // This optional code is used to register a service worker. | COMMENT |
| LOW | …ples/vue3-app/src/components/chart/nodes/FirstGroup.ts | 1 | import { GroupNode, GroupNodeModel } from '@logicflow/extension' | COMMENT |
| LOW | …les/vue3-app/src/components/chart/nodes/MiddleGroup.ts | 1 | import { GroupNode, GroupNodeModel } from '@logicflow/extension' | COMMENT |
| LOW | …es/vue3-app/src/components/chart/nodes/LandingGroup.ts | 1 | import { GroupNode, GroupNodeModel } from '@logicflow/extension' | COMMENT |
| LOW | examples/vue3-app/src/views/LogicFlowView.vue | 121 | const lf = new LogicFlow({ | COMMENT |
| LOW | examples/vue3-app/src/views/LogicFlowView.vue | 141 | allowResize: false, | COMMENT |
| LOW | examples/vue3-app/src/views/PerformanceNode.vue | 161 | // const timer = setInterval(() => { | COMMENT |
| LOW | examples/vue3-app/src/views/LFChartView.vue | 61 | properties: { | COMMENT |
| LOW | examples/vue3-app/src/views/LFChartView.vue | 81 | // x: 0, | COMMENT |
| LOW | examples/vue3-app/src/views/LFChartView.vue | 101 | // x: 0, | COMMENT |
| LOW | examples/vue3-app/src/views/LFChartView.vue | 121 | // type: 'defaultNode', | COMMENT |
| LOW | examples/next-app/src/app/page.tsx | 141 | // isSilentMode: true, | COMMENT |
| LOW | examples/next-app/src/app/page.tsx | 161 | // const r = window.confirm("确定要删除吗?"); | COMMENT |
| LOW | …r-examples/src/pages/extension/dynamic-group/index.tsx | 301 | // 'properties': {}, | COMMENT |
| LOW | …r-examples/src/pages/extension/dynamic-group/index.tsx | 321 | // 'text': { | COMMENT |
| LOW | …r-examples/src/pages/extension/dynamic-group/index.tsx | 341 | // '37869799-e2ee-45b8-9150-b38ccc8e65d3', | COMMENT |
| LOW | …r-examples/src/pages/extension/dynamic-group/index.tsx | 361 | // 'x': 552, | COMMENT |
| LOW | …ples/engine-browser-examples/src/pages/graph/index.tsx | 161 | container: containerRef.current as HTMLElement, | COMMENT |
| LOW | …ples/engine-browser-examples/src/pages/graph/index.tsx | 181 | keyboard: { | COMMENT |
| LOW | …/engine-browser-examples/src/pages/engine/Recorder.tsx | 41 | // 获取执行记录 | COMMENT |
| LOW | …/engine-browser-examples/src/pages/engine/Recorder.tsx | 61 | // expect(executionIds.length).toBe(1); | COMMENT |
| LOW | packages/react-node-registry/src/view.ts | 161 | COMMENT | |
| LOW | packages/react-node-registry/src/view.ts | 181 | // } | COMMENT |
| LOW | packages/core/src/util/node.ts | 481 | // Text 相关节点工具函数 | COMMENT |
| LOW | packages/core/src/history/index.ts | 81 | this.undos.push(model.modelToGraphData()) | COMMENT |
| LOW | …es/extension/__test__/bpmn-elements/definition.test.ts | 21 | COMMENT | |
| 11 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …kages/extension/src/bpmn-elements/presets/Pool/Lane.ts | 60 | const groupId = this.props.graphModel.group.nodeGroupMap.get(id) | CODE |
| CRITICAL | …kages/extension/src/bpmn-elements/presets/Pool/Lane.ts | 107 | const groupId = this.props.graphModel.group.nodeGroupMap.get(id) | CODE |
| CRITICAL | …kages/extension/src/bpmn-elements/presets/Pool/Lane.ts | 154 | const groupId = this.props.graphModel.group.nodeGroupMap.get(id) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …specs/2026-06-26-dynamic-group-resize-bounds-design.md | 130 | export function isGroupBoundsContainsChildren( | CODE |
| LOW | …ocs/src/tutorial/extension/proximity-connect/index.tsx | 88 | export default function ProximityConnectExtension() { | CODE |
| LOW | …mples/src/pages/extensions/proximity-connect/index.tsx | 110 | export default function ProximityConnectExtension() { | CODE |
| LOW | …ples/src/pages/edges/custom/rounded-rect-nan/index.tsx | 178 | export default function RoundedRectNaNReproduction() { | CODE |
| LOW | …ples/src/pages/edges/custom/animate-polyline/index.tsx | 15 | export default function customAnimatePolylineEdge() { | CODE |
| LOW | …gression/src/components/LayoutFormatEscapeControls.tsx | 28 | export default function LayoutFormatEscapeControls({ lf, loadGraph }: Props) { | CODE |
| LOW | …dynamic-group-regression/src/scenarios/resizeBounds.ts | 101 | export function syncResizeBoundsMembership(lf: LogicFlow) { | CODE |
| LOW | packages/core/src/algorithm/rotate.ts | 25 | export function calculatePointAfterRotateAngle( | CODE |
| LOW | packages/extension/__test__/dynamic-group/fixtures.ts | 38 | export function graphWithSingleExternalEdge() { | CODE |
| LOW | packages/extension/__test__/dynamic-group/fixtures.ts | 69 | export function graphWithGatewayDualBranch() { | CODE |
| LOW | …on/__test__/dynamic-group/auto-resize-collapse.test.ts | 15 | function simulateAutoResizeAfterDrag( | CODE |
| LOW | …es/extension/__test__/dynamic-group/membership.test.ts | 37 | function graphLockedGroupWithChild() { | CODE |
| LOW | …extension/__test__/dynamic-group/resize-bounds.test.ts | 16 | function simulateAutoResizeAfterDrag( | CODE |
| LOW | packages/extension/__test__/pool/fixtures.ts | 25 | export function createHorizontalPoolGraph() { | CODE |
| LOW | packages/extension/__test__/pool/fixtures.ts | 127 | export function createPoolGraphWithNodeInLane() { | CODE |
| LOW | packages/extension/src/tools/label/mediumEditor.ts | 42 | export function createColorPickerButtonClass(MediumEditor?: any) { | CODE |
| LOW | packages/extension/src/NodeResize/control/Util.ts | 130 | export function getEllipseResizeEdgePoint({ point, beforeNode, afterNode }) { | CODE |
| LOW | packages/extension/src/NodeResize/control/Util.ts | 168 | export function getDiamondResizeEdgePoint({ point, beforeNode, afterNode }) { | CODE |
| LOW | packages/extension/src/turbo-adapter/index.ts | 39 | function convertNodeToTurboElement(node) { | CODE |
| LOW | packages/extension/src/turbo-adapter/index.ts | 58 | function convertEdgeToTurboElement(edge) { | CODE |
| LOW | packages/extension/src/dynamic-group/utils.ts | 89 | export function isGroupBoundsContainsChildren( | CODE |
| LOW | packages/extension/src/dynamic-group/utils.ts | 175 | export function getTitleForeignObjectRect(options: { | CODE |
| LOW | …ages/extension/src/bpmn-elements/presets/Task/index.ts | 70 | function isBoundaryEventCloseToTask(task: any, event: any) { | CODE |
| LOW | …/bpmn-elements/presets/Event/IntermediateThrowEvent.ts | 12 | export function IntermediateThrowEventFactory(lf: any): { | CODE |
| LOW | …/bpmn-elements/presets/Event/IntermediateCatchEvent.ts | 12 | export function IntermediateCatchEventFactory(lf: any): { | CODE |
| LOW | packages/layout/__test__/group-layout.test.ts | 29 | function expectNodeCenterInsideGroup( | CODE |
| LOW | packages/layout/src/utils/groupLayout.ts | 220 | export function createGroupLayoutWarningState(): GroupLayoutWarningState { | CODE |
| LOW | packages/layout/src/utils/groupLayout.ts | 404 | export function applyGroupResizeAndWarnings( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …amples/material-ui-demo/src/views/layout/Typography.js | 56 | subtitle1. Lorem ipsum dolor sit connecter adieu siccing eliot. Quos blanditiis tenetur | CODE |
| LOW | …amples/material-ui-demo/src/views/layout/Typography.js | 61 | subtitle2. Lorem ipsum dolor sit connecter adieu siccing eliot. Quos blanditiis tenetur | CODE |
| LOW | …amples/material-ui-demo/src/views/layout/Typography.js | 72 | body1. Lorem ipsum dolor sit connecter adieu siccing eliot. Quos blanditiis tenetur unde suscipit, quam | CODE |
| LOW | …amples/material-ui-demo/src/views/layout/Typography.js | 78 | body2. Lorem ipsum dolor sit connecter adieu siccing eliot. Quos blanditiis tenetur unde suscipit, quam | CODE |
| LOW | examples/material-ui-demo/src/views/edges/index.js | 12 | Lorem ipsum dolor sit amen, consenter nipissing eli, sed do elusion tempos incident ut laborers et doolie magna al | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/extension/src/bpmn-elements/presets/Flow/manhattan.ts | 506 | // Step 1: Convert perpendicular segments to straight lines | COMMENT |
| LOW | …/extension/src/bpmn-elements/presets/Flow/manhattan.ts | 525 | // Step 2: Douglas-Peucker algorithm to remove redundant points | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/extension/src/bpmn-elements/presets/Flow/manhattan.ts | 506 | // Step 1: Convert perpendicular segments to straight lines | COMMENT |
| LOW | …/extension/src/bpmn-elements/presets/Flow/manhattan.ts | 525 | // Step 2: Douglas-Peucker algorithm to remove redundant points | COMMENT |