claude-pangu 1.7.2 → 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.
@@ -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,CAoBzF;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
+ {"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': `文件或目录不存在: ${filePath}\n 请检查路径是否正确`,
15
- 'EACCES': `权限不足: ${filePath}\n 请尝试以管理员身份运行,或检查文件权限`,
16
- 'EPERM': `操作被拒绝: ${filePath}\n 可能被其他程序占用,请关闭相关程序后重试`,
17
- 'ENOSPC': `磁盘空间不足\n 请清理磁盘空间后重试`,
18
- 'EBUSY': `资源正忙: ${filePath}\n 文件可能正在被其他程序使用`,
19
- 'EMFILE': `打开文件过多\n 请关闭一些应用程序后重试`,
20
- 'EEXIST': `文件已存在: ${filePath}\n 请先删除或重命名现有文件`,
21
- 'EISDIR': `目标是目录而非文件: ${filePath}`,
22
- 'ENOTDIR': `目标不是目录: ${filePath}`,
23
- 'ENOTEMPTY': `目录不为空: ${filePath}\n 请先清空目录内容`,
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 friendlyMessage = errorMessages[err.code || ''];
26
- if (friendlyMessage) {
27
- return friendlyMessage;
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 `${err.message}\n 如需帮助,请访问: ${GITHUB_ISSUES_URL}`;
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":"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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-pangu",
3
- "version": "1.7.2",
3
+ "version": "1.7.3",
4
4
  "description": "基于中国传统文化的 Claude Code 智能编排插件 - A Claude Code plugin inspired by Chinese traditional culture (原名 oh-my-claude)",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -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}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
20
- ${colors.cyan}🏔️ oh-my-claude 已下载${colors.reset}
21
- ${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
48
+ ${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
49
+ ${colors.bold}${colors.cyan}${messages.title}${colors.reset}
50
+ ${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
22
51
 
23
- ${colors.yellow}请运行以下命令完成安装:${colors.reset}
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}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}
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
  `);