@termdock/twlint 1.0.0 → 1.0.2

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 (55) hide show
  1. package/README.md +176 -63
  2. package/bin/twlint +4 -2
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +63 -12
  6. package/dist/cli.js.map +1 -1
  7. package/dist/core/config-schema.d.ts +1 -0
  8. package/dist/core/config-schema.d.ts.map +1 -1
  9. package/dist/core/config-schema.js +33 -7
  10. package/dist/core/config-schema.js.map +1 -1
  11. package/dist/core/dictionary-loading-strategies.d.ts +45 -0
  12. package/dist/core/dictionary-loading-strategies.d.ts.map +1 -0
  13. package/dist/core/dictionary-loading-strategies.js +75 -0
  14. package/dist/core/dictionary-loading-strategies.js.map +1 -0
  15. package/dist/core/dictionary-manager.d.ts +2 -1
  16. package/dist/core/dictionary-manager.d.ts.map +1 -1
  17. package/dist/core/dictionary-manager.js +51 -16
  18. package/dist/core/dictionary-manager.js.map +1 -1
  19. package/dist/core/linter.d.ts +2 -6
  20. package/dist/core/linter.d.ts.map +1 -1
  21. package/dist/core/linter.js +82 -58
  22. package/dist/core/linter.js.map +1 -1
  23. package/dist/core/lru-cache.d.ts +18 -0
  24. package/dist/core/lru-cache.d.ts.map +1 -0
  25. package/dist/core/lru-cache.js +57 -0
  26. package/dist/core/lru-cache.js.map +1 -0
  27. package/dist/core/matching/match-strategies.d.ts +19 -11
  28. package/dist/core/matching/match-strategies.d.ts.map +1 -1
  29. package/dist/core/matching/match-strategies.js +44 -74
  30. package/dist/core/matching/match-strategies.js.map +1 -1
  31. package/dist/core/rules/mainland-terms.d.ts +3 -1
  32. package/dist/core/rules/mainland-terms.d.ts.map +1 -1
  33. package/dist/core/rules/mainland-terms.js +25 -4
  34. package/dist/core/rules/mainland-terms.js.map +1 -1
  35. package/dist/dictionaries/academic.json +242 -22
  36. package/dist/dictionaries/ai-emerging-tech.json +3209 -0
  37. package/dist/dictionaries/business-finance.json +3449 -0
  38. package/dist/dictionaries/core.json +2902 -248
  39. package/dist/dictionaries/hardware-3c.json +2649 -0
  40. package/dist/dictionaries/index.json +70 -8
  41. package/dist/dictionaries/network-cloud.json +2953 -0
  42. package/dist/dictionaries/operating-system.json +2889 -0
  43. package/dist/dictionaries/social-media.json +2833 -0
  44. package/dist/dictionaries/software-development.json +3809 -0
  45. package/dist/dictionaries/user-interface.json +3225 -0
  46. package/dist/formatters/stylish.d.ts.map +1 -1
  47. package/dist/formatters/stylish.js +5 -15
  48. package/dist/formatters/stylish.js.map +1 -1
  49. package/dist/types.d.ts +20 -8
  50. package/dist/types.d.ts.map +1 -1
  51. package/dist/utils/error-utils.d.ts +9 -0
  52. package/dist/utils/error-utils.d.ts.map +1 -0
  53. package/dist/utils/error-utils.js +15 -0
  54. package/dist/utils/error-utils.js.map +1 -0
  55. package/package.json +5 -5
package/README.md CHANGED
@@ -1,81 +1,141 @@
1
1
  # TWLint
2
2
 
3
- > 檢測簡體中文用語並建議臺灣繁體替代方案的 CLI 工具
3
+ **關於 TWLint **
4
4
 
5
- TWLint 幫助臺灣開發者和內容創作者檢測並修正意外使用的大陸用語,確保文本符合臺灣慣用的表達方式。
5
+ 目前各大 LLM 訓練語料裡面繁體中文資料的比例非常的少,透過 LLM 產生的各種內容會混雜不同版本的中文,TWLint 目的在幫助開發者統一專案中文件中文字,確保使用台灣繁體中文和用語。
6
6
 
7
- ## 特色功能
7
+ ## ✨ 核心特色
8
8
 
