ai-engineering-init 1.6.0 → 1.8.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 (187) hide show
  1. package/.claude/agents/code-reviewer.md +3 -130
  2. package/.claude/hooks/skill-forced-eval.js +46 -60
  3. package/.claude/hooks/stop.js +24 -1
  4. package/.claude/settings.json +10 -1
  5. package/.claude/skills/api-development/SKILL.md +179 -130
  6. package/.claude/skills/architecture-design/SKILL.md +102 -212
  7. package/.claude/skills/backend-annotations/SKILL.md +166 -220
  8. package/.claude/skills/bug-detective/SKILL.md +225 -186
  9. package/.claude/skills/code-patterns/SKILL.md +127 -244
  10. package/.claude/skills/codex-code-review/SKILL.md +327 -0
  11. package/.claude/skills/collaborating-with-codex/SKILL.md +96 -113
  12. package/.claude/skills/crud-development/SKILL.md +226 -307
  13. package/.claude/skills/data-permission/SKILL.md +131 -202
  14. package/.claude/skills/database-ops/SKILL.md +158 -355
  15. package/.claude/skills/error-handler/SKILL.md +224 -285
  16. package/.claude/skills/file-oss-management/SKILL.md +174 -169
  17. package/.claude/skills/git-workflow/SKILL.md +123 -341
  18. package/.claude/skills/json-serialization/SKILL.md +121 -137
  19. package/.claude/skills/leniu-report-customization/SKILL.md +82 -2
  20. package/.claude/skills/leniu-report-standard-customization/SKILL.md +65 -2
  21. package/.claude/skills/loki-log-query/SKILL.md +400 -0
  22. package/.claude/skills/mysql-debug/SKILL.md +58 -22
  23. package/.claude/skills/performance-doctor/SKILL.md +83 -89
  24. package/.claude/skills/redis-cache/SKILL.md +134 -185
  25. package/.claude/skills/scheduled-jobs/SKILL.md +187 -224
  26. package/.claude/skills/security-guard/SKILL.md +168 -276
  27. package/.claude/skills/sms-mail/SKILL.md +266 -228
  28. package/.claude/skills/social-login/SKILL.md +257 -195
  29. package/.claude/skills/sync-back-merge/SKILL.md +66 -0
  30. package/.claude/skills/tenant-management/SKILL.md +172 -188
  31. package/.claude/skills/utils-toolkit/SKILL.md +214 -222
  32. package/.claude/skills/websocket-sse/SKILL.md +251 -172
  33. package/.claude/skills/workflow-engine/SKILL.md +178 -250
  34. package/.claude/skills/yunxiao-task-management/SKILL.md +489 -0
  35. package/.codex/skills/api-development/SKILL.md +179 -130
  36. package/.codex/skills/architecture-design/SKILL.md +102 -212
  37. package/.codex/skills/backend-annotations/SKILL.md +166 -220
  38. package/.codex/skills/bug-detective/SKILL.md +225 -186
  39. package/.codex/skills/code-patterns/SKILL.md +127 -244
  40. package/.codex/skills/collaborating-with-codex/SKILL.md +96 -113
  41. package/.codex/skills/crud-development/SKILL.md +226 -307
  42. package/.codex/skills/data-permission/SKILL.md +131 -202
  43. package/.codex/skills/database-ops/SKILL.md +158 -355
  44. package/.codex/skills/error-handler/SKILL.md +224 -285
  45. package/.codex/skills/file-oss-management/SKILL.md +174 -169
  46. package/.codex/skills/git-workflow/SKILL.md +123 -341
  47. package/.codex/skills/json-serialization/SKILL.md +121 -137
  48. package/.codex/skills/leniu-report-customization/SKILL.md +82 -2
  49. package/.codex/skills/leniu-report-standard-customization/SKILL.md +65 -2
  50. package/.codex/skills/loki-log-query/SKILL.md +400 -0
  51. package/.codex/skills/loki-log-query/environments.json +45 -0
  52. package/.codex/skills/mysql-debug/SKILL.md +58 -22
  53. package/.codex/skills/performance-doctor/SKILL.md +83 -89
  54. package/.codex/skills/redis-cache/SKILL.md +134 -185
  55. package/.codex/skills/scheduled-jobs/SKILL.md +187 -224
  56. package/.codex/skills/security-guard/SKILL.md +168 -276
  57. package/.codex/skills/skill-creator/LICENSE.txt +202 -0
  58. package/.codex/skills/skill-creator/SKILL.md +479 -0
  59. package/.codex/skills/skill-creator/agents/analyzer.md +274 -0
  60. package/.codex/skills/skill-creator/agents/comparator.md +202 -0
  61. package/.codex/skills/skill-creator/agents/grader.md +223 -0
  62. package/.codex/skills/skill-creator/assets/eval_review.html +146 -0
  63. package/.codex/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  64. package/.codex/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  65. package/.codex/skills/skill-creator/references/schemas.md +430 -0
  66. package/.codex/skills/skill-creator/scripts/__init__.py +0 -0
  67. package/.codex/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  68. package/.codex/skills/skill-creator/scripts/generate_report.py +326 -0
  69. package/.codex/skills/skill-creator/scripts/improve_description.py +248 -0
  70. package/.codex/skills/skill-creator/scripts/package_skill.py +136 -0
  71. package/.codex/skills/skill-creator/scripts/quick_validate.py +103 -0
  72. package/.codex/skills/skill-creator/scripts/run_eval.py +310 -0
  73. package/.codex/skills/skill-creator/scripts/run_loop.py +332 -0
  74. package/.codex/skills/skill-creator/scripts/utils.py +47 -0
  75. package/.codex/skills/sms-mail/SKILL.md +266 -228
  76. package/.codex/skills/social-login/SKILL.md +257 -195
  77. package/.codex/skills/sync-back-merge/SKILL.md +66 -0
  78. package/.codex/skills/tenant-management/SKILL.md +172 -188
  79. package/.codex/skills/utils-toolkit/SKILL.md +214 -222
  80. package/.codex/skills/websocket-sse/SKILL.md +251 -172
  81. package/.codex/skills/workflow-engine/SKILL.md +178 -250
  82. package/.codex/skills/yunxiao-task-management/SKILL.md +489 -0
  83. package/.cursor/hooks/cursor-skill-eval.js +66 -6
  84. package/.cursor/hooks/stop.js +23 -1
  85. package/.cursor/skills/api-development/SKILL.md +179 -130
  86. package/.cursor/skills/architecture-design/SKILL.md +102 -212
  87. package/.cursor/skills/backend-annotations/SKILL.md +166 -220
  88. package/.cursor/skills/bug-detective/SKILL.md +225 -186
  89. package/.cursor/skills/code-patterns/SKILL.md +127 -244
  90. package/.cursor/skills/collaborating-with-codex/SKILL.md +96 -113
  91. package/.cursor/skills/crud-development/SKILL.md +226 -307
  92. package/.cursor/skills/data-permission/SKILL.md +131 -202
  93. package/.cursor/skills/database-ops/SKILL.md +158 -355
  94. package/.cursor/skills/error-handler/SKILL.md +224 -285
  95. package/.cursor/skills/file-oss-management/SKILL.md +174 -169
  96. package/.cursor/skills/git-workflow/SKILL.md +123 -341
  97. package/.cursor/skills/json-serialization/SKILL.md +121 -137
  98. package/.cursor/skills/leniu-report-customization/SKILL.md +82 -2
  99. package/.cursor/skills/leniu-report-standard-customization/SKILL.md +65 -2
  100. package/.cursor/skills/loki-log-query/SKILL.md +400 -0
  101. package/.cursor/skills/loki-log-query/environments.json +45 -0
  102. package/.cursor/skills/mysql-debug/SKILL.md +58 -22
  103. package/.cursor/skills/performance-doctor/SKILL.md +83 -89
  104. package/.cursor/skills/redis-cache/SKILL.md +134 -185
  105. package/.cursor/skills/scheduled-jobs/SKILL.md +187 -224
  106. package/.cursor/skills/security-guard/SKILL.md +168 -276
  107. package/.cursor/skills/skill-creator/LICENSE.txt +202 -0
  108. package/.cursor/skills/skill-creator/SKILL.md +479 -0
  109. package/.cursor/skills/skill-creator/agents/analyzer.md +274 -0
  110. package/.cursor/skills/skill-creator/agents/comparator.md +202 -0
  111. package/.cursor/skills/skill-creator/agents/grader.md +223 -0
  112. package/.cursor/skills/skill-creator/assets/eval_review.html +146 -0
  113. package/.cursor/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  114. package/.cursor/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  115. package/.cursor/skills/skill-creator/references/schemas.md +430 -0
  116. package/.cursor/skills/skill-creator/scripts/__init__.py +0 -0
  117. package/.cursor/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  118. package/.cursor/skills/skill-creator/scripts/generate_report.py +326 -0
  119. package/.cursor/skills/skill-creator/scripts/improve_description.py +248 -0
  120. package/.cursor/skills/skill-creator/scripts/package_skill.py +136 -0
  121. package/.cursor/skills/skill-creator/scripts/quick_validate.py +103 -0
  122. package/.cursor/skills/skill-creator/scripts/run_eval.py +310 -0
  123. package/.cursor/skills/skill-creator/scripts/run_loop.py +332 -0
  124. package/.cursor/skills/skill-creator/scripts/utils.py +47 -0
  125. package/.cursor/skills/sms-mail/SKILL.md +266 -228
  126. package/.cursor/skills/social-login/SKILL.md +257 -195
  127. package/.cursor/skills/sync-back-merge/SKILL.md +66 -0
  128. package/.cursor/skills/tenant-management/SKILL.md +172 -188
  129. package/.cursor/skills/utils-toolkit/SKILL.md +214 -222
  130. package/.cursor/skills/websocket-sse/SKILL.md +251 -172
  131. package/.cursor/skills/workflow-engine/SKILL.md +178 -250
  132. package/.cursor/skills/yunxiao-task-management/SKILL.md +489 -0
  133. package/AGENTS.md +49 -540
  134. package/CLAUDE.md +73 -119
  135. package/README.md +37 -6
  136. package/bin/index.js +611 -25
  137. package/package.json +1 -1
  138. package/src/platform-map.json +4 -0
  139. package/src/skills/api-development/SKILL.md +179 -130
  140. package/src/skills/architecture-design/SKILL.md +102 -212
  141. package/src/skills/backend-annotations/SKILL.md +166 -220
  142. package/src/skills/bug-detective/SKILL.md +225 -186
  143. package/src/skills/code-patterns/SKILL.md +127 -244
  144. package/src/skills/codex-code-review/SKILL.md +261 -69
  145. package/src/skills/collaborating-with-codex/SKILL.md +96 -113
  146. package/src/skills/crud-development/SKILL.md +226 -307
  147. package/src/skills/data-permission/SKILL.md +131 -202
  148. package/src/skills/database-ops/SKILL.md +158 -355
  149. package/src/skills/error-handler/SKILL.md +224 -285
  150. package/src/skills/file-oss-management/SKILL.md +174 -169
  151. package/src/skills/git-workflow/SKILL.md +123 -341
  152. package/src/skills/json-serialization/SKILL.md +121 -137
  153. package/src/skills/leniu-report-customization/SKILL.md +82 -2
  154. package/src/skills/leniu-report-standard-customization/SKILL.md +65 -2
  155. package/src/skills/loki-log-query/SKILL.md +400 -0
  156. package/src/skills/loki-log-query/environments.json +45 -0
  157. package/src/skills/mysql-debug/SKILL.md +58 -22
  158. package/src/skills/performance-doctor/SKILL.md +83 -89
  159. package/src/skills/redis-cache/SKILL.md +134 -185
  160. package/src/skills/scheduled-jobs/SKILL.md +187 -224
  161. package/src/skills/security-guard/SKILL.md +168 -276
  162. package/src/skills/skill-creator/LICENSE.txt +202 -0
  163. package/src/skills/skill-creator/SKILL.md +479 -0
  164. package/src/skills/skill-creator/agents/analyzer.md +274 -0
  165. package/src/skills/skill-creator/agents/comparator.md +202 -0
  166. package/src/skills/skill-creator/agents/grader.md +223 -0
  167. package/src/skills/skill-creator/assets/eval_review.html +146 -0
  168. package/src/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  169. package/src/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  170. package/src/skills/skill-creator/references/schemas.md +430 -0
  171. package/src/skills/skill-creator/scripts/__init__.py +0 -0
  172. package/src/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  173. package/src/skills/skill-creator/scripts/generate_report.py +326 -0
  174. package/src/skills/skill-creator/scripts/improve_description.py +248 -0
  175. package/src/skills/skill-creator/scripts/package_skill.py +136 -0
  176. package/src/skills/skill-creator/scripts/quick_validate.py +103 -0
  177. package/src/skills/skill-creator/scripts/run_eval.py +310 -0
  178. package/src/skills/skill-creator/scripts/run_loop.py +332 -0
  179. package/src/skills/skill-creator/scripts/utils.py +47 -0
  180. package/src/skills/sms-mail/SKILL.md +266 -228
  181. package/src/skills/social-login/SKILL.md +257 -195
  182. package/src/skills/sync-back-merge/SKILL.md +66 -0
  183. package/src/skills/tenant-management/SKILL.md +172 -188
  184. package/src/skills/utils-toolkit/SKILL.md +214 -222
  185. package/src/skills/websocket-sse/SKILL.md +251 -172
  186. package/src/skills/workflow-engine/SKILL.md +178 -250
  187. package/src/skills/yunxiao-task-management/SKILL.md +489 -0
