A modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. It's fast!
This report summarizes scanner evidence for vbenjs/vue-vben-admin, a TypeScript project with 33,718 GitHub stars. SynthScan examined 183,307 lines of code across 1935 source files, recording 119 pattern matches distributed across 4 syntactic categories. The legacy adjusted pattern signal is 0.7 (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? 66 finding(s).
Are imports declared and package/API names verified? 53 finding(s).
Are wrappers, guards, and repeated structures necessary? 46 finding(s).
Which changes need focused human review? 119 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 119 distinct pattern matches across 4 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 | playground/src/locales/langs/zh-CN/demos.json | 95 | "placeholder": "请输入看板标题" | CODE |
| LOW | playground/src/locales/langs/zh-CN/system.json | 15 | "placeholder": "搜索部门..." | CODE |
| LOW | playground/src/locales/langs/zh-TW/demos.json | 95 | "placeholder": "請輸入看板標題" | CODE |
| LOW | playground/src/locales/langs/zh-TW/system.json | 15 | "placeholder": "搜尋部門..." | CODE |
| LOW | playground/src/locales/langs/en-US/demos.json | 95 | "placeholder": "Please enter the report title" | CODE |
| LOW | playground/src/locales/langs/en-US/system.json | 15 | "placeholder": "Search Department..." | CODE |
| LOW | docs/src/components/common-ui/vben-form.md | 412 | await formApi.setValues({ email: 'user@example.com' }); | CODE |
| LOW | docs/src/en/components/common-ui/vben-form.md | 254 | await formApi.setValues({ email: 'user@example.com' }); | CODE |
| LOW | packages/locales/src/langs/zh-CN/ui.json | 27 | "placeholder": { | CODE |
| LOW | packages/locales/src/langs/zh-CN/ui.json | 50 | "placeholder": "选择一个图标", | CODE |
| LOW | packages/locales/src/langs/zh-CN/ui.json | 65 | "placeholder": "请输入内容...", | CODE |
| LOW | packages/locales/src/langs/zh-CN/ui.json | 154 | "placeholder": "请输入锁屏密码", | CODE |
| LOW | packages/locales/src/langs/zh-CN/preferences.json | 241 | "placeholder": "请输入报表默认标题" | CODE |
| LOW | packages/locales/src/langs/zh-TW/ui.json | 27 | "placeholder": { | CODE |
| LOW | packages/locales/src/langs/zh-TW/ui.json | 50 | "placeholder": "選擇一個圖示", | CODE |
| LOW | packages/locales/src/langs/zh-TW/ui.json | 65 | "placeholder": "請輸入內容...", | CODE |
| LOW | packages/locales/src/langs/zh-TW/ui.json | 154 | "placeholder": "請輸入鎖屏密碼", | CODE |
| LOW | packages/locales/src/langs/zh-TW/preferences.json | 241 | "placeholder": "請輸入報表預設標題" | CODE |
| LOW | packages/locales/src/langs/en-US/ui.json | 27 | "placeholder": { | CODE |
| LOW | packages/locales/src/langs/en-US/ui.json | 50 | "placeholder": "Select an icon", | CODE |
| LOW | packages/locales/src/langs/en-US/ui.json | 65 | "placeholder": "Please enter content...", | CODE |
| LOW | packages/locales/src/langs/en-US/ui.json | 154 | "placeholder": "Please enter password", | CODE |
| LOW | packages/locales/src/langs/en-US/preferences.json | 241 | "placeholder": "Please enter the default report title" | CODE |
| LOW | packages/stores/src/modules/user.test.ts | 13 | const userInfo: any = { name: 'Jane Doe', roles: [{ value: 'user' }] }; | CODE |
| LOW | …/layouts/src/widgets/preferences/blocks/input-item.vue | 62 | :placeholder="placeholder" | CODE |
| LOW | …layouts/src/widgets/preferences/blocks/select-item.vue | 67 | <SelectValue :placeholder="placeholder" /> | CODE |
| LOW | …core/ui-kit/shadcn-ui/src/components/select/select.vue | 32 | <SelectValue class="flex-auto text-left" :placeholder="placeholder" /> | CODE |
| LOW | …core/ui-kit/form-ui/__tests__/form-integration.test.ts | 607 | expect(details.attributes('placeholder')).toBe('resolved'); | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/types.ts | 118 | | 'placeholder' | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 32 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 39 | await storageManager.setItem('user1', { age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 40 | await storageManager.setItem('user2', { age: 25, name: 'Jane Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 47 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }, 1000); // 1秒过期 | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 55 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }, 10_000); // 10秒过期 | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 59 | expect(user).toEqual({ age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 68 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 69 | await storageManager.setItem('user', { age: 25, name: 'Jane Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 71 | expect(user).toEqual({ age: 25, name: 'Jane Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 75 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 78 | expect(user).toEqual({ age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 82 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }, 1000); // 1秒过期 | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 89 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }, 10_000); // 10秒过期 | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 92 | expect(user).toEqual({ age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 96 | await storageManager.setItem('user1', { age: 30, name: 'John Doe' }, 1000); // 1秒过期 | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 97 | await storageManager.setItem('user2', { age: 25, name: 'Jane Doe' }, 2000); // 2秒过期 | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 103 | expect(user2).toEqual({ age: 25, name: 'Jane Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 107 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 111 | expect(user).toEqual({ age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 115 | await storageManager.setItem('user1', { age: 30, name: 'John Doe' }); | CODE |
| LOW⚡ | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 116 | await storageManager.setItem('user2', { age: 25, name: 'Jane Doe' }); | CODE |
| LOW | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 18 | await storageManager.setItem('user', { age: 30, name: 'John Doe' }); | CODE |
| LOW | …ase/shared/src/cache/__tests__/storage-manager.test.ts | 20 | expect(user).toEqual({ age: 30, name: 'John Doe' }); | CODE |
| LOW | apps/backend-mock/api/demo/bigint.ts | 17 | "name": "John Doe", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | playground/__tests__/e2e/layout-system.spec.ts | 71 | async function getSidebarTransitionDuration( | CODE |
| LOW | playground/__tests__/e2e/common/layout-performance.ts | 142 | async function measureSidebarPerformance( | CODE |
| LOW | playground/src/views/examples/drawer/index.vue | 125 | function openTypedDataExplicitDrawer() { | CODE |
| LOW | playground/src/views/examples/drawer/index.vue | 134 | function openTypedDataFactoryDrawer() { | CODE |
| LOW | playground/src/views/examples/form/custom.vue | 137 | function handleToggleDynamicComponent() { | CODE |
| LOW | playground/src/views/examples/modal/index.vue | 144 | function openTypedDataExplicitModal() { | CODE |
| LOW | playground/src/views/examples/modal/index.vue | 153 | function openTypedDataFactoryModal() { | CODE |
| LOW | internal/vite-config/src/plugins/inject-metadata.ts | 29 | async function resolveMonorepoDependencies() { | CODE |
| LOW | internal/vite-config/src/plugins/tailwind-reference.ts | 14 | export function viteTailwindReferencePlugin(): Plugin { | CODE |
| LOW | internal/vite-config/src/plugins/vxe-table.ts | 5 | async function viteVxeTableImportsPlugin(): Promise<PluginOption> { | CODE |
| LOW | …onfig/src/plugins/form-field-slot-migration-warning.ts | 6 | function viteFormFieldSlotMigrationWarningPlugin(): Plugin { | CODE |
| LOW | …al/vite-config/src/plugins/inject-app-loading/index.ts | 14 | async function viteInjectAppLoadingPlugin( | CODE |
| LOW | …al/vite-config/src/plugins/inject-app-loading/index.ts | 54 | async function getLoadingRawByHtmlTemplate(loadingTemplate: string) { | CODE |
| LOW | scripts/vsh/src/code-workspace/index.ts | 65 | function defineCodeWorkspaceCommand(cac: CAC) { | CODE |
| LOW | scripts/vsh/src/check-circular/index.ts | 49 | async function detectCircularDependencies({ | CODE |
| LOW | scripts/vsh/src/check-circular/index.ts | 193 | function defineCheckCircularCommand(cac: CAC): void { | CODE |
| LOW | packages/preferences/src/index.ts | 15 | function defineOverridesPreferences(preferences: DeepPartial<Preferences>) { | CODE |
| LOW | packages/utils/src/helpers/generate-routes-backend.ts | 14 | function menuHasVisibleWithForbidden(route: RouteRecordRaw): boolean { | CODE |
| LOW | packages/utils/src/helpers/generate-routes-frontend.ts | 50 | function menuHasVisibleWithForbidden(route: RouteRecordRaw) { | CODE |
| LOW | packages/effects/plugins/src/tiptap/extensions.ts | 403 | export function createDefaultTiptapExtensions( | CODE |
| LOW | packages/effects/layouts/src/basic/layout.vue | 212 | function clearPreferencesAndLogout() { | CODE |
| LOW | packages/effects/layouts/src/basic/header/header.vue | 256 | function clearPreferencesAndLogout() { | CODE |
| LOW | …layouts/src/widgets/preferences/preferences-button.vue | 12 | function clearPreferencesAndLogout() { | CODE |
| LOW | …layouts/src/widgets/preferences/preferences-drawer.vue | 386 | function handleCustomPreferencesUpdate(updates: CustomPreferencesRecord) { | CODE |
| LOW | …ts/layouts/src/widgets/user-dropdown/user-dropdown.vue | 301 | function handleLanguageToggleSelect(event?: Event) { | CODE |
| LOW | packages/effects/hooks/src/use-design-tokens.ts | 163 | export function useElementPlusDesignTokens() { | CODE |
| LOW | …es/@core/composables/src/use-layout-viewport-height.ts | 7 | function supportsDynamicViewportHeight() { | CODE |
| LOW | …es/@core/composables/src/use-layout-viewport-height.ts | 40 | function scheduleApplyViewportHeight() { | CODE |
| LOW | …ages/@core/ui-kit/layout-ui/src/header-scroll-state.ts | 10 | export function resolveHeaderHiddenOnScroll({ | CODE |
| LOW | packages/@core/ui-kit/layout-ui/src/vben-layout.vue | 519 | function updateHeaderVisibilityFromMouse(mouseY: null | number) { | CODE |
| LOW | packages/@core/ui-kit/layout-ui/src/vben-layout.vue | 552 | function resolveHeaderVisibilityOnScroll() { | CODE |
| LOW | packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue | 392 | function computeIndeterminateKeysInSelection( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/use-form-context.ts | 42 | function normalizeSchemaForDefaults(rule: ZodType): ZodType { | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-runtime.ts | 62 | function registerValidationInvalidator( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-runtime.ts | 81 | function invalidateFieldValidation(fieldName: string) { | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-runtime-field.ts | 16 | export function createRuntimeFieldComponent( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/field-name.ts | 41 | export function resolveChildUpdateFieldName( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/field-name.ts | 76 | export function resolveValueFormatFieldName( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-render/schema.ts | 123 | function wrapRenderComponentContent( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-render/schema.ts | 203 | function createArrayComponentProps( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-render/schema.ts | 341 | export function resolveArrayChildFieldName(rowPath: string, fieldName: string) { | CODE |
| LOW | …s/@core/ui-kit/form-ui/src/form-render/dependencies.ts | 115 | async function resolveLegacyDependencies( | CODE |
| LOW | …es/@core/ui-kit/form-ui/src/form-render/form-field.vue | 319 | function conflictsWithFormProperty(fieldName: string): boolean { | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-render/helper.ts | 45 | export function getDefaultValueInZodStack( | CODE |
| LOW | packages/@core/ui-kit/form-ui/src/form-render/form.vue | 151 | function isNormalizedFormGroupSchema( | CODE |
| LOW | apps/backend-mock/utils/cookie-utils.ts | 25 | export function getRefreshTokenFromCookie(event: H3Event<EventHandlerRequest>) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lefthook.yml | 1 | # EXAMPLE USAGE: | COMMENT |
| LOW | lefthook.yml | 21 | # parallel: true | COMMENT |
| LOW | playground/playwright.config.ts | 41 | // name: 'webkit', | COMMENT |
| LOW | playground/playwright.config.ts | 61 | /* Test against branded browsers. */ | COMMENT |
| LOW | playground/src/views/_core/authentication/login.vue | 41 | // if (findItem) { | COMMENT |
| LOW | internal/lint-configs/eslint-config/src/configs/vue.ts | 21 | { | COMMENT |
| LOW | docs/src/demos/vben-vxe-table/tree/index.vue | 21 | // { | COMMENT |
| LOW | docs/src/demos/vben-vxe-table/remote/index.vue | 21 | // 数据实例 | COMMENT |
| LOW | scripts/turbo-run/src/run.ts | 61 | * @param packages | COMMENT |
| LOW | packages/@core/ui-kit/popup-ui/src/modal/modal.vue | 141 | const { offsetX, offsetY } = transform; | COMMENT |
| LOW | packages/@core/ui-kit/menu-ui/src/components/menu.vue | 641 | // } | COMMENT |
| LOW | packages/@core/base/shared/src/cache/README.md | 41 | //new StorageManager({ driver: new IndexedDBDriver(), prefix: 'app' }); | COMMENT |
| LOW | packages/@core/base/shared/src/utils/diff.ts | 21 | // 比较两个数组是否相等(顺序敏感) | COMMENT |
| LOW | packages/@core/base/shared/src/utils/diff.ts | 41 | COMMENT | |
| LOW | .github/workflows/codeql.yml | 1 | # For most projects, this workflow file will not need changing; you simply need | COMMENT |
| LOW | .github/workflows/codeql.yml | 61 | COMMENT | |
| LOW | apps/web-tdesign/src/bootstrap.ts | 21 | async function bootstrap(namespace: string) { | COMMENT |
| LOW | apps/web-ele/src/bootstrap.ts | 21 | // 初始化组件适配器 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | playground/src/views/examples/json-viewer/data.ts | 8 | additionalNotes: 'This JSON is used for demonstration purposes', | CODE |
| MEDIUM | .github/workflows/codeql.yml | 56 | # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how | COMMENT |