@comate/zulu 1.2.1-beta.1 → 1.3.0

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 (169) hide show
  1. package/comate-engine/assets/skills/auto-commit-comate/SKILL.md +260 -0
  2. package/comate-engine/assets/skills/auto-commit-comate/references/data_structures.md +189 -0
  3. package/comate-engine/assets/skills/auto-commit-comate/references/new_version_instruction.md +209 -0
  4. package/comate-engine/assets/skills/auto-commit-comate/references/old_version_instruction.md +208 -0
  5. package/comate-engine/assets/skills/auto-commit-comate/scripts/git_diff_cli.py +196 -0
  6. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/git_utils.py +20 -10
  7. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/client.py +69 -40
  8. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/farseer.py +8 -9
  9. package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/matching.py +65 -9
  10. package/comate-engine/assets/skills/auto-commit-comate/scripts/match_card_cli.py +37 -0
  11. package/comate-engine/assets/skills/cnap-comate/SKILL.md +157 -0
  12. package/comate-engine/assets/skills/cnap-comate/references/cases.md +198 -0
  13. package/comate-engine/assets/skills/cnap-comate/references/deploy-troubleshoot.md +15 -0
  14. package/comate-engine/assets/skills/cnap-comate/references/install.md +43 -0
  15. package/comate-engine/assets/skills/cnap-comate/references/kubectl.md +55 -0
  16. package/comate-engine/assets/skills/cnap-comate/references/login.md +125 -0
  17. package/comate-engine/assets/skills/cnap-comate/references/oncall.md +24 -0
  18. package/comate-engine/assets/skills/cnap-comate/scripts/install_cnap_cli.sh +36 -0
  19. package/comate-engine/assets/skills/code-security/SKILL.md +176 -0
  20. package/comate-engine/assets/skills/code-security/references/credential_hosting.md +102 -0
  21. package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +219 -0
  22. package/comate-engine/assets/skills/code-security/scripts/build_repair_info.py +0 -0
  23. package/comate-engine/assets/skills/code-security/scripts/credential_hosting.py +99 -0
  24. package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +350 -0
  25. package/comate-engine/assets/skills/code-security/scripts/http_client.py +173 -0
  26. package/comate-engine/assets/skills/code-security/scripts/parse_scan_result.py +301 -0
  27. package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +261 -0
  28. package/comate-engine/assets/skills/code-security/scripts/report_chat.py +198 -0
  29. package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +316 -0
  30. package/comate-engine/assets/skills/code-security-comate/SKILL.md +219 -0
  31. package/comate-engine/assets/skills/code-security-comate/references/credential_hosting.md +102 -0
  32. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-go_sql_injection.md +399 -0
  33. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-java_sql_injection.md +591 -0
  34. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-php_sql_injection.md +318 -0
  35. package/comate-engine/assets/skills/code-security-comate/references/vul_repair-python_sql_injection.md +198 -0
  36. package/comate-engine/assets/skills/code-security-comate/references/vul_repair_sensitive.md +219 -0
  37. package/comate-engine/assets/skills/code-security-comate/scripts/credential_hosting.py +87 -0
  38. package/comate-engine/assets/skills/code-security-comate/scripts/credential_poll.py +345 -0
  39. package/comate-engine/assets/skills/code-security-comate/scripts/http_client.py +173 -0
  40. package/comate-engine/assets/skills/code-security-comate/scripts/parse_scan_result.py +392 -0
  41. package/comate-engine/assets/skills/code-security-comate/scripts/repair_vulnerability.py +245 -0
  42. package/comate-engine/assets/skills/code-security-comate/scripts/report_chat.py +145 -0
  43. package/comate-engine/assets/skills/code-security-comate/scripts/scan_vulnerability.py +444 -0
  44. package/comate-engine/assets/skills/code-security-comate/scripts/utils.py +153 -0
  45. package/comate-engine/assets/skills/comate-docs-comate/SKILL.md +148 -0
  46. package/comate-engine/assets/skills/comate-docs-comate/references/doc-map-extended.md +78 -0
  47. package/comate-engine/assets/skills/comate-docs-comate/references/models-and-billing.md +51 -0
  48. package/comate-engine/assets/skills/comate-docs-comate/references/product-overview.md +73 -0
  49. package/comate-engine/assets/skills/comate-docs-comate/references/query_content.md +83 -0
  50. package/comate-engine/assets/skills/comate-docs-comate/references/query_repo.md +57 -0
  51. package/comate-engine/assets/skills/comate-docs-comate/scripts/ku_operator.py +1575 -0
  52. package/comate-engine/assets/skills/create-image-comate/SKILL.md +278 -0
  53. package/comate-engine/assets/skills/create-skill-comate/SKILL.md +308 -217
  54. package/comate-engine/assets/skills/create-skill-comate/agents/analyzer.md +274 -0
  55. package/comate-engine/assets/skills/create-skill-comate/agents/comparator.md +202 -0
  56. package/comate-engine/assets/skills/create-skill-comate/agents/grader.md +223 -0
  57. package/comate-engine/assets/skills/create-skill-comate/assets/eval_review.html +146 -0
  58. package/comate-engine/assets/skills/create-skill-comate/eval-viewer/generate_review.py +489 -0
  59. package/comate-engine/assets/skills/create-skill-comate/eval-viewer/viewer.html +1325 -0
  60. package/comate-engine/assets/skills/create-skill-comate/references/schemas.md +430 -0
  61. package/comate-engine/assets/skills/create-skill-comate/scripts/__init__.py +0 -0
  62. package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  63. package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/aggregate_benchmark.cpython-311.pyc +0 -0
  64. package/comate-engine/assets/skills/create-skill-comate/scripts/aggregate_benchmark.py +412 -0
  65. package/comate-engine/assets/skills/create-skill-comate/scripts/generate_report.py +334 -0
  66. package/comate-engine/assets/skills/create-skill-comate/scripts/package_skill.py +140 -0
  67. package/comate-engine/assets/skills/create-skill-comate/scripts/utils.py +53 -0
  68. package/comate-engine/assets/skills/find-skills-comate/SKILL.md +15 -12
  69. package/comate-engine/assets/skills/find-skills-comate/scripts/fetch_skills.py +32 -3
  70. package/comate-engine/assets/skills/get-ugate-token-comate/SKILL.md +159 -0
  71. package/comate-engine/assets/skills/get-ugate-token-comate/getUgateToken.py +150 -0
  72. package/comate-engine/assets/skills/icafe-comate/SKILL.md +240 -0
  73. package/comate-engine/assets/skills/icafe-comate/references/ai-workflows.md +233 -0
  74. package/comate-engine/assets/skills/icafe-comate/references/commands.md +1147 -0
  75. package/comate-engine/assets/skills/icafe-comate/references/error-handling.md +164 -0
  76. package/comate-engine/assets/skills/icafe-comate/references/git-auto-bindcard-workflow.md +201 -0
  77. package/comate-engine/assets/skills/icafe-comate/references/git-bindcard-workflow.md +327 -0
  78. package/comate-engine/assets/skills/icafe-comate/references/iql-syntax.md +327 -0
  79. package/comate-engine/assets/skills/icafe-comate/references/platform-concepts.md +317 -0
  80. package/comate-engine/assets/skills/icafe-comate/references/smart-create-workflow.md +171 -0
  81. package/comate-engine/assets/skills/icafe-comate/references/smart-find-workflow.md +127 -0
  82. package/comate-engine/assets/skills/icafe-comate/references/smart-update-workflow.md +118 -0
  83. package/comate-engine/assets/skills/icode-comate/SKILL.md +366 -0
  84. package/comate-engine/assets/skills/icode-comate/references/api/add_reviewers.md +44 -0
  85. package/comate-engine/assets/skills/icode-comate/references/api/build_fetch_command.md +89 -0
  86. package/comate-engine/assets/skills/icode-comate/references/api/check_repo_permission.md +89 -0
  87. package/comate-engine/assets/skills/icode-comate/references/api/create_branch.md +79 -0
  88. package/comate-engine/assets/skills/icode-comate/references/api/create_draft_comment.md +109 -0
  89. package/comate-engine/assets/skills/icode-comate/references/api/get_ai_cr_result.md +190 -0
  90. package/comate-engine/assets/skills/icode-comate/references/api/get_ai_review.md +97 -0
  91. package/comate-engine/assets/skills/icode-comate/references/api/get_diff_content.md +92 -0
  92. package/comate-engine/assets/skills/icode-comate/references/api/get_diff_file.md +88 -0
  93. package/comate-engine/assets/skills/icode-comate/references/api/get_machine_check.md +73 -0
  94. package/comate-engine/assets/skills/icode-comate/references/api/get_my_reviews.md +115 -0
  95. package/comate-engine/assets/skills/icode-comate/references/api/get_person_commit.md +89 -0
  96. package/comate-engine/assets/skills/icode-comate/references/api/get_person_repo.md +63 -0
  97. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_branch.md +62 -0
  98. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_config.md +91 -0
  99. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_members.md +118 -0
  100. package/comate-engine/assets/skills/icode-comate/references/api/get_repo_reviews.md +91 -0
  101. package/comate-engine/assets/skills/icode-comate/references/api/get_review_comments.md +87 -0
  102. package/comate-engine/assets/skills/icode-comate/references/api/get_review_info.md +81 -0
  103. package/comate-engine/assets/skills/icode-comate/references/api/get_submit_settings.md +105 -0
  104. package/comate-engine/assets/skills/icode-comate/references/api/icode-api.md +86 -0
  105. package/comate-engine/assets/skills/icode-comate/references/api/publish_comments.md +72 -0
  106. package/comate-engine/assets/skills/icode-comate/references/api/set_review_score.md +58 -0
  107. package/comate-engine/assets/skills/icode-comate/references/api/start_ai_review.md +77 -0
  108. package/comate-engine/assets/skills/icode-comate/references/api/submit_review.md +50 -0
  109. package/comate-engine/assets/skills/icode-comate/references/api/trigger_ai_cr.md +63 -0
  110. package/comate-engine/assets/skills/icode-comate/references/feature/add-reviewer.md +92 -0
  111. package/comate-engine/assets/skills/icode-comate/references/feature/fix-machine-check.md +144 -0
  112. package/comate-engine/assets/skills/icode-comate/references/feature/merge-cr.md +100 -0
  113. package/comate-engine/assets/skills/icode-comate/references/feature/ssh-setup.md +106 -0
  114. package/comate-engine/assets/skills/icode-comate/references/feature/submit-acr.md +135 -0
  115. package/comate-engine/assets/skills/icode-comate/references/feature/submit-cr.md +123 -0
  116. package/comate-engine/assets/skills/icode-comate/references/git/clone.md +67 -0
  117. package/comate-engine/assets/skills/icode-comate/references/git/icode-git.md +68 -0
  118. package/comate-engine/assets/skills/icode-comate/references/git/push.md +64 -0
  119. package/comate-engine/assets/skills/icode-comate/references/git/push_cr.md +103 -0
  120. package/comate-engine/assets/skills/icode-comate/references/install.md +144 -0
  121. package/comate-engine/assets/skills/icode-comate/references/login.md +111 -0
  122. package/comate-engine/assets/skills/icode-comate/scripts/add-reviewer.sh +154 -0
  123. package/comate-engine/assets/skills/icode-comate/scripts/common.sh +145 -0
  124. package/comate-engine/assets/skills/icode-comate/scripts/fix-machine-check.sh +131 -0
  125. package/comate-engine/assets/skills/icode-comate/scripts/merge-cr.sh +105 -0
  126. package/comate-engine/assets/skills/icode-comate/scripts/ssh-setup.sh +159 -0
  127. package/comate-engine/assets/skills/icode-comate/scripts/submit-acr.sh +236 -0
  128. package/comate-engine/assets/skills/icode-comate/scripts/submit-cr.sh +104 -0
  129. package/comate-engine/assets/skills/icode-comate/scripts/test-preflight.sh +89 -0
  130. package/comate-engine/assets/skills/ku-operator-comate/SKILL.md +121 -0
  131. package/comate-engine/assets/skills/ku-operator-comate/examples.md +190 -0
  132. package/comate-engine/assets/skills/ku-operator-comate/references/add_member.md +49 -0
  133. package/comate-engine/assets/skills/ku-operator-comate/references/change_scope.md +38 -0
  134. package/comate-engine/assets/skills/ku-operator-comate/references/copy_doc.md +50 -0
  135. package/comate-engine/assets/skills/ku-operator-comate/references/create_doc.md +61 -0
  136. package/comate-engine/assets/skills/ku-operator-comate/references/delete_doc.md +31 -0
  137. package/comate-engine/assets/skills/ku-operator-comate/references/edit_content.md +568 -0
  138. package/comate-engine/assets/skills/ku-operator-comate/references/move_doc.md +45 -0
  139. package/comate-engine/assets/skills/ku-operator-comate/references/query_comment.md +79 -0
  140. package/comate-engine/assets/skills/ku-operator-comate/references/query_content.md +83 -0
  141. package/comate-engine/assets/skills/ku-operator-comate/references/query_flowchart.md +84 -0
  142. package/comate-engine/assets/skills/ku-operator-comate/references/query_permission.md +38 -0
  143. package/comate-engine/assets/skills/ku-operator-comate/references/query_recent_view.md +67 -0
  144. package/comate-engine/assets/skills/ku-operator-comate/references/query_repo.md +57 -0
  145. package/comate-engine/assets/skills/ku-operator-comate/references/query_user_info.md +37 -0
  146. package/comate-engine/assets/skills/ku-operator-comate/references/update_member.md +41 -0
  147. package/comate-engine/assets/skills/ku-operator-comate/references/upload_attachment.md +52 -0
  148. package/comate-engine/assets/skills/ku-operator-comate/scripts/ku_operator.py +1575 -0
  149. package/comate-engine/node_modules/better-sqlite3/node_modules/.bin/prebuild-install +2 -2
  150. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build +2 -2
  151. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-optional +2 -2
  152. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-test +2 -2
  153. package/comate-engine/package.json +2 -0
  154. package/comate-engine/server.js +263 -79
  155. package/dist/bundle/index.js +8 -8
  156. package/package.json +1 -1
  157. package/comate-engine/assets/skills/figma2code-comate/codeConnect.md +0 -37
  158. package/comate-engine/assets/skills/figma2code-comate/designToken.md +0 -3
  159. package/comate-engine/assets/skills/figma2code-comate/f2cMcp.md +0 -59
  160. package/comate-engine/assets/skills/smart-commit/SKILL.md +0 -646
  161. package/comate-engine/node_modules/@comate/plugin-host/dist/index-AZIho4HV.js +0 -1
  162. package/comate-engine/node_modules/@comate/plugin-host/dist/user-BIpzRUfb.js +0 -44
  163. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/issue_type_mapping.json +0 -0
  164. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/query_reference.md +0 -0
  165. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/compat.py +0 -0
  166. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/create_card_cli.py +0 -0
  167. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/__init__.py +0 -0
  168. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/logger.py +0 -0
  169. /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/recognize_card_cli.py +0 -0