@@ -0,0 +1,400 @@
1
+ ---
2
+ name: loki-log-query
3
+ description: |
4
+ 通过 Grafana Loki 查询线上日志,支持多环境切换、traceId 链路追踪、接口路径查询、关键词搜索。
5
+
6
+ 触发场景:
7
+ - 需要查看线上日志排查问题
8
+ - 通过 traceId 查询完整请求链路
9
+ - 通过接口路径查询该接口的所有日志
10
+ - 搜索特定错误日志或异常堆栈
11
+ - 切换不同日志服务环境
12
+
13
+ 触发词:查日志、traceId、链路追踪、Loki、日志查询、线上日志、生产日志、错误日志、异常堆栈、日志排查、切换环境、monitor
14
+ ---
15
+
16
+ # Loki 日志查询技能
17
+
18
+ ## 概述
19
+
20
+ 通过 Grafana Loki API 查询线上日志。支持:
21
+ 1. **多环境管理**:5 个 Grafana 日志服务,按需切换
22
+ 2. **traceId 查询**:通过日志ID获取完整请求链路
23
+ 3. **接口路径查询**:通过 API 接口路径查询相关日志
24
+ 4. **关键词搜索**:错误信息、类名、自定义关键词
25
+
26
+ ## 多环境配置
27
+
28
+ 配置文件:`.claude/skills/loki-log-query/environments.json`
29
+
30
+ ### 环境列表
31
+
32
+ | 环境别名 | 名称 | URL | 快捷词 |
33
+ |----------|------|-----|--------|
34
+ | `test13` | 测试13(主测试环境) | `https://test13.xnzn.net/grafana` | test13, 13 |
35
+ | `monitor-test` | Monitor 测试环境 | `https://monitor-test.xnzn.net/grafana` | mtest |
36
+ | `monitor-dev` | Monitor 开发环境 | `https://monitor-dev.xnzn.net/grafana` | mdev, dev |
37
+ | `monitor02-dev` | Monitor02 开发环境 | `https://monitor02-dev.xnzn.net/grafana` | m02, monitor02 |
38
+ | `monitor-tyy-dev` | Monitor 体验园开发环境 | `https://monitor-tyy-dev.xnzn.net/grafana` | tyy, 体验园 |
39
+
40
+ ### 环境匹配规则
41
+
42
+ 用户说的话 → 匹配环境:
43
+ - "查 test13 的日志" → `test13`
44
+ - "去 monitor-dev 查" → `monitor-dev`
45
+ - "切到体验园" → `monitor-tyy-dev`
46
+ - "去 m02 查一下" → `monitor02-dev`
47
+ - 未指定环境 → 使用 `active` 字段指定的默认环境
48
+
49
+ ### 读取配置
50
+
51
+ ```bash
52
+ SKILL_DIR="$CLAUDE_PROJECT_DIR/.claude/skills/loki-log-query"
53
+ ENV_FILE="${SKILL_DIR}/environments.json"
54
+
55
+ # 读取指定环境(参数: 环境别名)
56
+ read_env() {
57
+ local ENV_KEY="${1:-$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['active'])")}"
58
+ GRAFANA_URL=$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['environments']['${ENV_KEY}']['url'])")
59
+ TOKEN=$(python3 -c "import json; print(json.load(open('${ENV_FILE}'))['environments']['${ENV_KEY}']['token'])")
60
+ API="${GRAFANA_URL}/api/datasources/proxy/uid/loki/loki/api/v1"
61
+ echo "Environment: ${ENV_KEY} → ${GRAFANA_URL}"
62
+ }
63
+
64
+ # 通过别名查找环境 key
65
+ find_env() {
66
+ python3 -c "
67
+ import json
68
+ data = json.load(open('${ENV_FILE}'))
69
+ alias = '${1}'.lower()
70
+ for key, env in data['environments'].items():
71
+ if alias == key or alias in env.get('aliases', []):
72
+ print(key)
73
+ break
74
+ else:
75
+ print(data['active'])
76
+ "
77
+ }
78
+ ```
79
+
80
+ ### 切换活跃环境
81
+
82
+ ```bash
83
+ # 切换默认环境为 monitor-dev
84
+ python3 -c "
85
+ import json
86
+ data = json.load(open('${ENV_FILE}'))
87
+ data['active'] = 'monitor-dev'
88
+ json.dump(data, open('${ENV_FILE}', 'w'), indent=2, ensure_ascii=False)
89
+ print('Switched to:', data['active'])
90
+ "
91
+ ```
92
+
93
+ ### 更新 Token
94
+
95
+ ```bash
96
+ # 为某个环境设置 Token
97
+ python3 -c "
98
+ import json
99
+ data = json.load(open('${ENV_FILE}'))
100
+ data['environments']['monitor-dev']['token'] = 'glsa_新的token值'
101
+ json.dump(data, open('${ENV_FILE}', 'w'), indent=2, ensure_ascii=False)
102
+ print('Token updated for monitor-dev')
103
+ "
104
+ ```
105
+
106
+ ## API 基础
107
+
108
+ | 项目 | 值 |
109
+ |------|-----|
110
+ | 数据源 | Loki(uid: `loki`) |
111
+ | **API 路径** | `{GRAFANA_URL}/api/datasources/proxy/uid/loki/loki/api/v1/query_range` |
112
+ | 认证 | `Authorization: Bearer {TOKEN}` |
113
+ | 默认标签 | `app="yunshitang"` |
114
+
115
+ > **重要**:Loki API 必须通过 Grafana datasource proxy 访问,直接 `/loki/api/v1/` 会返回 404。
116
+ > 查询时不限 project 标签(`{app="yunshitang"}`),可覆盖该 Grafana 下所有环境。
117
+
118
+ ## 日志格式
119
+
120
+ ```
121
+ 2026-03-07 09:16:53.039,bcf6d955-fa26-45a5-9628-748f7ac4eed2,,, INFO 1 --- [线程名] 类名 : 行号 : 消息内容
122
+ ```
123
+
124
+ | 位置 | 字段 | 示例 |
125
+ |------|------|------|
126
+ | 第1段 | 时间戳 | `2026-03-07 09:16:53.039` |
127
+ | 第2段 | traceId | `bcf6d955-fa26-45a5-9628-748f7ac4eed2` 或 `a53dd0b0cc62bf4a79a63e77444f6f3f` |
128
+ | 第3段 | 商户ID | `553722740746489856` |
129
+ | 第4段 | 用户ID | `553723188689768448` |
130
+ | 第5段 | 日志内容 | `INFO 1 --- [thread] Class : 123 : msg` |
131
+
132
+ > traceId 可能是 UUID 格式(带横线)或 32位hex(不带横线),都支持。
133
+
134
+ ## 查询场景
135
+
136
+ ### 场景 1:按 traceId 查完整链路(最常用)
137
+
138
+ 用户说:"用 `a53dd0b0cc62bf4a79a63e77444f6f3f` 查日志"
139
+
140
+ ```bash
141
+ TRACE_ID="a53dd0b0cc62bf4a79a63e77444f6f3f"
142
+ END=$(date +%s)000000000
143
+ START=$(( $(date +%s) - 86400 ))000000000
144
+
145
+ curl -s "${API}/query_range" \
146
+ -H "Authorization: Bearer ${TOKEN}" \
147
+ --data-urlencode "query={app=\"yunshitang\"} |= \"${TRACE_ID}\"" \
148
+ --data-urlencode "start=${START}" \
149
+ --data-urlencode "end=${END}" \
150
+ --data-urlencode "limit=500" \
151
+ --data-urlencode "direction=forward" \
152
+ | python3 -c "
153
+ import sys, json
154
+ data = json.load(sys.stdin)
155
+ if data.get('status') == 'success':
156
+ for stream in data['data']['result']:
157
+ labels = stream.get('stream', {})
158
+ print(f'--- {labels.get(\"app\",\"?\")}/{labels.get(\"project\",\"?\")} ---')
159
+ for ts, line in stream['values']:
160
+ print(line)
161
+ else:
162
+ print('Error:', data)
163
+ "
164
+ ```
165
+
166
+ ### 场景 2:按接口路径查日志
167
+
168
+ 用户说:"查 `/security/summary/order/mealtime/classify/page` 这个接口的日志"
169
+
170
+ 接口路径出现在请求日志的 `RequestLoggingFilter` 中(`>>> POST /xxx` 或 `>>> GET /xxx`)。
171
+
172
+ ```bash
173
+ API_PATH="/security/summary/order/mealtime/classify/page"
174
+ END=$(date +%s)000000000
175
+ START=$(( $(date +%s) - 3600 ))000000000 # 最近1小时
176
+
177
+ curl -s "${API}/query_range" \
178
+ -H "Authorization: Bearer ${TOKEN}" \
179
+ --data-urlencode "query={app=\"yunshitang\"} |= \"${API_PATH}\"" \
180
+ --data-urlencode "start=${START}" \
181
+ --data-urlencode "end=${END}" \
182
+ --data-urlencode "limit=200" \
183
+ --data-urlencode "direction=forward" \
184
+ | python3 -c "
185
+ import sys, json, re
186
+ data = json.load(sys.stdin)
187
+ if data.get('status') != 'success':
188
+ print('Error:', data); sys.exit()
189
+
190
+ # 从匹配的请求日志中提取 traceId
191
+ trace_ids = set()
192
+ all_lines = []
193
+ for stream in data['data']['result']:
194
+ for ts, line in stream['values']:
195
+ all_lines.append(line)
196
+ # 提取 traceId(第2个逗号分隔字段)
197
+ parts = line.split(',')
198
+ if len(parts) >= 2:
199
+ tid = parts[1].strip()
200
+ if len(tid) >= 32:
201
+ trace_ids.add(tid)
202
+
203
+ print(f'Found {len(all_lines)} lines, {len(trace_ids)} unique traceIds')
204
+ print()
205
+ for tid in list(trace_ids)[:10]:
206
+ print(f' traceId: {tid}')
207
+ print()
208
+ for line in all_lines[:30]:
209
+ print(line)
210
+ if len(all_lines) > 30:
211
+ print(f'... and {len(all_lines)-30} more lines')
212
+ "
213
+ ```
214
+
215
+ **进阶**:找到 traceId 后,再用场景 1 查该 traceId 的完整链路。
216
+
217
+ ### 场景 3:关键词搜索
218
+
219
+ 用户说:"搜一下 LeException" 或 "查 ERROR 日志"
220
+
221
+ ```bash
222
+ KEYWORD="LeException"
223
+ END=$(date +%s)000000000
224
+ START=$(( $(date +%s) - 3600 ))000000000
225
+
226
+ curl -s "${API}/query_range" \
227
+ -H "Authorization: Bearer ${TOKEN}" \
228
+ --data-urlencode "query={app=\"yunshitang\"} |= \"${KEYWORD}\"" \
229
+ --data-urlencode "start=${START}" \
230
+ --data-urlencode "end=${END}" \
231
+ --data-urlencode "limit=100" \
232
+ --data-urlencode "direction=backward"
233
+ ```
234
+
235
+ **常用关键词组合**:
236
+
237
+ ```logql
238
+ # 所有 ERROR 日志
239
+ {app="yunshitang"} |= "ERROR"
240
+
241
+ # 业务异常
242
+ {app="yunshitang"} |= "LeException"
243
+
244
+ # SQL 错误
245
+ {app="yunshitang"} |~ "SQLSyntaxError|DataAccessException|BadSqlGrammar"
246
+
247
+ # 空指针
248
+ {app="yunshitang"} |= "NullPointerException"
249
+
250
+ # 按类名搜索
251
+ {app="yunshitang"} |= "OrderInfoService"
252
+
253
+ # 组合:ERROR + 特定类
254
+ {app="yunshitang"} |= "ERROR" |= "OrderInfoService"
255
+
256
+ # 排除健康检查噪音
257
+ {app="yunshitang"} |= "ERROR" != "health" != "actuator"
258
+ ```
259
+
260
+ ### 场景 4:按接口查完整链路(组合查询)
261
+
262
+ 用户说:"查 `/api/v2/web/order/list` 接口的全链路日志"
263
+
264
+ **两步走**:
265
+ 1. 先按接口路径搜索,拿到 traceId
266
+ 2. 再按 traceId 查完整链路
267
+
268
+ ```bash
269
+ # Step 1: 找 traceId
270
+ API_PATH="/api/v2/web/order/list"
271
+ END=$(date +%s)000000000
272
+ START=$(( $(date +%s) - 3600 ))000000000
273
+
274
+ TRACE_IDS=$(curl -s "${API}/query_range" \
275
+ -H "Authorization: Bearer ${TOKEN}" \
276
+ --data-urlencode "query={app=\"yunshitang\"} |= \"${API_PATH}\" |= \">>>\"" \
277
+ --data-urlencode "start=${START}" \
278
+ --data-urlencode "end=${END}" \
279
+ --data-urlencode "limit=10" \
280
+ --data-urlencode "direction=backward" \
281
+ | python3 -c "
282
+ import sys, json
283
+ data = json.load(sys.stdin)
284
+ for stream in data.get('data',{}).get('result',[]):
285
+ for ts, line in stream['values']:
286
+ parts = line.split(',')
287
+ if len(parts) >= 2 and len(parts[1].strip()) >= 32:
288
+ print(parts[1].strip())
289
+ ")
290
+
291
+ echo "Found traceIds:"
292
+ echo "${TRACE_IDS}" | head -5
293
+
294
+ # Step 2: 用第一个 traceId 查完整链路
295
+ FIRST_TID=$(echo "${TRACE_IDS}" | head -1)
296
+ if [ -n "${FIRST_TID}" ]; then
297
+ curl -s "${API}/query_range" \
298
+ -H "Authorization: Bearer ${TOKEN}" \
299
+ --data-urlencode "query={app=\"yunshitang\"} |= \"${FIRST_TID}\"" \
300
+ --data-urlencode "start=${START}" \
301
+ --data-urlencode "end=${END}" \
302
+ --data-urlencode "limit=500" \
303
+ --data-urlencode "direction=forward" \
304
+ | python3 -c "
305
+ import sys, json
306
+ data = json.load(sys.stdin)
307
+ for stream in data.get('data',{}).get('result',[]):
308
+ for ts, line in stream['values']:
309
+ print(line)
310
+ "
311
+ fi
312
+ ```
313
+
314
+ ### 场景 5:指定 project 环境查询
315
+
316
+ 如果用户指定了具体的 project(如 test20):
317
+
318
+ ```logql
319
+ {app="yunshitang",project="test20"} |= "traceId值"
320
+ ```
321
+
322
+ ## LogQL 语法速查
323
+
324
+ ### 流选择器
325
+
326
+ | 操作 | 语法 | 示例 |
327
+ |------|------|------|
328
+ | 精确匹配 | `=` | `{app="yunshitang"}` |
329
+ | 不等于 | `!=` | `{app!="test"}` |
330
+ | 正则匹配 | `=~` | `{project=~"test2.*"}` |
331
+
332
+ ### 行过滤
333
+
334
+ | 操作 | 语法 | 示例 |
335
+ |------|------|------|
336
+ | 包含 | `\|=` | `\|= "ERROR"` |
337
+ | 不包含 | `!=` | `!= "DEBUG"` |
338
+ | 正则匹配 | `\|~` | `\|~ "Exception\|Error"` |
339
+ | 正则排除 | `!~` | `!~ "health\|ping"` |
340
+
341
+ ### 查看可用标签值
342
+
343
+ ```bash
344
+ # 列出所有 project
345
+ curl -s "${API}/label/project/values" -H "Authorization: Bearer ${TOKEN}"
346
+
347
+ # 列出所有 app
348
+ curl -s "${API}/label/app/values" -H "Authorization: Bearer ${TOKEN}"
349
+ ```
350
+
351
+ ## Bug 修复工作流
352
+
353
+ ```
354
+ 1. 获取线索(traceId / 接口路径 / 错误关键词)
355
+
356
+ 2. 确定环境(哪个 Grafana?读取 environments.json)
357
+
358
+ 3. 查询日志(场景 1-4 选择合适的查询方式)
359
+
360
+ 4. 分析日志(ERROR/异常堆栈/SQL 错误/耗时)
361
+
362
+ 5. 定位代码(类名:行号 → 项目搜索)
363
+
364
+ 6. 修复 + 更新云效任务状态
365
+ ```
366
+
367
+ ### 日志分析重点
368
+
369
+ 1. **ERROR 级别日志** — 异常根因
370
+ 2. **异常堆栈** — `at net.xnzn.core.xxx` 开头的行
371
+ 3. **SQL 错误** — `SQLSyntaxErrorException`、`DataAccessException`
372
+ 4. **业务异常** — `LeException` 抛出的位置
373
+ 5. **耗时** — `Completed xxx in Nms`,识别慢请求
374
+ 6. **请求/响应** — `RequestLoggingFilter` 的 `>>>` 和 `<<<` 日志
375
+
376
+ ### 联动技能
377
+
378
+ | 场景 | 联动技能 |
379
+ |------|---------|
380
+ | 排查 Bug | `bug-detective` |
381
+ | 查询云效任务 | `yunxiao-task-management` |
382
+ | 查数据库 | `mysql-debug` |
383
+ | 性能问题 | `performance-doctor` |
384
+
385
+ ## Grafana Service Account Token 创建
386
+
387
+ 每个 Grafana 环境需要独立创建 Token:
388
+
389
+ 1. 登录对应 Grafana URL
390
+ 2. 左侧菜单 → Administration → Service accounts
391
+ 3. Add service account(名称:`claude-loki-reader`),角色:`Viewer`
392
+ 4. Add service account token → 复制
393
+ 5. 更新 `environments.json` 中对应环境的 `token` 字段
394
+
395
+ ## 注意
396
+
397
+ - 如果 Token 为空会报 `invalid API key`,需要先为该环境创建 Token
398
+ - 查询默认不限 project,可覆盖该 Grafana 下所有项目环境
399
+ - `direction=forward` 按时间正序,`direction=backward` 按时间倒序(最新优先)
400
+ - 如果是 Bug 排查完整流程,同时使用 `bug-detective`
@@ -0,0 +1,45 @@
1
+ {
2
+ "_comment": "Loki 多环境配置。每个环境需要独立的 Grafana Service Account Token。",
3
+ "_usage": "用户说'查 test13 的日志'或'去 monitor-dev 查'时,匹配对应环境。",
4
+ "_setup": "Token 创建:Grafana → Administration → Service accounts → Add(Viewer 角色)→ Add token → 复制到对应环境的 token 字段。",
5
+
6
+ "active": "test13",
7
+
8
+ "environments": {
9
+ "test13": {
10
+ "name": "测试13(主测试环境)",
11
+ "url": "https://test13.xnzn.net/grafana",
12
+ "token": "",
13
+ "aliases": ["test13", "13"],
14
+ "projects": ["test13", "test14", "test15", "test16", "test17", "test18", "test19", "test20", "test21", "test22", "test23", "test24", "test25", "test26", "test27", "test28", "test31", "ywcs"]
15
+ },
16
+ "monitor-test": {
17
+ "name": "Monitor 测试环境",
18
+ "url": "https://monitor-test.xnzn.net/grafana",
19
+ "token": "",
20
+ "aliases": ["monitor-test", "mtest"],
21
+ "projects": ["test01", "test02", "test03", "test04", "test05", "test06", "test07", "test08", "test09", "test10", "test11", "test12"]
22
+ },
23
+ "monitor-dev": {
24
+ "name": "Monitor 开发环境",
25
+ "url": "https://monitor-dev.xnzn.net/grafana",
26
+ "token": "",
27
+ "aliases": ["monitor-dev", "mdev", "dev"],
28
+ "projects": ["dev01", "dev02", "dev03", "dev04", "dev05", "dev06", "dev07", "dev08", "dev09", "dev10", "dev11", "dev12", "dev13", "dev14", "dev15"]
29
+ },
30
+ "monitor02-dev": {
31
+ "name": "Monitor02 开发环境",
32
+ "url": "https://monitor02-dev.xnzn.net/grafana",
33
+ "token": "",
34
+ "aliases": ["monitor02-dev", "m02", "monitor02"],
35
+ "projects": ["dev16", "dev17", "dev19", "dev21", "dev22", "dev23", "dev24", "dev25", "dev26", "dev28", "dev29", "dev30", "dev31", "dev32", "dev33", "dev34", "dev35", "dev36", "dev37", "dev38", "dev39", "dev40", "dev41", "dev42"]
36
+ },
37
+ "monitor-tyy-dev": {
38
+ "name": "Monitor 体验园开发环境",
39
+ "url": "https://monitor-tyy-dev.xnzn.net/grafana",
40
+ "token": "",
41
+ "aliases": ["monitor-tyy", "tyy", "体验园"],
42
+ "projects": ["dev44", "dev45", "dev46", "dev47", "dev48", "dev49", "dev50", "dev51", "dev52", "dev53", "dev54", "dev55", "dev56", "dev57", "dev58", "dev60", "dev61", "dev63", "dev64", "grafana"]
43
+ }
44
+ }
45
+ }
@@ -27,41 +27,73 @@ description: |
27
27
 
