@eevee-ta/cli 0.1.0-beta.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +195 -119
  2. package/assets/skills/eevee-integration/SKILL.md +46 -0
  3. package/assets/skills/eevee-integration/agents/openai.yaml +3 -0
  4. package/assets/skills/eevee-integration/references/intake.md +87 -0
  5. package/assets/skills/eevee-integration/references/java-springboot.md +182 -0
  6. package/assets/skills/eevee-integration/references/umijs.md +210 -0
  7. package/assets/skills/eevee-mcp/SKILL.md +87 -3
  8. package/assets/skills/eevee-mcp/reference.md +31 -2
  9. package/dist/src/bin/cli.js +66 -27
  10. package/dist/src/bin/cli.js.map +1 -1
  11. package/dist/src/commands/business-command.js +9 -4
  12. package/dist/src/commands/business-command.js.map +1 -1
  13. package/dist/src/commands/i18n-command.js +194 -0
  14. package/dist/src/commands/i18n-command.js.map +1 -0
  15. package/dist/src/commands/skill-command.js +80 -29
  16. package/dist/src/commands/skill-command.js.map +1 -1
  17. package/dist/src/lib/business-catalog.js +24 -20
  18. package/dist/src/lib/business-catalog.js.map +1 -1
  19. package/dist/src/lib/config.js +1 -1
  20. package/dist/src/lib/config.js.map +1 -1
  21. package/dist/src/lib/http.js +95 -0
  22. package/dist/src/lib/http.js.map +1 -0
  23. package/dist/src/lib/i18n-exporter.js +402 -0
  24. package/dist/src/lib/i18n-exporter.js.map +1 -0
  25. package/dist/src/lib/i18n-scanner.js +1172 -0
  26. package/dist/src/lib/i18n-scanner.js.map +1 -0
  27. package/dist/src/lib/mcp-client.js +5 -4
  28. package/dist/src/lib/mcp-client.js.map +1 -1
  29. package/dist/src/lib/skill-installer.js +140 -42
  30. package/dist/src/lib/skill-installer.js.map +1 -1
  31. package/dist/src/lib/updater.js +129 -0
  32. package/dist/src/lib/updater.js.map +1 -0
  33. package/dist/src/lib/version.js +55 -0
  34. package/dist/src/lib/version.js.map +1 -0
  35. package/install.sh +203 -0
  36. package/package.json +9 -9
  37. package/scripts/postinstall.mjs +31 -0
  38. package/assets/skills/eevee-migration/SKILL.md +0 -181
  39. package/assets/skills/eevee-project-setup/SKILL.md +0 -266
  40. package/dist/src/commands/intl-command.js +0 -131
  41. package/dist/src/commands/intl-command.js.map +0 -1
  42. package/dist/src/commands/lint-command.js +0 -105
  43. package/dist/src/commands/lint-command.js.map +0 -1
  44. package/dist/src/lib/intl-catalog.js +0 -58
  45. package/dist/src/lib/intl-catalog.js.map +0 -1
  46. package/dist/src/lib/intl-config.js +0 -125
  47. package/dist/src/lib/intl-config.js.map +0 -1
  48. package/dist/src/lib/intl-downloader.js +0 -217
  49. package/dist/src/lib/intl-downloader.js.map +0 -1
  50. package/dist/src/lib/intl-serializers/csv.js +0 -25
  51. package/dist/src/lib/intl-serializers/csv.js.map +0 -1
  52. package/dist/src/lib/intl-serializers/custom.js +0 -23
  53. package/dist/src/lib/intl-serializers/custom.js.map +0 -1
  54. package/dist/src/lib/intl-serializers/index.js +0 -22
  55. package/dist/src/lib/intl-serializers/index.js.map +0 -1
  56. package/dist/src/lib/intl-serializers/js.js +0 -10
  57. package/dist/src/lib/intl-serializers/js.js.map +0 -1
  58. package/dist/src/lib/intl-serializers/json.js +0 -7
  59. package/dist/src/lib/intl-serializers/json.js.map +0 -1
  60. package/dist/src/lib/intl-serializers/properties.js +0 -43
  61. package/dist/src/lib/intl-serializers/properties.js.map +0 -1
  62. package/dist/src/lib/intl-serializers/ts.js +0 -16
  63. package/dist/src/lib/intl-serializers/ts.js.map +0 -1
  64. package/dist/src/lib/intl-serializers/xml.js +0 -21
  65. package/dist/src/lib/intl-serializers/xml.js.map +0 -1
  66. package/dist/src/lib/lint-config.js +0 -180
  67. package/dist/src/lib/lint-config.js.map +0 -1
  68. package/dist/src/lib/lint-java.js +0 -226
  69. package/dist/src/lib/lint-java.js.map +0 -1
  70. package/dist/src/lib/lint-types.js +0 -2
  71. package/dist/src/lib/lint-types.js.map +0 -1
  72. package/dist/src/lib/lint-web.js +0 -183
  73. package/dist/src/lib/lint-web.js.map +0 -1
  74. package/dist/src/lib/lint.js +0 -192
  75. package/dist/src/lib/lint.js.map +0 -1