@@ -0,0 +1,327 @@
1
+ # 复杂场景工作流指南
2
+
3
+ 本文档包含使用 icafe-cli 处理复杂多步骤场景的详细操作指南和决策流程。
4
+
5
+ ---
6
+
7
+ ## 场景1: Git 提交/发起评审时智能绑定卡片
8
+
9
+ 用户在 iCode (Gerrit 模式) 提交代码后发起评审,需要绑定 iCafe 卡片。核心逻辑:**自动查找最相关的已有卡片,找不到则新建**。
10
+
11
+ ### 第一步:确定目标空间
12
+
13
+ 空间的确定有优先级,按以下顺序逐级尝试。
14
+
15
+ **1.1 用户对话上下文直接指定了空间**
16
+
17
+ 如果用户说"提交到 cloud-iCafe 空间",直接使用 `cloud-iCafe` 作为 space。
18
+
19
+ **1.2 从 git log 历史提交记录中解析空间**
20
+
21
+ ```bash
22
+ git log --oneline -20
23
+ ```
24
+
25
+ 分析历史提交信息,提取卡片绑定信息。提交记录中通常包含如下格式:
26
+
27
+ ```
28
+ cloud-iCafe-22210 [Task] 【前端】智能预审结果支持发起LR
29
+ cloud-iCafe-22211【前端】智能预审结果支持xxx发起LR
30
+ myspace-1568 [Bug] 修复登录异常
31
+ ```
32
+
33
+ 解析规则:
34
+ - 格式为 `{空间标识}-{卡片序列号 (sequence)}`,如 `cloud-iCafe-22210`
35
+ - **序列号 (sequence) 是最后一个 `-` 后的纯数字部分**,前面的所有内容是空间标识 (prefixCode)。空间标识本身可能包含 `-`,例如 `cloud-iCafe-22210` 中 space 是 `cloud-iCafe`、sequence 是 `22210`
36
+ - `[Task]`、`[Bug]` 等方括号内容是卡片类型(可能没有)
37
+ - 如果多条提交记录指向不同空间,统计出现最多的空间,或列出让用户选择
38
+
39
+ **解析结果暂存**:将解析出的所有 `{space, sequence, type(可能为空)}` 记录下来,供第二步和第三步复用。
40
+
41
+ **1.3 smart-find + git remote 交叉匹配推断空间**
42
+
43
+ 如果 git log 中没有卡片信息(新项目、第一次提交等),组合使用 smart-find 和 git remote 推断:
44
+
45
+ ```bash
46
+ # 获取仓库名关键词
47
+ git remote get-url origin
48
+ # 例如: icode.baidu.com/baidu/icafe/luigi-service → 关键词 "luigi", "icafe"
49
+
50
+ # 获取用户活跃卡片和空间
51
+ icafe-cli card smart-find
52
+ ```
53
+
54
+ 从 smart-find 结果中推断空间的策略(**直接读 `stats.bySpace` 字段,已按数量降序排列**):
55
+
56
+ 1. **仓库名匹配**: 从 `git remote` URL 提取仓库关键词(如 `luigi-service` → "luigi"、"icafe"),与 `stats.bySpace` 中的空间名和 `cards` 中的卡片标题做模糊匹配,匹配度高的空间优先
57
+ 2. **空间分布统计**: 统计 smart-find 结果中各空间出现的卡片数量,出现最多的空间最可能是用户当前工作的空间
58
+ 3. **活跃度权重**: `lastModified` 越近的卡片所在空间权重越高
59
+ 4. **单空间直接使用**: 如果只有一个空间,直接使用
60
+ 5. **多空间候选**: 如果无法自动确定,列出 top 3 候选空间(附卡片数量和最近活跃时间)让用户选择
61
+ 6. **无结果**: smart-find 也无结果,必须询问用户
62
+
63
+ > **注意**: `smart-find` 结果缓存 10 分钟,同一会话内多次调用不会重复请求 API。
64
+
65
+ ### 第二步:在选定空间中查找已有卡片
66
+
67
+ 确定空间后,优先查找可以复用的已有卡片,避免重复创建。
68
+
69
+ **2.1 从 smart-find 结果中匹配**
70
+
71
+ 如果第一步中使用了 `smart-find`,其结果已包含用户的活跃卡片列表。直接从中筛选属于目标空间的卡片:
72
+ - 排除已结束的卡片(status 为终态的,如"已完成"、"已关闭")
73
+ - 检查标题是否与本次代码变更相关(用 git diff 摘要、分支名、commit message 做关键词匹配)
74
+ - 如果有多张候选,按标题相关性 + lastModified 时间综合排序
75
+
76
+ 如果找到合适的卡片,推荐给用户使用。**用户确认 → 跳到第五步。**
77
+
78
+ **2.2 从 git log 中提取的卡片批量查询**
79
+
80
+ 如果第一步中解析出了该空间的卡片序列号,**一次性批量查询**(同时验证空间有效性):
81
+
82
+ ```bash
83
+ # 将同一空间的所有序列号合并查询,避免逐个调用
84
+ icafe-cli card get --space cloud-iCafe --sequence 22210,22211,22215 --brief
85
+ ```
86
+
87
+ > **复用提示**: 本步返回的卡片数据(类型、状态等)在第三步确定卡片类型时直接复用,无需再次调用 `card get`。
88
+
89
+ 从返回结果中筛选适合本次提交的卡片:
90
+ - 排除 `isFinishedStatus` 为 `true` 的卡片(已结束,不适合绑定)
91
+ - 检查标题和类型是否与本次代码变更相关
92
+ - 结合当前用户对话的上下文判断
93
+ - 如果有多张候选,按相关性排序推荐
94
+
95
+ 如果找到合适的卡片,推荐给用户使用。**用户确认 → 跳到第五步。用户拒绝或没有合适的 → 继续 2.3 IQL 搜索。**
96
+
97
+ **2.3 用 IQL 搜索相关卡片**
98
+
99
+ 如果前两步都没有找到合适的卡片,使用 IQL 查询。结合当前上下文(git diff 内容、分支名、用户编写的 commit message)构建查询:
100
+
101
+ ```bash
102
+ # 查找当前用户负责的未关闭卡片 (currentUser 是 IQL 内置关键字,自动匹配当前认证用户)
103
+ icafe-cli card query --space <space> \
104
+ --iql "负责人 = currentUser AND 流程状态 != 已关闭" \
105
+ --max-records 10 --brief
106
+
107
+ # 如果能从分支名或 commit message 中提取关键词,用标题模糊匹配缩小范围
108
+ icafe-cli card query --space <space> \
109
+ --iql "负责人 = currentUser AND 标题 ~ <关键词> AND 流程状态 != 已关闭" --brief
110
+ ```
111
+
112
+ > **注意**: `流程状态 != 已关闭` 中的 "已关闭" 只是常见的终态名称,不同空间的终态名可能不同(如 "已完成"、"Done" 等)。建议对查询结果再用返回的 `isFinishedStatus` 字段做二次过滤,排除所有已结束的卡片。
113
+
114
+ - 如果找到匹配的卡片,列出候选卡片(序列号、标题、类型、状态),让用户确认使用哪张
115
+ - 如果找到多张,根据标题与本次代码变更的相关性排序推荐
116
+ - 用户确认后,直接使用该卡片,跳到第五步
117
+
118
+ **2.4 没有找到合适的已有卡片 → 进入第三步新建**
119
+
120
+ ### 第三步:确定新建卡片的类型
121
+
122
+ > **重要约束: 卡片类型可绑定性**
123
+ >
124
+ > 每个空间可以配置哪些卡片类型允许绑定代码(即 Git 提交可以关联该类型的卡片)。有些空间只允许特定类型(如 Task、Bug)绑定代码,有些空间未配置则所有类型都可绑定。**目前没有 API 可以查询哪些类型可绑定代码**,因此必须优先参考 git log 中已有的历史绑定记录——历史上成功绑定过的卡片类型大概率是该空间允许的。
125
+
126
+ 按以下优先级确定类型,**多个信号综合判断比单一信号更可靠**:
127
+
128
+ **3.1 用户上下文中指定了类型** (可信度: 最高)
129
+
130
+ 如果用户明确说"创建一个 Bug",直接使用。
131
+
132
+ **3.2 git log 历史绑定类型** (可信度: 高,已验证可绑定)
133
+
134
+ 从第一步解析的 `[Task]`、`[Bug]` 类型标记中提取。这些是该空间**已验证可绑定代码**的类型:
135
+ - 如果历史只有一种类型(如全是 Task),本次优先用 Task
136
+ - 如果有多种类型,暂存供后续交叉验证
137
+
138
+ **3.3 git 分支名模式匹配** (可信度: 中)
139
+
140
+ 解析当前 git 分支名,很多团队有分支命名规范:
141
+
142
+ ```bash
143
+ git rev-parse --abbrev-ref HEAD
144
+ ```
145
+
146
+ | 分支名模式 | 推断类型 |
147
+ |-----------|---------|
148
+ | `bugfix/*`, `fix/*`, `hotfix/*` | Bug |
149
+ | `feature/*`, `feat/*` | Story 或 Feature |
150
+ | `task/*`, `chore/*`, `docs/*` | Task |
151
+ | `release/*`, `deploy/*` | 不推断(通常不新建卡片) |
152
+
153
+ > **注意**: 分支名推断的类型需要和 3.2 的历史类型交叉验证。如果分支名推断为 Bug,但历史上该空间从未绑定过 Bug 类型,应该提示用户确认。
154
+
155
+ **3.4 smart-find 该空间的类型分布** (可信度: 中)
156
+
157
+ 如果第一步使用了 smart-find,**直接读 `stats.bySpaceType` 字段**(已按数量降序排列,无需自己遍历 cards 计算):
158
+
159
+ ```
160
+ 例如 smart-find 返回的 stats.bySpaceType:
161
+ [{"space":"cloud-iCafe", "type":"Task", "count":8},
162
+ {"space":"cloud-iCafe", "type":"Story", "count":4},
163
+ {"space":"cloud-iCafe", "type":"Bug", "count":2}]
164
+ → cloud-iCafe 空间最常用 Task
165
+ ```
166
+
167
+ - 结合 3.3 的分支名提示交叉验证:分支名推断 Bug + 该空间有 Bug 类型 → 高置信度选 Bug
168
+ - 如果无分支名提示,用出现最多的类型作为默认值
169
+
170
+ **3.5 commit message / git diff 关键词** (可信度: 低,辅助参考)
171
+
172
+ | 关键词 | 推断类型 |
173
+ |--------|---------|
174
+ | "修复", "fix", "bug", "repair", "patch" | Bug |
175
+ | "新增", "feat", "add", "implement", "新功能" | Story/Feature |
176
+ | "优化", "refactor", "重构", "perf" | Task |
177
+ | "文档", "doc", "readme" | Task |
178
+ | "测试", "test", "ut" | Task |
179
+
180
+ > 这些只是辅助信号,不能单独决定类型。应与 3.2~3.4 的结果综合判断。
181
+
182
+ **3.6 综合决策**
183
+
184
+ 将以上信号按权重综合:
185
+
186
+ ```
187
+ 最终类型 =
188
+ 用户指定 (最高优先)
189
+ > git log 历史类型 (高优先,已验证可绑定)
190
+ > 分支名 + smart-find 类型分布交叉验证 (中优先)
191
+ > smart-find 该空间最常用类型 (中低优先)
192
+ > commit/diff 关键词 (低优先,仅辅助)
193
+ ```
194
+
195
+ 如果有足够置信度(至少两个信号指向同一类型),直接使用并告知用户;否则列出候选类型让用户选择。
196
+
197
+ **3.7 查询空间支持的类型列表 (兜底)**
198
+
199
+ 仅当以上所有信号都无法确定类型时(新项目、新空间、无历史记录):
200
+
201
+ ```bash
202
+ icafe-cli space issue-types --space <space>
203
+ ```
204
+
205
+ 获取该空间所有可用类型,结合上下文让模型判断最合适的类型,不确定时询问用户。注意:这里返回的是空间支持的所有类型,不代表所有类型都能绑定代码。
206
+
207
+ > **避免重复调用**: 如果确定了类型后紧接着要调 `space type-fields --type <type>` 获取字段,`type-fields` 调用成功即隐含"该类型存在"的验证,不需要先调 `issue-types` 确认类型再调 `type-fields`。只有在**需要列出所有类型让用户选择**时才调 `issue-types`。
208
+
209
+ ### 第四步:获取字段信息并创建卡片
210
+
211
+ **4.1 获取该空间该类型下的所有字段**
212
+
213
+ ```bash
214
+ icafe-cli space type-fields --space <space> --type <type>
215
+ ```
216
+
217
+ 这个接口返回每个字段的:
218
+ - 字段名称(中文,如"负责人"、"优先级")
219
+ - 字段类型(文本、选择、人员等)
220
+ - 是否必填
221
+ - 可选值列表(如优先级的 P0-Highest ~ P4-Lowest)
222
+
223
+ **注意:不同空间的字段可能不同,同一字段的可选值也可能不同,必须通过此接口动态获取,不能硬编码。**
224
+
225
+ **4.2 填充字段值**
226
+
227
+ 结合上下文信息尽可能填充所有字段:
228
+
229
+ | 字段 | 值来源 |
230
+ |------|--------|
231
+ | 标题 (title) | 从 commit message 或 git diff 摘要生成,或询问用户 |
232
+ | 正文 (detail) | 从 git diff 生成变更摘要,转换为 HTML 格式 |
233
+ | 类型 (type) | 第三步确定的类型 |
234
+ | 负责人 (assignee) | 当前用户的百度用户名 (邮箱前缀) |
235
+ | 优先级 (priority) | 根据 type-fields 返回的优先级选项动态选择。如有 P2-Middle 可作为默认值;如该类型无优先级字段则不传 |
236
+ | 流程状态 (status) | 通常不需要指定,使用默认的初始状态 |
237
+ | 自定义必填字段 | 从 fields 接口获取必填字段,尽量填充;无法确定值时直接跳过 (API 不强制校验自定义必填字段) |
238
+
239
+ **4.3 创建卡片**
240
+
241
+ ```bash
242
+ icafe-cli card create \
243
+ --space <space> \
244
+ --title "从代码变更和上下文推断的标题" \
245
+ --detail "<p>变更摘要的HTML描述</p>" \
246
+ --type <type> \
247
+ --assignee <username> \
248
+ --priority <从 type-fields 获取的优先级值> \
249
+ --fields "自定义必填字段1=值1,自定义必填字段2=值2"
250
+ ```
251
+
252
+ > **注意**: `--priority` 的值必须来自 `space type-fields` 返回的选项列表,不能硬编码。如该类型无优先级字段则不传此参数。
253
+
254
+ 如果必填字段无法全部填充,仍然可以创建成功 (API 层不强制校验自定义必填字段,只校验 title 和 type)。但建议尽量填充以保证卡片信息完整。
255
+
256
+ ### 第五步:返回卡片信息
257
+
258
+ 无论是复用已有卡片还是新建卡片,最终都要返回:
259
+
260
+ 1. **卡片 URL**(用于绑定到 git commit / 评审):
261
+ ```
262
+ https://console.cloud.baidu-int.com/devops/icafe/issue/<space>-<sequence>/show
263
+ ```
264
+
265
+ 2. **卡片基本信息**:序列号、标题、类型、状态
266
+
267
+ 3. **供用户使用的 commit message 格式**:
268
+ ```
269
+ <space>-<sequence> [<type>] <title>
270
+ ```
271
+ 例如:`cloud-iCafe-22210 [Task] 【前端】智能预审结果支持发起LR`
272
+
273
+ ### 决策流程图
274
+
275
+ ```
276
+ 用户准备提交代码 / 发起评审
277
+
278
+ ├─ 1. 确定空间
279
+ │ ├─ 用户上下文指定? → 使用指定空间
280
+ │ ├─ git log 中有历史卡片? → 解析 {空间标识}-{序列号} (序列号=最后一个-后的纯数字)
281
+ │ │ 暂存所有 {space, sequence, type} 记录
282
+ │ └─ 都没有? → card smart-find + git remote 交叉匹配
283
+ │ ├─ 仓库名与卡片标题/空间名匹配 → 优先推荐匹配的空间
284
+ │ ├─ 统计空间分布 + 活跃度 → 推荐 top 空间
285
+ │ └─ 无法确定 → 列候选让用户选择
286
+
287
+ ├─ 2. 查找已有卡片
288
+ │ ├─ smart-find 结果中有该空间的卡片? → 标题关键词匹配推荐
289
+ │ │ ├─ 用户确认 → 跳到第 5 步
290
+ │ │ └─ 用户拒绝 → 继续 2.2
291
+ │ ├─ 有解析出的序列号? → card get 批量查询 (同时验证空间 + 获取类型信息)
292
+ │ │ ├─ 有未结束且相关的卡片 → 推荐给用户
293
+ │ │ │ ├─ 用户确认 → 跳到第 5 步
294
+ │ │ │ └─ 用户拒绝 → 继续 IQL 搜索
295
+ │ │ └─ 全部已结束或不相关 → 继续 IQL 搜索 (但保留类型信息供第 3 步用)
296
+ │ ├─ IQL 搜索用户未关闭的卡片 (用 currentUser + isFinishedStatus 过滤)
297
+ │ │ ├─ 找到 → 列出候选,用户选择 → 跳到第 5 步
298
+ │ │ └─ 没找到 → 进入第 3 步
299
+
300
+ ├─ 3. 确定卡片类型 (多信号综合判断)
301
+ │ ├─ 用户指定? → 直接使用
302
+ │ ├─ 收集信号:
303
+ │ │ ├─ [高] git log 历史类型标记 [Task]/[Bug] (已验证可绑定)
304
+ │ │ ├─ [中] git 分支名模式: bugfix→Bug, feature→Story, task→Task
305
+ │ │ ├─ [中] smart-find 该空间类型分布统计 (最常用类型)
306
+ │ │ └─ [低] commit/diff 关键词: "修复"→Bug, "新增"→Story
307
+ │ ├─ 交叉验证: 多个信号指向同一类型? → 高置信度使用
308
+ │ ├─ 信号冲突? → 优先 git log 历史 > 分支名+类型分布 > 关键词
309
+ │ └─ 无任何信号? → issue-types 获取列表 → 询问用户
310
+
311
+ ├─ 4. 创建卡片
312
+ │ ├─ type-fields 获取字段定义、必填项和可选值 (含优先级选项)
313
+ │ ├─ 从 git diff + commit message 生成 title 和 detail (HTML)
314
+ │ ├─ 填充负责人、优先级 (从 type-fields 动态获取)、自定义必填字段
315
+ │ ├─ card create 创建
316
+ │ │ ├─ 成功 → 进入第 5 步
317
+ │ │ └─ 失败(缺必填字段等) → 分析报错,询问用户补充后重试
318
+
319
+ └─ 5. 返回结果
320
+ ├─ 卡片 URL: https://console.cloud.baidu-int.com/devops/icafe/issue/{space}-{sequence}/show
321
+ ├─ 卡片基本信息
322
+ └─ commit message 格式: {space}-{sequence} [{type}] {title}
323
+ ```
324
+
325
+ ---
326
+
327
+ > 智能修改卡片的完整流程已移至 [智能修改卡片工作流](smart-update-workflow.md)。
@@ -0,0 +1,327 @@
1
+ # IQL (iCafe Query Language) 语法参考
2
+
3
+ ## 概述
4
+
5
+ IQL 是 iCafe 平台的卡片查询语言,用于按条件筛选和检索卡片。通过 `icafe-cli card query --iql` 参数使用。
6
+
7
+ ## 基本语法
8
+
9
+ ```
10
+ 字段名 操作符 值 [AND|OR 字段名 操作符 值 ...]
11
+ ```
12
+
13
+ **不支持 `NOT` 一元逻辑操作符**,不能写 `NOT (类型 = Bug)`。需要用 `!=`、`!~`、`not in` 等取反操作符代替。
14
+
15
+ 判空只能用 `is empty` / `is not empty`,不支持 `= null`。
16
+
17
+ ## 操作符
18
+
19
+ | 操作符 | 含义 | 示例 |
20
+ |--------|------|------|
21
+ | `=` | 等于 | `类型 = Bug` |
22
+ | `!=` | 不等于 | `流程状态 != 已关闭` |
23
+ | `>` | 大于 | `创建时间 > "2024-01-01"` |
24
+ | `<` | 小于 | `创建时间 < "2024-12-31"` |
25
+ | `>=` | 大于等于 | 仅流程状态支持: `流程状态 >= 开发中` |
26
+ | `<=` | 小于等于 | 仅流程状态支持: `流程状态 <= 测试中` |
27
+ | `in` | 在集合中 | `类型 in (Bug, Story, Task)` |
28
+ | `not in` | 不在集合中 | `优先级 not in (P3-Low, P4-Lowest)` |
29
+ | `~` | 包含 | `标题 ~ 登录` |
30
+ | `!~` | 不包含 | `标题 !~ 测试` |
31
+ | `is empty` | 为空 | `截止日期 is empty` |
32
+ | `is not empty` | 不为空 | `负责人 is not empty` |
33
+
34
+ ## 逻辑操作符
35
+
36
+ | 操作符 | 含义 | 示例 |
37
+ |--------|------|------|
38
+ | `AND` | 与 | `类型 = Bug AND 优先级 = P1-High` |
39
+ | `OR` | 或 | `类型 = Bug OR 类型 = Story` |
40
+ | `()` | 分组 | `(类型 = Bug OR 类型 = Story) AND 负责人 = currentUser` |
41
+
42
+ ## 字段类型与支持的操作符
43
+
44
+ ### 日期/时间字段
45
+
46
+ 字段: `创建时间`, `更新时间`, `最后修改时间`, `截止日期`, `解决时间`
47
+
48
+ 支持操作符: `<`, `>`, `=`, `is empty`, `is not empty`
49
+
50
+ **注意**: 日期字段不支持 `>=`、`<=`、`~`、`!~`。
51
+
52
+ **`=` 的特殊行为**: `创建时间 = "2024-01-01"` 匹配的是当天 00:00:00 到 23:59:59 的整天范围,不是精确时间点匹配。
53
+
54
+ ```
55
+ 创建时间 > "2024-01-01"
56
+ 更新时间 < "2024-06-30"
57
+ 截止日期 is empty
58
+ ```
59
+
60
+ #### 日期特殊值
61
+
62
+ `=` 操作符支持的周期值(匹配整个周期范围):
63
+
64
+ | 值 | 说明 |
65
+ |----|------|
66
+ | `currentDay` | 今天 |
67
+ | `currentWeek` | 本周 |
68
+ | `currentMonth` | 本月 |
69
+ | `currentQuarter` | 本季度 |
70
+ | `currentYear` | 今年 |
71
+ | `lastDay` | 昨天 |
72
+ | `lastWeek` | 上周 |
73
+ | `lastMonth` | 上月 |
74
+ | `lastQuarter` | 上季度 |
75
+ | `lastYear` | 去年 |
76
+ | `nextDay` | 明天 |
77
+ | `nextWeek` | 下周 |
78
+ | `nextMonth` | 下月 |
79
+ | `nextQuarter` | 下季度 |
80
+ | `nextYear` | 明年 |
81
+
82
+ **约束**: `current*`/`last*`/`next*` 只能用于 `=` 操作符。
83
+
84
+ `>` / `<` 操作符支持的相对时间值:
85
+
86
+ | 值 | 说明 | 示例 |
87
+ |----|------|------|
88
+ | `before-N-days` | N 天前 | `创建时间 > before-7-days` |
89
+ | `before-N-weeks` | N 周前 | `创建时间 > before-2-weeks` |
90
+ | `before-N-months` | N 月前 | `创建时间 > before-1-months` |
91
+ | `before-N-quarters` | N 季度前 | |
92
+ | `after-N-days` | N 天后 | |
93
+ | `after-N-weeks` | N 周后 | |
94
+ | `startOfDay` | 今天开始 | `创建时间 > startOfDay` |
95
+ | `startOfWeek` | 本周开始 | |
96
+ | `startOfMonth` | 本月开始 | |
97
+ | `startOfYear` | 今年开始 | |
98
+
99
+ **约束**: `startOf*` 只能用于 `>` 或 `<` 操作符。
100
+
101
+ ```
102
+ # 本周创建的卡片
103
+ 创建时间 = currentWeek
104
+
105
+ # 最近 7 天创建的卡片
106
+ 创建时间 > before-7-days
107
+
108
+ # 上月更新的卡片
109
+ 更新时间 = lastMonth
110
+ ```
111
+
112
+ ### 人员字段
113
+
114
+ 字段: `负责人`, `创建人`, `最后修改人`
115
+
116
+ 支持操作符: `=`, `!=`, `in()`, `not in()`, `is empty`, `is not empty`
117
+
118
+ ```
119
+ 负责人 = currentUser
120
+ 创建人 = zhangsan
121
+ 负责人 in (zhangsan, lisi)
122
+ ```
123
+
124
+ ### 类型字段
125
+
126
+ 字段: `类型`
127
+
128
+ 支持操作符: `=`, `!=`, `in()`, `not in()`, `is empty`, `is not empty`
129
+
130
+ ```
131
+ 类型 = Bug
132
+ 类型 in (Bug, Story, Task, Epic)
133
+ 类型 != Epic
134
+ ```
135
+
136
+ ### 流程状态字段
137
+
138
+ 字段: `流程状态`
139
+
140
+ 支持操作符: `=`, `!=`, `>`, `<`, `>=`, `<=`, `in()`, `not in()`, `is empty`, `is not empty`
141
+
142
+ 流程状态有排序位置,`>`/`<`/`>=`/`<=` 基于状态在空间配置中的排序位置进行比较。
143
+ 例如状态顺序为 [新建, 开发中, 测试中, 已完成],`流程状态 >= 开发中` 会匹配 开发中、测试中、已完成。
144
+ 后端实际将 `>=`/`<=` 转换为 `in` 查询。
145
+
146
+ **注意**: `>=`/`<=` 是流程状态独有的操作符,其他字段(包括日期、选择列表等)均不支持。
147
+
148
+ ```
149
+ 流程状态 = 开发中
150
+ 流程状态 >= 开发中
151
+ 流程状态 in (新建, 待开发, 开发中)
152
+ 流程状态 != 已关闭
153
+ ```
154
+
155
+ ### 编号字段
156
+
157
+ 字段: `编号`
158
+
159
+ 支持操作符: `=`, `!=`, `in()`, `not in()`, `~`
160
+
161
+ ```
162
+ 编号 = 1001
163
+ 编号 in (1001, 1002, 1003)
164
+ ```
165
+
166
+ ### 父卡片字段
167
+
168
+ 字段: `父卡片编号`
169
+
170
+ 支持操作符: `=`, `!=`, `in()`, `not in()`, `is empty`, `is not empty`
171
+
172
+ ```
173
+ 父卡片编号 is empty
174
+ 父卡片编号 = 1001
175
+ ```
176
+
177
+ ### 计划字段
178
+
179
+ 字段: `所属计划`
180
+
181
+ 支持操作符: `=`, `!=`, `in()`, `not in()`, `is empty`, `is not empty`
182
+
183
+ 需要使用完整路径,可包含子计划。
184
+
185
+ ```
186
+ 所属计划 = "2024Q1/Sprint1"
187
+ 所属计划 is not empty
188
+ ```
189
+
190
+ ### 关键字字段
191
+
192
+ 字段: `关键字`
193
+
194
+ 支持操作符: `~` (仅包含搜索)
195
+
196
+ ```
197
+ 关键字 ~ 重要
198
+ ```
199
+
200
+ ### 标题字段
201
+
202
+ 字段: `标题`
203
+
204
+ 支持操作符: `~`, `!~`, `is empty`, `is not empty`
205
+
206
+ ```
207
+ 标题 ~ 登录
208
+ 标题 !~ 测试
209
+ ```
210
+
211
+ ### 数字字段
212
+
213
+ 支持操作符: `<`, `>`, `=`, `is empty`, `is not empty`
214
+
215
+ ```
216
+ 预估工时 > 8
217
+ ```
218
+
219
+ ### 选择/多选/复选框字段
220
+
221
+ 支持操作符: `=`, `!=`, `in()`, `not in()`, `is empty`, `is not empty`
222
+
223
+ ```
224
+ 优先级 = P1-High
225
+ 优先级 in (P0-Highest, P1-High)
226
+ ```
227
+
228
+ ### 文本字段 (单行/多行)
229
+
230
+ 支持操作符: `~`, `!~`, `is empty`, `is not empty`
231
+
232
+ ### URL 字段
233
+
234
+ 支持操作符: `~`, `!~`, `=`, `is empty`, `is not empty`
235
+
236
+ ### 标签字段
237
+
238
+ 字段: `标签`
239
+
240
+ 支持操作符: `=`, `!=`, `in()`, `not in()`, `is empty`, `is not empty`
241
+
242
+ ```
243
+ 标签 = 紧急
244
+ 标签 in (紧急, 重要)
245
+ ```
246
+
247
+ ## 特殊值
248
+
249
+ | 值 | 适用字段 | 说明 |
250
+ |----|---------|------|
251
+ | `currentUser` | 人员字段 | 当前认证用户 |
252
+ | `currentDay` / `lastWeek` / ... | 日期字段 | 周期值,详见日期特殊值表 |
253
+ | `before-N-days` / `startOfMonth` / ... | 日期字段 | 相对时间值,详见日期特殊值表 |
254
+ | `当前计划` | 所属计划 | 当前激活的计划 |
255
+
256
+ ```
257
+ 负责人 = currentUser
258
+ 创建时间 = currentWeek
259
+ 创建时间 > before-7-days
260
+ 所属计划 = 当前计划
261
+ ```
262
+
263
+ ## 嵌套查询函数
264
+
265
+ IQL 支持 `subtasksOf` 和 `parentsOf` 函数,用于查询子卡片或父卡片:
266
+
267
+ ```
268
+ issues in (subtasksOf[子查询IQL, 深度])
269
+ issues in (parentsOf[子查询IQL, 深度])
270
+ ```
271
+
272
+ - **深度**: 正整数,表示向下/向上查找的层级数(推荐 1-5)
273
+ - **子查询结果上限**: 1000 张卡片
274
+ - **最多嵌套**: 15 个 `issues in (...)` 块
275
+ - 函数名大小写不敏感
276
+
277
+ ```bash
278
+ # 查询某用户 Story 的所有子卡片
279
+ icafe-cli card query --space myspace --iql "issues in (subtasksOf[类型 = Story AND 负责人 = currentUser, 1])"
280
+
281
+ # 查询某些 Task 的父卡片 (向上 2 层)
282
+ icafe-cli card query --space myspace --iql "issues in (parentsOf[类型 = Task AND 流程状态 = 开发中, 2])"
283
+ ```
284
+
285
+ ## 常用查询示例
286
+
287
+ ```bash
288
+ # 当前用户负责的所有未关闭卡片
289
+ icafe-cli card query --space myspace --iql "负责人 = currentUser AND 流程状态 != 已关闭"
290
+
291
+ # 高优先级 Bug
292
+ icafe-cli card query --space myspace --iql "类型 = Bug AND 优先级 in (P0-Highest, P1-High)"
293
+
294
+ # 本周创建的卡片
295
+ icafe-cli card query --space myspace --iql "创建时间 = currentWeek"
296
+
297
+ # 最近 7 天创建的卡片
298
+ icafe-cli card query --space myspace --iql "创建时间 > before-7-days"
299
+
300
+ # 特定迭代中的 Story
301
+ icafe-cli card query --space myspace --iql "类型 = Story AND 所属计划 = \"2024Q1/Sprint1\""
302
+
303
+ # 无负责人的卡片
304
+ icafe-cli card query --space myspace --iql "负责人 is empty AND 类型 != Epic"
305
+
306
+ # 标题包含关键词的 Task
307
+ icafe-cli card query --space myspace --iql "类型 = Task AND 标题 ~ 优化"
308
+
309
+ # 复合条件
310
+ icafe-cli card query --space myspace --iql "(类型 = Bug OR 类型 = Task) AND 负责人 = currentUser AND 流程状态 != 已关闭"
311
+
312
+ # 指定编号的卡片
313
+ icafe-cli card query --space myspace --iql "编号 in (1001, 1002, 1003)"
314
+
315
+ # 没有父卡片的顶层卡片
316
+ icafe-cli card query --space myspace --iql "父卡片编号 is empty AND 类型 = Story"
317
+ ```
318
+
319
+ ## 注意事项
320
+
321
+ 1. 值中包含以下字符时,需要用双引号包裹: 空格、`(`、`)`、`=`、`<`、`>`、`~`、`!`
322
+ 2. `in()` 操作符的值列表用逗号分隔,放在括号内
323
+ 3. 日期值格式为 `YYYY-MM-DD`,需要用双引号包裹
324
+ 4. `currentUser` 等特殊值不需要引号
325
+ 5. `is empty` 和 `is not empty` 后面不需要值
326
+ 6. 不支持 `NOT` 一元逻辑操作符,用 `!=`、`!~`、`not in` 代替
327
+ 7. 不支持 `= null`,判空用 `is empty` / `is not empty`