An open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作
This report summarizes scanner evidence for siyuan-note/siyuan, a TypeScript project with 46,710 GitHub stars. SynthScan examined 906,337 lines of code across 3920 source files, recording 1270 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 4.8 (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.
Can maintainers explain intent, assumptions, and trade-offs? 932 finding(s).
Are imports declared and package/API names verified? 324 finding(s).
Are wrappers, guards, and repeated structures necessary? 124 finding(s).
Which changes need focused human review? 1270 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 1270 distinct pattern matches across 11 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 |
|---|---|---|---|---|
| CRITICAL | app/tests/newRefDocAtPath.test.js | 198 | assert.equal(f.hint.element.lastElementChild.innerHTML.includes("newFileAtPath"), true); | CODE |
| CRITICAL | app/stage/protyle/js/mermaid/mermaid-zenuml.min.js | 23 | `?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:n,tokens:this.lexer.inline(n)}}}text(t){let e=this.rules.b | CODE |
| CRITICAL | app/stage/protyle/js/mermaid/mermaid-zenuml.min.js | 34 | `+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=s.text):e.push(n);continue}if(t){let a=" | CODE |
| CRITICAL | app/stage/protyle/js/echarts/echarts-gl.min.js | 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("echarts")):"function"==typeof | CODE |
| CRITICAL | app/src/card/openCard.ts | 886 | options.editor.protyle.element.classList.remove("fn__none"); | CODE |
| CRITICAL | app/src/card/openCard.ts | 887 | options.editor.protyle.element.nextElementSibling.classList.add("fn__none"); | CODE |
| CRITICAL | app/src/card/viewCards.ts | 345 | edit.protyle.element.nextElementSibling.classList.remove("fn__none"); | CODE |
| CRITICAL | app/src/card/viewCards.ts | 349 | edit.protyle.element.nextElementSibling.classList.add("fn__none"); | CODE |
| CRITICAL | app/src/boot/onGetConfig.ts | 141 | if (window.siyuan.menus.menu.element.classList.contains("fn__none") && | CODE |
| CRITICAL | app/src/boot/onGetConfig.ts | 275 | if (window.siyuan.config.export.pdfFooter.trim()) { | CODE |
| CRITICAL | app/src/boot/globalEvent/mousemove.ts | 82 | item.protyle.breadcrumb.element.classList.remove("protyle-breadcrumb__bar--hide"); | CODE |
| CRITICAL | app/src/boot/globalEvent/mousemove.ts | 206 | if (item.editor.protyle.wysiwyg.element.contains(eventPath0)) { | CODE |
| CRITICAL | app/src/boot/globalEvent/keydown.ts | 1655 | if (!window.siyuan.menus.menu.element.classList.contains("fn__none")) { | CODE |
| CRITICAL | app/src/boot/globalEvent/searchKeydown.ts | 85 | if (!window.siyuan.menus.menu.element.classList.contains("fn__none")) { | CODE |
| CRITICAL | app/src/boot/globalEvent/searchKeydown.ts | 217 | if (!window.siyuan.menus.menu.element.classList.contains("fn__none")) { | CODE |
| CRITICAL | app/src/boot/globalEvent/searchKeydown.ts | 255 | currentList.parentElement.nextElementSibling.nextElementSibling.firstElementChild.classList.add("b3- | CODE |
| CRITICAL | app/src/boot/globalEvent/searchKeydown.ts | 292 | currentList.parentElement.previousElementSibling.previousElementSibling.lastElementChild.classList.a | CODE |
| CRITICAL⚡ | app/src/boot/globalEvent/click.ts | 15 | if (!window.siyuan.menus.menu.element.contains(element) && !hasClosestByAttribute(element, "data-menu", "true")) { | CODE |
| CRITICAL⚡ | app/src/boot/globalEvent/click.ts | 16 | if (getSelection().rangeCount > 0 && window.siyuan.menus.menu.element.contains(getSelection().getRangeAt(0).star | CODE |
| CRITICAL⚡ | app/src/boot/globalEvent/click.ts | 17 | window.siyuan.menus.menu.element.contains(document.activeElement)) { | CODE |
| CRITICAL | app/src/boot/globalEvent/click.ts | 95 | !item.pdfObject.appConfig.appContainer.classList.contains("fn__none")) { | CODE |
| CRITICAL | app/src/boot/globalEvent/command/protyle.ts | 19 | updateReadonly(options.protyle.breadcrumb.element.parentElement.querySelector('.block__icon[data-type="readonly" | CODE |
| CRITICAL | app/src/asset/pdf/app.js | 2855 | if (([92, 91, 68].includes(evt.keyCode) || evt.ctrlKey || evt.altKey) && pdfInstance.appConfig.toolbar.rectAnno.clas | CODE |
| CRITICAL | app/src/asset/pdf/app.js | 2894 | !pdfInstance.appConfig.toolbar.rectAnno.classList.contains('toggled')) { | CODE |
| CRITICAL | app/src/asset/pdf/app.js | 2904 | !pdfInstance.appConfig.toolbar.rectAnno.classList.contains('toggled')) { | CODE |
| CRITICAL | app/src/util/reloadSync.ts | 62 | window.siyuan.mobile.editor.protyle.title.setTitle(response.data.name, response.data.ial[Constants.CUSTO | CODE |
| CRITICAL | app/src/util/pathName.ts | 510 | if (window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_MOVE_PATH_HISTORY) { | CODE |
| CRITICAL | app/src/util/noRelyPCFunction.ts | 49 | window.siyuan.mobile.docks.tag.update(); | CODE |
| CRITICAL | app/src/util/backForward.ts | 180 | stack.protyle.model.parent.parent.switchTab(stack.protyle.model.parent.headElement); | CODE |
| CRITICAL | app/src/util/backForward.ts | 200 | stack.protyle.model.parent.parent.switchTab(stack.protyle.model.parent.headElement, | CODE |
| CRITICAL | app/src/util/backForward.ts | 234 | stack.protyle.model.parent.parent.switchTab(stack.protyle.model.parent.headElement, | CODE |
| CRITICAL | app/src/util/backForward.ts | 258 | if (!blockElement && !stack.zoomId && !stack.protyle.scroll.element.classList.contains("fn__none")) { | CODE |
| CRITICAL | app/src/util/Tree.ts | 354 | item.parentElement.parentElement.nextElementSibling.classList.remove("fn__none"); | CODE |
| CRITICAL | app/src/util/Tree.ts | 359 | item.parentElement.parentElement.nextElementSibling.classList.add("fn__none"); | CODE |
| CRITICAL | app/src/config/tabs/secretsVariablesUi.ts | 80 | saveSecrets(root, window.siyuan.config.secrets.items.filter((item) => item.name !== name)); | CODE |
| CRITICAL | app/src/config/tabs/secretsVariablesUi.ts | 179 | saveVariables(root, window.siyuan.config.variables.items.filter((item) => item.name !== name)); | CODE |
| CRITICAL | app/src/config/tabs/keymapUi.ts | 169 | window.siyuan.ws.app.plugins.forEach((item) => { | CODE |
| CRITICAL | app/src/config/tabs/keymapUi.ts | 723 | window.siyuan.ws.app.plugins.forEach(plugin => { | CODE |
| CRITICAL | app/src/config/tabs/editorTab.ts | 154 | `<div class="fn__pointer b3-chip b3-chip--middle${window.siyuan.config.editor.spellcheckLanguages.includes(item) | CODE |
| CRITICAL | app/src/config/tabs/accessTab.ts | 640 | window.siyuan.config.publish.auth.accounts.push({ | CODE |
| CRITICAL | app/src/config/tabs/accessTab.ts | 684 | window.siyuan.config.publish.auth.accounts.splice(index, 1); | CODE |
| CRITICAL | app/src/config/tabs/appearanceTab.ts | 835 | options: window.siyuan.config.appearance.lightThemes.filter((item) => | CODE |
| CRITICAL | app/src/config/tabs/appearanceTab.ts | 843 | options: window.siyuan.config.appearance.darkThemes.filter((item) => | CODE |
| CRITICAL | app/src/config/tabs/appearanceTab.ts | 877 | options: window.siyuan.config.appearance.icons.map((item) => ({ | CODE |
| CRITICAL | app/src/config/tabs/accessRuntime.ts | 94 | const listItemHtml = window.siyuan.config.publish.auth.accounts.map((account, index) => ` | CODE |
| CRITICAL | app/src/config/tabs/ai/aiUi.ts | 580 | saveMcpServers(root, window.siyuan.config.ai.mcp.servers.filter((item) => item.name !== serverName)); | CODE |
| CRITICAL | app/src/config/tabs/ai/aiUi.ts | 623 | const nextServers = window.siyuan.config.ai.mcp.servers.map((item) => { | CODE |
| CRITICAL | app/src/config/tabs/ai/aiUi.ts | 951 | if (window.siyuan.config.ai.mcp.servers.some((server) => { | CODE |
| CRITICAL | app/src/config/tabs/ai/aiUi.ts | 973 | window.siyuan.config.ai.mcp.servers.find((server) => server.name === serverName); | CODE |
| CRITICAL | app/src/config/tabs/ai/aiProviderUi.ts | 149 | const providerCards = window.siyuan.config.ai.providers.map((provider) => `<div class="b3-card" data-provider-id="${ | CODE |
| CRITICAL | app/src/config/tabs/ai/aiProviderUi.ts | 182 | () => saveProviders(root, window.siyuan.config.ai.providers.filter((item) => item.id !== provider.id)), | CODE |
| CRITICAL | app/src/config/tabs/ai/aiProviderUi.ts | 367 | ? window.siyuan.config.ai.providers.find((provider) => provider.id === providerId) | CODE |
| CRITICAL | app/src/config/tabs/ai/aiProviderUi.ts | 897 | ? window.siyuan.config.ai.providers.map((provider) => provider.id === existing.id ? draft : provider) | CODE |
| CRITICAL | app/src/config/tabs/ai/aiProviderUi.ts | 918 | const provider = window.siyuan.config.ai.providers.find((item) => item.id === providerId); | CODE |
| CRITICAL | app/src/config/tabs/ai/aiProviderUi.ts | 936 | const providers = window.siyuan.config.ai.providers.map((provider) => | CODE |
| CRITICAL⚡ | app/src/config/util/snippets.ts | 161 | target.parentElement.nextElementSibling.firstElementChild.classList.remove("fn__none"); | CODE |
| CRITICAL⚡ | app/src/config/util/snippets.ts | 162 | target.parentElement.nextElementSibling.lastElementChild.classList.add("fn__none"); | CODE |
| CRITICAL⚡ | app/src/config/util/snippets.ts | 166 | target.parentElement.nextElementSibling.firstElementChild.classList.add("fn__none"); | CODE |
| CRITICAL⚡ | app/src/config/util/snippets.ts | 167 | target.parentElement.nextElementSibling.lastElementChild.classList.remove("fn__none"); | CODE |
| CRITICAL | app/src/config/entryVisibility/ui.ts | 536 | ? window.siyuan.config.appearance.entryVisibility.profiles.find((item) => item.id === profileID) | CODE |
| 239 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/stage/protyle/js/highlight.js/styles/agate.min.css | 1 | pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! | COMMENT |
| LOW | app/electron/main.js | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | app/src/asset/pdf/pdf_find_bar.js | 181 | if (total > 0) { | COMMENT |
| LOW | app/src/asset/pdf/ui_utils.js | 341 | * before the first visible element in `views`, but not by too much. (Usually, | COMMENT |
| LOW | app/src/asset/pdf/ui_utils.js | 361 | COMMENT | |
| LOW | app/src/asset/pdf/ui_utils.js | 381 | // Initially assume that we need to find the beginning of the current row | COMMENT |
| LOW | app/src/asset/pdf/viewer.js | 301 | // ) { | COMMENT |
| LOW | app/src/asset/pdf/pdf_history.js | 561 | // In practice, it seems that the event is arriving too late in order for | COMMENT |
| LOW | app/src/asset/pdf/pdf_find_controller.js | 161 | // The goal is to obtain the array: [[0, 0], [3, -1], [4, -2], | COMMENT |
| LOW | app/src/asset/pdf/pdf_viewer.js | 241 | #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); | COMMENT |
| LOW | app/src/asset/pdf/app.js | 441 | background: AppOptions.get("pageColorsBackground"), | COMMENT |
| LOW | app/src/asset/pdf/app.js | 1581 | // NOTE | COMMENT |
| LOW | app/src/asset/pdf/app.js | 2601 | } = this; | COMMENT |
| LOW | app/src/util/iOSPurchase.ts | 21 | // -2:Server communication failed, need to retry 服务器通讯失败,需要重试 | COMMENT |
| LOW | app/src/layout/dock/agent/frontendCapabilities.ts | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | scripts/generate-arch-svg.js | 1 | "use strict"; | COMMENT |
| LOW | kernel/main.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/cmd/closews.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/cmd/cmd.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/cmd/ping.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/block_structure.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/blocktree.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/tree.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/blocktree_fix.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/blocktree_query_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/fold_heading_stack_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/av.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/heading.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/marker.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/block_structure_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/node_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/treenode/node.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/layout_gallery.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/render_template_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/color_render_context_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/color.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/visible_views_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/filter_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/layout_table_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/path_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/date_format_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/av_fix_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/mirror_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/ref_hook.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/layout_card.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/av_search_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/value_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/color_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/card_cover_position_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/context_filter_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/new_item_template.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/number_calc.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/layout.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/sort.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/layout_table.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/sort_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/filter.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/calc.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/value_source_test.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| LOW | kernel/av/group.go | 1 | // SiYuan - From thought to insight, with agents | COMMENT |
| 744 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/src/asset/pdf/ui_utils.js | 345 | function backtrackBeforeAllVisibleElements(index, views, top) { | CODE |
| LOW | app/src/asset/pdf/ui_utils.js | 476 | function isElementBottomAfterViewTop(view) { | CODE |
| LOW | app/src/asset/pdf/ui_utils.js | 482 | function isElementNextAfterViewHorizontally(view) { | CODE |
| LOW | app/src/asset/pdf/ui_utils.js | 594 | function normalizeWheelEventDirection(evt) { | CODE |
| LOW | app/src/asset/pdf/ui_utils.js | 760 | function getActiveOrFocusedElement() { | CODE |
| LOW | app/src/asset/pdf/ui_utils.js | 779 | function apiPageLayoutToViewerModes(layout) { | CODE |
| LOW | app/src/asset/pdf/pdf_viewer.js | 77 | function isValidAnnotationEditorMode(mode) { | CODE |
| LOW | app/src/asset/pdf/app.js | 2055 | function addWindowResolutionChange(evt = null) { | CODE |
| LOW | scripts/test_prepare_release.py | 42 | def test_versions_and_document_update_idempotently(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 56 | def test_invalid_field_leaves_all_files_unchanged(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 63 | def test_explicit_codes_and_downgrade_rejection(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 71 | def test_unchanged_code_for_new_version_is_rejected(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 76 | def test_concurrent_edit_is_preserved(self): | CODE |
| LOW | scripts/test_prepare_release.py | 99 | def test_publish_and_retry_use_committed_android_version(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 113 | def test_publish_rejects_untracked_files_before_modification(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 119 | def test_tag_rejects_dirty_version(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 125 | def test_publish_rejects_existing_tag_before_version_change(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 132 | def test_dry_run_does_not_write(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 141 | def test_execute_prepares_index_without_build_or_publish(self): | CODE |
| LOW | scripts/test_prepare_release.py | 154 | def test_publish_includes_index_in_preview_and_execution(self): | CODE |
| LOW | scripts/test_prepare_release.py | 174 | def test_index_preflight_failure_prevents_release_writes(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 226 | def test_dry_run_does_not_build_or_modify(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 233 | def test_build_failure_does_not_commit_or_push(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 242 | def test_wrong_version_and_missing_page_rejected(self): | CODE |
| LOW⚡ | scripts/test_prepare_release.py | 251 | def test_unrelated_staged_change_rejected(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 50 | def test_copy_rejects_destination_escape(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 56 | def test_wsl_sync_skips_matching_commit(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 62 | def test_wsl_authentication_precedes_environment_checks(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 131 | def test_copy_updates_old_file_and_verifies_hash(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 138 | def test_collect_missing_output_fails(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 142 | def test_old_kernel_version_is_rejected(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 147 | def test_wrong_kernel_architecture_is_rejected(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 152 | def test_windows_uses_fresh_kernel_directories_and_forces_signing(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 320 | def test_finish_does_not_generate_checksums(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 329 | def test_default_plan_does_not_run_commands(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 337 | def test_collection_is_immediate_and_does_not_overwrite(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 445 | def test_atomic_progress_write_preserves_previous_snapshot_on_failure(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 454 | def test_record_directories_are_unique_and_outside_outputs(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 462 | def test_record_directory_rejects_build_and_package_locations(self): | CODE |
| LOW⚡ | scripts/test_build_release.py | 469 | def test_execution_records_partial_windows_success(self): | CODE |
| LOW | scripts/test_build_release.py | 78 | def test_windows_only_skips_wsl_authentication(self): | CODE |
| LOW | scripts/test_build_release.py | 86 | def test_wsl_sync_pins_windows_commit(self): | CODE |
| LOW | scripts/test_build_release.py | 105 | def test_wsl_sync_rejects_dirty_worktrees(self): | CODE |
| LOW | scripts/test_build_release.py | 114 | def test_wsl_sync_stops_before_checkout_on_fetch_or_ancestry_failure(self): | CODE |
| LOW | scripts/test_build_release.py | 192 | def test_installed_builder_configuration_excludes_old_kernel(self): | CODE |
| LOW | scripts/test_build_release.py | 205 | def test_harmony_copies_each_architecture_before_next_build(self): | CODE |
| LOW | scripts/test_build_release.py | 237 | def test_harmony_rejects_unsigned_only_output(self): | CODE |
| LOW | scripts/test_build_release.py | 258 | def test_harmony_missing_generated_header_stops_packaging(self): | CODE |
| LOW | scripts/test_build_release.py | 270 | def test_android_new_aar_is_copied_before_gradle(self): | CODE |
| LOW | scripts/test_build_release.py | 298 | def test_finish_only_prints_manual_validation_command(self): | CODE |
| LOW | scripts/test_build_release.py | 309 | def test_add_platform_preserves_existing_packages_and_checksums(self): | CODE |
| LOW | scripts/test_build_release.py | 367 | def test_command_output_is_streamed_to_terminal_and_log(self): | CODE |
| LOW | scripts/test_build_release.py | 398 | def test_failed_command_preserves_stage_and_later_pending_steps(self): | CODE |
| LOW | scripts/test_build_release.py | 412 | def test_interrupt_preserves_progress(self): | CODE |
| LOW | scripts/test_build_release.py | 421 | def test_ssh_authentication_keeps_terminal_handles(self): | CODE |
| LOW | scripts/test_build_release.py | 434 | def test_capture_output_and_environment_are_not_dumped(self): | CODE |
| LOW | scripts/test_build_release.py | 492 | def test_complete_execution_persists_progress_without_validation(self): | CODE |
| LOW | scripts/test_build_release.py | 519 | def test_preflight_failure_is_saved_before_work_directory_creation(self): | CODE |
| LOW | scripts/generate-third-party-notices.py | 627 | def collect_retained_comments(): | CODE |
| LOW | scripts/generate-third-party-notices.py | 791 | def collect_additional_notices(go_modules): | CODE |
| 50 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 226 | - `SIYUAN_OIDC_CLAIM_RULES`: JSON array of claim rules used when allow-all is disabled, for example `[{"claim":"email" | CODE |
| LOW | app/stage/protyle/js/protyle-html.js | 2 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define | CODE |
| LOW | app/src/protyle/util/trackedRange.test.ts | 153 | ["same", "placeholder"], | CODE |
| LOW | app/src/protyle/util/tableCellRichLute.test.ts | 84 | holder.innerHTML = base.Md2BlockDOM("placeholder"); | CODE |
| LOW⚡ | app/src/protyle/util/onGet.ts | 372 | editElement.setAttribute("placeholder", window.siyuan.languages.emptyMobilePlaceholder); | CODE |
| LOW⚡ | app/src/protyle/util/onGet.ts | 374 | editElement.setAttribute("placeholder", window.siyuan.languages.emptyPlaceholder); | CODE |
| LOW | app/src/protyle/lite/fragmentEditor.ts | 97 | emptyElement.firstElementChild.setAttribute("placeholder", options.placeholder); | CODE |
| LOW | app/src/protyle/wysiwyg/turnIntoList.ts | 43 | editElement.removeAttribute("placeholder"); | CODE |
| LOW | app/src/protyle/wysiwyg/tabsPersistence.test.ts | 23 | let ids = ["original", "placeholder"]; | CODE |
| LOW⚡ | app/src/protyle/wysiwyg/tabsPersistence.test.ts | 46 | f.selectTab("placeholder"); | CODE |
| LOW⚡ | app/src/protyle/wysiwyg/tabsPersistence.test.ts | 54 | f.selectTab("placeholder"); | CODE |
| LOW⚡ | app/src/protyle/wysiwyg/tabsPersistence.test.ts | 62 | f.selectTab("placeholder"); | CODE |
| LOW⚡ | app/src/protyle/wysiwyg/tabsPersistence.test.ts | 71 | f.selectTab("placeholder"); | CODE |
| LOW | app/src/protyle/render/av/col.ts | 339 | inputElement.setAttribute("placeholder", `${options.data.name} ${nameElement.value}`); | CODE |
| LOW | app/src/protyle/header/titleEnter.ts | 26 | firstEditableHasPlaceholder: Boolean(editElement?.getAttribute("placeholder")), | CODE |
| LOW | app/src/protyle/header/titleEnter.ts | 75 | firstEditableHasPlaceholder: Boolean(editElement?.getAttribute("placeholder")), | CODE |
| LOW | app/src/mobile/util/initFramework.ts | 454 | inputElement.setAttribute("placeholder", window.siyuan.languages._kernel[16]); | CODE |
| LOW | kernel/model/oidc_test.go | 63 | Claim: "email", Operator: conf.OIDCClaimOperatorEquals, Values: []string{"user@example.com"}, | CODE |
| LOW | kernel/model/oidc_provider/provider_test.go | 110 | }).Claims(map[string]any{"nonce": nonce, "email": "user@example.com"}).Serialize() | CODE |
| LOW | kernel/model/oidc_provider/provider_test.go | 144 | if claims["email"] != "user@example.com" { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | scripts/check-lang-keys.py | 196 | print(f"Error: Failed to parse file {file_path}: {e}") | CODE |
| MEDIUM⚡ | scripts/check-lang-keys.py | 199 | print(f"Error: Failed to read file {file_path}: {e}") | CODE |
| MEDIUM | scripts/check-lang-keys.py | 89 | print(f"Error: Failed to check duplicate keys in {file_path}: {e}") | CODE |
| MEDIUM | scripts/check-lang-keys.py | 247 | print("Error: en.json must contain a _kernel object") | CODE |
| MEDIUM | scripts/check-lang-keys.py | 263 | print(f"Error: {name} _kernel.{key}: {detail}") | CODE |
| MEDIUM | scripts/check-lang-keys.py | 284 | print(f"Error: Directory does not exist: {langs_dir}") | CODE |
| MEDIUM | scripts/check-lang-keys.py | 306 | print("Error: No language files found") | CODE |
| MEDIUM | scripts/check-lang-keys.py | 311 | print("Error: No valid language files found") | CODE |
| LOW⚡ | scripts/check-lang-keys.py | 198 | except Exception as e: | CODE |
| LOW | scripts/check-lang-keys.py | 88 | except Exception as e: | CODE |
| LOW | scripts/check-lang-keys.py | 174 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/verify-release.py | 202 | CODE | |
| LOW | scripts/verify-release.py | 405 | CODE | |
| LOW | scripts/verify-release.py | 458 | CODE | |
| LOW | scripts/verify-release.py | 104 | CODE | |
| LOW | scripts/check-translations.py | 52 | CODE | |
| LOW | scripts/build-release.py | 172 | CODE | |
| LOW | scripts/build-release.py | 327 | CODE | |
| LOW | scripts/build-release.py | 99 | CODE | |
| LOW | scripts/generate-third-party-notices.py | 729 | CODE | |
| LOW | scripts/check-lang-keys.py | 35 | CODE | |
| LOW | scripts/check-lang-keys.py | 93 | CODE | |
| LOW | scripts/check-lang-keys.py | 122 | CODE | |
| LOW | scripts/check-lang-keys.py | 203 | CODE | |
| LOW | scripts/check-lang-keys.py | 243 | CODE | |
| LOW | scripts/check-lang-keys.py | 268 | CODE | |
| LOW | scripts/prepare-release.py | 269 | CODE | |
| LOW | scripts/test_verify_release.py | 363 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/src/types/index.d.ts | 236 | print(title: string, html: string): void | CODE |
| HIGH | app/src/types/index.d.ts | 260 | print(title: string, html: string): void | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | kernel/cli/cmd/block.go | 40 | // ─── Read ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | kernel/cli/cmd/block.go | 186 | // ─── Write ───────────────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/generate-third-party-notices.py | 768 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/parse-changelog.py | 2 | CODE | |
| LOW | scripts/check-lang-keys.py | 28 | CODE | |
| LOW | scripts/parse-changelog-HEAD.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-lang-keys.py | 356 | # Output results | COMMENT |