9
- - **自動檢測簡體字**:使用 OpenCC 引擎進行簡繁轉換
10
- - **大陸用語檢測**:識別大陸特有用語並提供臺灣替代建議
11
- - **自動修復**:支援 `--fix` 參數自動修正可修復的問題
12
- - **多種輸出格式**:支援 stylish、json 等格式
13
- - **靈活配置**:支援專案級配置檔案
9
+ ### 統一中文用法
10
+ - **簡體字清除**:自動檢測並轉換所有簡體字為繁體字
11
+ - **大陸用語替換**:識別並建議台灣本土用語替代方案
12
+ - **技術詞彙本土化**:軟件→軟體、網絡→網路、用戶→使用者
14
13
 
15
- ## 安裝
14
+ ### 檢索引擎
15
+ - **語境偵測**:根據上下文精確識別同形異義詞
16
+ - **領域專門詞庫**:1,062+ 詞目涵蓋 AI、軟體開發、商業金融等
17
+ - **程式碼檢查**:支援註解、字串、UI 文字等程式碼中的中文內容
16
18
 
17
- ```bash
18
- npm install -g twlint
19
- ```
19
+ ### 🛠️ 開發者友善
20
+ - **ESLint 風格**:預設檢查,`--fix` 修復,完美整合開發流程
21
+ - **遵循 .gitignore**:智慧跳過不需要的檔案和目錄
22
+ - **多種輸出格式**:stylish、json 格式滿足不同需求
23
+ - **npm script 整合**:像使用 ESLint 一樣簡單
20
24
 
21
- ## 快速開始
25
+ ## 🚀 快速開始
22
26
 
23
- ### 基本檢查
27
+ ### 全域安裝
24
28
  ```bash
25
- twlint check README.md
26
- twlint check "src/**/*.md"
29
+ npm install -g @termdock/twlint
27
30
  ```
28
31
 
29
- ### 自動修復
32
+ ### 基本使用
30
33
  ```bash
34
+ # 檢查文件(ESLint 風格:預設只檢查不修復)
35
+ twlint check README.md
36
+ twlint check "docs/**/*.md"
37
+
38
+ # 自動修復(需要明確指定 --fix)
31
39
  twlint check README.md --fix
40
+
41
+ # 檢查程式碼中的中文(註解、字串等)
42
+ twlint check "src/**/*.{js,ts,jsx,tsx,vue}"
43
+
44
+ # 初始化專案配置
45
+ twlint init
32
46
  ```
33
47
 
34
- ### 初始化配置檔案
48
+ ### 整合到專案(推薦)
35
49
  ```bash
50
+ # 1. 初始化配置檔案
36
51
  twlint init
52
+
53
+ # 2. 按提示加入 package.json scripts
54
+ {
55
+ "scripts": {
56
+ "twlint": "twlint check **/*.md **/*.txt",
57
+ "twlint:fix": "twlint check **/*.md **/*.txt --fix",
58
+ "twlint:code": "twlint check 'src/**/*.{js,ts,jsx,tsx,vue}'",
59
+ "twlint:all": "twlint check **/*.md **/*.txt 'src/**/*.{js,ts,jsx,tsx,vue}'"
60
+ }
61
+ }
62
+
63
+ # 3. 簡易的使用方式
64
+ npm run twlint # 檢查文件
65
+ npm run twlint:fix # 檢查並修復文件
66
+ npm run twlint:all # 檢查所有檔案
37
67
  ```
38
68
 
39
- ## 使用範例
69
+ ## Demo
40
70
 
41
- 假設有以下檔案內容(包含大陸用語):
71
+ ### 文件檢查範例
72
+ 假設有以下包含大陸用語的檔案:
42
73
  ```markdown
43
- # 项目介绍
74
+ # 软件开发项目
44
75
  这个软件的质量很好,我们使用了先进的算法。
45
76
  ```
46
77
 