28
28
  ---
29
29
 
30
- ## 首次使用引导(必须执行)
30
+ ## 连接信息获取(三级降级,自动查找)
31
31
 
32
- 当本技能被激活时,**必须先执行以下两项检查**,任一不通过则输出引导提示并停止查库操作:
32
+ 当本技能被激活时,**按以下优先级获取数据库连接信息**:
33
33
 
34
- ### 检查 1:配置文件是否就绪
34
+ ### 优先级 1:用户对话中指定(最高优先级)
35
35
 
36
- 读取 `.claude/mysql-config.json`,确定当前环境(用户指定 或 `default` 字段),检查该环境的 password 是否仍为占位符 `YOUR_PASSWORD`:
36
+ 用户直接给出连接信息,或指定环境名:
37
+ - "连 dev 环境查一下" → 使用 `.claude/mysql-config.json` 中 dev 环境的配置
38
+ - 直接给出 host/port/user/password → 直接使用
37
39
 
40
+ ### 优先级 2:`.claude/mysql-config.json`(显式配置,可选)
41
+
42
+ 如果文件存在且当前环境的 password 不是占位符 `YOUR_PASSWORD`,使用该配置。
43
+ **此文件为可选**,主要用于连接非本地环境(dev/prod 远程数据库)。
44
+
45
+ ### 优先级 3:工程配置文件(零配置,本地开发默认)
46
+
47
+ 从项目的 `bootstrap-dev.yml` 中自动提取连接信息:
48
+
49
+ **搜索路径**:
38
50
  ```
39
- 如果文件不存在 或 当前环境的 password == "YOUR_PASSWORD":
40
- → 输出引导提示(见下方模板),不执行查库
51
+ **/bootstrap-dev.yml
52
+ **/bootstrap*.yml(降级)
41
53
  ```
