@comate/zulu 1.4.0-beta.2 → 1.4.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/comate-engine/assets/skills/auto-commit/SKILL.md +241 -0
  2. package/comate-engine/assets/skills/auto-commit/references/data_structures.md +183 -0
  3. package/comate-engine/assets/skills/auto-commit/references/interaction_instruction.md +220 -0
  4. package/comate-engine/assets/skills/auto-commit/references/issue_type_mapping.json +19 -0
  5. package/comate-engine/assets/skills/auto-commit/references/query_reference.md +176 -0
  6. package/comate-engine/assets/skills/auto-commit/scripts/build_git_commit_payload.py +195 -0
  7. package/comate-engine/assets/skills/auto-commit/scripts/build_icafe_cards_payload.py +80 -0
  8. package/comate-engine/assets/skills/auto-commit/scripts/cache_manager.py +69 -0
  9. package/comate-engine/assets/skills/auto-commit/scripts/create_card_cli.py +67 -0
  10. package/comate-engine/assets/skills/auto-commit/scripts/git_diff_cli.py +201 -0
  11. package/comate-engine/assets/skills/auto-commit/scripts/git_utils.py +230 -0
  12. package/comate-engine/assets/skills/auto-commit/scripts/icafe/__init__.py +66 -0
  13. package/comate-engine/assets/skills/auto-commit/scripts/icafe/client.py +473 -0
  14. package/comate-engine/assets/skills/auto-commit/scripts/icafe/farseer.py +52 -0
  15. package/comate-engine/assets/skills/auto-commit/scripts/icafe/matching.py +784 -0
  16. package/comate-engine/assets/skills/auto-commit/scripts/logger.py +32 -0
  17. package/comate-engine/assets/skills/auto-commit/scripts/match_card_cli.py +41 -0
  18. package/comate-engine/assets/skills/auto-commit/scripts/payload_validators.py +309 -0
  19. package/comate-engine/assets/skills/auto-commit/scripts/recognize_card_cli.py +63 -0
  20. package/comate-engine/assets/skills/{automation-browser-comate → automation-browser}/SKILL.md +1 -0
  21. package/comate-engine/assets/skills/{cnap-comate → cnap}/SKILL.md +1 -0
  22. package/comate-engine/assets/skills/code-review/SKILL.md +202 -0
  23. package/comate-engine/assets/skills/code-review/agents/correctness-reviewer.md +62 -0
  24. package/comate-engine/assets/skills/code-review/agents/custom-reviewer.md +53 -0
  25. package/comate-engine/assets/skills/code-review/agents/meta-reviewer.md +84 -0
  26. package/comate-engine/assets/skills/code-review/agents/reliability-reviewer.md +72 -0
  27. package/comate-engine/assets/skills/code-review/agents/reuse-reviewer.md +101 -0
  28. package/comate-engine/assets/skills/code-review/agents/style-reviewer.md +65 -0
  29. package/comate-engine/assets/skills/code-review/evals/SKILL.md +334 -0
  30. package/comate-engine/assets/skills/code-review/evals/agents/gt-generator.md +76 -0
  31. package/comate-engine/assets/skills/code-review/evals/agents/miner.md +87 -0
  32. package/comate-engine/assets/skills/code-review/evals/agents/score-judge.md +168 -0
  33. package/comate-engine/assets/skills/code-review/evals/references/cli-query-template.md +114 -0
  34. package/comate-engine/assets/skills/code-review/evals/references/gt-schema.md +77 -0
  35. package/comate-engine/assets/skills/code-review/references/custom-rules/RULE_TEMPLATE.md +141 -0
  36. package/comate-engine/assets/skills/code-review/references/dispatch-template.md +142 -0
  37. package/comate-engine/assets/skills/code-review/references/output-schema.md +197 -0
  38. package/comate-engine/assets/skills/code-review/references/report-format.md +41 -0
  39. package/comate-engine/assets/skills/code-review/references/rules/Go/GO_AUTH_RULES.md +29 -0
  40. package/comate-engine/assets/skills/code-review/references/rules/Go/GO_CORRECTNESS_RULES.md +111 -0
  41. package/comate-engine/assets/skills/code-review/references/rules/Go/GO_RESOURCE_CONCURRENCY_RULES.md +190 -0
  42. package/comate-engine/assets/skills/code-review/references/rules/Go/GO_STYLE_RULES.md +354 -0
  43. package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_AUTH_RULES.md +34 -0
  44. package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_CORRECTNESS_RULES.md +207 -0
  45. package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_RESOURCE_CONCURRENCY_RULES.md +220 -0
  46. package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_STYLE_RULES.md +306 -0
  47. package/comate-engine/assets/skills/code-review/references/rules/Js/JS_AUTH_RULES.md +48 -0
  48. package/comate-engine/assets/skills/code-review/references/rules/Js/JS_CORRECTNESS_RULES.md +364 -0
  49. package/comate-engine/assets/skills/code-review/references/rules/Js/JS_RESOURCE_CONCURRENCY_RULES.md +180 -0
  50. package/comate-engine/assets/skills/code-review/references/rules/Js/JS_STYLE_RULES.md +350 -0
  51. package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_AUTH_RULES.md +38 -0
  52. package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_CORRECTNESS_RULES.md +255 -0
  53. package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_RESOURCE_CONCURRENCY_RULES.md +180 -0
  54. package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_STYLE_RULES.md +195 -0
  55. package/comate-engine/assets/skills/code-review/references/telemetry.md +27 -0
  56. package/comate-engine/assets/skills/{code-security-comate → code-security}/SKILL.md +1 -0
  57. package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/SKILL.md +1 -1
  58. package/comate-engine/assets/skills/create-automation-tasks-comate/SKILL.md +300 -0
  59. package/comate-engine/assets/skills/create-automation-tasks-comate/references/backend_dev.md +109 -0
  60. package/comate-engine/assets/skills/create-automation-tasks-comate/references/env_setup.md +130 -0
  61. package/comate-engine/assets/skills/create-automation-tasks-comate/references/frontend_dev.md +74 -0
  62. package/comate-engine/assets/skills/create-automation-tasks-comate/references/git_operations.md +88 -0
  63. package/comate-engine/assets/skills/create-automation-tasks-comate/references/long_running_task.md +96 -0
  64. package/comate-engine/assets/skills/create-automation-tasks-comate/references/testing_strategy.md +94 -0
  65. package/comate-engine/assets/skills/create-automation-tasks-comate/scripts/check_config.py +397 -0
  66. package/comate-engine/assets/skills/{create-rule-comate → create-rule}/SKILL.md +1 -0
  67. package/comate-engine/assets/skills/{create-skill-comate → create-skill}/SKILL.md +1 -1
  68. package/comate-engine/assets/skills/{figma2code-comate → figma2code}/SKILL.md +1 -0
  69. package/comate-engine/assets/skills/{icafe-comate → icafe}/SKILL.md +1 -13
  70. package/comate-engine/assets/skills/{icode-comate → icode}/SKILL.md +1 -0
  71. package/comate-engine/node_modules/@comate/plugin-shared-internals/dist/index.js +3 -3
  72. package/comate-engine/server.js +136 -82
  73. package/dist/bundle/index.js +20 -9
  74. package/package.json +1 -1
  75. /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/cases.md +0 -0
  76. /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/deploy-troubleshoot.md +0 -0
  77. /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/install.md +0 -0
  78. /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/kubectl.md +0 -0
  79. /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/login.md +0 -0
  80. /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/oncall.md +0 -0
  81. /package/comate-engine/assets/skills/{cnap-comate → cnap}/scripts/install_cnap_cli.sh +0 -0
  82. /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/credential_hosting.md +0 -0
  83. /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-go_sql_injection.md +0 -0
  84. /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-java_sql_injection.md +0 -0
  85. /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-php_sql_injection.md +0 -0
  86. /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-python_sql_injection.md +0 -0
  87. /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair_sensitive.md +0 -0
  88. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/credential_hosting.py +0 -0
  89. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/credential_poll.py +0 -0
  90. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/http_client.py +0 -0
  91. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/parse_scan_result.py +0 -0
  92. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/repair_vulnerability.py +0 -0
  93. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/report_chat.py +0 -0
  94. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/scan_vulnerability.py +0 -0
  95. /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/utils.py +0 -0
  96. /package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/references/doc-map-extended.md +0 -0
  97. /package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/references/models-and-billing.md +0 -0
  98. /package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/references/product-overview.md +0 -0
  99. /package/comate-engine/assets/skills/{create-image-comate → create-image}/SKILL.md +0 -0
  100. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/LICENSE.txt +0 -0
  101. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/agents/analyzer.md +0 -0
  102. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/agents/comparator.md +0 -0
  103. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/agents/grader.md +0 -0
  104. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/assets/eval_review.html +0 -0
  105. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/eval-viewer/generate_review.py +0 -0
  106. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/eval-viewer/viewer.html +0 -0
  107. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/references/schemas.md +0 -0
  108. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/__init__.py +0 -0
  109. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  110. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/__pycache__/aggregate_benchmark.cpython-311.pyc +0 -0
  111. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/aggregate_benchmark.py +0 -0
  112. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/generate_report.py +0 -0
  113. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/package_skill.py +0 -0
  114. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/quick_validate.py +0 -0
  115. /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/utils.py +0 -0
  116. /package/comate-engine/assets/skills/{create-subagent-comate → create-subagent}/SKILL.md +0 -0
  117. /package/comate-engine/assets/skills/{figma2code-comate → figma2code}/references/codeConnect.md +0 -0
  118. /package/comate-engine/assets/skills/{figma2code-comate → figma2code}/references/designToken.md +0 -0
  119. /package/comate-engine/assets/skills/{figma2code-comate → figma2code}/references/image2design.md +0 -0
  120. /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/SKILL.md +0 -0
  121. /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/fetch_skills.py +0 -0
  122. /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/get_download_url.py +0 -0
  123. /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/install_skill.py +0 -0
  124. /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/preview_skill.py +0 -0
  125. /package/comate-engine/assets/skills/{get-ugate-token-comate → get-ugate-token}/SKILL.md +0 -0
  126. /package/comate-engine/assets/skills/{get-ugate-token-comate → get-ugate-token}/getUgateToken.py +0 -0
  127. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/ai-workflows.md +0 -0
  128. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/commands.md +0 -0
  129. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/error-handling.md +0 -0
  130. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/git-auto-bindcard-workflow.md +0 -0
  131. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/git-bindcard-workflow.md +0 -0
  132. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/iql-syntax.md +0 -0
  133. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/platform-concepts.md +0 -0
  134. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/smart-create-workflow.md +0 -0
  135. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/smart-find-workflow.md +0 -0
  136. /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/smart-update-workflow.md +0 -0
  137. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/add_reviewers.md +0 -0
  138. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/build_fetch_command.md +0 -0
  139. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/check_repo_permission.md +0 -0
  140. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/create_branch.md +0 -0
  141. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/create_draft_comment.md +0 -0
  142. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_ai_cr_result.md +0 -0
  143. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_ai_review.md +0 -0
  144. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_diff_content.md +0 -0
  145. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_diff_file.md +0 -0
  146. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_machine_check.md +0 -0
  147. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_my_reviews.md +0 -0
  148. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_person_commit.md +0 -0
  149. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_person_repo.md +0 -0
  150. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_branch.md +0 -0
  151. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_config.md +0 -0
  152. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_members.md +0 -0
  153. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_reviews.md +0 -0
  154. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_review_comments.md +0 -0
  155. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_review_info.md +0 -0
  156. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_submit_settings.md +0 -0
  157. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/icode-api.md +0 -0
  158. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/publish_comments.md +0 -0
  159. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/set_review_score.md +0 -0
  160. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/start_ai_review.md +0 -0
  161. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/submit_review.md +0 -0
  162. /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/trigger_ai_cr.md +0 -0
  163. /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/add-reviewer.md +0 -0
  164. /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/fix-machine-check.md +0 -0
  165. /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/merge-cr.md +0 -0
  166. /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/ssh-setup.md +0 -0
  167. /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/submit-acr.md +0 -0
  168. /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/submit-cr.md +0 -0
  169. /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/clone.md +0 -0
  170. /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/icode-git.md +0 -0
  171. /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/push.md +0 -0
  172. /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/push_cr.md +0 -0
  173. /package/comate-engine/assets/skills/{icode-comate → icode}/references/install.md +0 -0
  174. /package/comate-engine/assets/skills/{icode-comate → icode}/references/login.md +0 -0
  175. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/add-reviewer.sh +0 -0
  176. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/common.sh +0 -0
  177. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/fix-machine-check.sh +0 -0
  178. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/merge-cr.sh +0 -0
  179. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/ssh-setup.sh +0 -0
  180. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/submit-acr.sh +0 -0
  181. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/submit-cr.sh +0 -0
  182. /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/test-preflight.sh +0 -0
  183. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/SKILL.md +0 -0
  184. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/examples.md +0 -0
  185. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/add_member.md +0 -0
  186. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/change_scope.md +0 -0
  187. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/copy_doc.md +0 -0
  188. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/create_doc.md +0 -0
  189. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/delete_doc.md +0 -0
  190. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/edit_content.md +0 -0
  191. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/move_doc.md +0 -0
  192. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_comment.md +0 -0
  193. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_content.md +0 -0
  194. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_flowchart.md +0 -0
  195. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_permission.md +0 -0
  196. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_recent_view.md +0 -0
  197. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_repo.md +0 -0
  198. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_user_info.md +0 -0
  199. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/update_member.md +0 -0
  200. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/upload_attachment.md +0 -0
  201. /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/scripts/ku_operator.py +0 -0