47
- 執行檢查:
78
+ **第一步:檢查問題(ESLint 風格:預設只檢查)**
48
79
  ```bash
49
80
  $ twlint check example.md
50
81
 
51
82
  example.md
52
- 1:3 error 簡體字 '' 建議使用繁體字 '' simplified-chars
53
- 1:4 error 簡體字 '' 建議使用繁體字 '' simplified-chars
54
- 1:5 error 簡體字 '' 建議使用繁體字 '' simplified-chars
55
- 1:6 error 簡體字 '' 建議使用繁體字 '' simplified-chars
56
- 2:1 error 簡體字 '' 建議使用繁體字 '' simplified-chars
57
- 2:2 error 簡體字 '' 建議使用繁體字 '' simplified-chars
58
- 2:3 error 簡體字 '' 建議使用繁體字 '' simplified-chars
59
- 2:4 error 簡體字 '' 建議使用繁體字 '' simplified-chars
60
- 1:3 warning 大陸用語 '項目' 建議使用臺灣用語 '專案' mainland-terms
61
- 2:3 warning 大陸用語 '軟件' 建議使用臺灣用語 '軟體' mainland-terms
62
- 2:7 warning 大陸用語 '質量' 建議使用臺灣用語 '品質' mainland-terms
63
- 2:18 warning 大陸用語 '算法' 建議使用臺灣用語 '演算法' mainland-terms
83
+ 1:3 error 簡體字 '' 建議使用繁體字 '' simplified-chars
84
+ 1:6 error 簡體字 '' 建議使用繁體字 '' simplified-chars
85
+ 1:8 error 簡體字 '' 建議使用繁體字 '' simplified-chars
86
+ 2:1 error 簡體字 '' 建議使用繁體字 '' simplified-chars
87
+ 2:2 error 簡體字 '' 建議使用繁體字 '' simplified-chars
88
+ 1:3 warning 大陸用語 '軟件' 建議使用臺灣用語 '軟體' mainland-terms
89
+ 1:8 warning 大陸用語 '項目' 建議使用臺灣用語 '專案' mainland-terms
90
+ 2:7 warning 大陸用語 '質量' 建議使用臺灣用語 '品質' mainland-terms
91
+ 2:18 ⚠ warning 大陸用語 '算法' 建議使用臺灣用語 '演算法' mainland-terms
64
92
 
65
93
  ✖ 12 problems (8 errors, 4 warnings)
94
+
66
95
  12 problems potentially fixable with the `--fix` option.
67
96
  ```
68
97
 
69
- 自動修復後:
98
+ **第二步:自動修復(明確使用 --fix)**
70
99
  ```bash
71
100
  $ twlint check example.md --fix
72
101
 
73
- Fixed: example.md
102
+ 🎉 Fixed 1 file(s)
103
+
104
+ --- Remaining issues after fix ---
105
+ ✓ No problems found!
106
+ ```
74
107
 
75
- # 專案介紹
108
+ **修復結果:完全台灣本土化**
109
+ ```markdown
110
+ # 軟體開發專案
76
111
  這個軟體的品質很好,我們使用了先進的演算法。
77
112
  ```
78
113
 
114
+ ### 💻 程式碼檢查範例
115
+ 對於程式碼中的註解和字串:
116
+ ```javascript
117
+ /**
118
+ * 这个软件用于处理用户数据
119
+ */
120
+ function processData(data) {
121
+ console.log("网络连接失败");
122
+ throw new Error("文件读取失败");
123
+ }
124
+ ```
125
+
126
+ ```bash
127
+ $ twlint check src/utils.js --fix
128
+
129
+ # 自動修復為台灣用語
130
+ /**
131
+ * 這個軟體用於處理使用者資料
132
+ */
133
+ function processData(data) {
134
+ console.log("網路連線失敗");
135
+ throw new Error("檔案讀取失敗");
136
+ }
137
+ ```
138
+
79
139
  ## 配置
80
140
 
81
141
  ### 專案配置檔案