42
54
 
43
- ### 检查 2:mysql CLI 是否可用
44
-
45
- 执行 `which mysql`,检查是否返回有效路径:
55
+ **解析位置**:`spring.dataset.system.master` 节点
46
56
 
57
+ **解析规则**:
58
+ ```yaml
59
+ # 从以下字段提取:
60
+ jdbcUrl: jdbc:mysql://127.0.0.1:3306/system_xxx
61
+ username: root
62
+ password: xxx
47
63
  ```
48
- 如果 mysql 命令不存在:
49
- → 输出引导提示(见下方模板),不执行查库
64
+
65
+ **提取结果**:
66
+ - host = `127.0.0.1`(从 jdbcUrl 解析)
67
+ - port = `3306`(从 jdbcUrl 解析)
68
+ - user = `root`(username 字段)
69
+ - password = `xxx`(password 字段)
70
+ - 注意:jdbcUrl 中的数据库名(`system_xxx`)为系统库,**不作为查询目标数据库**。查询目标数据库 = 租户ID(从日志提取或用户指定)
71
+
72
+ ### mysql CLI 查找(多路径)
73
+
74
+ 按顺序查找 mysql 客户端:
75
+
76
+ ```bash
77
+ which mysql \
78
+ || ls /usr/local/mysql/bin/mysql \
79
+ || ls /opt/homebrew/bin/mysql \
80
+ || ls /opt/homebrew/opt/mysql-client/bin/mysql
50
81
  ```