@@ -0,0 +1,364 @@
1
+ # JavaScript/TypeScript 正确性规则
2
+
3
+ 静态模式可识别的确定性错误,仅看代码结构即可判断,单次执行可触发。
4
+
5
+ ---
6
+
7
+ ## 一、控制流与逻辑错误(9项)
8
+
9
+ ### CORRECTNESS_JS_01. 条件表达式中出现赋值操作符 [Critical]
10
+ - **检测**:`if`/`while`/`for` 条件中使用 `=` 而非 `===`/`==`,导致条件判断逻辑错误或死循环
11
+ - **排除**:有注释明确说明意图是赋值后判断;`while (item = queue.shift())` 等惯用模式
12
+
13
+ ```javascript
14
+ // 错误写法
15
+ if (x = 1) { ... } // 永远为 true
16
+ while (data = fetch()) {} // 非惯用模式,易误读
17
+
18
+ // 排除场景(允许的惯用模式)
19
+ while (item = queue.shift()) { process(item); } // 已知惯用,可排除
20
+ ```
21
+
22
+ ### CORRECTNESS_JS_02. 正则表达式中使用控制字符 [Critical]
23
+ - **检测**:正则表达式中包含控制字符(如 `\t`、`\n` 等不可见字符),可能导致匹配行为不可预测或 ReDoS
24
+ - **排除**:显式使用 `\t`、`\n` 转义序列(非字面控制字符)
25
+
26
+ ### CORRECTNESS_JS_03. finally 块中使用控制流语句 [Critical]
27
+ - **检测**:`finally` 中使用 `return`/`throw`/`break`/`continue`,导致 `try`/`catch` 中的原始返回值或异常被覆盖丢失
28
+ - **排除**:无正当场景
29
+
30
+ ```javascript
31
+ function getData() {
32
+ try { throw new Error('原始错误'); }
33
+ finally { return 'fallback'; } // 原始异常被吞没,调用方拿到 'fallback'
34
+ }
35
+ ```
36
+
37
+ ### CORRECTNESS_JS_04. 否定关系运算符左操作数 [Critical]
38
+ - **检测**:`!key in object` 因运算符优先级实际执行为 `(!key) in object`,与 `!(key in object)` 语义不同
39
+ - **排除**:已用括号明确优先级
40
+
41
+ ```javascript
42
+ // 错误写法 — 实际执行 (!key) in obj,即 false in obj
43
+ if (!key in obj) { ... }
44
+
45
+ // 正确写法
46
+ if (!(key in obj)) { ... }
47
+ ```
48
+
49
+ ### CORRECTNESS_JS_05. 无限循环 [Critical]
50
+ - **检测**:循环条件永真且循环体内无 `break`/`return`,或循环变量在循环体内未被更新
51
+ - **排除**:`while(true)` 内有明确 `break`/`return` 退出逻辑
52
+
53
+ ### CORRECTNESS_JS_06. 无限递归 / 缺少递归基准条件 [Critical]
54
+ - **检测**:递归函数无终止条件,或终止条件在某些输入下(如负数)永不可达
55
+ - **排除**:有充分的终止条件覆盖所有输入范围
56
+
57
+ ### CORRECTNESS_JS_07. 错误的逻辑运算符 [Critical]
58
+ - **检测**:布尔表达式使用 `&&` 但语义需要 `||`(或反之),导致条件永真/永假,如 `type === 'a' && type === 'b'`
59
+ - **排除**:逻辑正确
60
+
61
+ ### CORRECTNESS_JS_08. `||` 短路误用导致 falsy 值被覆盖 [Critical]
62
+ - **检测**:`const x = options.value || default`,当 `options.value` 为 `0`/`false`/`""` 时被错误替换为默认值
63
+ - **排除**:确认不存在合法 falsy 值的场景;已改用 `??`
64
+
65
+ ```javascript
66
+ // 错误写法 — count=0 时被覆盖为 10
67
+ const count = options.count || 10;
68
+
69
+ // 正确写法 — ?? 只在 null/undefined 时取默认值
70
+ const count = options.count ?? 10;
71
+ ```
72
+
73
+ ### CORRECTNESS_JS_09. 一成不变的循环条件(死循环/无效循环)[Critical]
74
+ - **检测**:循环条件中的变量在循环体内从未被修改,导致死循环或循环体永不执行
75
+ - **排除**:`while(true)` 内有退出逻辑
76
+
77
+ ---
78
+
79
+ ## 二、类型与访问错误(7项)
80
+
81
+ ### CORRECTNESS_JS_10. 错误的数组索引访问 [Critical]
82
+ - **检测**:使用动态索引访问数组时未做范围校验;直接 `arr[arr.length]`;外部输入索引未校验
83
+ - **排除**:有长度检查;索引来源可信且范围有界
84
+
85
+ ### CORRECTNESS_JS_11. 对象属性链式访问未判空 [Critical]
86
+ - **检测**:`a.b.c` 形式的链式访问,中间节点可能为 `null`/`undefined`,未使用 `?.` 可选链或判空
87
+ - **排除**:上下文保证对象非空;已使用 `?.`
88
+
89
+ ```javascript
90
+ const city = user.address.city; // user 或 address 可能为 undefined
91
+ // 正确:user?.address?.city
92
+ ```
93
+
94
+ ### CORRECTNESS_JS_12. 异步结果未 await 直接使用 [Critical]
95
+ - **检测**:async 函数返回 Promise 但被当作同步值使用(缺少 `await`);在 `async` 函数中调用异步函数未 await
96
+
97
+ ```javascript
98
+ async function init() {
99
+ const result = fetchUser(); // 未 await,result 是 Promise 对象
100
+ displayUser(result);
101
+ }
102
+ ```
103
+
104
+ ### CORRECTNESS_JS_13. 函数调用依赖顺序错误 [Critical]
105
+ - **检测**:后续函数使用了前一个尚未完成的异步操作的结果,缺少 `await` 或回调处理
106
+ - **排除**:结果来自同步函数
107
+
108
+ ### CORRECTNESS_JS_14. 变量未定义直接使用 [Critical]
109
+ - **检测**:使用了未通过 `var`/`let`/`const` 声明的变量,导致 `ReferenceError`
110
+ - **排除**:全局变量已在其他文件声明;框架注入的全局变量
111
+
112
+ ### CORRECTNESS_JS_15. 循环引用导致 JSON 序列化失败 [Critical]
113
+ - **检测**:两个或多个对象相互引用形成环,在 `JSON.stringify` 时抛出循环引用错误,或导致内存泄漏
114
+ - **排除**:有自定义 replacer 处理循环引用
115
+
116
+ ### CORRECTNESS_JS_16. 无效的 JSDoc 注释 [Critical]
117
+ - **检测**:JSDoc 中 `@param` 参数名与函数实际参数名不一致;`@returns` 标注了返回值但函数无 return;`@param` 数量与实际参数数量不符
118
+ - **排除**:参数名确实一致;无返回值函数不标 @returns
119
+
120
+ ```javascript
121
+ // 错误写法 — @param 名称与实际参数不匹配
122
+ /**
123
+ * @param {string} usre - 用户名 ← 应为 user
124
+ * @returns {boolean} ← 函数实际无返回值
125
+ */
126
+ function login(user) {
127
+ doLogin(user);
128
+ }
129
+ ```
130
+
131
+ ---
132
+
133
+ ## 三、Vue 框架缺陷(8项)
134
+
135
+ ### CORRECTNESS_VUE_01. 模板中使用未定义变量 [Critical]
136
+ - **检测**:Vue 模板中引用了未在 `data`/`props`/`computed`/`methods` 中定义的变量,导致渲染错误
137
+
138
+ ### CORRECTNESS_VUE_02. created 生命周期中访问 DOM [Critical]
139
+ - **检测**:在 `created` 钩子中使用 `$refs` 或 `document.querySelector`,此时 DOM 尚未挂载
140
+ - **排除**:已改在 `mounted` 中访问
141
+
142
+ ### CORRECTNESS_VUE_03. computed 中修改响应式数据 [Critical]
143
+ - **检测**:计算属性函数体内修改 `this.xxx`(data 或其他状态),违反响应式原则,可能导致无限更新
144
+
145
+ ### CORRECTNESS_VUE_04. watch 中修改被观察的值导致无限循环 [Critical]
146
+ - **检测**:`watch` 回调中直接修改被监听的同一属性,触发再次 watch,形成无限循环
147
+
148
+ ### CORRECTNESS_VUE_05. setup 中直接修改 props [Critical]
149
+ - **检测**:`setup(props)` 中对 props 属性直接赋值,违反单向数据流,应通过 emit 通知父组件
150
+
151
+ ### CORRECTNESS_VUE_06. 组件 data 不是函数 [Critical]
152
+ - **检测**:组件选项中 `data` 直接返回对象而非函数,导致多个实例共享同一数据对象
153
+
154
+ ```javascript
155
+ // 错误写法 — 所有实例共享同一个对象
156
+ export default {
157
+ data: {count: 0}
158
+ };
159
+
160
+ // 正确写法 — 每个实例有独立数据
161
+ export default {
162
+ data() { return {count: 0}; }
163
+ };
164
+ ```
165
+
166
+ ### CORRECTNESS_VUE_07. computed 没有 return 语句 [Critical]
167
+ - **检测**:计算属性函数体内有计算逻辑但缺少 `return`,导致值为 `undefined`
168
+
169
+ ### CORRECTNESS_VUE_08. 绑定未定义的事件处理函数 [Critical]
170
+ - **检测**:`@click="method"` 但 `method` 未在 `methods` 中定义,点击时报错
171
+
172
+ ---
173
+
174
+ ## 四、React 框架缺陷(9项)
175
+
176
+ ### CORRECTNESS_REACT_01. useEffect 依赖数组缺失或不完整 [Critical]
177
+ - **检测**:`useEffect` 无依赖数组(每次渲染都执行);或依赖数组缺少实际使用的变量(闭包陷阱)
178
+ - **排除**:刻意设计为每次渲染执行且有注释说明
179
+
180
+ ```javascript
181
+ useEffect(() => { document.title = count; }); // 缺少 [count]
182
+ ```
183
+
184
+ ### CORRECTNESS_REACT_02. 直接修改 state [Critical]
185
+ - **检测**:`this.state.x = value` 或对 useState 返回的数组/对象直接 `push`/赋值,React 无法检测变化
186
+ - **排除**:使用了 `setState`/`dispatch`/setter 函数
187
+
188
+ ### CORRECTNESS_REACT_03. render/函数组件主体中调用 setState [Critical]
189
+ - **检测**:在 `render()` 方法或函数组件主体(非事件处理、非 effect)中直接调用 `setState`,导致无限渲染循环
190
+
191
+ ### CORRECTNESS_REACT_04. useEffect 直接使用 async 函数 [Critical]
192
+ - **检测**:`useEffect(async () => {...})` —— cleanup 返回值为 Promise 而非函数,行为异常
193
+ - **排除**:已在 effect 内部定义 async 函数后调用
194
+
195
+ ```javascript
196
+ // 错误写法 — cleanup 收到 Promise 而非清理函数
197
+ useEffect(async () => {
198
+ const data = await fetchData();
199
+ setData(data);
200
+ }, []);
201
+
202
+ // 正确写法
203
+ useEffect(() => {
204
+ const fetchAsync = async () => {
205
+ const data = await fetchData();
206
+ setData(data);
207
+ };
208
+ fetchAsync();
209
+ }, []);
210
+ ```
211
+
212
+ ### CORRECTNESS_REACT_05. useEffect 未清理订阅/定时器 [Critical]
213
+ - **检测**:`useEffect` 中注册了 `addEventListener`/`setInterval`/订阅,但未返回清理函数
214
+ - **排除**:有 return `() => { ... }` 清理逻辑
215
+
216
+ ### CORRECTNESS_REACT_06. useCallback/useMemo 依赖数组缺失 [Critical]
217
+ - **检测**:`useCallback`/`useMemo` 的依赖数组未包含回调中使用的外部变量,导致闭包陷阱
218
+ - **排除**:变量确实不需要触发重新创建
219
+
220
+ ### CORRECTNESS_REACT_07. Hook 在条件/循环中调用 [Critical]
221
+ - **检测**:`useState`/`useReducer`/`useEffect` 等 Hook 在 `if`/`for`/嵌套函数中调用,违反 Hook 规则
222
+
223
+ ### CORRECTNESS_REACT_08. useLayoutEffect 在服务端使用 [Critical]
224
+ - **检测**:SSR 场景中使用 `useLayoutEffect`,服务端不执行 DOM 操作,产生警告
225
+ - **排除**:有 `typeof window !== 'undefined'` 保护;纯客户端渲染
226
+
227
+ ### CORRECTNESS_REACT_09. useEffect 异步请求未处理组件卸载 [Critical]
228
+ - **检测**:`useEffect` 内部发起异步请求,但未在 cleanup 中设置取消标志或 AbortController,组件卸载后仍调用 `setState`
229
+
230
+ ```javascript
231
+ // 错误写法 — 组件卸载后仍 setState
232
+ useEffect(() => {
233
+ fetch('/api/data').then(res => res.json()).then(setData);
234
+ }, []);
235
+
236
+ // 正确写法 — AbortController 取消请求
237
+ useEffect(() => {
238
+ const controller = new AbortController();
239
+ fetch('/api/data', {signal: controller.signal})
240
+ .then(res => res.json()).then(setData)
241
+ .catch(err => { if (err.name !== 'AbortError') throw err; });
242
+ return () => controller.abort();
243
+ }, []);
244
+ ```
245
+
246
+ ---
247
+
248
+ ## 五、坏习惯与 ES6 规范问题(13项)
249
+
250
+ > 原属规范类,因会引发实际逻辑隐患或运行错误,归入缺陷类一并扫描。
251
+
252
+ ### CORRECTNESS_JS_HABIT_01. case 子句中使用词法声明 [Critical]
253
+ - **检测**:switch 的 case 子句中使用 `let`/`const` 且无 `{}` 块包裹,作用域贯穿整个 switch,可能导致重复声明报错
254
+
255
+ ```javascript
256
+ // 错误写法
257
+ switch (type) {
258
+ case 'a':
259
+ let msg = 'hello'; // 作用域泄漏到整个 switch
260
+ break;
261
+ case 'b':
262
+ let msg = 'world'; // SyntaxError: already been declared
263
+ }
264
+
265
+ // 正确写法 — 用 {} 包裹
266
+ switch (type) {
267
+ case 'a': {
268
+ let msg = 'hello';
269
+ break;
270
+ }
271
+ }
272
+ ```
273
+
274
+ ### CORRECTNESS_JS_HABIT_02. 使用空解构模式 [Critical]
275
+ - **检测**:`const {} = obj` 或 `const [] = arr` 等空解构,无实际意义
276
+
277
+ ### CORRECTNESS_JS_HABIT_03. 宽松相等与 null 比较 [Critical]
278
+ - **检测**:`value == null` 宽松比较同时匹配 null 和 undefined,通常非预期
279
+ - **排除**:明确需要同时判断 null/undefined 且已知的场景
280
+
281
+ ### CORRECTNESS_JS_HABIT_04. 魔术数字 [Critical]
282
+ - **检测**:代码中直接出现无命名的数字常量(如 `status === 1`),含义不明
283
+ - **排除**:0、1、-1 等通用数字;数组索引;明确语境下的简单值
284
+
285
+ ### CORRECTNESS_JS_HABIT_05. 自我赋值 [Critical]
286
+ - **检测**:`x = x`、`arr[i] = arr[i]` 等无操作的自我赋值,可能掩盖真实 bug
287
+
288
+ ### CORRECTNESS_JS_HABIT_06. 一成不变的循环条件 [Critical]
289
+ - **检测**:循环条件中的变量在循环体内从未被修改,导致死循环或循环体永不执行
290
+ - **排除**:`while(true)` 内部有明确 break/return 逻辑
291
+
292
+ ### CORRECTNESS_JS_HABIT_07. 将 undefined 作为标识符 [Critical]
293
+ - **检测**:函数参数名或变量名使用 `undefined`,覆盖全局 undefined 导致判断失效
294
+
295
+ ```javascript
296
+ // 错误写法 — undefined 被覆盖,typeof undefined === 'string'
297
+ function check(undefined) {
298
+ if (x === undefined) { ... } // 判断失效
299
+ }
300
+ ```
301
+
302
+ ### CORRECTNESS_JS_HABIT_08. function 声明与表达式风格不一致 [Critical]
303
+ - **检测**:同文件中混用 `function foo(){}` 声明和 `const bar = () => {}` 表达式,风格不统一
304
+ - **排除**:有意区分提升特性的场景
305
+
306
+ ### CORRECTNESS_JS_HABIT_09. 行注释位置不规范 [Critical]
307
+ - **检测**:行注释 `//` 位置不规范,影响可读性
308
+
309
+ ### CORRECTNESS_JS_HABIT_10. 文件中使用制表符 [Critical]
310
+ - **检测**:代码缩进使用 Tab 字符与空格混用,不同编辑器显示不一致
311
+ - **排除**:项目统一使用 Tab 缩进
312
+
313
+ ### CORRECTNESS_JS_HABIT_11. 对象字面量未使用简写语法 [Critical]
314
+ - **检测**:`{ method: function() {} }` 可简写为 `{ method() {} }`;`{ prop: prop }` 可简写为 `{ prop }`
315
+
316
+ ### CORRECTNESS_JS_HABIT_12. 未用 const 声明不变变量 [Critical]
317
+ - **检测**:使用 `let` 声明但后续从未重新赋值的变量,语义上应为 `const`
318
+ - **排除**:循环变量;明确预留赋值位的变量
319
+
320
+ ### CORRECTNESS_JS_HABIT_13. 字符串连接未使用模板字面量 [Critical]
321
+ - **检测**:使用 `+` 号拼接含变量的字符串,应改为模板字符串
322
+ - **排除**:纯静态字符串拼接(无变量)
323
+
324
+ ---
325
+
326
+ ## 六、正确性与逻辑(4项)
327
+
328
+ ### CORRECTNESS_JS_COR_01. 正则表达式缺少锚点 [high]
329
+ - **检测**:用于输入校验的正则表达式缺少 `^` 和 `$` 锚点,导致部分匹配通过本应拒绝的字符串(如 `/<script>/` 匹配 `safe<script>attack`)
330
+ - **排除**:明确需要部分匹配场景(如搜索文本中提取内容);已使用 `test()` 并知晓语义
331
+
332
+ ```javascript
333
+ // 错误写法 — "123abc" 能通过纯数字校验
334
+ const isNum = /\d+/.test(input);
335
+
336
+ // 正确写法
337
+ const isNum = /^\d+$/.test(input);
338
+ ```
339
+
340
+ ### CORRECTNESS_JS_COR_02. 错误链断裂 [middle]
341
+ - **检测**:`throw new Error('操作失败')` 重新抛出错误时丢失原始 cause,导致上层无法溯源;应使用 `{ cause: originalError }` 或在 message 中保留原始信息
342
+ - **排除**:有意隐藏底层错误(如安全场景);日志中已记录原始错误
343
+
344
+ ```javascript
345
+ // 错误写法 — 原始 stack 丢失
346
+ } catch (e) {
347
+ throw new Error('数据库写入失败'); // e 的信息消失
348
+ }
349
+
350
+ // 正确写法
351
+ } catch (e) {
352
+ throw new Error('数据库写入失败', { cause: e });
353
+ }
354
+ ```
355
+
356
+ ### CORRECTNESS_JS_COR_03. 乐观更新未回滚 [middle]
357
+ - **检测**:UI 先乐观更新(修改 state/store),随后 API 调用失败后未将状态回滚到操作前的值
358
+ - **排除**:无乐观更新逻辑;失败后有明确回滚代码
359
+ - **复核**:确认存在"先改 state 再 await api"的模式;确认 catch 块中没有还原操作
360
+
361
+ ### CORRECTNESS_JS_COR_04. 竞态条件:快速操作结果覆盖 [middle]
362
+ - **检测**:异步操作(如搜索、tab 切换、翻页)无取消前一次请求的机制,后发先至的响应会覆盖最新请求的结果
363
+ - **排除**:有 AbortController 取消;有请求序列号校验;有防抖/节流保证只发最后一次
364
+ - **复核**:确认存在用户可快速重复触发的场景;确认无序列号或取消逻辑
@@ -0,0 +1,180 @@
1
+ # JavaScript/TypeScript 资源并发类规则
2
+
3
+ 涵盖性能、内存、资源释放、并发竞态、计算准确性及 SQL 操作问题。需考虑时序、资源生命周期、并发场景才能暴露的问题。
4
+
5
+ ---
6
+
7
+ ## 一、性能问题
8
+
9
+ ### PERF_01. 大数组/大数据集循环操作 [middle]
10
+ - 全量查询无 limit + 内存遍历;O(n²) 嵌套循环;主线程大数据量 sort/filter/map 链式
11
+ - **排除**:有分页/limit;数据量 <100;Web Worker/流式处理
12
+
13
+ ### PERF_02. 频繁 DOM 操作 [low]
14
+ - 循环内 appendChild/innerHTML/style.*/classList.*;读写交替触发重排
15
+ - **排除**:DocumentFragment;数据量 <5
16
+
17
+ ### PERF_03. 缺少缓存 [low]
18
+ - 循环内重复调用同参函数/接口;高频纯函数未 memoize;同周期多次查库
19
+ - **排除**:函数有副作用不适合缓存;数据量小
20
+
21
+ ### PERF_04. 同步 XMLHttpRequest 阻塞主线程 [high]
22
+ - **检测**:`xhr.open('GET', url, false)`(第三个参数为 false)
23
+ - **排除**:Service Worker 中的同步 XHR(特定场景)
24
+
25
+ ### PERF_05. 主线程大循环阻塞 [middle]
26
+ - **检测**:主线程执行超大循环(>10万次迭代)或重计算,未使用 Web Worker 或 requestIdleCallback 分片
27
+ - **排除**:已用 Web Worker;循环量确认有限
28
+
29
+ ---
30
+
31
+ ## 二、接口限流
32
+
33
+ ### RATE_01. API 调用无限流 [middle]
34
+ - 对外/第三方接口无 rate-limit 中间件;发短信/邮件等敏感操作无限流
35
+ - **排除**:有全局限流中间件;内部接口;天然幂等
36
+
37
+ ### RATE_02. 循环内调用外部接口 [high]
38
+ - for/forEach/while 内 axios/fetch/request/http.get
39
+ - **排除**:循环 ≤3 次;有 delay/throttle;有批量接口
40
+
41
+ ### RATE_03. 并发请求未控制 [middle]
42
+ - `Promise.all(array.map(...))` 且 array 可能 >20;无并发控制库
43
+ - **排除**:数组明确很少;有 p-limit/bottleneck
44
+
45
+ ---
46
+
47
+ ## 三、内存泄漏
48
+
49
+ ### MEM_01. 未清理的定时器 [high]
50
+ - setInterval 未保存引用;Vue/React 组件中 setInterval 无 beforeDestroy/unmount 对应清理;setTimeout 递归无退出条件
51
+ - **排除**:有 clearInterval/clearTimeout;一次性短定时器且不在组件内
52
+
53
+ ### MEM_02. 未清理的事件监听器 [high]
54
+ - addEventListener 在组件中使用,对应 removeEventListener 未在销毁时调用
55
+ - **排除**:有清理逻辑;全局持久监听且有意设计
56
+
57
+ ### MEM_03. 闭包引用大对象 [middle]
58
+ - 闭包引用大数组/DOM/请求结果且被长期持有(模块级变量、全局缓存)
59
+ - **排除**:闭包生命周期短;引用对象小
60
+
61
+ ### MEM_04. 无限制增长的缓存 [high]
62
+ - 模块级 Map/Object/Array 只增不删;无 TTL/LRU/容量限制
63
+ - **排除**:有清理逻辑;数量有界(枚举/配置)
64
+
65
+ ---
66
+
67
+ ## 四、资源释放
68
+
69
+ ### RES_01. 文件句柄未关闭 [high]
70
+ - fs.open/createReadStream/createWriteStream 后无 close;catch/finally 未关闭
71
+ - **排除**:使用 readFile/writeFile 等自动关闭 API;finally 有关闭
72
+
73
+ ### RES_02. 数据库连接/事务未释放 [high]
74
+ - getConnection 无 release;beginTransaction 后 catch 无 rollback;finally 无释放
75
+ - **排除**:连接池自动管理(ORM);finally 有释放
76
+
77
+ ---
78
+
79
+ ## 五、高危缺陷(运行时崩溃)
80
+
81
+ ### FATAL_01. 空指针/undefined 解引用 [high]
82
+ - 链式访问无 `?.` 且可能为 null;异步结果未判空;find/[index] 结果未判断 undefined
83
+ - **排除**:有 null 判断;使用了 `?.`;上下文确保非空
84
+
85
+ ### FATAL_02. 数组越界访问 [middle]
86
+ - 动态索引未校验范围;`arr[arr.length]`;外部输入索引未校验
87
+ - **排除**:有长度检查
88
+
89
+ ### FATAL_03. 类型错误 [middle]
90
+ - 对非数组调用 .map/.filter/.forEach;字符串 ID 做数字运算;Promise 当同步值用
91
+ - **排除**:有类型检查或 TypeScript 类型保护
92
+
93
+ ---
94
+
95
+ ## 六、并发竞态
96
+
97
+ ### RACE_01. 缺少事务/锁保护 [high]
98
+ - 多个数据库写操作无事务;先查后更新无行锁;数量字段未用原子操作
99
+ - **排除**:有事务;有 SELECT FOR UPDATE;有乐观锁/Redis 原子操作
100
+
101
+ ### RACE_02. 重复提交防护缺失 [high]
102
+ - 创建订单/支付/领取等敏感接口无幂等 token;无唯一约束;无防抖防重
103
+ - **排除**:有 idempotencyKey;有唯一索引;操作天然幂等
104
+
105
+ ---
106
+
107
+ ## 七、计算准确性
108
+
109
+ ### CALC_01. 大数整数溢出 [middle]
110
+ - 大 ID(雪花 ID/时间戳)或大金额直接数值运算未用 BigInt
111
+ - **排除**:值域确认在 Number.MAX_SAFE_INTEGER 范围内
112
+
113
+ ### CALC_02. 并发下计数丢失 [high]
114
+ - 先查数量再更新,中间无原子操作或事务保护(详见 SQL_CONC_01)
115
+
116
+ ---
117
+
118
+ ## 八、SQL 操作问题
119
+
120
+ ### SQL_PERF_01. N+1 查询 [middle]
121
+ - for/forEach/map/while 循环内调用数据库方法或 await 异步查询
122
+ - **排除**:有 break 且数量有限;Promise.all 并行;已用 IN 批量查询
123
+
124
+ ### SQL_CONC_01. 库存/数量非原子操作 [high]
125
+ - 先 SELECT 后 UPDATE 模式(findOne → stock - quantity → save),无事务/行锁/原子操作
126
+ - **排除**:`UPDATE SET stock = stock - 1 WHERE stock > 0` 原子操作;SELECT FOR UPDATE;乐观锁;Redis DECR
127
+
128
+ ### SQL_CONC_02. check-then-act 非原子 [high]
129
+ - 先查询判断(findOne/count)再插入/更新,中间无锁/事务保护,无唯一约束
130
+ - **排除**:有唯一索引;有事务+行锁;有幂等 token
131
+
132
+ ### SQL_TRANS_01. 事务完整性缺失 [high]
133
+ - 多个连续数据库写操作构成原子业务单元,无 beginTransaction/startTransaction,无 rollback
134
+ - **排除**:单个写操作;已有事务;操作相互独立
135
+
136
+ ### SQL_PERF_02. 缺少查询索引 [middle]
137
+ - 原生 SQL WHERE 条件字段无索引;ORM 用低选择/无索引字段;上下文表明大表
138
+ - **排除**:用主键查询;已注释说明有索引;表数据量明确小
139
+ - **复核**:需明确证据(注释/表结构),不确定不上报
140
+
141
+ ---
142
+
143
+ ## 九、效率问题补充(3项)
144
+
145
+ ### EFF_01. 可并行的串行 await [middle]
146
+ - **检测**:连续多个 `await asyncA()` + `await asyncB()` 且两个操作互不依赖(B 不使用 A 的返回值),应改为 `Promise.all`
147
+ - **排除**:B 依赖 A 的结果;操作间有顺序语义(如日志记录、事务步骤);有意串行限流
148
+
149
+ ```javascript
150
+ // 反例 — 串行,总耗时 = tA + tB
151
+ const user = await fetchUser(id);
152
+ const config = await fetchConfig(); // 不依赖 user,可并行
153
+
154
+ // 正例 — 并行,总耗时 = max(tA, tB)
155
+ const [user, config] = await Promise.all([fetchUser(id), fetchConfig()]);
156
+ ```
157
+
158
+ ### EFF_02. 文件/资源存在性预检查(TOCTOU) [low]
159
+ - **检测**:操作前先调用 `fs.existsSync`/`fs.access` 检查存在性,再执行实际操作,形成 check-then-act 竞态,且增加额外 I/O
160
+ - **排除**:业务逻辑确实需要分支判断(如"不存在则创建"但使用了原子 flags)
161
+ - **复核**:确认可以用 try-catch 处理 ENOENT 替代预检查
162
+
163
+ ```javascript
164
+ // 反例 — 两次 I/O,且存在竞态
165
+ if (fs.existsSync(filePath)) {
166
+ const data = fs.readFileSync(filePath);
167
+ }
168
+
169
+ // 正例 — 直接操作,catch 处理不存在
170
+ try {
171
+ const data = fs.readFileSync(filePath);
172
+ } catch (e) {
173
+ if (e.code !== 'ENOENT') throw e;
174
+ }
175
+ ```
176
+
177
+ ### EFF_03. 无变化时触发的无效更新 [low]
178
+ - **检测**:在轮询、定时器或事件处理器中,无条件更新状态/存储(如 `setState(value)`),未在写入前比较新旧值,导致下游无意义重渲染/重计算
179
+ - **排除**:已有 `if (prev !== next)` 守卫;状态管理框架内置了浅比较
180
+ - **复核**:确认触发频率较高(如 setInterval ≤1s 或高频事件);确认下游有实际渲染开销