@@ -88,8 +148,11 @@ export default [
88
148
  // 檢查的檔案類型
89
149
  files: ["**/*.md", "**/*.txt"],
90
150
 
91
- // 使用的詞庫
92
- dictionaries: ["core"],
151
+ // 使用的領域詞庫(新架構)
152
+ domains: ["software-development", "user-interface"],
153
+
154
+ // 或使用舊的詞庫配置(向後相容)
155
+ // dictionaries: ["core", "academic"],
93
156
 
94
157
  // 規則配置
95
158
  rules: {
@@ -106,23 +169,59 @@ export default [
106
169
  twlint check <files...> [options]
107
170
 
108
171
  Options:
109
- --fix 自動修復可修復的問題
172
+ --fix 自動修復可修復的問題(僅安全修復)
110
173
  --format <type> 輸出格式 (stylish, json)
111
- --dict <names...> 指定使用的詞庫
174
+ --domains <names...> 指定使用的領域詞庫(推薦)
175
+ --dict <names...> 指定使用的詞庫(向後相容)
112
176
  --config <path> 配置檔案路徑
113
177
  --verbose 顯示詳細輸出
114
178
  --deep 深度模式(載入所有詞庫)
115
179
  ```
116
180
 
117
- ## 詞庫
181
+ ## 詞庫架構
118
182
 
119
- TWLint 包含以下內建詞庫:
183
+ ### 領域專門詞庫(新架構)
120
184
 
121
- - **core**:核心技術用語(預設載入)
185
+ TWLint 採用領域導向的詞庫架構,提供更精確的用語檢測:
186
+
187
+ | 領域 | 描述 | 詞目數量 |
188
+ |------|------|----------|
189
+ | core | 核心詞庫(必載) | 150 |
190
+ | software-development | 軟體開發 | 139 |
191
+ | user-interface | 使用者介面 | 119 |
192
+ | network-cloud | 網路雲端 | 113 |
193
+ | social-media | 社群媒體 | 106 |
194
+ | operating-system | 作業系統 | 101 |
195
+ | hardware-3c | 硬體3C | 91 |
196
+ | business-finance | 商業金融 | 123 |
197
+ | ai-emerging-tech | AI新興技術 | 108 |
198
+
199
+ ### 配置範例
200
+
201
+ **領域專門配置**(推薦):
202
+ ```bash
203
+ # 軟體開發專案
204
+ twlint check src/ --domains software-development user-interface
205
+
206
+ # 商業文件
207
+ twlint check docs/ --domains business-finance
208
+
209
+ # AI 技術文檔
210
+ twlint check papers/ --domains ai-emerging-tech network-cloud
211
+ ```
212
+
213
+ **深度掃描**(載入所有詞庫):
214
+ ```bash
215
+ twlint check README.md --deep
216
+ ```
217
+
218
+ ### 傳統詞庫(向後相容)
219
+
220
+ 仍支援舊的詞庫配置方式:
221
+ - **core**:核心技術用語
122
222
  - **academic**:學術用語
123
223
  - **extended**:擴充功能用語集
124
224
 
125
- 使用特定詞庫:
126
225
  ```bash
127
226
  twlint check file.md --dict core academic
128
227
  ```
@@ -135,7 +234,7 @@ twlint check file.md --dict core academic
135
234
 
136
235
  ### 本機開發
137
236
  ```bash
138
- git clone https://github.com/username/twlint.git
237
+ git clone https://github.com/HCYT/twlint.git
139
238
  cd twlint
140
239
  npm install
141
240
  npm run build
@@ -153,33 +252,47 @@ npm run dict:validate
153
252
  ### simplified-chars
154
253
  檢測簡體字並自動轉換為繁體字。
155
254
  - **嚴重度**:error
156
- - **可修復**:是
255
+ - **可修復**:是(完全自動)
157
256
 
158
257
  ### mainland-terms
159
258
  檢測大陸特有用語並建議臺灣慣用詞彙。
160
- - **嚴重度**:warning
161
- - **可修復**:部分
259
+ - **嚴重度**:warning(安全修復)/ info(需人工判斷)
260
+ - **可修復**:智慧分級修復
162
261
 
163
- ## 授權
262
+ ## 進階功能
164
263
 
165
- Apache License 2.0
264
+ ### 語境感知檢測
166
265
 
167
- 詳見 [LICENSE](LICENSE) 檔案。
266
+ TWLint 支援根據上下文精確檢測同形異義詞:
168
267
 
169
- ## 商標
268
+ ```javascript
269
+ // 範例:「質量」的語境檢測
270
+ {
271
+ taiwan: "品質", // 商業語境下的建議
272
+ china_simplified: "质量",
273
+ match_type: "context_sensitive",
274
+ context: {
275
+ before: ["產品", "服務", "商品"],
276
+ after: ["控制", "管理", "標準"],
277
+ exclude: ["物理"] // 排除物理學語境
278
+ }
279
+ }
280
+ ```
170
281
 
171
- "TWLint" 名稱和標誌為本專案商標。使用前請參閱 [商標使用指南](TRADEMARK.md)。
282
+ ### 自動修復分級
172
283
 
173
- ## 貢獻
284
+ - **安全修復**(`autofix_safe: true`):確定無誤的用詞替換
285
+ - 例:「軟件」→「軟體」、「網絡」→「網路」
286
+ - 自動執行 `--fix` 時會修復
174
287
 
175
- 歡迎提交 Pull Request 或回報問題!
288
+ - **建議修復**(`autofix_safe: false`):需人工確認的替換
289
+ - 例:語境敏感詞、專業術語
290
+ - 僅提供建議,不會自動修復
176
291
 
177
- 1. Fork 本專案
178
- 2. 建立功能分支 (`git checkout -b feature/amazing-feature`)
179
- 3. 提交變更 (`git commit -m 'Add amazing feature'`)
180
- 4. 推送到分支 (`git push origin feature/amazing-feature`)
181
- 5. 開啟 Pull Request
292
+ ## 授權
182
293
 
183
- ---
294
+ Apache License 2.0
295
+
296
+ 詳見 [LICENSE](LICENSE) 檔案。
184
297
 
185
- **讓我們一起維護臺灣中文的純正性!**
298
+ **讓我們一起維護臺灣繁體中文的純正性!**
package/bin/twlint CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import('../dist/cli.js').catch(err => {
4
- console.error('Failed to load TWLint:', err.message);
3
+ import('../dist/cli.js').then(module => {
4
+ return module.main();
5
+ }).catch(err => {
6
+ console.error('Failed to run TWLint:', err.message);
5
7
  process.exit(1);
6
8
  });
package/dist/cli.d.ts CHANGED
@@ -7,4 +7,6 @@ export interface CLIOptions {
7
7
  config?: string;
8
8
  verbose?: boolean;
9
9
  }
10
+ declare function main(): Promise<void>;
11
+ export { main };
10
12
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAWA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAYA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AA2ID,iBAAe,IAAI,kBA4DlB;AAGD,OAAO,EAAE,IAAI,EAAE,CAAA"}
package/dist/cli.js CHANGED
@@ -1,13 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
3
  import chalk from 'chalk';
4
- import { writeFile, access } from 'fs/promises';
4
+ import { writeFile, access, readFile } from 'fs/promises';
5
5
  import { TWLinter } from './core/linter.js';
6
6
  import { loadConfig } from './core/config-loader.js';
7
7
  import { createSampleConfig } from './core/config-schema.js';
8
8
  import { StylishFormatter } from './formatters/stylish.js';
9
9
  import { JsonFormatter } from './formatters/json.js';
10
+ import { formatError } from './utils/error-utils.js';
10
11
  async function performCheck(linter, files, options) {
12
+ // 檢查是否找到任何檔案
13
+ if (files.length === 0) {
14
+ console.error(chalk.red('✖ No files found matching the pattern.'));
15
+ process.exit(1);
16
+ }
11
17
  const results = await linter.lintFiles(files);
12
18
  const formatter = options.format === 'json'
13
19
  ? new JsonFormatter()
@@ -15,9 +21,22 @@ async function performCheck(linter, files, options) {
15
21
  const output = formatter.format(results);
16
22
  console.log(output);
17
23
  const errorCount = results.reduce((sum, result) => sum + result.messages.filter(msg => msg.severity === 'error').length, 0);
18
- if (errorCount > 0) {
24
+ const warningCount = results.reduce((sum, result) => sum + result.messages.filter(msg => msg.severity === 'warning').length, 0);
25
+ const fixableCount = results.reduce((sum, result) => sum + result.messages.filter(msg => msg.fixable !== false).length, 0);
26
+ // 檢查是否所有檔案都載入失敗
27
+ const fileReadErrors = results.filter(result => result.messages.some(msg => msg.rule === 'file-read-error'));
28
+ if (fileReadErrors.length === results.length && results.length > 0) {
29
+ // 在顯示詳細錯誤後,再顯示匯總錯誤訊息
30
+ console.error(chalk.red('✖ Failed to read any of the specified files.'));
19
31
  process.exit(1);
20
32
  }
33
+ // ESLint 風格的修復提示(僅在非 JSON 格式時顯示)
34
+ if (errorCount > 0 || warningCount > 0) {
35
+ if (fixableCount > 0 && options.format !== 'json') {
36
+ console.log(chalk.yellow(`\n ${fixableCount} problem${fixableCount === 1 ? '' : 's'} potentially fixable with the \`--fix\` option.`));
37
+ }
38
+ process.exit(errorCount > 0 ? 1 : 0);
39
+ }
21
40
  }
22
41
  async function performAutoFix(linter, files, options) {
23
42
  const { readFile } = await import('fs/promises');
@@ -38,8 +57,7 @@ async function performAutoFix(linter, files, options) {
38
57
  }
39
58
  }
40
59
  catch (error) {
41
- const message = error instanceof Error ? error.message : String(error);
42
- console.error(chalk.red(`✗ Error fixing ${filePath}:`), message);
60
+ console.error(chalk.red(`✗ Error fixing ${filePath}:`), formatError(error));
43
61
  }
44
62
  }
45
63
  console.log(chalk.green(`\n🎉 Fixed ${totalFixed} file(s)`));
@@ -67,17 +85,51 @@ async function performInit(force) {
67
85
  const configContent = createSampleConfig();
68
86
  await writeFile(configFile, configContent, 'utf-8');
69
87
  console.log(chalk.green(`✅ Created ${configFile}`));
70
- console.log(chalk.dim('\nNext steps:'));
88
+ // 檢查是否有 package.json,提供 npm script 整合建議
89
+ try {
90
+ await access('package.json');
91
+ console.log(chalk.dim('\n📦 Detected package.json - Add these scripts for better integration:'));
92
+ console.log(chalk.cyan(`
93
+ {
94
+ "scripts": {
95
+ "twlint": "twlint check **/*.md **/*.txt",
96
+ "twlint:fix": "twlint check **/*.md **/*.txt --fix",
97
+ "twlint:code": "twlint check 'src/**/*.{js,ts,jsx,tsx,vue}'",
98
+ "twlint:all": "twlint check **/*.md **/*.txt 'src/**/*.{js,ts,jsx,tsx,vue}'",
99
+ "twlint:all:fix": "twlint check **/*.md **/*.txt 'src/**/*.{js,ts,jsx,tsx,vue}' --fix"
100
+ }
101
+ }`));
102
+ console.log(chalk.dim('Then run:'));
103
+ console.log(chalk.dim('• npm run twlint # 檢查文件'));
104
+ console.log(chalk.dim('• npm run twlint:fix # 檢查並修復文件'));
105
+ console.log(chalk.dim('• npm run twlint:code # 檢查程式碼中的中文'));
106
+ console.log(chalk.dim('• npm run twlint:all # 檢查所有檔案'));
107
+ console.log(chalk.dim('• npm run twlint:all:fix # 檢查並修復所有檔案'));
108
+ }
109
+ catch {
110
+ // 沒有 package.json,顯示一般指引
111
+ }
112
+ console.log(chalk.dim('\n🚀 Next steps:'));
71
113
  console.log(chalk.dim('1. Customize the configuration to fit your needs'));
72
114
  console.log(chalk.dim('2. Run: twlint check **/*.md'));
73
115
  console.log(chalk.dim('3. Use --fix to automatically fix issues'));
74
116
  }
117
+ async function getVersion() {
118
+ try {
119
+ const packageJsonPath = new URL('../package.json', import.meta.url).pathname;
120
+ const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
121
+ return packageJson.version;
122
+ }
123
+ catch {
124
+ return '1.0.0'; // fallback
125
+ }
126
+ }
75
127
  async function main() {
76
128
  const program = new Command();
77
129
  program
78
130
  .name('twlint')
79
131
  .description('A CLI tool for detecting simplified Chinese terms and suggesting Taiwan traditional alternatives')
80
- .version('1.0.0');
132
+ .version(await getVersion());
81
133
  program
82
134
  .command('check')
83
135
  .description('Check files for Chinese term issues')
@@ -109,8 +161,7 @@ async function main() {
109
161
  }
110
162
  }
111
163
  catch (error) {
112
- const message = error instanceof Error ? error.message : String(error);
113
- console.error(chalk.red('Error:'), message);
164
+ console.error(chalk.red('Error:'), formatError(error));
114
165
  process.exit(1);
115
166
  }
116
167
  });
@@ -123,19 +174,19 @@ async function main() {
123
174
  await performInit(options.force);
124
175
  }
125
176
  catch (error) {
126
- const message = error instanceof Error ? error.message : String(error);
127
- console.error(chalk.red('Error:'), message);
177
+ console.error(chalk.red('Error:'), formatError(error));
128
178
  process.exit(1);
129
179
  }
130
180
  });
131
181
  await program.parseAsync();
132
182
  }
183
+ // 導出 main 函數供 bin script 使用
184
+ export { main };
133
185
  // 當作為主模組執行時啟動 CLI
134
186
  if (import.meta.url === `file://${process.argv[1]}` ||
135
187
  process.argv[1]?.endsWith('cli.js')) {
136
188
  main().catch(error => {
137
- const message = error instanceof Error ? error.message : String(error);
138
- console.error(chalk.red('Fatal error:'), message);
189
+ console.error(chalk.red('Fatal error:'), formatError(error));
139
190
  process.exit(1);
140
191
  });
141
192
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAWpD,KAAK,UAAU,YAAY,CAAC,MAAgB,EAAE,KAAe,EAAE,OAAmB;IAChF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM;QACzC,CAAC,CAAC,IAAI,aAAa,EAAE;QACrB,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAA;IAE1B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAEnB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAChD,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAE1E,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAgB,EAAE,KAAe,EAAE,OAAmB;IAClF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IAChD,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACzD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;YAE1D,IAAI,eAAe,KAAK,YAAY,EAAE,CAAC;gBACrC,MAAM,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;gBAChD,UAAU,EAAE,CAAA;gBAEZ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAA;gBAClD,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,UAAU,UAAU,CAAC,CAAC,CAAA;IAE5D,iBAAiB;IACjB,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAA;QAC9D,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAe;IACxC,MAAM,UAAU,GAAG,kBAAkB,CAAA;IAErC,cAAc;IACd,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,UAAU,kBAAkB,CAAC,CAAC,CAAA;YACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAA;YACtD,OAAM;QACR,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IAED,SAAS;IACT,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;IAC1C,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;IAEnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAA;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,kGAAkG,CAAC;SAC/G,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnB,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,YAAY,EAAE,4BAA4B,CAAC;SACpD,MAAM,CAAC,OAAO,EAAE,yCAAyC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,4CAA4C,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,SAAS,CAAC;SACrE,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,OAAmB,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAE/C,6BAA6B;YAC7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAA;YACpC,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;YAE3D,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAA;YACrF,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,SAAS;gBACT,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO;gBACP,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;AAC5B,CAAC;AAED,kBAAkB;AAClB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACnB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAA;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAWpD,KAAK,UAAU,YAAY,CAAC,MAAgB,EAAE,KAAe,EAAE,OAAmB;IAChF,aAAa;IACb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAA;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM;QACzC,CAAC,CAAC,IAAI,aAAa,EAAE;QACrB,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAA;IAE1B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAEnB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAChD,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAClD,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC5E,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAClD,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAEvE,gBAAgB;IAChB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAC5D,CAAA;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,qBAAqB;QACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAA;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,YAAY,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,YAAY,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,iDAAiD,CAAC,CAAC,CAAA;QACzI,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAgB,EAAE,KAAe,EAAE,OAAmB;IAClF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IAChD,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACzD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;YAE1D,IAAI,eAAe,KAAK,YAAY,EAAE,CAAC;gBACrC,MAAM,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;gBAChD,UAAU,EAAE,CAAA;gBAEZ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAA;gBAClD,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,QAAQ,GAAG,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QAC7E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,UAAU,UAAU,CAAC,CAAC,CAAA;IAE5D,iBAAiB;IACjB,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAA;QAC9D,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAe;IACxC,MAAM,UAAU,GAAG,kBAAkB,CAAA;IAErC,cAAc;IACd,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,UAAU,kBAAkB,CAAC,CAAC,CAAA;YACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAA;YACtD,OAAM;QACR,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IAED,SAAS;IACT,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAA;IAC1C,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;IAEnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC,CAAA;IAEnD,wCAAwC;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC,CAAA;QAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;;;;;;;;EASzB,CAAC,CAAC,CAAA;QACA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAA;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;QAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;QACxE,OAAO,WAAW,CAAC,OAAO,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAA,CAAC,WAAW;IAC5B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,kGAAkG,CAAC;SAC/G,OAAO,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;IAE9B,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,YAAY,EAAE,4BAA4B,CAAC;SACpD,MAAM,CAAC,OAAO,EAAE,yCAAyC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,4CAA4C,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,SAAS,CAAC;SACrE,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,OAAmB,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAE/C,6BAA6B;YAC7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAA;YACpC,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;YAE3D,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAA;YACrF,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,SAAS;gBACT,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO;gBACP,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;AAC5B,CAAC;AAED,4BAA4B;AAC5B,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,kBAAkB;AAClB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export interface TWLintConfigRule {
2
2
  files?: string[];
3
3
  dictionaries?: string[];
4
+ domains?: string[];
4
5
  rules?: Record<string, 'error' | 'warning' | 'info' | 'off'>;
5
6
  }
6
7
  export type TWLintConfigArray = TWLintConfigRule[];
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,CAAA;CAC7D;AAED,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,EAAE,CAAA;AAClD,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAA;AAGjD,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,iBAAiB,CAAA;AAErE,eAAO,MAAM,cAAc,EAAE,kBAO5B,CAAA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB,CAYlE;AA4BD,wBAAgB,kBAAkB,IAAI,MAAM,CAuB3C"}
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,CAAA;CAC7D;AAED,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,EAAE,CAAA;AAClD,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAA;AAGjD,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,iBAAiB,CAAA;AAErE,eAAO,MAAM,cAAc,EAAE,kBAO5B,CAAA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB,CAYlE;AA6BD,wBAAgB,kBAAkB,IAAI,MAAM,CAgD3C"}
@@ -31,6 +31,7 @@ function mergeConfig(defaultConfig, userConfig) {
31
31
  return {
32
32
  files: userConfig.files || defaultConfig.files,
33
33
  dictionaries: userConfig.dictionaries || defaultConfig.dictionaries,
34
+ domains: userConfig.domains || defaultConfig.domains, // 保留 domains 配置
34
35
  rules: {
35
36
  ...defaultConfig.rules,
36
37
  ...userConfig.rules
@@ -43,22 +44,47 @@ export function createSampleConfig() {
43
44
 
44
45
  export default [
45
46
  {
46
- // 檢查的檔案類型
47
+ // 文件檔案:完整檢查
47
48
  files: ["**/*.md", "**/*.txt"],
48
-
49
- // 使用的詞庫
50
- dictionaries: ["core"],
51
-
52
- // 規則配置
49
+ domains: ["software-development", "user-interface"],
53
50
  rules: {
54
51
  "simplified-chars": "error", // 簡體字檢測(自動修復)
55
52
  "mainland-terms": "warning" // 大陸用語檢測(提供建議)
56
53
  }
54
+ },
55
+ {
56
+ // 程式碼檔案:檢查註解和字串內容
57
+ files: ["src/**/*.{js,ts,jsx,tsx,vue}"],
58
+ domains: ["software-development", "user-interface"],
59
+ rules: {
60
+ "simplified-chars": "error", // 註解中的簡體字必須修復
61
+ "mainland-terms": "warning" // UI 文字中的大陸用語提醒
62
+ }
63
+ },
64
+ {
65
+ // 商業文件:更嚴格的檢查
66
+ files: ["docs/business/**/*.md"],
67
+ domains: ["business-finance"],
68
+ rules: {
69
+ "simplified-chars": "error",
70
+ "mainland-terms": "error" // 商業文件更嚴格
71
+ }
57
72
  }
58
73
  ]
59
74
 
60
75
  // 使用方式:
61
76
  // twlint check **/*.md // 檢查檔案
62
- // twlint check **/*.md --fix // 自動修復`;
77
+ // twlint check **/*.md --fix // 自動修復
78
+ // twlint check src/ --domains software-development // 指定領域
79
+
80
+ // 推薦 npm script 整合 (加入 package.json):
81
+ // {
82
+ // "scripts": {
83
+ // "twlint": "twlint check **/*.md",
84
+ // "twlint:fix": "twlint check **/*.md --fix",
85
+ // "twlint:docs": "twlint check docs/**/*.md --fix"
86
+ // }
87
+ // }
88
+ // 然後執行: npm run twlint`;
63
89
  }
64
90
  //# sourceMappingURL=config-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"AAAA,qBAAqB;AAcrB,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC9B,YAAY,EAAE,CAAC,MAAM,CAAC;IACtB,KAAK,EAAE;QACL,kBAAkB,EAAE,OAAO;QAC3B,gBAAgB,EAAE,SAAS;KAC5B;CACF,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,eAAe;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED,SAAS;IACT,OAAO,WAAW,CAAC,cAAc,EAAE,MAAqC,CAAC,CAAA;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,OAAkB;IACtC,IAAI,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,CAAA;IAElC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAqC,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,WAAW,CAClB,aAAiC,EACjC,UAAuC;IAEvC,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK;QAC9C,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,aAAa,CAAC,YAAY;QACnE,KAAK,EAAE;YACL,GAAG,aAAa,CAAC,KAAK;YACtB,GAAG,UAAU,CAAC,KAAK;SACpB;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;+CAqBsC,CAAA;AAC/C,CAAC"}
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/core/config-schema.ts"],"names":[],"mappings":"AAAA,qBAAqB;AAerB,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC9B,YAAY,EAAE,CAAC,MAAM,CAAC;IACtB,KAAK,EAAE;QACL,kBAAkB,EAAE,OAAO;QAC3B,gBAAgB,EAAE,SAAS;KAC5B;CACF,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,eAAe;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED,SAAS;IACT,OAAO,WAAW,CAAC,cAAc,EAAE,MAAqC,CAAC,CAAA;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,OAAkB;IACtC,IAAI,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,CAAA;IAElC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAqC,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,WAAW,CAClB,aAAiC,EACjC,UAAuC;IAEvC,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK;QAC9C,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,aAAa,CAAC,YAAY;QACnE,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,EAAG,gBAAgB;QACvE,KAAK,EAAE;YACL,GAAG,aAAa,CAAC,KAAK;YACtB,GAAG,UAAU,CAAC,KAAK;SACpB;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA8Ce,CAAA;AACxB,CAAC"}