@eevee-ta/cli 0.1.0-beta.1

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 (70) hide show
  1. package/README.md +492 -0
  2. package/assets/skills/eevee-mcp/SKILL.md +127 -0
  3. package/assets/skills/eevee-mcp/reference.md +105 -0
  4. package/assets/skills/eevee-migration/SKILL.md +181 -0
  5. package/assets/skills/eevee-project-setup/SKILL.md +266 -0
  6. package/dist/src/bin/cli.js +237 -0
  7. package/dist/src/bin/cli.js.map +1 -0
  8. package/dist/src/commands/business-command.js +340 -0
  9. package/dist/src/commands/business-command.js.map +1 -0
  10. package/dist/src/commands/config-command.js +71 -0
  11. package/dist/src/commands/config-command.js.map +1 -0
  12. package/dist/src/commands/intl-command.js +131 -0
  13. package/dist/src/commands/intl-command.js.map +1 -0
  14. package/dist/src/commands/lint-command.js +105 -0
  15. package/dist/src/commands/lint-command.js.map +1 -0
  16. package/dist/src/commands/mcp-command.js +167 -0
  17. package/dist/src/commands/mcp-command.js.map +1 -0
  18. package/dist/src/commands/skill-command.js +116 -0
  19. package/dist/src/commands/skill-command.js.map +1 -0
  20. package/dist/src/lib/args.js +77 -0
  21. package/dist/src/lib/args.js.map +1 -0
  22. package/dist/src/lib/business-catalog.js +445 -0
  23. package/dist/src/lib/business-catalog.js.map +1 -0
  24. package/dist/src/lib/config.js +69 -0
  25. package/dist/src/lib/config.js.map +1 -0
  26. package/dist/src/lib/intl-catalog.js +58 -0
  27. package/dist/src/lib/intl-catalog.js.map +1 -0
  28. package/dist/src/lib/intl-config.js +125 -0
  29. package/dist/src/lib/intl-config.js.map +1 -0
  30. package/dist/src/lib/intl-downloader.js +217 -0
  31. package/dist/src/lib/intl-downloader.js.map +1 -0
  32. package/dist/src/lib/intl-serializers/csv.js +25 -0
  33. package/dist/src/lib/intl-serializers/csv.js.map +1 -0
  34. package/dist/src/lib/intl-serializers/custom.js +23 -0
  35. package/dist/src/lib/intl-serializers/custom.js.map +1 -0
  36. package/dist/src/lib/intl-serializers/index.js +22 -0
  37. package/dist/src/lib/intl-serializers/index.js.map +1 -0
  38. package/dist/src/lib/intl-serializers/js.js +10 -0
  39. package/dist/src/lib/intl-serializers/js.js.map +1 -0
  40. package/dist/src/lib/intl-serializers/json.js +7 -0
  41. package/dist/src/lib/intl-serializers/json.js.map +1 -0
  42. package/dist/src/lib/intl-serializers/properties.js +43 -0
  43. package/dist/src/lib/intl-serializers/properties.js.map +1 -0
  44. package/dist/src/lib/intl-serializers/ts.js +16 -0
  45. package/dist/src/lib/intl-serializers/ts.js.map +1 -0
  46. package/dist/src/lib/intl-serializers/xml.js +21 -0
  47. package/dist/src/lib/intl-serializers/xml.js.map +1 -0
  48. package/dist/src/lib/json.js +40 -0
  49. package/dist/src/lib/json.js.map +1 -0
  50. package/dist/src/lib/lint-config.js +180 -0
  51. package/dist/src/lib/lint-config.js.map +1 -0
  52. package/dist/src/lib/lint-java.js +226 -0
  53. package/dist/src/lib/lint-java.js.map +1 -0
  54. package/dist/src/lib/lint-types.js +2 -0
  55. package/dist/src/lib/lint-types.js.map +1 -0
  56. package/dist/src/lib/lint-web.js +183 -0
  57. package/dist/src/lib/lint-web.js.map +1 -0
  58. package/dist/src/lib/lint.js +192 -0
  59. package/dist/src/lib/lint.js.map +1 -0
  60. package/dist/src/lib/mcp-client.js +185 -0
  61. package/dist/src/lib/mcp-client.js.map +1 -0
  62. package/dist/src/lib/output.js +34 -0
  63. package/dist/src/lib/output.js.map +1 -0
  64. package/dist/src/lib/skill-installer.js +123 -0
  65. package/dist/src/lib/skill-installer.js.map +1 -0
  66. package/dist/src/lib/tool-docs.js +66 -0
  67. package/dist/src/lib/tool-docs.js.map +1 -0
  68. package/dist/src/lib/types.js +2 -0
  69. package/dist/src/lib/types.js.map +1 -0
  70. package/package.json +33 -0