@@ -1,266 +0,0 @@
1
- ---
2
- name: eevee-project-setup
3
- description: Guide configuring a frontend or Java backend project to use @eevee/cli for term sync (intl download) and lint (missing-key / hardcoded-text detection). Covers web and Java adapters, file layout, and step-by-step initialization.
4
- ---
5
-
6
- # eevee 项目接入技能
7
-
8
- 当需要让一个代码仓库通过 `@eevee/cli` 实现**词条同步**和**国际化检查**时使用此技能。
9
- 核心原则:**所有词条数据通过 API 拉取,配置文件提交到仓库,token 不入 Git**。
10
-
11
- ## 前置条件
12
-
13
- ```bash
14
- eevee config set --url http://127.0.0.1:10001/mcp
15
- eevee config set --token <your-user-token>
16
- eevee ping
17
- ```
18
-
19
- 确认项目 ID 和版本 ID:
20
-
21
- ```bash
22
- eevee project list
23
- eevee intl versions --project <projectId>
24
- ```
25
-
26
- ## 通用流程
27
-
28
- 1. 确认项目类型(前端 web / 后端 java)
29
- 2. 创建 `.eevee/` 目录存放同步配置
30
- 3. 创建 `.eevee-lint.json`(Java)或在 `package.json` 配置 `eevee.lint`(web)
31
- 4. 运行 `eevee intl download --dry-run` 验证
32
- 5. 运行 `eevee lint` 验证
33
- 6. 把快照目录加入 `.gitignore`(快照不入 Git)
34
-
35
- ---
36
-
37
- ## 前端项目(web adapter)
38
-
39
- 前端项目有 `package.json`,配置写入 `eevee` 字段或独立 `.eevee-lint.json`。
40
-
41
- ### package.json
42
-
43
- ```jsonc
44
- {
45
- "eevee": {
46
- "intl": "intl.download.json",
47
- "lint": {
48
- "refresh": {
49
- "config": "intl.download.json"
50
- },
51
- "languages": {
52
- "web": {
53
- "enabled": true,
54
- "root": ".",
55
- "intlConfig": "intl.json",
56
- "includes": ["src/**/*.{ts,tsx,js,jsx}"],
57
- "excludes": ["**/*.test.*", "**/mock/**", "**/node_modules/**"],
58
- "excludeAscii": true,
59
- "tagMatchMap": {
60
- "src/**/*": ["<project-tag>"]
61
- },
62
- "excludeProperties": ["title", "description"],
63
- "excludeTrack": true
64
- }
65
- }
66
- }
67
- }
68
- }
69
- ```
70
-
71
- ### intl.download.json
72
-
73
- ```json
74
- [
75
- {
76
- "outPath": ".eevee/locales",
77
- "format": "json",
78
- "splitByTag": false,
79
- "languages": {
80
- "zh-CN": "zh-CN-<tag-name>"
81
- },
82
- "projects": [
83
- { "projectId": 1, "tags": [123] }
84
- ]
85
- }
86
- ]
87
- ```
88
-
89
- ### intl.json(lint 数据源)
90
-
91
- ```json
92
- {
93
- "outPaths": [
94
- { "path": ".eevee/locales" }
95
- ]
96
- }
97
- ```
98
-
99
- ### 运行
100
-
101
- ```bash
102
- eevee lint --staged
103
- eevee lint --language web
104
- ```
105
-
106
- ---
107
-
108
- ## 后端项目(Java adapter)
109
-
110
- Java 项目(如 Spring Boot)通常没有 `package.json`,推荐在仓库根目录放 `.eevee-lint.json`,
111
- 同步配置放 `.eevee/` 目录。
112
-
113
- ### 目录结构
114
-
115
- ```
116
- project-root/
117
- ├── .eevee/
118
- │ ├── sync.json ← 运行时 properties 全量生成
119
- │ ├── download.json ← lint 用 JSON 快照
120
- │ ├── intl.json ← lint 数据源声明
121
- │ └── README.md
122
- ├── .eevee-lint.json ← lint 规则
123
- └── .gitignore ← 忽略 .eevee/locales/
124
- ```
125
-
126
- ### .eevee-lint.json
127
-
128
- ```json
129
- {
130
- "refresh": {
131
- "config": ".eevee/download.json"
132
- },
133
- "languages": {
134
- "web": { "enabled": false },
135
- "java": {
136
- "enabled": true,
137
- "root": ".",
138
- "intlConfig": ".eevee/intl.json",
139
- "includes": ["*/src/main/java/**/*.java"],
140
- "excludes": ["**/src/test/**", "**/generated/**", "**/target/**"],
141
- "tagMatchMap": {
142
- "*/src/main/java/**/*": ["<tag-name>"]
143
- },
144
- "localeMethods": ["getLocaleMessage", "tryLocaleMessage", "getMessage"],
145
- "checkHardcoded": true,
146
- "excludeMethods": ["trace", "debug", "info", "warn", "error"]
147
- }
148
- }
149
- }
150
- ```
151
-
152
- ### .eevee/download.json(lint 快照)
153
-
154
- ```json
155
- [
156
- {
157
- "outPath": "locales",
158
- "format": "json",
159
- "splitByTag": false,
160
- "languages": {
161
- "zh-CN": "zh-CN-<tag-name>"
162
- },
163
- "projects": [
164
- { "projectId": 3, "versions": [2, 29, 30, 31] }
165
- ]
166
- }
167
- ]
168
- ```
169
-
170
- ### .eevee/intl.json
171
-
172
- ```json
173
- {
174
- "outPaths": [
175
- { "path": "locales" }
176
- ]
177
- }
178
- ```
179
-
180
- > `outPaths` 相对于 `.eevee/intl.json` 自身目录解析,所以 `"locales"` 指向 `.eevee/locales/`。
181
-
182
- ### .eevee/sync.json(运行时 properties 全量生成)
183
-
184
- ```json
185
- [
186
- {
187
- "outPath": "<module>/src/main/resources/static/i18n",
188
- "format": "properties",
189
- "splitByTag": false,
190
- "languages": {
191
- "zh-CN": "messages_zh_CN",
192
- "en-US": "messages_en_US",
193
- "ja-JP": "messages_ja_JP",
194
- "ko-KR": "messages_ko_KR"
195
- },
196
- "projects": [
197
- {
198
- "projectId": 3,
199
- "versions": [2, 29, 30, 31],
200
- "tags": []
201
- }
202
- ],
203
- "options": {
204
- "properties": { "escape": "none" }
205
- }
206
- }
207
- ]
208
- ```
209
-
210
- 关键点:
211
-
212
- - `tags: []` 表示不做标签过滤,项目级全量拉取(适用于没有平台标签的后端项目)
213
- - 语言映射的 value 是文件名前缀(不含 `.properties`),直接生成 `messages_zh_CN.properties`
214
- - `escape: "none"` 保持 UTF-8 原文,与 Spring Boot `MessageSource` 兼容
215
- - `outPath` 相对于 `.eevee/` 目录解析,`../` 可以跳出回到仓库根
216
-
217
- ### .gitignore 追加
218
-
219
- ```gitignore
220
- # eevee lint 本地快照;运行时 properties 由 sync.json 显式同步
221
- /.eevee/locales/
222
- ```
223
-
224
- ### 运行
225
-
226
- ```bash
227
- # 预览运行时同步
228
- eevee intl download --config .eevee/sync.json --dry-run
229
-
230
- # 全量生成 properties
231
- eevee intl download --config .eevee/sync.json
232
-
233
- # lint(自动刷新快照 + 检查)
234
- eevee lint --staged --language java
235
- ```
236
-
237
- ---
238
-
239
- ## 无标签项目的特殊处理
240
-
241
- 如果 EEVEE 平台项目没有创建任何标签组:
242
-
243
- - `tags: []` → 项目级全量拉取
244
- - 省略 `tags` 且平台无标签 → 自动降级为项目级全量
245
- - `versions` 省略 → 拉取项目全部版本
246
-
247
- 后端项目推荐显式配置 `versions`,避免新版本迁移后把未发布的 key 拉进当前分支。
248
-
249
- ## 版本升级维护
250
-
251
- 每次创建新 release 版本后:
252
-
253
- 1. 在 EEVEE 通过 API 迁移增量词条
254
- 2. 拿到新 version ID
255
- 3. 追加到 `.eevee/sync.json` 和 `.eevee/download.json` 的 `versions` 数组
256
- 4. 执行 `eevee intl download --config .eevee/sync.json` 刷新 properties
257
-
258
- ## 常见问题
259
-
260
- | 问题 | 原因 | 解决 |
261
- |------|------|------|
262
- | 未读取到任何 zh-CN*.json | `intl.json` 的 `outPaths` 路径不对 | 确认路径相对于 `intl.json` 所在目录 |
263
- | 平台返回 0 个词条 | 项目没有标签且未配置 `tags: []` | 显式设置 `"tags": []` |
264
- | token 过期 401 | `~/.eevee-cli/config.json` 里的 token 失效 | `eevee config set --token <new>` |
265
- | 全量 sync 后 diff 很大 | key 顺序按平台排序 | 一次性重排,后续 diff 只看新增/删除 |
266
- | properties 某行换行 | 翻译里含物理换行 | 已在 CLI 修复,确保使用最新版本 |
@@ -1,131 +0,0 @@
1
- import { CliError, parseArgs, hasFlag, requireOption } from '../lib/args.js';
2
- import { loadIntlConfig } from '../lib/intl-config.js';
3
- import { downloadIntl } from '../lib/intl-downloader.js';
4
- import { resolveRuntimeConfig, requireToken } from '../lib/config.js';
5
- export async function runIntl(subcommand, argv) {
6
- switch (subcommand) {
7
- case 'download':
8
- return await runDownload(argv);
9
- case 'tags':
10
- return await runTags(argv);
11
- case 'versions':
12
- return await runVersions(argv);
13
- case 'languages':
14
- return await runLanguages(argv);
15
- default:
16
- throw new CliError(`用法: eevee intl <download|tags|versions|languages>`);
17
- }
18
- }
19
- // ---------- download ----------
20
- async function runDownload(argv) {
21
- const parsed = parseArgs(argv, [
22
- { long: 'dry-run' },
23
- { long: 'json' },
24
- { long: 'config', value: true },
25
- ]);
26
- const config = await loadIntlConfig(typeof parsed.options.get('config') === 'string' ? String(parsed.options.get('config')) : undefined);
27
- if (hasFlag(parsed.options, 'dry-run')) {
28
- const summary = config.targets.map((t, i) => ({
29
- index: i + 1,
30
- outPath: t.outPath,
31
- format: t.format ?? 'json',
32
- splitByTag: t.splitByTag ?? false,
33
- languages: t.languages,
34
- projects: t.projects.map((p) => ({
35
- projectId: p.projectId,
36
- versions: p.versions ?? '(all)',
37
- tags: p.tags ?? '(all)',
38
- })),
39
- }));
40
- if (hasFlag(parsed.options, 'json')) {
41
- console.log(JSON.stringify({ ok: true, data: { dryRun: true, targets: summary } }, null, 2));
42
- }
43
- else {
44
- console.log('dry-run — 以下为将要执行的下载计划:\n');
45
- for (const s of summary) {
46
- console.log(`[${s.index}] outPath=${s.outPath} format=${s.format} splitByTag=${s.splitByTag}`);
47
- console.log(` languages: ${JSON.stringify(s.languages)}`);
48
- for (const p of s.projects) {
49
- console.log(` project=${p.projectId} versions=${p.versions} tags=${p.tags}`);
50
- }
51
- }
52
- }
53
- return;
54
- }
55
- const result = await downloadIntl(config);
56
- if (hasFlag(parsed.options, 'json')) {
57
- console.log(JSON.stringify({ ok: true, data: result }, null, 2));
58
- return;
59
- }
60
- console.log('✔ 下载完成\n');
61
- for (const target of result.targets) {
62
- console.log(`输出目录: ${target.outPath} 格式: ${target.format}`);
63
- for (const file of target.files) {
64
- console.log(` ${file.path} ${file.terms} 词条`);
65
- }
66
- }
67
- console.log(`\n总计: ${result.totalTerms} 词条, 耗时 ${result.duration}ms`);
68
- }
69
- // ---------- tags / versions / languages ----------
70
- async function queryApi(argv, apiPath) {
71
- const parsed = parseArgs(argv, [
72
- { long: 'project', value: true },
73
- { long: 'json' },
74
- ]);
75
- const projectId = Number(requireOption(parsed.options, 'project'));
76
- if (!Number.isInteger(projectId) || projectId <= 0)
77
- throw new CliError('--project 必须是正整数');
78
- const runtime = await resolveRuntimeConfig({});
79
- requireToken(runtime.token);
80
- const base = new URL(runtime.url);
81
- base.pathname = base.pathname.replace(/\/mcp\/?$/, '');
82
- const url = new URL(apiPath(projectId), base.origin + (base.pathname === '/' ? '' : base.pathname));
83
- const response = await fetch(url, {
84
- headers: { Authorization: `Bearer ${runtime.token}` },
85
- signal: AbortSignal.timeout(15_000),
86
- });
87
- if (!response.ok)
88
- throw new CliError(`API ${response.status}: ${url.pathname}`);
89
- const json = await response.json();
90
- return json.data;
91
- }
92
- async function runTags(argv) {
93
- const parsed = parseArgs(argv, [{ long: 'project', value: true }, { long: 'json' }]);
94
- const data = await queryApi(argv, (id) => `/api/v1/projects/${id}/tag-groups`);
95
- if (hasFlag(parsed.options, 'json')) {
96
- console.log(JSON.stringify({ ok: true, data }, null, 2));
97
- return;
98
- }
99
- console.log('标签组 标签ID 标签名');
100
- for (const group of data) {
101
- for (const tag of group.tags ?? []) {
102
- console.log(`${group.name.padEnd(14)} ${String(tag.id).padEnd(6)} ${tag.name}`);
103
- }
104
- }
105
- }
106
- async function runVersions(argv) {
107
- const parsed = parseArgs(argv, [{ long: 'project', value: true }, { long: 'json' }]);
108
- const data = await queryApi(argv, (id) => `/api/v1/projects/${id}/versions`);
109
- if (hasFlag(parsed.options, 'json')) {
110
- console.log(JSON.stringify({ ok: true, data }, null, 2));
111
- return;
112
- }
113
- console.log('版本ID 版本名 词条数');
114
- for (const v of data) {
115
- console.log(`${String(v.id).padEnd(6)} ${(v.name ?? '').padEnd(12)} ${v.term_count ?? '-'}`);
116
- }
117
- }
118
- async function runLanguages(argv) {
119
- const parsed = parseArgs(argv, [{ long: 'json' }]);
120
- const projectId = Number(requireOption(parseArgs(argv, [{ long: 'project', value: true }]).options, 'project'));
121
- const data = await queryApi(argv, (id) => `/api/v1/projects/${id}`);
122
- const locales = data.locales ?? (data.ref_locale ? [data.ref_locale] : []);
123
- if (hasFlag(parsed.options, 'json')) {
124
- console.log(JSON.stringify({ ok: true, data: locales }, null, 2));
125
- return;
126
- }
127
- console.log('locale');
128
- for (const locale of locales)
129
- console.log(locale);
130
- }
131
- //# sourceMappingURL=intl-command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intl-command.js","sourceRoot":"","sources":["../../../src/commands/intl-command.ts"],"names":[],"mappings":"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"}
@@ -1,105 +0,0 @@
1
- import path from 'node:path';
2
- import { CliError, hasFlag, optionalOption, parseArgs } from '../lib/args.js';
3
- import { runLintScan } from '../lib/lint.js';
4
- export async function runLint(argv) {
5
- let jsonRequested = false;
6
- try {
7
- const parsed = parseArgs(argv, [
8
- { long: 'config', value: true },
9
- { long: 'language', value: true },
10
- { long: 'source', value: true },
11
- { long: 'staged' },
12
- { long: 'changed' },
13
- { long: 'fix' },
14
- { long: 'refresh' },
15
- { long: 'no-refresh' },
16
- { long: 'refresh-config', value: true },
17
- { long: 'refresh-on-error', value: true },
18
- { long: 'json' },
19
- ]);
20
- jsonRequested = hasFlag(parsed.options, 'json');
21
- if (hasFlag(parsed.options, 'fix')) {
22
- throw new CliError('当前没有可安全自动修复的问题;--fix 已保留。请按诊断 hint 修改,或让 Agent 根据 --json 生成补丁。', 64);
23
- }
24
- const sourceFlag = optionalOption(parsed.options, 'source');
25
- if (sourceFlag && !['workspace', 'staged', 'changed'].includes(sourceFlag)) {
26
- throw new CliError('--source 仅支持 workspace、staged 或 changed', 64);
27
- }
28
- let source = sourceFlag ?? 'workspace';
29
- const staged = hasFlag(parsed.options, 'staged');
30
- const changed = hasFlag(parsed.options, 'changed');
31
- if (staged && changed)
32
- throw new CliError('--staged 和 --changed 不能同时使用', 64);
33
- if (staged)
34
- source = 'staged';
35
- if (changed)
36
- source = 'changed';
37
- const refresh = hasFlag(parsed.options, 'refresh');
38
- const noRefresh = hasFlag(parsed.options, 'no-refresh');
39
- if (noRefresh)
40
- throw new CliError('词条同步是强制步骤,不支持 --no-refresh', 64);
41
- const refreshOnError = optionalOption(parsed.options, 'refresh-on-error');
42
- if (refreshOnError) {
43
- throw new CliError('词条同步是强制步骤,不支持 --refresh-on-error', 64);
44
- }
45
- const languages = optionalOption(parsed.options, 'language')?.split(',').map((item) => item.trim());
46
- const report = await runLintScan({
47
- cwd: process.cwd(),
48
- configPath: optionalOption(parsed.options, 'config'),
49
- languages,
50
- files: parsed.positionals,
51
- source,
52
- refresh: {
53
- enabled: refresh ? true : undefined,
54
- config: optionalOption(parsed.options, 'refresh-config'),
55
- },
56
- });
57
- if (jsonRequested) {
58
- console.log(JSON.stringify({ ok: true, data: report }, null, 2));
59
- }
60
- else {
61
- renderHuman(report);
62
- }
63
- if (!report.passed)
64
- process.exitCode = 1;
65
- }
66
- catch (error) {
67
- if (!jsonRequested)
68
- throw error;
69
- const exitCode = error instanceof CliError && Number.isInteger(error.exitCode) ? error.exitCode : 1;
70
- console.log(JSON.stringify({ ok: false, error: { message: error.message } }, null, 2));
71
- process.exitCode = exitCode;
72
- }
73
- }
74
- function renderHuman(report) {
75
- if (report.refresh?.status === 'ok') {
76
- console.log(`✔ 词条同步完成:${report.refresh.totalTerms ?? 0} 词条,耗时 ${report.refresh.duration ?? 0}ms`);
77
- }
78
- else if (report.refresh?.status === 'warn') {
79
- console.warn('词条同步失败时不会继续检查');
80
- }
81
- if (report.issueCount === 0) {
82
- console.log(`✔ ${report.source === 'workspace' ? '检查完成' : `检查 ${report.source} 文件完成`},未发现国际化问题`);
83
- return;
84
- }
85
- console.log('EEVEE 国际化检查\n');
86
- for (const file of report.files) {
87
- for (const diagnostic of file.diagnostics) {
88
- const relative = path.relative(report.root, diagnostic.file).replaceAll(path.sep, '/');
89
- console.log(`${relative}:${diagnostic.line}:${diagnostic.column} error ${diagnostic.message} ${diagnostic.ruleId}`);
90
- console.log(` ${diagnostic.excerpt}`);
91
- console.log(` 建议: ${diagnostic.hint}`);
92
- }
93
- }
94
- const byCode = groupCount(report.files.flatMap((file) => file.diagnostics.map((item) => item.code)));
95
- console.log(`\n✖ ${report.issueCount} 个问题,覆盖 ${report.files.length} 个文件`);
96
- console.log(` ${Object.entries(byCode).map(([code, count]) => `${code}: ${count}`).join(', ')}`);
97
- console.log(' 自动修复: 当前规则需要业务决策,没有启用自动改写;可使用 --json 获取结构化建议');
98
- }
99
- function groupCount(values) {
100
- const result = {};
101
- for (const value of values)
102
- result[value] = (result[value] ?? 0) + 1;
103
- return result;
104
- }
105
- //# sourceMappingURL=lint-command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lint-command.js","sourceRoot":"","sources":["../../../src/commands/lint-command.ts"],"names":[],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- import { readFile, readdir } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { CliError } from './args.js';
4
- export async function readIntlCatalog(_root, configFile) {
5
- let raw;
6
- try {
7
- raw = JSON.parse(await readFile(configFile, 'utf8'));
8
- }
9
- catch (error) {
10
- throw new CliError(`Intl 数据配置解析失败 (${configFile}): ${error.message}`);
11
- }
12
- const source = raw;
13
- if (!source || !Array.isArray(source.outPaths)) {
14
- throw new CliError(`Intl 数据配置格式不正确,缺少 outPaths 数组: ${configFile}`);
15
- }
16
- const catalog = { allTerms: new Map(), tagTerms: new Map() };
17
- for (const output of source.outPaths) {
18
- if (!output?.path || typeof output.path !== 'string')
19
- continue;
20
- // outPaths 相对于 intl 配置文件所在目录解析;这样 .eevee/intl.json 可以直接指向 .eevee/locales。
21
- const directory = path.resolve(path.dirname(configFile), output.path);
22
- let entries;
23
- try {
24
- entries = await readdir(directory, { withFileTypes: true });
25
- }
26
- catch {
27
- continue;
28
- }
29
- for (const entry of entries) {
30
- const match = /^zh-CN(?:-([^.]+))?\.json$/i.exec(entry.name);
31
- if (!match || !entry.isFile())
32
- continue;
33
- const tag = match[1] ?? 'default';
34
- const file = path.join(directory, entry.name);
35
- let terms;
36
- try {
37
- terms = JSON.parse(await readFile(file, 'utf8'));
38
- }
39
- catch (error) {
40
- throw new CliError(`Intl 词条文件解析失败 (${file}): ${error.message}`);
41
- }
42
- if (!terms || typeof terms !== 'object' || Array.isArray(terms)) {
43
- throw new CliError(`Intl 词条文件必须是对象: ${file}`);
44
- }
45
- const tagMap = catalog.tagTerms.get(tag) ?? new Map();
46
- for (const key of Object.keys(terms)) {
47
- tagMap.set(key, true);
48
- catalog.allTerms.set(key, true);
49
- }
50
- catalog.tagTerms.set(tag, tagMap);
51
- }
52
- }
53
- if (catalog.allTerms.size === 0) {
54
- throw new CliError(`未读取到任何 zh-CN*.json 词条; 请检查 Intl 数据配置: ${configFile}`);
55
- }
56
- return catalog;
57
- }
58
- //# sourceMappingURL=intl-catalog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intl-catalog.js","sourceRoot":"","sources":["../../../src/lib/intl-catalog.ts"],"names":[],"mappings":"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"}