51
82
 
52
- ### 引导提示模板
83
+ 找到任一即可使用。如果全部不存在,输出安装提示:
84
+ ```
85
+ brew install mysql-client
86
+ ```
53
87
 
54
- 当检查不通过时,输出以下提示:
88
+ ### 引导提示(仅当连接信息和 mysql CLI 都无法获取时)
55
89
 
56
90
  ```
57
91
  ⚠️ 数据库查询功能需要先完成配置:
58
92
 
59
- 1. 编辑 .claude/mysql-config.json,填入你的 MySQL 连接信息:
60
- 配置文件支持多环境(local / dev / prod),至少配置一个环境:
61
- - host: 数据库地址
62
- - port: 端口(默认 3306)
63
- - user: 用户名
64
- - password: 数据库密码(替换 YOUR_PASSWORD)
93
+ 1. 连接信息获取失败:
94
+ - 未找到 bootstrap-dev.yml 工程配置文件
95
+ - 未找到 .claude/mysql-config.json 配置文件
96
+ → 请创建 .claude/mysql-config.json 或确保项目中存在 bootstrap-dev.yml
65
97
 
66
98
  2. 安装 MySQL 客户端:
67
99
  brew install mysql-client
@@ -209,11 +241,15 @@ mysql -h 127.0.0.1 -P 3306 -u root -p'password' 546198574447230976 -e "SELECT ..
209
241
 
210
242
  ### 连接方式
211
243
 
212
- 读取 `.claude/mysql-config.json` 获取 host/port/user/password,数据库名从日志提取或用户指定:
244
+ 按"连接信息获取"章节的优先级获取 host/port/user/password,数据库名从日志提取或用户指定:
213
245
 
214
246
  ```bash
215
- # 从配置读取连接信息 + 动态数据库名
216
- mysql -h {host} -P {port} -u {user} -p'{password}' {database_from_log} -e "{SQL}"
247
+ # 连接信息来源:用户指定 > mysql-config.json > bootstrap-dev.yml 自动提取
248
+ # 数据库名来源:用户指定 > 日志提取的租户ID
249
+ mysql -h {host} -P {port} -u {user} -p'{password}' {database_from_log_or_user} -e "{SQL}"
250
+
251
+ # mysql 路径:如果 which mysql 失败,尝试绝对路径
252
+ /opt/homebrew/opt/mysql-client/bin/mysql -h {host} ...
217
253
  ```
218
254
 
219
255
  ### 常用排查查询模板