@eevee-ta/cli 0.1.0-beta.1 → 1.0.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 (62) hide show
  1. package/README.md +76 -154
  2. package/assets/skills/eevee-mcp/SKILL.md +26 -0
  3. package/assets/skills/eevee-mcp/reference.md +12 -0
  4. package/dist/src/bin/cli.js +48 -25
  5. package/dist/src/bin/cli.js.map +1 -1
  6. package/dist/src/commands/business-command.js +9 -4
  7. package/dist/src/commands/business-command.js.map +1 -1
  8. package/dist/src/commands/skill-command.js +40 -5
  9. package/dist/src/commands/skill-command.js.map +1 -1
  10. package/dist/src/lib/config.js +1 -1
  11. package/dist/src/lib/config.js.map +1 -1
  12. package/dist/src/lib/http.js +95 -0
  13. package/dist/src/lib/http.js.map +1 -0
  14. package/dist/src/lib/mcp-client.js +5 -4
  15. package/dist/src/lib/mcp-client.js.map +1 -1
  16. package/dist/src/lib/skill-installer.js +134 -45
  17. package/dist/src/lib/skill-installer.js.map +1 -1
  18. package/dist/src/lib/updater.js +129 -0
  19. package/dist/src/lib/updater.js.map +1 -0
  20. package/dist/src/lib/version.js +55 -0
  21. package/dist/src/lib/version.js.map +1 -0
  22. package/install.sh +203 -0
  23. package/package.json +8 -8
  24. package/scripts/postinstall.mjs +31 -0
  25. package/assets/skills/eevee-migration/SKILL.md +0 -181
  26. package/assets/skills/eevee-project-setup/SKILL.md +0 -266
  27. package/dist/src/commands/intl-command.js +0 -131
  28. package/dist/src/commands/intl-command.js.map +0 -1
  29. package/dist/src/commands/lint-command.js +0 -105
  30. package/dist/src/commands/lint-command.js.map +0 -1
  31. package/dist/src/lib/intl-catalog.js +0 -58
  32. package/dist/src/lib/intl-catalog.js.map +0 -1
  33. package/dist/src/lib/intl-config.js +0 -125
  34. package/dist/src/lib/intl-config.js.map +0 -1
  35. package/dist/src/lib/intl-downloader.js +0 -217
  36. package/dist/src/lib/intl-downloader.js.map +0 -1
  37. package/dist/src/lib/intl-serializers/csv.js +0 -25
  38. package/dist/src/lib/intl-serializers/csv.js.map +0 -1
  39. package/dist/src/lib/intl-serializers/custom.js +0 -23
  40. package/dist/src/lib/intl-serializers/custom.js.map +0 -1
  41. package/dist/src/lib/intl-serializers/index.js +0 -22
  42. package/dist/src/lib/intl-serializers/index.js.map +0 -1
  43. package/dist/src/lib/intl-serializers/js.js +0 -10
  44. package/dist/src/lib/intl-serializers/js.js.map +0 -1
  45. package/dist/src/lib/intl-serializers/json.js +0 -7
  46. package/dist/src/lib/intl-serializers/json.js.map +0 -1
  47. package/dist/src/lib/intl-serializers/properties.js +0 -43
  48. package/dist/src/lib/intl-serializers/properties.js.map +0 -1
  49. package/dist/src/lib/intl-serializers/ts.js +0 -16
  50. package/dist/src/lib/intl-serializers/ts.js.map +0 -1
  51. package/dist/src/lib/intl-serializers/xml.js +0 -21
  52. package/dist/src/lib/intl-serializers/xml.js.map +0 -1
  53. package/dist/src/lib/lint-config.js +0 -180
  54. package/dist/src/lib/lint-config.js.map +0 -1
  55. package/dist/src/lib/lint-java.js +0 -226
  56. package/dist/src/lib/lint-java.js.map +0 -1
  57. package/dist/src/lib/lint-types.js +0 -2
  58. package/dist/src/lib/lint-types.js.map +0 -1
  59. package/dist/src/lib/lint-web.js +0 -183
  60. package/dist/src/lib/lint-web.js.map +0 -1
  61. package/dist/src/lib/lint.js +0 -192
  62. package/dist/src/lib/lint.js.map +0 -1
