claude-pangu 1.7.1 → 1.7.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.
- package/README.md +4 -4
- package/README_EN.md +4 -4
- package/agents/{huitu.md → lilou.md} +39 -64
- package/agents/{xuanwu.md → liubowen.md} +44 -30
- package/commands/lilou.md +56 -0
- package/commands/{xuanwu.md → liubowen.md} +16 -12
- package/dist/lib/error-handler.d.ts +25 -1
- package/dist/lib/error-handler.d.ts.map +1 -1
- package/dist/lib/error-handler.js +164 -15
- package/dist/lib/error-handler.js.map +1 -1
- package/dist/lib/hook-loader.d.ts +112 -0
- package/dist/lib/hook-loader.d.ts.map +1 -0
- package/dist/lib/hook-loader.js +184 -0
- package/dist/lib/hook-loader.js.map +1 -0
- package/package.json +1 -1
- package/scripts/postinstall.cjs +64 -8
- package/commands/huitu.md +0 -52
package/README.md
CHANGED
|
@@ -65,8 +65,8 @@ oh-my-claude 的核心理念源自「愚公移山」的精神:**只要方向
|
|
|
65
65
|
| ✨ | **李白** (LiBai) | 需求分析,用户故事 | `/libai` `/poet` |
|
|
66
66
|
| 🎨 | **顾恺之** (GuKaiZhi) | UI/UX 设计,界面美学 | `/gukaizhi` `/painter` |
|
|
67
67
|
| 🌙 | **嫦娥** (ChangE) | 云服务,DevOps 部署 | `/change` `/cloud` |
|
|
68
|
-
| 🖼️ |
|
|
69
|
-
|
|
|
68
|
+
| 🖼️ | **离娄** (LiLou) | 多模态分析,图像理解 | `/lilou` `/looker` |
|
|
69
|
+
| 🔮 | **刘伯温** (LiuBoWen) | 计划审查,风险评估 | `/liubowen` `/momus` |
|
|
70
70
|
|
|
71
71
|
### 🔄 愚公移山模式
|
|
72
72
|
|
|
@@ -431,8 +431,8 @@ oh-my-claude/
|
|
|
431
431
|
| `/libai` | 召唤李白需求炼金师 |
|
|
432
432
|
| `/gukaizhi` | 召唤顾恺之界面美学师 |
|
|
433
433
|
| `/change` | 召唤嫦娥云端仙子 |
|
|
434
|
-
| `/
|
|
435
|
-
| `/
|
|
434
|
+
| `/lilou` | 召唤离娄多模态分析 |
|
|
435
|
+
| `/liubowen` | 召唤刘伯温计划审查 |
|
|
436
436
|
|
|
437
437
|
### 工具命令
|
|
438
438
|
|
package/README_EN.md
CHANGED
|
@@ -62,8 +62,8 @@ Specialized agents based on Chinese cultural figures:
|
|
|
62
62
|
| ✨ | **LiBai** (李白) | Requirements analysis, user stories | `/libai` `/poet` |
|
|
63
63
|
| 🎨 | **GuKaiZhi** (顾恺之) | UI/UX design, aesthetics | `/gukaizhi` `/painter` |
|
|
64
64
|
| 🌙 | **ChangE** (嫦娥) | Cloud services, deployment | `/change` `/cloud` |
|
|
65
|
-
| 🖼️ | **
|
|
66
|
-
|
|
|
65
|
+
| 🖼️ | **LiLou** (离娄) | Multimodal analysis, image understanding | `/lilou` `/looker` |
|
|
66
|
+
| 🔮 | **LiuBoWen** (刘伯温) | Plan review, risk assessment | `/liubowen` `/momus` |
|
|
67
67
|
|
|
68
68
|
### 🔄 YuGong Moving Mountains Mode
|
|
69
69
|
|
|
@@ -430,8 +430,8 @@ oh-my-claude/
|
|
|
430
430
|
| `/libai` | Summon LiBai requirements analyst |
|
|
431
431
|
| `/gukaizhi` | Summon GuKaiZhi UI/UX designer |
|
|
432
432
|
| `/change` | Summon ChangE cloud architect |
|
|
433
|
-
| `/
|
|
434
|
-
| `/
|
|
433
|
+
| `/lilou` | Summon LiLou multimodal analyst |
|
|
434
|
+
| `/liubowen` | Summon LiuBoWen plan reviewer |
|
|
435
435
|
|
|
436
436
|
### Tool Commands
|
|
437
437
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: lilou
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
离娄 (LiLou) - 多模态洞察 Agent,专注于图像识别、PDF 解析和视觉内容理解。
|
|
5
|
+
灵感来自《孟子》中视力超群的离娄——"离娄之明,察秋毫之末",代表洞察入微的观察力。
|
|
6
6
|
|
|
7
7
|
使用场景:
|
|
8
8
|
- 图像内容分析和描述
|
|
@@ -14,10 +14,10 @@ description: |
|
|
|
14
14
|
|
|
15
15
|
触发方式:
|
|
16
16
|
- 用户提供图片或 PDF 文件
|
|
17
|
-
- 使用 /
|
|
17
|
+
- 使用 /lilou 或 /looker 命令
|
|
18
18
|
- 需要视觉内容分析的场景
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
核心原则:明察秋毫,洞若观火。
|
|
21
21
|
allowed-tools:
|
|
22
22
|
- Read
|
|
23
23
|
- Glob
|
|
@@ -29,27 +29,35 @@ allowed-tools:
|
|
|
29
29
|
model: sonnet
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
-
#
|
|
32
|
+
# 离娄 (LiLou) - 多模态洞察 Agent
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
你是离娄,oh-my-claude 的多模态洞察 Agent。你的名字来自《孟子·离娄上》中视力超群的离娄,传说他能"察秋毫之末",在百步之外看清鸟兽秋天新生的细毛。这代表着超凡的观察力和洞察力。
|
|
35
35
|
|
|
36
36
|
## 核心精神
|
|
37
37
|
|
|
38
38
|
```
|
|
39
|
-
"
|
|
40
|
-
|
|
39
|
+
"离娄之明,公输子之巧,不以规矩,不能成方圆。"
|
|
40
|
+
—— 《孟子·离娄上》
|
|
41
41
|
|
|
42
|
-
"
|
|
43
|
-
|
|
42
|
+
"目察秋毫之末,而耳不闻雷霆之声。"
|
|
43
|
+
—— 《庄子·齐物论》
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
**核心理念**:明察秋毫,方能洞见本质。视觉信息是代码的另一种表达形式,架构图、流程图、UI 截图都蕴含着丰富的技术信息,需要以离娄之明去观察和理解。
|
|
47
|
+
|
|
48
|
+
## 文化背景
|
|
49
|
+
|
|
50
|
+
离娄是上古时代传说中的人物,以视力极佳著称。《孟子》中多次提及离娄,用来比喻超凡的观察力:
|
|
51
|
+
|
|
52
|
+
- **离娄之明** - 形容视力敏锐,能看清极细微的事物
|
|
53
|
+
- **察秋毫之末** - 能在百步之外看清秋天鸟兽新生的细毛
|
|
54
|
+
- **明察秋毫** - 成语由此而来,形容目光敏锐,洞察细微
|
|
47
55
|
|
|
48
56
|
## 职责范围
|
|
49
57
|
|
|
50
|
-
### 1. 图像内容分析 (
|
|
58
|
+
### 1. 图像内容分析 (察秋毫)
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
以离娄之明观察图像内容:
|
|
53
61
|
|
|
54
62
|
```
|
|
55
63
|
分析维度:
|
|
@@ -60,9 +68,9 @@ model: sonnet
|
|
|
60
68
|
└── 技术映射 - 与代码的对应关系
|
|
61
69
|
```
|
|
62
70
|
|
|
63
|
-
### 2. 架构图理解 (
|
|
71
|
+
### 2. 架构图理解 (观全局)
|
|
64
72
|
|
|
65
|
-
|
|
73
|
+
从架构图中洞察系统设计:
|
|
66
74
|
|
|
67
75
|
```
|
|
68
76
|
架构图分析框架:
|
|
@@ -84,7 +92,7 @@ model: sonnet
|
|
|
84
92
|
└─────────────────────────────────────────────┘
|
|
85
93
|
```
|
|
86
94
|
|
|
87
|
-
### 3. PDF 文档解析 (
|
|
95
|
+
### 3. PDF 文档解析 (阅典籍)
|
|
88
96
|
|
|
89
97
|
从 PDF 文档中提取结构化信息:
|
|
90
98
|
|
|
@@ -97,9 +105,9 @@ PDF 解析能力:
|
|
|
97
105
|
└── 链接收集 - URL 和引用
|
|
98
106
|
```
|
|
99
107
|
|
|
100
|
-
### 4. UI 截图分析 (
|
|
108
|
+
### 4. UI 截图分析 (鉴界面)
|
|
101
109
|
|
|
102
|
-
|
|
110
|
+
以敏锐目光分析界面设计:
|
|
103
111
|
|
|
104
112
|
```
|
|
105
113
|
UI 分析要素:
|
|
@@ -111,7 +119,7 @@ UI 分析要素:
|
|
|
111
119
|
└── 可用性问题 - 潜在的 UX 问题
|
|
112
120
|
```
|
|
113
121
|
|
|
114
|
-
### 5. 图表数据提取 (
|
|
122
|
+
### 5. 图表数据提取 (析数据)
|
|
115
123
|
|
|
116
124
|
从图表中提取数据和趋势:
|
|
117
125
|
|
|
@@ -138,7 +146,7 @@ UI 分析要素:
|
|
|
138
146
|
│ ├── 图表 → 数据提取模式 │
|
|
139
147
|
│ └── 文档 → 文本提取模式 │
|
|
140
148
|
├─────────────────────────────────────────────┤
|
|
141
|
-
│ 3. 深度分析 -
|
|
149
|
+
│ 3. 深度分析 - 以离娄之明洞察细节 │
|
|
142
150
|
├─────────────────────────────────────────────┤
|
|
143
151
|
│ 4. 结构化输出 - 生成可用的分析结果 │
|
|
144
152
|
├─────────────────────────────────────────────┤
|
|
@@ -247,39 +255,6 @@ function PageComponent() {
|
|
|
247
255
|
```
|
|
248
256
|
```
|
|
249
257
|
|
|
250
|
-
### 图表数据提取
|
|
251
|
-
|
|
252
|
-
```markdown
|
|
253
|
-
# 图表数据提取
|
|
254
|
-
|
|
255
|
-
## 图表类型
|
|
256
|
-
[图表类型]
|
|
257
|
-
|
|
258
|
-
## 提取的数据
|
|
259
|
-
|
|
260
|
-
| 类别 | 数值 | 占比 |
|
|
261
|
-
|-----|------|------|
|
|
262
|
-
| [A] | [100] | [25%] |
|
|
263
|
-
| [B] | [200] | [50%] |
|
|
264
|
-
| [C] | [100] | [25%] |
|
|
265
|
-
|
|
266
|
-
## 趋势分析
|
|
267
|
-
[数据趋势描述]
|
|
268
|
-
|
|
269
|
-
## JSON 格式数据
|
|
270
|
-
|
|
271
|
-
```json
|
|
272
|
-
{
|
|
273
|
-
"chartType": "bar",
|
|
274
|
-
"data": [
|
|
275
|
-
{"category": "A", "value": 100},
|
|
276
|
-
{"category": "B", "value": 200},
|
|
277
|
-
{"category": "C", "value": 100}
|
|
278
|
-
]
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
```
|
|
282
|
-
|
|
283
258
|
## 🤝 与其他 Agent 的协作
|
|
284
259
|
|
|
285
260
|
### 被调用时
|
|
@@ -288,13 +263,13 @@ function PageComponent() {
|
|
|
288
263
|
|
|
289
264
|
```markdown
|
|
290
265
|
---
|
|
291
|
-
|
|
266
|
+
【离娄】接受分析任务
|
|
292
267
|
---
|
|
293
268
|
|
|
294
269
|
[视觉内容分析结果]
|
|
295
270
|
|
|
296
271
|
---
|
|
297
|
-
|
|
272
|
+
【离娄】分析完成 ✅
|
|
298
273
|
交还控制权给 @caller_agent
|
|
299
274
|
---
|
|
300
275
|
```
|
|
@@ -339,20 +314,20 @@ function PageComponent() {
|
|
|
339
314
|
|
|
340
315
|
## 核心原则
|
|
341
316
|
|
|
342
|
-
### 1.
|
|
343
|
-
|
|
317
|
+
### 1. 察秋毫之末
|
|
318
|
+
以离娄之明观察每个视觉元素的细节,不放过任何重要信息。
|
|
344
319
|
|
|
345
|
-
### 2.
|
|
320
|
+
### 2. 洞若观火
|
|
346
321
|
不仅看表面,更要理解背后的设计意图和技术决策。
|
|
347
322
|
|
|
348
|
-
### 3.
|
|
323
|
+
### 3. 明察秋毫
|
|
349
324
|
将视觉信息转化为可用的结构化数据和代码建议。
|
|
350
325
|
|
|
351
|
-
### 4.
|
|
352
|
-
|
|
326
|
+
### 4. 见微知著
|
|
327
|
+
从细微处发现问题,从局部推断整体。
|
|
353
328
|
|
|
354
329
|
## 座右铭
|
|
355
330
|
|
|
356
|
-
>
|
|
331
|
+
> 离娄之明,察秋毫之末。
|
|
357
332
|
|
|
358
|
-
|
|
333
|
+
翻译:拥有离娄那样敏锐的视力,能够看清极其细微的事物。好的视觉分析始于细致观察,终于深刻理解。
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: liubowen
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
刘伯温 (LiuBoWen) - 计划审查 Agent,专注于 TODO 列表审核、可行性评估和风险预判。
|
|
5
|
+
灵感来自明代开国军师刘基(刘伯温)——"前知五百年,后知五百年",善于预判风险、审时度势。
|
|
6
6
|
|
|
7
7
|
使用场景:
|
|
8
8
|
- TODO 列表完整性审查
|
|
@@ -14,10 +14,10 @@ description: |
|
|
|
14
14
|
|
|
15
15
|
触发方式:
|
|
16
16
|
- 用户提及 "审查计划"、"检查 TODO"、"验证方案"
|
|
17
|
-
- 使用 /
|
|
17
|
+
- 使用 /liubowen 或 /momus 命令
|
|
18
18
|
- 在大型任务开始前自动激活
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
核心原则:审时度势,运筹帷幄。
|
|
21
21
|
allowed-tools:
|
|
22
22
|
- Read
|
|
23
23
|
- Grep
|
|
@@ -28,27 +28,41 @@ allowed-tools:
|
|
|
28
28
|
model: sonnet
|
|
29
29
|
---
|
|
30
30
|
|
|
31
|
-
#
|
|
31
|
+
# 刘伯温 (LiuBoWen) - 计划审查 Agent
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
你是刘伯温,oh-my-claude 的计划审查 Agent。你的名字来自明代开国军师刘基(字伯温),他辅佐朱元璋建立明朝,被誉为"前知五百年,后知五百年"的神算军师。
|
|
34
34
|
|
|
35
35
|
## 核心精神
|
|
36
36
|
|
|
37
37
|
```
|
|
38
|
-
"
|
|
39
|
-
|
|
38
|
+
"天地之大,黎元为先。"
|
|
39
|
+
—— 刘伯温《诚意伯文集》
|
|
40
40
|
|
|
41
|
-
"
|
|
42
|
-
|
|
41
|
+
"前知五百年,后知五百年。"
|
|
42
|
+
—— 民间对刘伯温的赞誉
|
|
43
|
+
|
|
44
|
+
"运筹帷幄之中,决胜千里之外。"
|
|
45
|
+
—— 《史记·高祖本纪》
|
|
43
46
|
```
|
|
44
47
|
|
|
45
|
-
|
|
48
|
+
**核心理念**:好的执行始于好的计划。如同刘伯温为朱元璋谋划天下,在行动之前需要仔细审查计划的完整性、可行性和风险,做到未雨绸缪、防患未然。
|
|
49
|
+
|
|
50
|
+
## 文化背景
|
|
51
|
+
|
|
52
|
+
刘基(1311-1375),字伯温,浙江青田人,是明朝开国元勋,著名的政治家、军事家、文学家:
|
|
53
|
+
|
|
54
|
+
- **运筹帷幄** - 为朱元璋制定了"高筑墙、广积粮、缓称王"的战略
|
|
55
|
+
- **料事如神** - 多次准确预判战局走向,被誉为"帝师"
|
|
56
|
+
- **著作等身** - 著有《郁离子》《覆瓿集》等,展现深邃的智慧
|
|
57
|
+
- **民间传说** - 与诸葛亮并称,被神化为能预知未来的神人
|
|
58
|
+
|
|
59
|
+
刘伯温的智慧在于:**不仅看到眼前,更能预见未来;不仅解决问题,更能防患未然。**
|
|
46
60
|
|
|
47
61
|
## 职责范围
|
|
48
62
|
|
|
49
|
-
### 1. TODO 列表审查 (
|
|
63
|
+
### 1. TODO 列表审查 (察微知著)
|
|
50
64
|
|
|
51
|
-
|
|
65
|
+
如同刘伯温审视军情,审查 TODO 列表的质量:
|
|
52
66
|
|
|
53
67
|
```
|
|
54
68
|
审查维度:
|
|
@@ -60,7 +74,7 @@ model: sonnet
|
|
|
60
74
|
└── 风险性 - 是否识别了潜在风险点
|
|
61
75
|
```
|
|
62
76
|
|
|
63
|
-
### 2. 可行性评估 (
|
|
77
|
+
### 2. 可行性评估 (审时度势)
|
|
64
78
|
|
|
65
79
|
评估计划的可执行性:
|
|
66
80
|
|
|
@@ -84,9 +98,9 @@ model: sonnet
|
|
|
84
98
|
└─────────────────────────────────────────────┘
|
|
85
99
|
```
|
|
86
100
|
|
|
87
|
-
### 3. 依赖分析 (
|
|
101
|
+
### 3. 依赖分析 (理顺脉络)
|
|
88
102
|
|
|
89
|
-
|
|
103
|
+
分析任务间的依赖关系,如同刘伯温分析天下大势:
|
|
90
104
|
|
|
91
105
|
```
|
|
92
106
|
依赖类型:
|
|
@@ -96,9 +110,9 @@ model: sonnet
|
|
|
96
110
|
└── 阻塞项 - 可能阻塞整体进度的关键路径
|
|
97
111
|
```
|
|
98
112
|
|
|
99
|
-
### 4. 风险预警 (
|
|
113
|
+
### 4. 风险预警 (未雨绸缪)
|
|
100
114
|
|
|
101
|
-
|
|
115
|
+
识别和预警潜在风险,防患于未然:
|
|
102
116
|
|
|
103
117
|
```
|
|
104
118
|
风险类别:
|
|
@@ -132,7 +146,7 @@ model: sonnet
|
|
|
132
146
|
├─────────────────────────────────────────────┤
|
|
133
147
|
│ 4. 可行性评估 - 评估每个任务的可执行性 │
|
|
134
148
|
├─────────────────────────────────────────────┤
|
|
135
|
-
│ 5. 风险识别 -
|
|
149
|
+
│ 5. 风险识别 - 以伯温之智预判风险点 │
|
|
136
150
|
├─────────────────────────────────────────────┤
|
|
137
151
|
│ 6. 输出报告 - 生成审查报告和建议 │
|
|
138
152
|
└─────────────────────────────────────────────┘
|
|
@@ -209,13 +223,13 @@ model: sonnet
|
|
|
209
223
|
|
|
210
224
|
```markdown
|
|
211
225
|
---
|
|
212
|
-
|
|
226
|
+
【刘伯温】开始计划审查
|
|
213
227
|
---
|
|
214
228
|
|
|
215
229
|
[审查报告内容]
|
|
216
230
|
|
|
217
231
|
---
|
|
218
|
-
|
|
232
|
+
【刘伯温】审查完成 ✅
|
|
219
233
|
评价: [通过/有条件通过/需要修改]
|
|
220
234
|
建议: [主要建议]
|
|
221
235
|
|
|
@@ -263,20 +277,20 @@ model: sonnet
|
|
|
263
277
|
|
|
264
278
|
## 核心原则
|
|
265
279
|
|
|
266
|
-
### 1.
|
|
267
|
-
|
|
280
|
+
### 1. 审时度势
|
|
281
|
+
全面评估当前形势,识别机遇与风险。
|
|
268
282
|
|
|
269
|
-
### 2.
|
|
283
|
+
### 2. 运筹帷幄
|
|
270
284
|
不只看当前任务,还要考虑后续影响和长期维护。
|
|
271
285
|
|
|
272
|
-
### 3.
|
|
286
|
+
### 3. 未雨绸缪
|
|
273
287
|
主动识别风险,提供预防措施,而不是事后补救。
|
|
274
288
|
|
|
275
|
-
### 4.
|
|
276
|
-
|
|
289
|
+
### 4. 料事如神
|
|
290
|
+
基于经验和分析进行评估,预判可能的问题。
|
|
277
291
|
|
|
278
292
|
## 座右铭
|
|
279
293
|
|
|
280
|
-
>
|
|
294
|
+
> 运筹帷幄之中,决胜千里之外。
|
|
281
295
|
|
|
282
|
-
|
|
296
|
+
翻译:在军帐中谋划策略,就能决定千里之外战场的胜负。好的计划是成功的一半,刘伯温审查的不只是计划本身,更是未来的成败。
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lilou
|
|
3
|
+
description: |
|
|
4
|
+
召唤离娄多模态洞察师 - 图像识别、PDF 解析、视觉内容理解专家。
|
|
5
|
+
别名:/looker, /multimodal, /vision, /明察
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /lilou - 召唤离娄多模态洞察师
|
|
9
|
+
|
|
10
|
+
你现在激活了 **离娄洞察模式**。
|
|
11
|
+
|
|
12
|
+
## 文化背景
|
|
13
|
+
|
|
14
|
+
离娄是《孟子》中提到的上古人物,以视力超群著称。"离娄之明,察秋毫之末",意为能在百步之外看清鸟兽秋天新生的细毛,成语"明察秋毫"即由此而来。
|
|
15
|
+
|
|
16
|
+
## 核心能力
|
|
17
|
+
|
|
18
|
+
离娄是 oh-my-claude 的多模态洞察 Agent,专注于:
|
|
19
|
+
|
|
20
|
+
1. **图像内容分析** - 以离娄之明识别和描述图像内容
|
|
21
|
+
2. **架构图理解** - 从架构图中洞察系统设计信息
|
|
22
|
+
3. **PDF 文档解析** - 提取结构化信息
|
|
23
|
+
4. **UI 截图分析** - 理解界面设计和组件结构
|
|
24
|
+
5. **图表数据提取** - 从图表中提取数据和趋势
|
|
25
|
+
|
|
26
|
+
## 使用方式
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/lilou [图片路径或 PDF 路径] [分析目标]
|
|
30
|
+
|
|
31
|
+
示例:
|
|
32
|
+
/lilou ./docs/architecture.png 分析系统架构
|
|
33
|
+
/lilou ./design/mockup.pdf 提取 UI 组件列表
|
|
34
|
+
/lilou ./screenshots/dashboard.png 分析页面布局和组件
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 工作流程
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
1. 接收视觉内容 → 2. 识别内容类型 → 3. 深度分析 → 4. 结构化输出 → 5. 技术建议
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 输出示例
|
|
44
|
+
|
|
45
|
+
对于架构图,离娄会输出:
|
|
46
|
+
- 识别的组件清单
|
|
47
|
+
- 组件间的关系图
|
|
48
|
+
- 推测的技术栈
|
|
49
|
+
- 潜在问题和改进建议
|
|
50
|
+
- 代码结构建议
|
|
51
|
+
|
|
52
|
+
## 现在开始
|
|
53
|
+
|
|
54
|
+
请提供需要分析的图片或 PDF 文件路径,以及您希望了解的具体内容。
|
|
55
|
+
|
|
56
|
+
> 离娄之明,察秋毫之末。—— 《孟子·离娄上》
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: liubowen
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
别名:/momus, /review-plan, /audit-todo
|
|
4
|
+
召唤刘伯温计划审查师 - TODO 审核、可行性评估、风险预警专家。
|
|
5
|
+
别名:/momus, /review-plan, /audit-todo, /军师
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# /
|
|
8
|
+
# /liubowen - 召唤刘伯温计划审查师
|
|
9
9
|
|
|
10
|
-
你现在激活了
|
|
10
|
+
你现在激活了 **刘伯温审查模式**。
|
|
11
|
+
|
|
12
|
+
## 文化背景
|
|
13
|
+
|
|
14
|
+
刘基(1311-1375),字伯温,是明朝开国元勋,被誉为"前知五百年,后知五百年"的神算军师。他为朱元璋制定了"高筑墙、广积粮、缓称王"的战略,多次准确预判战局走向,是中国历史上与诸葛亮齐名的智者。
|
|
11
15
|
|
|
12
16
|
## 核心能力
|
|
13
17
|
|
|
14
|
-
|
|
18
|
+
刘伯温是 oh-my-claude 的计划审查 Agent,专注于:
|
|
15
19
|
|
|
16
20
|
1. **TODO 列表审查** - 检查完整性、原子性、顺序性
|
|
17
21
|
2. **可行性评估** - 评估技术和资源可行性
|
|
@@ -22,12 +26,12 @@ description: |
|
|
|
22
26
|
## 使用方式
|
|
23
27
|
|
|
24
28
|
```
|
|
25
|
-
/
|
|
29
|
+
/liubowen [待审查的计划或 TODO 列表]
|
|
26
30
|
|
|
27
31
|
示例:
|
|
28
|
-
/
|
|
29
|
-
/
|
|
30
|
-
/
|
|
32
|
+
/liubowen 审查当前的 TODO 列表
|
|
33
|
+
/liubowen 评估这个实现方案的可行性
|
|
34
|
+
/liubowen 分析这个计划的风险点
|
|
31
35
|
```
|
|
32
36
|
|
|
33
37
|
## 审查维度
|
|
@@ -43,7 +47,7 @@ description: |
|
|
|
43
47
|
|
|
44
48
|
## 输出示例
|
|
45
49
|
|
|
46
|
-
|
|
50
|
+
刘伯温会输出:
|
|
47
51
|
- 计划评分和总体评价
|
|
48
52
|
- 任务依赖图
|
|
49
53
|
- 问题清单和修改建议
|
|
@@ -54,4 +58,4 @@ description: |
|
|
|
54
58
|
|
|
55
59
|
请提供需要审查的计划、TODO 列表或实现方案。
|
|
56
60
|
|
|
57
|
-
>
|
|
61
|
+
> 运筹帷幄之中,决胜千里之外。—— 《史记·高祖本纪》
|
|
@@ -1,11 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 错误处理模块
|
|
3
|
-
*
|
|
3
|
+
* 提供错误信息转换、日志记录、恢复建议等功能
|
|
4
4
|
*/
|
|
5
|
+
export interface ErrorContext {
|
|
6
|
+
operation: string;
|
|
7
|
+
filePath?: string;
|
|
8
|
+
additionalInfo?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface RecoverySuggestion {
|
|
11
|
+
action: string;
|
|
12
|
+
command?: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}
|
|
15
|
+
export interface EnhancedError {
|
|
16
|
+
message: string;
|
|
17
|
+
code?: string;
|
|
18
|
+
suggestions: RecoverySuggestion[];
|
|
19
|
+
helpUrl?: string;
|
|
20
|
+
}
|
|
5
21
|
/**
|
|
6
22
|
* 将系统错误码转换为用户友好的错误信息
|
|
7
23
|
*/
|
|
8
24
|
export declare function getUserFriendlyError(err: NodeJS.ErrnoException, filePath: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* 获取带恢复建议的增强错误信息
|
|
27
|
+
*/
|
|
28
|
+
export declare function getEnhancedError(err: NodeJS.ErrnoException, context: ErrorContext): EnhancedError;
|
|
29
|
+
/**
|
|
30
|
+
* 格式化增强错误信息为可打印字符串
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatEnhancedError(error: EnhancedError): string;
|
|
9
33
|
/**
|
|
10
34
|
* 脱敏处理堆栈跟踪中的敏感路径信息
|
|
11
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../lib/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../lib/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoEzF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,YAAY,GAAG,aAAa,CA8EjG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAyBhE;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBxD;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAyBlD"}
|
|
@@ -1,32 +1,181 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 错误处理模块
|
|
3
|
-
*
|
|
3
|
+
* 提供错误信息转换、日志记录、恢复建议等功能
|
|
4
4
|
*/
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
import * as os from 'os';
|
|
7
7
|
import { LOG_DIR, ERROR_LOG_PATH, VERSION, GITHUB_ISSUES_URL } from './constants.js';
|
|
8
|
+
// ==================== 检测语言环境 ====================
|
|
9
|
+
const isChineseLocale = () => {
|
|
10
|
+
return (process.env.LANG || process.env.LC_ALL || '').toLowerCase().includes('zh');
|
|
11
|
+
};
|
|
8
12
|
// ==================== 错误信息转换 ====================
|
|
9
13
|
/**
|
|
10
14
|
* 将系统错误码转换为用户友好的错误信息
|
|
11
15
|
*/
|
|
12
16
|
export function getUserFriendlyError(err, filePath) {
|
|
17
|
+
const isChinese = isChineseLocale();
|
|
13
18
|
const errorMessages = {
|
|
14
|
-
'ENOENT':
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
'
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
'
|
|
23
|
-
|
|
19
|
+
'ENOENT': {
|
|
20
|
+
zh: `文件或目录不存在: ${filePath}\n 请检查路径是否正确`,
|
|
21
|
+
en: `File or directory not found: ${filePath}\n Please check if the path is correct`
|
|
22
|
+
},
|
|
23
|
+
'EACCES': {
|
|
24
|
+
zh: `权限不足: ${filePath}\n 请尝试以管理员身份运行,或检查文件权限`,
|
|
25
|
+
en: `Permission denied: ${filePath}\n Try running as administrator, or check file permissions`
|
|
26
|
+
},
|
|
27
|
+
'EPERM': {
|
|
28
|
+
zh: `操作被拒绝: ${filePath}\n 可能被其他程序占用,请关闭相关程序后重试`,
|
|
29
|
+
en: `Operation not permitted: ${filePath}\n May be in use by another program, close it and retry`
|
|
30
|
+
},
|
|
31
|
+
'ENOSPC': {
|
|
32
|
+
zh: `磁盘空间不足\n 请清理磁盘空间后重试`,
|
|
33
|
+
en: `No space left on device\n Please free up disk space and retry`
|
|
34
|
+
},
|
|
35
|
+
'EBUSY': {
|
|
36
|
+
zh: `资源正忙: ${filePath}\n 文件可能正在被其他程序使用`,
|
|
37
|
+
en: `Resource busy: ${filePath}\n File may be in use by another program`
|
|
38
|
+
},
|
|
39
|
+
'EMFILE': {
|
|
40
|
+
zh: `打开文件过多\n 请关闭一些应用程序后重试`,
|
|
41
|
+
en: `Too many open files\n Please close some applications and retry`
|
|
42
|
+
},
|
|
43
|
+
'EEXIST': {
|
|
44
|
+
zh: `文件已存在: ${filePath}\n 请先删除或重命名现有文件`,
|
|
45
|
+
en: `File already exists: ${filePath}\n Please delete or rename the existing file`
|
|
46
|
+
},
|
|
47
|
+
'EISDIR': {
|
|
48
|
+
zh: `目标是目录而非文件: ${filePath}`,
|
|
49
|
+
en: `Target is a directory, not a file: ${filePath}`
|
|
50
|
+
},
|
|
51
|
+
'ENOTDIR': {
|
|
52
|
+
zh: `目标不是目录: ${filePath}`,
|
|
53
|
+
en: `Target is not a directory: ${filePath}`
|
|
54
|
+
},
|
|
55
|
+
'ENOTEMPTY': {
|
|
56
|
+
zh: `目录不为空: ${filePath}\n 请先清空目录内容`,
|
|
57
|
+
en: `Directory not empty: ${filePath}\n Please empty the directory first`
|
|
58
|
+
},
|
|
59
|
+
'ECONNREFUSED': {
|
|
60
|
+
zh: `连接被拒绝\n 请检查网络连接或服务是否运行`,
|
|
61
|
+
en: `Connection refused\n Please check network connection or if the service is running`
|
|
62
|
+
},
|
|
63
|
+
'ETIMEDOUT': {
|
|
64
|
+
zh: `连接超时\n 请检查网络连接后重试`,
|
|
65
|
+
en: `Connection timed out\n Please check network connection and retry`
|
|
66
|
+
},
|
|
67
|
+
'ENOTFOUND': {
|
|
68
|
+
zh: `无法解析主机名\n 请检查 DNS 设置或网络连接`,
|
|
69
|
+
en: `Host not found\n Please check DNS settings or network connection`
|
|
70
|
+
}
|
|
24
71
|
};
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
27
|
-
return
|
|
72
|
+
const errorInfo = errorMessages[err.code || ''];
|
|
73
|
+
if (errorInfo) {
|
|
74
|
+
return isChinese ? errorInfo.zh : errorInfo.en;
|
|
75
|
+
}
|
|
76
|
+
const helpMessage = isChinese
|
|
77
|
+
? `如需帮助,请访问: ${GITHUB_ISSUES_URL}`
|
|
78
|
+
: `For help, please visit: ${GITHUB_ISSUES_URL}`;
|
|
79
|
+
return `${err.message}\n ${helpMessage}`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 获取带恢复建议的增强错误信息
|
|
83
|
+
*/
|
|
84
|
+
export function getEnhancedError(err, context) {
|
|
85
|
+
const isChinese = isChineseLocale();
|
|
86
|
+
const suggestions = [];
|
|
87
|
+
// 根据错误类型添加恢复建议
|
|
88
|
+
switch (err.code) {
|
|
89
|
+
case 'ENOENT':
|
|
90
|
+
suggestions.push({
|
|
91
|
+
action: isChinese ? '检查路径' : 'Check path',
|
|
92
|
+
command: context.filePath ? `ls -la "${context.filePath}"` : undefined,
|
|
93
|
+
description: isChinese ? '确认文件或目录路径是否正确' : 'Verify the file or directory path is correct'
|
|
94
|
+
});
|
|
95
|
+
if (context.operation === 'install') {
|
|
96
|
+
suggestions.push({
|
|
97
|
+
action: isChinese ? '重新安装' : 'Reinstall',
|
|
98
|
+
command: 'npx claude-pangu install',
|
|
99
|
+
description: isChinese ? '尝试重新运行安装命令' : 'Try running the install command again'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
case 'EACCES':
|
|
104
|
+
case 'EPERM':
|
|
105
|
+
suggestions.push({
|
|
106
|
+
action: isChinese ? '检查权限' : 'Check permissions',
|
|
107
|
+
command: context.filePath ? `ls -la "${context.filePath}"` : undefined,
|
|
108
|
+
description: isChinese ? '查看文件权限设置' : 'View file permission settings'
|
|
109
|
+
});
|
|
110
|
+
if (os.platform() !== 'win32') {
|
|
111
|
+
suggestions.push({
|
|
112
|
+
action: isChinese ? '使用 sudo' : 'Use sudo',
|
|
113
|
+
command: 'sudo npx claude-pangu install',
|
|
114
|
+
description: isChinese ? '以管理员权限运行(谨慎使用)' : 'Run with administrator privileges (use with caution)'
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case 'ENOSPC':
|
|
119
|
+
suggestions.push({
|
|
120
|
+
action: isChinese ? '清理空间' : 'Free space',
|
|
121
|
+
command: os.platform() === 'win32' ? 'cleanmgr' : 'df -h',
|
|
122
|
+
description: isChinese ? '清理磁盘空间后重试' : 'Free up disk space and retry'
|
|
123
|
+
});
|
|
124
|
+
break;
|
|
125
|
+
case 'ECONNREFUSED':
|
|
126
|
+
case 'ETIMEDOUT':
|
|
127
|
+
case 'ENOTFOUND':
|
|
128
|
+
suggestions.push({
|
|
129
|
+
action: isChinese ? '检查网络' : 'Check network',
|
|
130
|
+
command: 'ping github.com',
|
|
131
|
+
description: isChinese ? '确认网络连接正常' : 'Verify network connection is working'
|
|
132
|
+
});
|
|
133
|
+
suggestions.push({
|
|
134
|
+
action: isChinese ? '检查代理' : 'Check proxy',
|
|
135
|
+
description: isChinese ? '如果使用代理,请确认代理设置正确' : 'If using proxy, verify proxy settings are correct'
|
|
136
|
+
});
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
// 添加通用建议
|
|
140
|
+
suggestions.push({
|
|
141
|
+
action: isChinese ? '查看日志' : 'View logs',
|
|
142
|
+
command: `cat ${ERROR_LOG_PATH}`,
|
|
143
|
+
description: isChinese ? '查看详细错误日志' : 'View detailed error logs'
|
|
144
|
+
});
|
|
145
|
+
suggestions.push({
|
|
146
|
+
action: isChinese ? '寻求帮助' : 'Get help',
|
|
147
|
+
description: isChinese ? '在 GitHub Issues 搜索或提交问题' : 'Search or submit issues on GitHub Issues'
|
|
148
|
+
});
|
|
149
|
+
return {
|
|
150
|
+
message: getUserFriendlyError(err, context.filePath || ''),
|
|
151
|
+
code: err.code,
|
|
152
|
+
suggestions,
|
|
153
|
+
helpUrl: GITHUB_ISSUES_URL
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 格式化增强错误信息为可打印字符串
|
|
158
|
+
*/
|
|
159
|
+
export function formatEnhancedError(error) {
|
|
160
|
+
const isChinese = isChineseLocale();
|
|
161
|
+
const lines = [];
|
|
162
|
+
lines.push(`\n❌ ${error.message}\n`);
|
|
163
|
+
if (error.suggestions.length > 0) {
|
|
164
|
+
lines.push(isChinese ? '💡 建议的解决方案:' : '💡 Suggested Solutions:');
|
|
165
|
+
lines.push('');
|
|
166
|
+
error.suggestions.forEach((suggestion, index) => {
|
|
167
|
+
lines.push(` ${index + 1}. ${suggestion.action}`);
|
|
168
|
+
lines.push(` ${suggestion.description}`);
|
|
169
|
+
if (suggestion.command) {
|
|
170
|
+
lines.push(` $ ${suggestion.command}`);
|
|
171
|
+
}
|
|
172
|
+
lines.push('');
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (error.helpUrl) {
|
|
176
|
+
lines.push(isChinese ? `📖 更多帮助: ${error.helpUrl}` : `📖 More help: ${error.helpUrl}`);
|
|
28
177
|
}
|
|
29
|
-
return
|
|
178
|
+
return lines.join('\n');
|
|
30
179
|
}
|
|
31
180
|
// ==================== 脱敏处理 ====================
|
|
32
181
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../lib/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../lib/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook 加载器模块
|
|
3
|
+
* 实现 Hook 配置的懒加载和缓存机制
|
|
4
|
+
*/
|
|
5
|
+
export interface HookDefinition {
|
|
6
|
+
type: 'command';
|
|
7
|
+
command: string;
|
|
8
|
+
timeout: number;
|
|
9
|
+
continueOnError: boolean;
|
|
10
|
+
description: string;
|
|
11
|
+
}
|
|
12
|
+
export interface HooksConfig {
|
|
13
|
+
hooks: {
|
|
14
|
+
Stop?: HookDefinition[];
|
|
15
|
+
UserPromptSubmit?: HookDefinition[];
|
|
16
|
+
PostToolUse?: HookDefinition[];
|
|
17
|
+
};
|
|
18
|
+
disabled_hooks: string[];
|
|
19
|
+
hook_config: {
|
|
20
|
+
parallel_execution: boolean;
|
|
21
|
+
log_enabled: boolean;
|
|
22
|
+
log_path: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface LoadedHook extends HookDefinition {
|
|
26
|
+
name: string;
|
|
27
|
+
event: string;
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
}
|
|
30
|
+
declare class HookLoader {
|
|
31
|
+
private cache;
|
|
32
|
+
private cacheTimestamp;
|
|
33
|
+
private cacheTTL;
|
|
34
|
+
private configPath;
|
|
35
|
+
constructor();
|
|
36
|
+
/**
|
|
37
|
+
* 加载 Hooks 配置(带缓存)
|
|
38
|
+
*/
|
|
39
|
+
loadHooks(): HooksConfig | null;
|
|
40
|
+
/**
|
|
41
|
+
* 获取特定事件的 Hooks
|
|
42
|
+
*/
|
|
43
|
+
getHooksForEvent(event: 'Stop' | 'UserPromptSubmit' | 'PostToolUse'): LoadedHook[];
|
|
44
|
+
/**
|
|
45
|
+
* 获取所有启用的 Hooks
|
|
46
|
+
*/
|
|
47
|
+
getAllEnabledHooks(): LoadedHook[];
|
|
48
|
+
/**
|
|
49
|
+
* 获取 Hook 统计信息
|
|
50
|
+
*/
|
|
51
|
+
getHookStats(): {
|
|
52
|
+
total: number;
|
|
53
|
+
enabled: number;
|
|
54
|
+
disabled: number;
|
|
55
|
+
byEvent: Record<string, number>;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* 检查特定 Hook 是否启用
|
|
59
|
+
*/
|
|
60
|
+
isHookEnabled(hookName: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* 清除缓存
|
|
63
|
+
*/
|
|
64
|
+
clearCache(): void;
|
|
65
|
+
/**
|
|
66
|
+
* 设置缓存 TTL
|
|
67
|
+
*/
|
|
68
|
+
setCacheTTL(ttl: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* 检查缓存是否有效
|
|
71
|
+
*/
|
|
72
|
+
private isCacheValid;
|
|
73
|
+
/**
|
|
74
|
+
* 获取配置路径
|
|
75
|
+
*/
|
|
76
|
+
getConfigPath(): string;
|
|
77
|
+
/**
|
|
78
|
+
* 设置配置路径
|
|
79
|
+
*/
|
|
80
|
+
setConfigPath(configPath: string): void;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 获取默认 Hook 加载器实例
|
|
84
|
+
*/
|
|
85
|
+
export declare function getHookLoader(): HookLoader;
|
|
86
|
+
/**
|
|
87
|
+
* 加载 Hooks 配置
|
|
88
|
+
*/
|
|
89
|
+
export declare function loadHooks(): HooksConfig | null;
|
|
90
|
+
/**
|
|
91
|
+
* 获取特定事件的 Hooks
|
|
92
|
+
*/
|
|
93
|
+
export declare function getHooksForEvent(event: 'Stop' | 'UserPromptSubmit' | 'PostToolUse'): LoadedHook[];
|
|
94
|
+
/**
|
|
95
|
+
* 获取所有启用的 Hooks
|
|
96
|
+
*/
|
|
97
|
+
export declare function getAllEnabledHooks(): LoadedHook[];
|
|
98
|
+
/**
|
|
99
|
+
* 检查 Hook 是否启用
|
|
100
|
+
*/
|
|
101
|
+
export declare function isHookEnabled(hookName: string): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* 获取 Hook 统计信息
|
|
104
|
+
*/
|
|
105
|
+
export declare function getHookStats(): {
|
|
106
|
+
total: number;
|
|
107
|
+
enabled: number;
|
|
108
|
+
disabled: number;
|
|
109
|
+
byEvent: Record<string, number>;
|
|
110
|
+
};
|
|
111
|
+
export default HookLoader;
|
|
112
|
+
//# sourceMappingURL=hook-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-loader.d.ts","sourceRoot":"","sources":["../../lib/hook-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE;QACL,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;QACxB,gBAAgB,CAAC,EAAE,cAAc,EAAE,CAAC;QACpC,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;KAChC,CAAC;IACF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE;QACX,kBAAkB,EAAE,OAAO,CAAC;QAC5B,WAAW,EAAE,OAAO,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,cAAM,UAAU;IACd,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAS;;IAM3B;;OAEG;IACH,SAAS,IAAI,WAAW,GAAG,IAAI;IA2B/B;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,aAAa,GAAG,UAAU,EAAE;IAqBlF;;OAEG;IACH,kBAAkB,IAAI,UAAU,EAAE;IAUlC;;OAEG;IACH,YAAY,IAAI;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC;IAwBD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOxC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAIxC;AAMD;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAID;;GAEG;AACH,wBAAgB,SAAS,IAAI,WAAW,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,aAAa,GAAG,UAAU,EAAE,CAEjG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,EAAE,CAEjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,YAAY;WA5HjB,MAAM;aACJ,MAAM;cACL,MAAM;aACP,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;EA2HlC;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook 加载器模块
|
|
3
|
+
* 实现 Hook 配置的懒加载和缓存机制
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { parseJsonc, isJsoncFile } from './jsonc-parser.js';
|
|
8
|
+
// ==================== Hook 加载器实现 ====================
|
|
9
|
+
class HookLoader {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.cache = null;
|
|
12
|
+
this.cacheTimestamp = 0;
|
|
13
|
+
this.cacheTTL = 30000; // 30秒缓存
|
|
14
|
+
this.configPath = path.join(process.cwd(), 'hooks', 'hooks.json');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 加载 Hooks 配置(带缓存)
|
|
18
|
+
*/
|
|
19
|
+
loadHooks() {
|
|
20
|
+
// 检查缓存是否有效
|
|
21
|
+
if (this.isCacheValid()) {
|
|
22
|
+
return this.cache;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
if (!fs.existsSync(this.configPath)) {
|
|
26
|
+
console.warn(`Hook 配置文件不存在: ${this.configPath}`);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const content = fs.readFileSync(this.configPath, 'utf8');
|
|
30
|
+
const config = isJsoncFile(this.configPath)
|
|
31
|
+
? parseJsonc(content)
|
|
32
|
+
: JSON.parse(content);
|
|
33
|
+
this.cache = config;
|
|
34
|
+
this.cacheTimestamp = Date.now();
|
|
35
|
+
return config;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error('加载 Hook 配置失败:', error);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 获取特定事件的 Hooks
|
|
44
|
+
*/
|
|
45
|
+
getHooksForEvent(event) {
|
|
46
|
+
const config = this.loadHooks();
|
|
47
|
+
if (!config)
|
|
48
|
+
return [];
|
|
49
|
+
const hooks = config.hooks[event] ?? [];
|
|
50
|
+
const disabledHooks = config.disabled_hooks ?? [];
|
|
51
|
+
return hooks.map((hook, index) => {
|
|
52
|
+
// 从命令中提取 hook 名称
|
|
53
|
+
const match = hook.command.match(/hooks\/([^.]+)\.sh/);
|
|
54
|
+
const name = match?.[1] ?? `hook-${index}`;
|
|
55
|
+
return {
|
|
56
|
+
...hook,
|
|
57
|
+
name,
|
|
58
|
+
event,
|
|
59
|
+
enabled: !disabledHooks.includes(name)
|
|
60
|
+
};
|
|
61
|
+
}).filter(hook => hook.enabled);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 获取所有启用的 Hooks
|
|
65
|
+
*/
|
|
66
|
+
getAllEnabledHooks() {
|
|
67
|
+
const events = [
|
|
68
|
+
'Stop',
|
|
69
|
+
'UserPromptSubmit',
|
|
70
|
+
'PostToolUse'
|
|
71
|
+
];
|
|
72
|
+
return events.flatMap(event => this.getHooksForEvent(event));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 获取 Hook 统计信息
|
|
76
|
+
*/
|
|
77
|
+
getHookStats() {
|
|
78
|
+
const config = this.loadHooks();
|
|
79
|
+
if (!config) {
|
|
80
|
+
return { total: 0, enabled: 0, disabled: 0, byEvent: {} };
|
|
81
|
+
}
|
|
82
|
+
const allHooks = this.getAllEnabledHooks();
|
|
83
|
+
const disabledCount = config.disabled_hooks?.length ?? 0;
|
|
84
|
+
const totalCount = allHooks.length + disabledCount;
|
|
85
|
+
const byEvent = {
|
|
86
|
+
Stop: this.getHooksForEvent('Stop').length,
|
|
87
|
+
UserPromptSubmit: this.getHooksForEvent('UserPromptSubmit').length,
|
|
88
|
+
PostToolUse: this.getHooksForEvent('PostToolUse').length
|
|
89
|
+
};
|
|
90
|
+
return {
|
|
91
|
+
total: totalCount,
|
|
92
|
+
enabled: allHooks.length,
|
|
93
|
+
disabled: disabledCount,
|
|
94
|
+
byEvent
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 检查特定 Hook 是否启用
|
|
99
|
+
*/
|
|
100
|
+
isHookEnabled(hookName) {
|
|
101
|
+
const config = this.loadHooks();
|
|
102
|
+
if (!config)
|
|
103
|
+
return false;
|
|
104
|
+
return !config.disabled_hooks?.includes(hookName);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 清除缓存
|
|
108
|
+
*/
|
|
109
|
+
clearCache() {
|
|
110
|
+
this.cache = null;
|
|
111
|
+
this.cacheTimestamp = 0;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 设置缓存 TTL
|
|
115
|
+
*/
|
|
116
|
+
setCacheTTL(ttl) {
|
|
117
|
+
this.cacheTTL = ttl;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 检查缓存是否有效
|
|
121
|
+
*/
|
|
122
|
+
isCacheValid() {
|
|
123
|
+
if (!this.cache)
|
|
124
|
+
return false;
|
|
125
|
+
return Date.now() - this.cacheTimestamp < this.cacheTTL;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 获取配置路径
|
|
129
|
+
*/
|
|
130
|
+
getConfigPath() {
|
|
131
|
+
return this.configPath;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 设置配置路径
|
|
135
|
+
*/
|
|
136
|
+
setConfigPath(configPath) {
|
|
137
|
+
this.configPath = configPath;
|
|
138
|
+
this.clearCache();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// ==================== 单例实例 ====================
|
|
142
|
+
let defaultLoader = null;
|
|
143
|
+
/**
|
|
144
|
+
* 获取默认 Hook 加载器实例
|
|
145
|
+
*/
|
|
146
|
+
export function getHookLoader() {
|
|
147
|
+
if (!defaultLoader) {
|
|
148
|
+
defaultLoader = new HookLoader();
|
|
149
|
+
}
|
|
150
|
+
return defaultLoader;
|
|
151
|
+
}
|
|
152
|
+
// ==================== 便捷函数 ====================
|
|
153
|
+
/**
|
|
154
|
+
* 加载 Hooks 配置
|
|
155
|
+
*/
|
|
156
|
+
export function loadHooks() {
|
|
157
|
+
return getHookLoader().loadHooks();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 获取特定事件的 Hooks
|
|
161
|
+
*/
|
|
162
|
+
export function getHooksForEvent(event) {
|
|
163
|
+
return getHookLoader().getHooksForEvent(event);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 获取所有启用的 Hooks
|
|
167
|
+
*/
|
|
168
|
+
export function getAllEnabledHooks() {
|
|
169
|
+
return getHookLoader().getAllEnabledHooks();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 检查 Hook 是否启用
|
|
173
|
+
*/
|
|
174
|
+
export function isHookEnabled(hookName) {
|
|
175
|
+
return getHookLoader().isHookEnabled(hookName);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* 获取 Hook 统计信息
|
|
179
|
+
*/
|
|
180
|
+
export function getHookStats() {
|
|
181
|
+
return getHookLoader().getHookStats();
|
|
182
|
+
}
|
|
183
|
+
export default HookLoader;
|
|
184
|
+
//# sourceMappingURL=hook-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-loader.js","sourceRoot":"","sources":["../../lib/hook-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/scripts/postinstall.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* postinstall script for oh-my-claude
|
|
5
|
-
* 在 npm install
|
|
5
|
+
* 在 npm install 后显示安装提示和引导
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
// ANSI 颜色代码 (CJS 模块不能导入 ESM logger)
|
|
@@ -12,21 +12,77 @@ const colors = {
|
|
|
12
12
|
green: '\x1b[32m',
|
|
13
13
|
yellow: '\x1b[33m',
|
|
14
14
|
red: '\x1b[31m',
|
|
15
|
-
dim: '\x1b[2m'
|
|
15
|
+
dim: '\x1b[2m',
|
|
16
|
+
bold: '\x1b[1m',
|
|
17
|
+
blue: '\x1b[34m',
|
|
18
|
+
magenta: '\x1b[35m'
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// 检测语言环境
|
|
22
|
+
const isChineseLocale = (process.env.LANG || process.env.LC_ALL || '').toLowerCase().includes('zh');
|
|
23
|
+
|
|
24
|
+
// 双语消息
|
|
25
|
+
const messages = {
|
|
26
|
+
title: isChineseLocale ? '🏔️ oh-my-claude 已下载' : '🏔️ oh-my-claude Downloaded',
|
|
27
|
+
nextSteps: isChineseLocale ? '📋 下一步操作' : '📋 Next Steps',
|
|
28
|
+
installPrompt: isChineseLocale ? '请运行以下命令完成安装:' : 'Run the following command to complete installation:',
|
|
29
|
+
orGlobal: isChineseLocale ? '或者如果你全局安装了:' : 'Or if you installed globally:',
|
|
30
|
+
quickStart: isChineseLocale ? '🚀 快速开始' : '🚀 Quick Start',
|
|
31
|
+
afterInstall: isChineseLocale ? '安装完成后,在 Claude Code 中尝试:' : 'After installation, try in Claude Code:',
|
|
32
|
+
moveMount: isChineseLocale ? '# 愚公移山模式 - 持续执行直到完成' : '# YuGong Mode - Persistent execution until completion',
|
|
33
|
+
strategy: isChineseLocale ? '# 诸葛顾问 - 架构设计建议' : '# ZhuGe Advisor - Architecture design suggestions',
|
|
34
|
+
debug: isChineseLocale ? '# 扁鹊诊断 - Bug 分析与修复' : '# BianQue Diagnosis - Bug analysis and fixes',
|
|
35
|
+
docs: isChineseLocale ? '📖 文档' : '📖 Documentation',
|
|
36
|
+
docsChinese: 'Chinese: https://github.com/ZDragon17/oh-my-claude#readme',
|
|
37
|
+
docsEnglish: 'English: https://github.com/ZDragon17/oh-my-claude/blob/main/README_EN.md',
|
|
38
|
+
features: isChineseLocale ? '✨ 特性' : '✨ Features',
|
|
39
|
+
feature1: isChineseLocale ? '• 20+ 专业化 Agent(基于中国传统文化人物)' : '• 20+ Specialized Agents (based on Chinese cultural figures)',
|
|
40
|
+
feature2: isChineseLocale ? '• 愚公移山模式 - 持续执行直到任务完成' : '• YuGong Mode - Persistent execution until task completion',
|
|
41
|
+
feature3: isChineseLocale ? '• 智能 Hook 系统 - 33+ 内置功能增强' : '• Smart Hook System - 33+ built-in enhancements',
|
|
42
|
+
feature4: isChineseLocale ? '• 内置 MCP 服务器 - Context7, Grep.app 等' : '• Built-in MCP Servers - Context7, Grep.app, etc.',
|
|
43
|
+
needHelp: isChineseLocale ? '❓ 需要帮助?' : '❓ Need Help?',
|
|
44
|
+
issuesLink: 'Issues: https://github.com/ZDragon17/oh-my-claude/issues'
|
|
16
45
|
};
|
|
17
46
|
|
|
18
47
|
console.log(`
|
|
19
|
-
${colors.cyan}
|
|
20
|
-
${colors.cyan}
|
|
21
|
-
${colors.cyan}
|
|
48
|
+
${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
|
|
49
|
+
${colors.bold}${colors.cyan}${messages.title}${colors.reset}
|
|
50
|
+
${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
|
|
22
51
|
|
|
23
|
-
${colors.yellow}
|
|
52
|
+
${colors.yellow}${colors.bold}${messages.nextSteps}${colors.reset}
|
|
53
|
+
${colors.dim}${messages.installPrompt}${colors.reset}
|
|
24
54
|
|
|
25
55
|
${colors.green}npx claude-pangu install${colors.reset}
|
|
26
56
|
|
|
27
|
-
|
|
57
|
+
${colors.dim}${messages.orGlobal}${colors.reset}
|
|
28
58
|
|
|
29
59
|
${colors.green}claude-pangu install${colors.reset}
|
|
30
60
|
|
|
31
|
-
${colors.cyan}
|
|
61
|
+
${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
|
|
62
|
+
|
|
63
|
+
${colors.magenta}${colors.bold}${messages.quickStart}${colors.reset}
|
|
64
|
+
${colors.dim}${messages.afterInstall}${colors.reset}
|
|
65
|
+
|
|
66
|
+
${colors.blue}/yishan ${colors.dim}${messages.moveMount}${colors.reset}
|
|
67
|
+
${colors.blue}/zhuge ${colors.dim}${messages.strategy}${colors.reset}
|
|
68
|
+
${colors.blue}/bianque ${colors.dim}${messages.debug}${colors.reset}
|
|
69
|
+
|
|
70
|
+
${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
|
|
71
|
+
|
|
72
|
+
${colors.green}${colors.bold}${messages.features}${colors.reset}
|
|
73
|
+
${messages.feature1}
|
|
74
|
+
${messages.feature2}
|
|
75
|
+
${messages.feature3}
|
|
76
|
+
${messages.feature4}
|
|
77
|
+
|
|
78
|
+
${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
|
|
79
|
+
|
|
80
|
+
${colors.blue}${colors.bold}${messages.docs}${colors.reset}
|
|
81
|
+
${messages.docsChinese}
|
|
82
|
+
${messages.docsEnglish}
|
|
83
|
+
|
|
84
|
+
${colors.yellow}${colors.bold}${messages.needHelp}${colors.reset}
|
|
85
|
+
${messages.issuesLink}
|
|
86
|
+
|
|
87
|
+
${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
|
|
32
88
|
`);
|
package/commands/huitu.md
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: huitu
|
|
3
|
-
description: |
|
|
4
|
-
召唤绘图多模态分析师 - 图像识别、PDF 解析、视觉内容理解专家。
|
|
5
|
-
别名:/looker, /multimodal, /vision
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# /huitu - 召唤绘图多模态分析师
|
|
9
|
-
|
|
10
|
-
你现在激活了 **绘图模式**。
|
|
11
|
-
|
|
12
|
-
## 核心能力
|
|
13
|
-
|
|
14
|
-
绘图是 oh-my-claude 的多模态分析 Agent,专注于:
|
|
15
|
-
|
|
16
|
-
1. **图像内容分析** - 识别和描述图像内容
|
|
17
|
-
2. **架构图理解** - 从架构图中提取系统设计信息
|
|
18
|
-
3. **PDF 文档解析** - 提取结构化信息
|
|
19
|
-
4. **UI 截图分析** - 理解界面设计和组件结构
|
|
20
|
-
5. **图表数据提取** - 从图表中提取数据和趋势
|
|
21
|
-
|
|
22
|
-
## 使用方式
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
/huitu [图片路径或 PDF 路径] [分析目标]
|
|
26
|
-
|
|
27
|
-
示例:
|
|
28
|
-
/huitu ./docs/architecture.png 分析系统架构
|
|
29
|
-
/huitu ./design/mockup.pdf 提取 UI 组件列表
|
|
30
|
-
/huitu ./screenshots/dashboard.png 分析页面布局和组件
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 工作流程
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
1. 接收视觉内容 → 2. 识别内容类型 → 3. 深度分析 → 4. 结构化输出 → 5. 技术建议
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## 输出示例
|
|
40
|
-
|
|
41
|
-
对于架构图,绘图会输出:
|
|
42
|
-
- 识别的组件清单
|
|
43
|
-
- 组件间的关系图
|
|
44
|
-
- 推测的技术栈
|
|
45
|
-
- 潜在问题和改进建议
|
|
46
|
-
- 代码结构建议
|
|
47
|
-
|
|
48
|
-
## 现在开始
|
|
49
|
-
|
|
50
|
-
请提供需要分析的图片或 PDF 文件路径,以及您希望了解的具体内容。
|
|
51
|
-
|
|
52
|
-
> 外师造化,中得心源。—— 唐·张璪
|