@@ -0,0 +1,43 @@
1
+ function escapeUnicode(value) {
2
+ let result = '';
3
+ for (const char of value) {
4
+ const code = char.codePointAt(0);
5
+ if (code > 0x7e) {
6
+ for (const unit of char) {
7
+ const hi = unit.codePointAt(0).toString(16).padStart(4, '0');
8
+ result += `\\u${hi}`;
9
+ }
10
+ }
11
+ else if (char === '=' || char === ':' || char === '#' || char === '!') {
12
+ result += `\\${char}`;
13
+ }
14
+ else {
15
+ result += char;
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+ function escapeProperties(value, escape) {
21
+ // .properties 的换行是记录分隔符;反斜杠必须最先转义,控制字符使用标准单字符转义。
22
+ const structural = value
23
+ .replaceAll('\\', '\\\\')
24
+ .replaceAll('\r\n', '\\n')
25
+ .replaceAll('\r', '\\r')
26
+ .replaceAll('\n', '\\n')
27
+ .replaceAll('\t', '\\t')
28
+ .replaceAll('\f', '\\f');
29
+ return escape === 'unicode' ? escapeUnicode(structural) : structural;
30
+ }
31
+ export class PropertiesSerializer {
32
+ extension = '.properties';
33
+ serialize(entries, options) {
34
+ const props = options?.properties ?? {};
35
+ const escape = props.escape ?? 'unicode';
36
+ const lines = Object.entries(entries)
37
+ .map(([k, v]) => {
38
+ return `${escapeProperties(k, escape)}=${escapeProperties(v, escape)}`;
39
+ });
40
+ return lines.join('\n') + '\n';
41
+ }
42
+ }
43
+ //# sourceMappingURL=properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../../../../src/lib/intl-serializers/properties.ts"],"names":[],"mappings":"AAGA,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAClC,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC9D,MAAM,IAAI,MAAM,EAAE,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,MAA0B;IACjE,iDAAiD;IACjD,MAAM,UAAU,GAAG,KAAK;SACrB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;SACxB,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;SACzB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;SACvB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;SACvB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;SACvB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACvE,CAAC;AAED,MAAM,OAAO,oBAAoB;IACtB,SAAS,GAAG,aAAa,CAAC;IAEnC,SAAS,CAAC,OAA+B,EAAE,OAAqB;QAC9D,MAAM,KAAK,GAAG,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACd,OAAO,GAAG,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;QACL,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ export class TsSerializer {
2
+ extension = '.ts';
3
+ serialize(entries, options) {
4
+ const ts = options?.ts ?? {};
5
+ const typeName = ts.typeName ?? 'Record<string, string>';
6
+ const style = ts.exportStyle ?? 'default';
7
+ const body = Object.entries(entries)
8
+ .map(([k, v]) => ` ${JSON.stringify(k)}: ${JSON.stringify(v)},`)
9
+ .join('\n');
10
+ if (style === 'named') {
11
+ return `export const messages: ${typeName} = {\n${body}\n};\n`;
12
+ }
13
+ return `export default {\n${body}\n} as ${typeName};\n`;
14
+ }
15
+ }
16
+ //# sourceMappingURL=ts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts.js","sourceRoot":"","sources":["../../../../src/lib/intl-serializers/ts.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,YAAY;IACd,SAAS,GAAG,KAAK,CAAC;IAE3B,SAAS,CAAC,OAA+B,EAAE,OAAqB;QAC9D,MAAM,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,IAAI,wBAAwB,CAAC;QACzD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,IAAI,SAAS,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;aAChE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,0BAA0B,QAAQ,SAAS,IAAI,QAAQ,CAAC;QACjE,CAAC;QACD,OAAO,qBAAqB,IAAI,UAAU,QAAQ,KAAK,CAAC;IAC1D,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ function escapeXml(value) {
2
+ return value
3
+ .replace(/&/g, '&amp;')
4
+ .replace(/</g, '&lt;')
5
+ .replace(/>/g, '&gt;')
6
+ .replace(/"/g, '&quot;')
7
+ .replace(/'/g, '&apos;');
8
+ }
9
+ export class XmlSerializer {
10
+ extension = '.xml';
11
+ serialize(entries, options) {
12
+ const xml = options?.xml ?? {};
13
+ const rootTag = xml.rootTag ?? 'resources';
14
+ const itemTag = xml.itemTag ?? 'string';
15
+ const nameAttr = xml.nameAttr ?? 'name';
16
+ const lines = Object.entries(entries)
17
+ .map(([k, v]) => ` <${itemTag} ${nameAttr}="${escapeXml(k)}">${escapeXml(v)}</${itemTag}>`);
18
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<${rootTag}>\n${lines.join('\n')}\n</${rootTag}>\n`;
19
+ }
20
+ }
21
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../../../src/lib/intl-serializers/xml.ts"],"names":[],"mappings":"AAGA,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,OAAO,aAAa;IACf,SAAS,GAAG,MAAM,CAAC;IAE5B,SAAS,CAAC,OAA+B,EAAE,OAAqB;QAC9D,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,WAAW,CAAC;QAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;QACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC;QAExC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,OAAO,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;QAC/F,OAAO,4CAA4C,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,OAAO,KAAK,CAAC;IACtG,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { CliError } from './args.js';
3
+ export function parseJsonObject(value, fieldName = 'JSON') {
4
+ if (value === undefined || value.trim() === '')
5
+ return {};
6
+ if (value.startsWith('@')) {
7
+ const file = value.slice(1);
8
+ try {
9
+ value = readFileSync(file, 'utf8');
10
+ }
11
+ catch (error) {
12
+ throw new CliError(`无法读取 ${fieldName} 文件 ${file}: ${error.message}`, 66);
13
+ }
14
+ }
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(value);
18
+ }
19
+ catch (error) {
20
+ throw new CliError(`${fieldName} 格式无效: ${error.message}`, 65);
21
+ }
22
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
23
+ throw new CliError(`${fieldName} 必须是 JSON 对象`, 65);
24
+ }
25
+ return parsed;
26
+ }
27
+ import { readFileSync } from 'node:fs';
28
+ export async function parseJsonFileOption(value) {
29
+ if (!value)
30
+ return {};
31
+ try {
32
+ return parseJsonObject(await readFile(value, 'utf8'), '文件 JSON');
33
+ }
34
+ catch (error) {
35
+ if (error instanceof CliError)
36
+ throw error;
37
+ throw new CliError(`无法读取 JSON 文件 ${value}: ${error.message}`, 66);
38
+ }
39
+ }
40
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/lib/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,MAAM,UAAU,eAAe,CAAC,KAAyB,EAAE,SAAS,GAAG,MAAM;IAC3E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC1D,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAAC,QAAQ,SAAS,OAAO,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,GAAG,SAAS,UAAW,KAAe,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,QAAQ,CAAC,GAAG,SAAS,cAAc,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAoB,CAAC;AAC9B,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAyB;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAC3C,MAAM,IAAI,QAAQ,CAAC,gBAAgB,KAAK,KAAM,KAAe,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -0,0 +1,180 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { CliError } from './args.js';
4
+ const CONFIG_FILE_NAMES = ['.eevee-lint.json', '.eeveerc.json'];
5
+ export async function findPackageJsonFile(startDir) {
6
+ let current = path.resolve(startDir);
7
+ while (true) {
8
+ const candidate = path.join(current, 'package.json');
9
+ try {
10
+ await readFile(candidate, 'utf8');
11
+ return candidate;
12
+ }
13
+ catch {
14
+ const parent = path.dirname(current);
15
+ if (parent === current)
16
+ return undefined;
17
+ current = parent;
18
+ }
19
+ }
20
+ }
21
+ export async function loadLintConfig(explicitPath, cwd = process.cwd()) {
22
+ const located = await locateLintConfig(explicitPath, cwd);
23
+ if (!located) {
24
+ throw new CliError('未找到 EEVEE lint 配置;可在 package.json 增加 eevee.lint,创建 .eevee-lint.json,或使用 --config PATH');
25
+ }
26
+ let raw;
27
+ try {
28
+ raw = JSON.parse(await readFile(located.configFile, 'utf8'));
29
+ }
30
+ catch (error) {
31
+ throw new CliError(`Lint 配置解析失败 (${located.configFile}): ${error.message}`);
32
+ }
33
+ return normalizeLintConfig(raw, located.configFile, path.dirname(located.configFile));
34
+ }
35
+ async function locateLintConfig(explicitPath, cwd) {
36
+ if (explicitPath) {
37
+ const configFile = path.resolve(explicitPath);
38
+ await accessOrThrow(configFile);
39
+ return { configFile };
40
+ }
41
+ for (const name of CONFIG_FILE_NAMES) {
42
+ const configFile = path.join(cwd, name);
43
+ try {
44
+ await readFile(configFile, 'utf8');
45
+ return { configFile };
46
+ }
47
+ catch {
48
+ // Continue to the next discovery location.
49
+ }
50
+ }
51
+ const packageFile = await findPackageJsonFile(cwd);
52
+ if (!packageFile)
53
+ return undefined;
54
+ try {
55
+ const pkg = JSON.parse(await readFile(packageFile, 'utf8'));
56
+ const eevee = pkg.eevee;
57
+ if (!eevee?.lint || typeof eevee.lint !== 'object')
58
+ return undefined;
59
+ return { configFile: packageFile };
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }
65
+ async function accessOrThrow(configFile) {
66
+ try {
67
+ await readFile(configFile, 'utf8');
68
+ }
69
+ catch (error) {
70
+ throw new CliError(`Lint 配置不存在: ${configFile}`);
71
+ }
72
+ }
73
+ export function normalizeLintConfig(raw, configFile, baseDir) {
74
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
75
+ throw new CliError(`Lint 配置必须是对象: ${configFile}`);
76
+ }
77
+ const source = raw;
78
+ const languages = source.languages;
79
+ if (!languages || typeof languages !== 'object' || Array.isArray(languages)) {
80
+ throw new CliError(`Lint 配置缺少 languages 对象: ${configFile}`);
81
+ }
82
+ const languagesRaw = languages;
83
+ const web = languagesRaw.web;
84
+ const java = languagesRaw.java;
85
+ return {
86
+ refresh: normalizeRefresh(source.refresh, configFile),
87
+ languages: {
88
+ web: web === undefined ? undefined : normalizeWeb(web, configFile, baseDir),
89
+ java: java === undefined ? undefined : normalizeJava(java, configFile),
90
+ },
91
+ };
92
+ }
93
+ function normalizeRefresh(value, configFile) {
94
+ if (value === undefined)
95
+ return undefined;
96
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
97
+ throw new CliError(`Lint 配置 refresh 必须是对象: ${configFile}`);
98
+ }
99
+ const raw = value;
100
+ if (raw.enabled === false || raw.on_error !== undefined || raw.onError !== undefined) {
101
+ throw new CliError(`Lint 配置 refresh 是强制步骤,不支持 enabled=false 或 onError 配置: ${configFile}`);
102
+ }
103
+ return {
104
+ config: typeof raw.config === 'string' && raw.config.trim()
105
+ ? path.resolve(path.dirname(configFile), raw.config)
106
+ : undefined,
107
+ };
108
+ }
109
+ function stringArray(value, field, configFile) {
110
+ if (value === undefined)
111
+ return undefined;
112
+ if (!Array.isArray(value) || value.some((item) => typeof item !== 'string' || !item.trim())) {
113
+ throw new CliError(`Lint 配置 ${field} 必须是非空字符串数组: ${configFile}`);
114
+ }
115
+ return value.map((item) => String(item).trim());
116
+ }
117
+ function normalizeWeb(value, configFile, baseDir) {
118
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
119
+ throw new CliError(`languages.web 必须是对象: ${configFile}`);
120
+ }
121
+ const raw = value;
122
+ const legacyExcludeProperties = stringArray(raw.excludePropertys, 'languages.web.excludePropertys', configFile);
123
+ const excludeProperties = stringArray(raw.excludeProperties, 'languages.web.excludeProperties', configFile);
124
+ return {
125
+ enabled: raw.enabled === undefined ? true : raw.enabled === true,
126
+ root: typeof raw.root === 'string' && raw.root.trim() ? path.resolve(baseDir, raw.root) : baseDir,
127
+ includes: stringArray(raw.includes, 'languages.web.includes', configFile),
128
+ excludes: stringArray(raw.excludes, 'languages.web.excludes', configFile),
129
+ excludeAscii: raw.excludeAscii === undefined ? true : raw.excludeAscii === true,
130
+ intlConfig: typeof raw.intlConfig === 'string' && raw.intlConfig.trim()
131
+ ? path.resolve(raw.root && typeof raw.root === 'string'
132
+ ? path.resolve(baseDir, raw.root)
133
+ : baseDir, raw.intlConfig)
134
+ : path.resolve(baseDir, 'intl.json'),
135
+ tagMatchMap: normalizeTagMatchMap(raw.tagMatchMap, configFile),
136
+ excludeProperties: excludeProperties ?? legacyExcludeProperties ?? [],
137
+ excludeTrack: raw.excludeTrack === undefined
138
+ ? raw.execludeTrack === true
139
+ : raw.excludeTrack === true,
140
+ };
141
+ }
142
+ function normalizeTagMatchMap(value, configFile) {
143
+ if (value === undefined)
144
+ return undefined;
145
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
146
+ throw new CliError(`languages.web.tagMatchMap 必须是对象: ${configFile}`);
147
+ }
148
+ const result = {};
149
+ for (const [key, tags] of Object.entries(value)) {
150
+ if (!key.trim())
151
+ throw new CliError('languages.web.tagMatchMap 的 pattern 不能为空');
152
+ const normalized = stringArray(tags, 'languages.web.tagMatchMap[*]', configFile);
153
+ if (normalized)
154
+ result[key] = normalized;
155
+ }
156
+ return result;
157
+ }
158
+ function normalizeJava(value, configFile) {
159
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
160
+ throw new CliError(`languages.java 必须是对象: ${configFile}`);
161
+ }
162
+ const raw = value;
163
+ const root = typeof raw.root === 'string' && raw.root.trim()
164
+ ? path.resolve(path.dirname(configFile), raw.root)
165
+ : path.dirname(configFile);
166
+ return {
167
+ enabled: raw.enabled === undefined ? false : raw.enabled === true,
168
+ root,
169
+ includes: stringArray(raw.includes, 'languages.java.includes', configFile),
170
+ excludes: stringArray(raw.excludes, 'languages.java.excludes', configFile),
171
+ intlConfig: typeof raw.intlConfig === 'string' && raw.intlConfig.trim()
172
+ ? path.resolve(root, raw.intlConfig)
173
+ : path.resolve(root, 'intl.json'),
174
+ tagMatchMap: normalizeTagMatchMap(raw.tagMatchMap, configFile),
175
+ localeMethods: stringArray(raw.localeMethods, 'languages.java.localeMethods', configFile),
176
+ checkHardcoded: raw.checkHardcoded === undefined ? true : raw.checkHardcoded === true,
177
+ excludeMethods: stringArray(raw.excludeMethods, 'languages.java.excludeMethods', configFile),
178
+ };
179
+ }
180
+ //# sourceMappingURL=lint-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-config.js","sourceRoot":"","sources":["../../../src/lib/lint-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { minimatch } from 'minimatch';
4
+ import { lexAndParse } from 'java-parser';
5
+ import { CliError } from './args.js';
6
+ import { readIntlCatalog } from './intl-catalog.js';
7
+ const RULE_ID = 'eevee/java-i18n';
8
+ const JAVA_EXTENSIONS = new Set(['.java']);
9
+ const DEFAULT_LOCALE_METHODS = new Set([
10
+ 'getLocaleMessage',
11
+ 'tryLocaleMessage',
12
+ 'getMessage',
13
+ ]);
14
+ const DEFAULT_EXCLUDED_METHODS = new Set([
15
+ // 日志和诊断信息通常不是终端用户文案。
16
+ 'trace', 'debug', 'info', 'warn', 'error',
17
+ 'println', 'printf', 'format',
18
+ // 单测断言不是业务文案。
19
+ 'assertEquals', 'assertNotEquals', 'assertTrue', 'assertFalse', 'assertNotNull', 'assertNull',
20
+ ]);
21
+ function walkCst(node, visit) {
22
+ visit(node);
23
+ for (const children of Object.values(node.children)) {
24
+ for (const element of children) {
25
+ if (typeof element === 'object' && element !== null && 'name' in element) {
26
+ walkCst(element, visit);
27
+ }
28
+ }
29
+ }
30
+ }
31
+ function collectNamedNodes(root, name) {
32
+ const result = [];
33
+ walkCst(root, (node) => {
34
+ if (node.name === name)
35
+ result.push(node);
36
+ });
37
+ return result;
38
+ }
39
+ function tokenBefore(source, offset) {
40
+ const prefix = source.slice(0, offset).trimEnd();
41
+ const match = /([A-Za-z_$][A-Za-z0-9_$]*)$/.exec(prefix);
42
+ return match?.[1];
43
+ }
44
+ function methodNameForInvocation(source, offset) {
45
+ return tokenBefore(source, offset);
46
+ }
47
+ function firstStringLiteral(node) {
48
+ if (!node)
49
+ return undefined;
50
+ const literals = collectNamedNodes(node, 'literal');
51
+ for (const literal of literals) {
52
+ const token = literal.children.StringLiteral?.[0];
53
+ if (!token)
54
+ continue;
55
+ const raw = token.image;
56
+ const value = raw.length >= 2 ? JSON.parse(raw) : raw;
57
+ return { token, value };
58
+ }
59
+ return undefined;
60
+ }
61
+ function position(source, token) {
62
+ return {
63
+ start: { line: token.startLine, column: token.startColumn },
64
+ end: { line: token.endLine, column: token.endColumn },
65
+ };
66
+ }
67
+ function excerpt(source, token) {
68
+ const lines = source.split(/\r?\n/);
69
+ return (lines[token.startLine - 1] ?? '').trimEnd();
70
+ }
71
+ function isInsideRanges(offset, ranges) {
72
+ return ranges.some((range) => offset >= range.start && offset <= range.end);
73
+ }
74
+ function findRegisteredDiagnostic(context, source, token, key) {
75
+ const relativeFile = path.relative(context.root, context.file).replaceAll(path.sep, '/');
76
+ const mappedTags = Object.entries(context.options.tagMatchMap)
77
+ .find(([pattern]) => minimatch(relativeFile, pattern, { dot: true }))?.[1] ?? [];
78
+ if (!mappedTags.length)
79
+ return undefined;
80
+ if (mappedTags.some((tag) => context.catalog.tagTerms.get(tag)?.has(key)))
81
+ return undefined;
82
+ const registered = context.catalog.allTerms.has(key);
83
+ return {
84
+ ruleId: RULE_ID,
85
+ severity: 'error',
86
+ code: registered ? 'tag-mismatch' : 'unregistered',
87
+ language: 'java',
88
+ file: context.file,
89
+ line: token.startLine,
90
+ column: token.startColumn,
91
+ endLine: token.endLine,
92
+ endColumn: token.endColumn,
93
+ message: registered
94
+ ? `词条【${key}】 标签不匹配`
95
+ : `词条【${key}】 未在平台登记`,
96
+ hint: registered
97
+ ? '确认 Java 项目对应的 EEVEE tag,或将词条补充到该 tag。'
98
+ : '先在 EEVEE 平台登记并同步该词条,再在代码中引用。',
99
+ excerpt: source.split(/\r?\n/)[token.startLine - 1]?.trimEnd() ?? '',
100
+ fixable: false,
101
+ };
102
+ }
103
+ function checkHardcodedChinese(context, source, cst) {
104
+ if (!context.options.checkHardcoded)
105
+ return [];
106
+ const excludedRanges = [];
107
+ const invocationNodes = collectNamedNodes(cst, 'methodInvocationSuffix');
108
+ for (const invocation of invocationNodes) {
109
+ const method = methodNameForInvocation(source, invocation.location.startOffset);
110
+ if (method && context.options.excludeMethods.includes(method)) {
111
+ excludedRanges.push({ start: invocation.location.startOffset, end: invocation.location.endOffset });
112
+ }
113
+ }
114
+ for (const annotation of collectNamedNodes(cst, 'annotation')) {
115
+ excludedRanges.push({ start: annotation.location.startOffset, end: annotation.location.endOffset });
116
+ }
117
+ const diagnostics = [];
118
+ for (const literal of collectNamedNodes(cst, 'literal')) {
119
+ const token = literal.children.StringLiteral?.[0];
120
+ if (!token)
121
+ continue;
122
+ const raw = token.image.slice(1, -1);
123
+ let value;
124
+ try {
125
+ value = JSON.parse(`"${raw}"`);
126
+ }
127
+ catch {
128
+ value = raw;
129
+ }
130
+ if (!/[\u4e00-\u9fa5]/.test(value))
131
+ continue;
132
+ if (isInsideRanges(token.startOffset, excludedRanges))
133
+ continue;
134
+ diagnostics.push({
135
+ ruleId: RULE_ID,
136
+ severity: 'error',
137
+ code: 'missing-intl',
138
+ language: 'java',
139
+ file: context.file,
140
+ line: token.startLine,
141
+ column: token.startColumn,
142
+ endLine: token.endLine,
143
+ endColumn: token.endColumn,
144
+ message: `词条【${value}】没有国际化`,
145
+ hint: '将用户可见文案改为平台词条 key,并通过 LocaleHandler/MessageSource 输出。',
146
+ excerpt: source.split(/\r?\n/)[token.startLine - 1]?.trimEnd() ?? '',
147
+ fixable: false,
148
+ });
149
+ }
150
+ return diagnostics;
151
+ }
152
+ function checkLocaleKeys(context, source, cst) {
153
+ const diagnostics = [];
154
+ for (const invocation of collectNamedNodes(cst, 'methodInvocationSuffix')) {
155
+ const method = methodNameForInvocation(source, invocation.location.startOffset);
156
+ if (!method || !context.options.localeMethods.includes(method))
157
+ continue;
158
+ const firstExpression = invocation.children.argumentList?.[0]?.children.expression?.[0];
159
+ const literal = firstStringLiteral(firstExpression);
160
+ if (literal) {
161
+ const diagnostic = findRegisteredDiagnostic(context, source, literal.token, literal.value);
162
+ if (diagnostic)
163
+ diagnostics.push(diagnostic);
164
+ continue;
165
+ }
166
+ }
167
+ return diagnostics;
168
+ }
169
+ export async function checkJavaFile(request, options) {
170
+ const normalized = {
171
+ includes: options.includes ?? ['**/*.java'],
172
+ excludes: options.excludes ?? ['**/src/test/**', '**/generated/**'],
173
+ intlConfig: options.intlConfig
174
+ ? path.resolve(request.root, options.intlConfig)
175
+ : path.resolve(request.root, 'intl.json'),
176
+ tagMatchMap: options.tagMatchMap ?? {},
177
+ localeMethods: options.localeMethods ?? [...DEFAULT_LOCALE_METHODS],
178
+ checkHardcoded: options.checkHardcoded ?? true,
179
+ excludeMethods: options.excludeMethods ?? [...DEFAULT_EXCLUDED_METHODS],
180
+ };
181
+ const relativeFile = path.relative(request.root, request.file).replaceAll(path.sep, '/');
182
+ if (!normalized.includes.some((pattern) => minimatch(relativeFile, pattern, { dot: true }))) {
183
+ return { file: request.file, language: 'java', diagnostics: [] };
184
+ }
185
+ if (normalized.excludes.some((pattern) => minimatch(relativeFile, pattern, { dot: true }))) {
186
+ return { file: request.file, language: 'java', diagnostics: [] };
187
+ }
188
+ let source;
189
+ try {
190
+ source = await readFile(request.file, 'utf8');
191
+ }
192
+ catch (error) {
193
+ throw new CliError(`无法读取检查文件 (${request.file}): ${error.message}`);
194
+ }
195
+ let cst;
196
+ try {
197
+ cst = lexAndParse(source).cst;
198
+ }
199
+ catch (error) {
200
+ throw new CliError(`Java 解析失败 (${request.file}): ${error.message}`);
201
+ }
202
+ const context = {
203
+ root: request.root,
204
+ file: request.file,
205
+ options: normalized,
206
+ catalog: await readIntlCatalog(request.root, normalized.intlConfig),
207
+ };
208
+ const diagnostics = [
209
+ ...checkLocaleKeys(context, source, cst),
210
+ ...checkHardcodedChinese(context, source, cst),
211
+ ];
212
+ return { file: request.file, language: 'java', diagnostics };
213
+ }
214
+ export function createJavaAdapter(options) {
215
+ return {
216
+ id: 'java',
217
+ description: 'Java 后端国际化检查(LocaleHandler/MessageSource 词条与硬编码中文)',
218
+ supports(file) {
219
+ return JAVA_EXTENSIONS.has(path.extname(file).toLowerCase());
220
+ },
221
+ check(request) {
222
+ return checkJavaFile(request, options);
223
+ },
224
+ };
225
+ }
226
+ //# sourceMappingURL=lint-java.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-java.js","sourceRoot":"","sources":["../../../src/lib/lint-java.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lint-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-types.js","sourceRoot":"","sources":["../../../src/lib/lint-types.ts"],"names":[],"mappings":""}