@@ -1,192 +0,0 @@
1
- import { readdir, stat } from 'node:fs/promises';
2
- import { execFile } from 'node:child_process';
3
- import path from 'node:path';
4
- import { promisify } from 'node:util';
5
- import { minimatch } from 'minimatch';
6
- import { CliError } from './args.js';
7
- import { loadLintConfig } from './lint-config.js';
8
- import { createWebAdapter } from './lint-web.js';
9
- import { createJavaAdapter } from './lint-java.js';
10
- import { downloadIntl } from './intl-downloader.js';
11
- import { loadIntlConfig } from './intl-config.js';
12
- const execFileAsync = promisify(execFile);
13
- export const LINT_LANGUAGES = ['web', 'java'];
14
- function isWebEnabled(config) {
15
- return config.languages.web?.enabled !== false;
16
- }
17
- function adaptersFor(config, requested) {
18
- const selected = requested?.length ? requested : LINT_LANGUAGES;
19
- const unknown = selected.filter((language) => !LINT_LANGUAGES.includes(language));
20
- if (unknown.length) {
21
- throw new CliError(`不支持的检查语言: ${unknown.join(', ')};可用: ${LINT_LANGUAGES.join(', ')}`, 64);
22
- }
23
- const adapters = [];
24
- for (const language of selected) {
25
- if (language === 'web') {
26
- if (isWebEnabled(config))
27
- adapters.push(createWebAdapter(config.languages.web ?? {}));
28
- continue;
29
- }
30
- if (language === 'java') {
31
- if (!config.languages.java?.enabled) {
32
- throw new CliError('Java 检查未启用;请在 eevee.lint.languages.java 中设置 enabled=true。', 64);
33
- }
34
- adapters.push(createJavaAdapter(config.languages.java));
35
- }
36
- }
37
- return adapters;
38
- }
39
- function matchesAny(file, patterns) {
40
- return patterns.some((pattern) => minimatch(file, pattern, { dot: true }));
41
- }
42
- async function collectWorkspaceFiles(root) {
43
- const files = [];
44
- await walk(root, files);
45
- return files;
46
- }
47
- async function walk(directory, output) {
48
- const entries = await readdir(directory, { withFileTypes: true });
49
- for (const entry of entries) {
50
- if (entry.name === '.git' || entry.name === 'node_modules')
51
- continue;
52
- const file = path.join(directory, entry.name);
53
- if (entry.isDirectory())
54
- await walk(file, output);
55
- else if (entry.isFile())
56
- output.push(file);
57
- }
58
- }
59
- async function gitNames(root, args) {
60
- try {
61
- const { stdout } = await execFileAsync('git', ['-C', root, ...args], {
62
- maxBuffer: 20 * 1024 * 1024,
63
- });
64
- return stdout.split('\0').filter(Boolean);
65
- }
66
- catch (error) {
67
- throw new CliError(`获取 Git 文件列表失败: ${error.message}`);
68
- }
69
- }
70
- async function gitRepositoryFiles(root, args) {
71
- const names = await gitNames(root, args);
72
- const { stdout } = await execFileAsync('git', ['-C', root, 'rev-parse', '--show-toplevel']);
73
- const repositoryRoot = path.resolve(stdout.trim());
74
- return names.map((name) => path.resolve(repositoryRoot, name));
75
- }
76
- async function sourceFiles(options, root) {
77
- const explicit = options.files?.length ? options.files : undefined;
78
- if (explicit) {
79
- const files = [];
80
- for (const item of explicit) {
81
- const target = path.resolve(item);
82
- const info = await stat(target);
83
- if (info.isDirectory())
84
- files.push(...await collectWorkspaceFiles(target));
85
- else
86
- files.push(target);
87
- }
88
- return files;
89
- }
90
- if (options.source === 'staged') {
91
- return gitRepositoryFiles(root, ['diff', '--cached', '--name-only', '--diff-filter=ACMR', '-z']);
92
- }
93
- if (options.source === 'changed') {
94
- const names = [
95
- ...await gitRepositoryFiles(root, ['diff', '--name-only', '--diff-filter=ACMR', 'HEAD', '-z']),
96
- ...await gitRepositoryFiles(root, ['ls-files', '--others', '--exclude-standard', '-z']),
97
- ];
98
- return [...new Set(names)];
99
- }
100
- return collectWorkspaceFiles(root);
101
- }
102
- export async function runLintScan(options = {}) {
103
- const started = Date.now();
104
- const cwd = path.resolve(options.cwd ?? process.cwd());
105
- const config = await loadLintConfig(options.configPath, cwd);
106
- const selected = adaptersFor(config, options.languages);
107
- if (selected.length === 0) {
108
- throw new CliError('没有启用的检查语言;请在 eevee.lint.languages 中启用 web 或 java。', 64);
109
- }
110
- const roots = new Set();
111
- if (config.languages.web?.enabled !== false && (options.languages?.includes('web') || !options.languages?.length)) {
112
- roots.add(path.resolve(config.languages.web?.root ?? cwd));
113
- }
114
- if (config.languages.java?.enabled && (options.languages?.includes('java') || !options.languages?.length)) {
115
- roots.add(path.resolve(config.languages.java.root ?? cwd));
116
- }
117
- if (roots.size !== 1) {
118
- throw new CliError('当前检查要求所有启用语言使用同一个 project root,便于提交检测按仓库执行。', 64);
119
- }
120
- const root = [...roots][0];
121
- let reportRefresh;
122
- if (options.refresh?.enabled !== false) {
123
- let refreshResult;
124
- try {
125
- const downloadConfig = await loadIntlConfig(options.refresh?.config ?? config.refresh?.config, root);
126
- const result = await downloadIntl(downloadConfig);
127
- if (result.totalTerms === 0) {
128
- throw new CliError('平台返回 0 个词条;请确认项目、版本和标签配置');
129
- }
130
- refreshResult = {
131
- enabled: true,
132
- status: 'ok',
133
- totalTerms: result.totalTerms,
134
- duration: result.duration,
135
- };
136
- }
137
- catch (error) {
138
- throw new CliError(`词条同步失败,已阻断检查: ${error.message}`);
139
- }
140
- reportRefresh = refreshResult;
141
- }
142
- const candidates = await sourceFiles({ ...options, files: options.files }, root);
143
- const byAdapter = new Map();
144
- for (const file of candidates) {
145
- for (const adapter of selected) {
146
- if (!adapter.supports(file))
147
- continue;
148
- const relativeFile = path.relative(root, file).replaceAll(path.sep, '/');
149
- const language = adapter.id;
150
- const languageConfig = language === 'web' ? config.languages.web : config.languages.java;
151
- const includes = languageConfig?.includes ?? ['**/*'];
152
- const excludes = languageConfig?.excludes ?? ['**/node_modules/**', '**/.git/**'];
153
- if (!matchesAny(relativeFile, includes))
154
- continue;
155
- if (matchesAny(relativeFile, excludes))
156
- continue;
157
- const existing = byAdapter.get(adapter) ?? [];
158
- existing.push(path.resolve(file));
159
- byAdapter.set(adapter, existing);
160
- }
161
- }
162
- const files = [];
163
- const checked = new Set();
164
- for (const [adapter, adapterFiles] of byAdapter) {
165
- for (const file of adapterFiles.sort()) {
166
- const key = `${adapter.id}:${file}`;
167
- if (checked.has(key))
168
- continue;
169
- checked.add(key);
170
- const result = await adapter.check({ root, file });
171
- if (result.diagnostics.length)
172
- files.push(result);
173
- }
174
- }
175
- files.sort((a, b) => a.file.localeCompare(b.file) || a.language.localeCompare(b.language));
176
- const issueCount = files.reduce((sum, file) => sum + file.diagnostics.length, 0);
177
- return {
178
- root,
179
- source: options.source ?? 'workspace',
180
- languages: selected.map((adapter) => adapter.id).sort(),
181
- passed: issueCount === 0,
182
- checkedFileCount: checked.size,
183
- diagnosticFileCount: files.length,
184
- fileCount: checked.size,
185
- issueCount,
186
- fixableCount: files.reduce((sum, file) => sum + file.diagnostics.filter((item) => item.fixable).length, 0),
187
- duration: Date.now() - started,
188
- files,
189
- refresh: reportRefresh,
190
- };
191
- }
192
- //# sourceMappingURL=lint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/lib/lint.ts"],"names":[],"mappings":"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"}