@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,237 @@
1
+ #!/usr/bin/env node
2
+ import { McpClient } from '../lib/mcp-client.js';
3
+ import { configPath, resolveRuntimeConfig } from '../lib/config.js';
4
+ import { parseArgs } from '../lib/args.js';
5
+ import { businessCommandMatrix, businessCommandsUsage, businessCommandUsage, matchBusinessInvocation, runBusiness, } from '../commands/business-command.js';
6
+ import { discoverInstalls } from '../lib/skill-installer.js';
7
+ import { runConfig } from '../commands/config-command.js';
8
+ import { runPing, runPrompts, runRequest, runResources, runTools, } from '../commands/mcp-command.js';
9
+ import { runSkills } from '../commands/skill-command.js';
10
+ import { runIntl } from '../commands/intl-command.js';
11
+ import { runLint } from '../commands/lint-command.js';
12
+ const VERSION = '0.1.0';
13
+ const RUNTIME_FLAG_NAMES = new Set(['url', 'token', 'timeout']);
14
+ function extractRuntimeOptions(input) {
15
+ const argv = [];
16
+ const options = {};
17
+ for (let index = 0; index < input.length; index++) {
18
+ const item = input[index];
19
+ if (item === '--') {
20
+ argv.push(...input.slice(index + 1));
21
+ break;
22
+ }
23
+ let key = item;
24
+ let inlineValue;
25
+ if (item.startsWith('--')) {
26
+ const equals = item.indexOf('=');
27
+ if (equals > 2) {
28
+ key = item.slice(0, equals);
29
+ inlineValue = item.slice(equals + 1);
30
+ }
31
+ }
32
+ const normalizedKey = key.replace(/^--/, '').toLowerCase();
33
+ if (!RUNTIME_FLAG_NAMES.has(normalizedKey)) {
34
+ argv.push(item);
35
+ continue;
36
+ }
37
+ const value = inlineValue ?? input[++index];
38
+ if (value !== undefined)
39
+ options[normalizedKey] = value;
40
+ }
41
+ return { argv, options };
42
+ }
43
+ function usage() {
44
+ console.log(`@eevee/cli ${VERSION} — stable MCP command line client
45
+
46
+ Usage:
47
+ eevee <group> <action> [options]
48
+ eevee <protocol-group> <action> [options]
49
+
50
+ ${businessCommandMatrix()}MCP protocol commands
51
+ ping eevee ping [--json]
52
+ tools eevee tools list [--raw|--json]
53
+ eevee tools docs [tool-name]
54
+ eevee tools call <tool> ['{...}' | @payload.json] [--args JSON|@file] [--raw]
55
+ resources eevee resources list
56
+ eevee resources templates
57
+ eevee resources read <uri>
58
+ eevee resources subscribe <uri>
59
+ eevee resources unsubscribe <uri>
60
+ prompts eevee prompts list
61
+ eevee prompts get <name> [--args JSON]
62
+ raw JSON-RPC eevee request <method> ['{...}' | @payload.json]
63
+ notifications eevee notify <method> --params '{...}'
64
+
65
+ Configuration
66
+ eevee config set --url URL [--token TOKEN]
67
+ eevee config show [--reveal]
68
+ eevee config get <url|token> [--reveal]
69
+ eevee config unset --url | --token
70
+ eevee config path
71
+
72
+ Agent skill commands
73
+ eevee skills install [codex|claude|universal][,...] [--global|--project DIR|--dir DIR]
74
+ eevee skills update [agents] [...target]
75
+ eevee skills uninstall [agents] [...target] --yes
76
+ eevee skills list
77
+ eevee skills paths
78
+ eevee skills info
79
+
80
+ Intl commands
81
+ eevee intl download [--dry-run] [--json] [--config PATH]
82
+ eevee intl tags --project ID [--json]
83
+ eevee intl versions --project ID [--json]
84
+ eevee intl languages --project ID [--json]
85
+
86
+ Local lint commands
87
+ eevee lint [files...] [--language web|java] [--source workspace|staged|changed]
88
+ [--staged] [--changed] [--config PATH] [--refresh-config PATH] [--json]
89
+
90
+ Diagnostics and meta commands
91
+ eevee doctor [--json]
92
+ eevee business print the complete business command matrix
93
+ eevee help | -h | --help print this complete help
94
+ eevee version | --version print package version
95
+
96
+ Connection options (accepted before or after a connected subcommand)
97
+ --url URL MCP endpoint; env EEVEE_MCP_URL
98
+ --token TOKEN user Bearer token; env EEVEE_TOKEN
99
+ --timeout MS request timeout; default 60000
100
+
101
+ Output options
102
+ --json machine-readable {ok,data}
103
+ --raw full MCP CallToolResult where supported`);
104
+ }
105
+ async function main() {
106
+ const argv = process.argv.slice(2);
107
+ if (argv.length === 0 || argv[0] === 'help' || argv[0] === '--help' || argv[0] === '-h') {
108
+ usage();
109
+ return;
110
+ }
111
+ if (argv[0] === 'version' || argv[0] === '--version') {
112
+ console.log(VERSION);
113
+ return;
114
+ }
115
+ // Runtime flags may appear before the business verb. Protocol/config commands keep
116
+ // their original parser behavior because some reuse these flag names locally.
117
+ const { argv: routeArgv, options: runtime } = extractRuntimeOptions(argv);
118
+ if (routeArgv[0] === 'business') {
119
+ businessCommandsUsage();
120
+ return;
121
+ }
122
+ const business = matchBusinessInvocation(routeArgv);
123
+ if (business) {
124
+ if (business.argv.includes('--help')) {
125
+ businessCommandUsage(business.command);
126
+ return;
127
+ }
128
+ const optionArgv = [];
129
+ for (const [key, value] of Object.entries(runtime)) {
130
+ if (value !== undefined)
131
+ optionArgv.push(`--${key}`, value);
132
+ }
133
+ return await runBusiness(business.command, [...business.argv, ...optionArgv]);
134
+ }
135
+ const command = argv.shift();
136
+ const next = argv[0];
137
+ switch (command) {
138
+ case 'config':
139
+ if (!next)
140
+ throw new Error('用法: eevee config <show|set|get|unset|path>');
141
+ argv.shift();
142
+ return await runConfig(next, argv);
143
+ case 'ping':
144
+ return await runPing(argv);
145
+ case 'tools':
146
+ if (!next)
147
+ throw new Error('用法: eevee tools <list|docs|call>');
148
+ argv.shift();
149
+ return await runTools(next, argv);
150
+ case 'resources': {
151
+ if (!next)
152
+ throw new Error('用法: eevee resources <list|templates|read|subscribe|unsubscribe>');
153
+ const subcommand = argv.shift();
154
+ if (!subcommand)
155
+ return;
156
+ return await runResources(subcommand, argv);
157
+ }
158
+ case 'prompts':
159
+ if (!next)
160
+ throw new Error('用法: eevee prompts <list|get>');
161
+ argv.shift();
162
+ return await runPrompts(next, argv);
163
+ case 'request':
164
+ return await runRequest(argv);
165
+ case 'notify':
166
+ return await runRequest(argv, true);
167
+ case 'skills':
168
+ if (!next)
169
+ throw new Error('用法: eevee skills <install|update|list|paths|info|uninstall>');
170
+ argv.shift();
171
+ return await runSkills(next, argv);
172
+ case 'intl':
173
+ if (!next)
174
+ throw new Error('用法: eevee intl <download|tags|versions|languages>');
175
+ argv.shift();
176
+ return await runIntl(next, argv);
177
+ case 'lint':
178
+ return await runLint(routeArgv.slice(1));
179
+ case 'doctor':
180
+ return await doctor(argv);
181
+ default:
182
+ throw new Error(`未知命令: ${command ?? ''}。执行 eevee help 查看帮助。`);
183
+ }
184
+ }
185
+ async function doctor(argv) {
186
+ const parsed = parseArgs(argv, [
187
+ { long: 'url', value: true },
188
+ { long: 'token', value: true },
189
+ { long: 'json' },
190
+ ]);
191
+ const report = {};
192
+ let healthy = true;
193
+ try {
194
+ const config = await resolveRuntimeConfig({
195
+ url: typeof parsed.options.get('url') === 'string' ? String(parsed.options.get('url')) : undefined,
196
+ token: typeof parsed.options.get('token') === 'string' ? String(parsed.options.get('token')) : undefined,
197
+ });
198
+ report.config = {
199
+ url: config.url,
200
+ hasToken: !!config.token,
201
+ source: configPathPublic(),
202
+ };
203
+ const client = new McpClient(config, 15_000);
204
+ const tools = await client.listTools();
205
+ report.mcp = {
206
+ status: 'ok',
207
+ toolCount: tools.tools.length,
208
+ tools: tools.tools.map((tool) => tool.name),
209
+ };
210
+ }
211
+ catch (error) {
212
+ healthy = false;
213
+ report.mcp = { status: 'error', message: error.message };
214
+ }
215
+ try {
216
+ report.skills = await discoverInstalls();
217
+ }
218
+ catch (error) {
219
+ healthy = false;
220
+ report.skillsError = error.message;
221
+ }
222
+ report.status = healthy ? 'ok' : 'error';
223
+ console.log(JSON.stringify(report, null, 2));
224
+ if (!healthy)
225
+ process.exitCode = 1;
226
+ }
227
+ function configPathPublic() {
228
+ return configPath();
229
+ }
230
+ main().catch((error) => {
231
+ const message = error instanceof Error ? error.message : String(error);
232
+ console.error(`✖ ${message}`);
233
+ process.exitCode = error instanceof Error && 'exitCode' in error && typeof error.exitCode === 'number'
234
+ ? error.exitCode
235
+ : 1;
236
+ });
237
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/bin/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,340 @@
1
+ import readline from 'node:readline/promises';
2
+ import { CliError } from '../lib/args.js';
3
+ import { BUSINESS_COMMANDS, findOperation } from '../lib/business-catalog.js';
4
+ import { resolveRuntimeConfig } from '../lib/config.js';
5
+ import { McpClient } from '../lib/mcp-client.js';
6
+ import { optionalOption } from '../lib/args.js';
7
+ import { isToolResult } from '../lib/output.js';
8
+ const CONTROL_OPTIONS = new Set(['url', 'token', 'timeout', 'json', 'raw', 'yes']);
9
+ export function matchBusinessInvocation(input) {
10
+ if (!input.length)
11
+ return undefined;
12
+ const [first, second] = input;
13
+ const command = BUSINESS_COMMANDS.find((candidate) => candidate.group === first && second === candidate.action);
14
+ return command ? { command, argv: input.slice(2) } : undefined;
15
+ }
16
+ function normalizeKey(value) {
17
+ return value.replace(/[-_\s]/g, '').toLowerCase();
18
+ }
19
+ function parseValue(argument, rawValues) {
20
+ const kind = argument.kind ?? 'string';
21
+ const requiredValue = () => {
22
+ const value = rawValues.at(-1)?.trim();
23
+ if (!value)
24
+ throw new CliError(`参数 --${argument.name} 缺少值`, 64);
25
+ return value;
26
+ };
27
+ if (kind === 'string-array' || kind === 'integer-array') {
28
+ const items = rawValues.flatMap((value) => value.split(',')).map((value) => value.trim()).filter(Boolean);
29
+ if (kind === 'integer-array') {
30
+ return items.map((item) => {
31
+ const parsed = Number(item);
32
+ if (!Number.isSafeInteger(parsed))
33
+ throw new CliError(`参数 --${argument.name} 必须是整数数组`, 64);
34
+ return parsed;
35
+ });
36
+ }
37
+ return items;
38
+ }
39
+ const value = requiredValue();
40
+ if (kind === 'integer') {
41
+ const parsed = Number(value);
42
+ if (!Number.isSafeInteger(parsed))
43
+ throw new CliError(`参数 --${argument.name} 必须是整数`, 64);
44
+ return parsed;
45
+ }
46
+ if (kind === 'number') {
47
+ const parsed = Number(value);
48
+ if (!Number.isFinite(parsed))
49
+ throw new CliError(`参数 --${argument.name} 必须是数字`, 64);
50
+ return parsed;
51
+ }
52
+ if (kind === 'boolean') {
53
+ if (['true', '1', 'yes', '是'].includes(value.toLowerCase()))
54
+ return true;
55
+ if (['false', '0', 'no', '否'].includes(value.toLowerCase()))
56
+ return false;
57
+ throw new CliError(`参数 --${argument.name} 必须是 true 或 false`, 64);
58
+ }
59
+ if (kind === 'object' || kind === 'array') {
60
+ try {
61
+ return JSON.parse(value);
62
+ }
63
+ catch {
64
+ throw new CliError(`参数 --${argument.name} 需要 JSON ${kind === 'object' ? '对象' : '数组'},例如 '${kind === 'object' ? '{"key":"value"}' : '[1,2]'}'`, 64);
65
+ }
66
+ }
67
+ return value;
68
+ }
69
+ export function parseBusinessArguments(input, command) {
70
+ const collected = new Map();
71
+ const controls = new Map();
72
+ const known = new Map(command.arguments.map((argument) => [normalizeKey(argument.name), argument]));
73
+ const positionals = [];
74
+ for (let index = 0; index < input.length; index++) {
75
+ const item = input[index];
76
+ if (!item.startsWith('--')) {
77
+ positionals.push(item);
78
+ continue;
79
+ }
80
+ const rawKey = item.slice(2);
81
+ let inlineValue;
82
+ const equals = rawKey.indexOf('=');
83
+ let key = rawKey;
84
+ if (equals >= 0) {
85
+ key = key.slice(0, equals);
86
+ inlineValue = rawKey.slice(equals + 1);
87
+ }
88
+ const canonical = [...known.values()].find((argument) => normalizeKey(argument.name) === normalizeKey(key))?.name
89
+ ?? [...CONTROL_OPTIONS].find((name) => normalizeKey(name) === normalizeKey(key));
90
+ if (!canonical) {
91
+ if (key === 'help')
92
+ continue;
93
+ throw new CliError(`${command.title} 不支持选项 --${key}`, 64, () => businessCommandUsage(command));
94
+ }
95
+ if (canonical === 'json' || canonical === 'raw' || canonical === 'yes') {
96
+ controls.set(canonical, inlineValue !== undefined ? inlineValue !== 'false' : true);
97
+ continue;
98
+ }
99
+ const value = inlineValue ?? input[++index];
100
+ if (value === undefined || value.startsWith('--')) {
101
+ throw new CliError(`参数 --${canonical} 缺少值`, 64, () => businessCommandUsage(command));
102
+ }
103
+ const bucket = collected.get(canonical) ?? [];
104
+ bucket.push(value);
105
+ collected.set(canonical, bucket);
106
+ }
107
+ // 单个必填参数允许位置传入;多个复杂参数时建议使用明确 flag。
108
+ let cursor = 0;
109
+ const pathNames = command.arguments.filter((argument) => argument.location === 'path');
110
+ for (const argument of pathNames) {
111
+ if (collected.has(argument.name) || cursor >= positionals.length)
112
+ continue;
113
+ collected.set(argument.name, [positionals[cursor++]]);
114
+ }
115
+ const remainingRequired = command.arguments.filter((argument) => argument.required
116
+ && argument.location !== 'path'
117
+ && !collected.has(argument.name));
118
+ if (remainingRequired.length === 1 && positionals.length > cursor) {
119
+ collected.set(remainingRequired[0].name, [positionals[cursor]]);
120
+ cursor++;
121
+ }
122
+ if (positionals.length > cursor) {
123
+ throw new CliError(`${command.title} 有无法识别的位置参数: ${positionals.slice(cursor).join(' ')}`, 64, () => businessCommandUsage(command));
124
+ }
125
+ const values = new Map();
126
+ for (const [name, rawValues] of collected) {
127
+ const argument = command.arguments.find((item) => item.name === name);
128
+ if (!argument)
129
+ continue; // --url/--token/--timeout are runtime controls.
130
+ values.set(name, parseValue(argument, rawValues));
131
+ }
132
+ for (const control of CONTROL_OPTIONS) {
133
+ if ((control === 'json' || control === 'raw' || control === 'yes') && !controls.has(control))
134
+ controls.set(control, false);
135
+ }
136
+ assertRequired(command, values);
137
+ return { values, controls };
138
+ }
139
+ function assertRequired(command, values) {
140
+ const missing = command.arguments
141
+ .filter((argument) => argument.required && !values.has(argument.name))
142
+ .map((argument) => `--${argument.name}(${argument.description || argument.kind || 'string'})`);
143
+ if (missing.length) {
144
+ throw new CliError(`${command.title} 缺少必填参数: ${missing.join(', ')}`, 64, () => businessCommandUsage(command));
145
+ }
146
+ }
147
+ async function confirmDestructive(command, enabled) {
148
+ if (!command.destructive || enabled)
149
+ return;
150
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
151
+ throw new CliError(`${command.title} 是破坏性操作,请显式加 --yes`, 64);
152
+ }
153
+ const terminal = readline.createInterface({ input: process.stdin, output: process.stdout });
154
+ try {
155
+ const answer = await terminal.question(`确认执行「${command.title}」?输入 yes 继续:`);
156
+ if (answer.trim().toLowerCase() !== 'yes')
157
+ throw new CliError('已取消操作', 0);
158
+ }
159
+ finally {
160
+ terminal.close();
161
+ }
162
+ }
163
+ function buildPath(command, values) {
164
+ return command.path.replace(/\{([^}]+)\}/g, (_, name) => {
165
+ const value = values.get(name);
166
+ if (value === undefined)
167
+ throw new CliError(`路径参数缺失: ${name}`, 64);
168
+ return encodeURIComponent(String(value));
169
+ });
170
+ }
171
+ export async function runBusiness(command, input) {
172
+ const parsed = parseBusinessArguments(input, command);
173
+ await confirmDestructive(command, parsed.controls.get('yes') === true);
174
+ const config = await resolveRuntimeConfig({
175
+ url: optionalControl(parsed.controls, 'url'),
176
+ token: optionalControl(parsed.controls, 'token'),
177
+ });
178
+ const timeout = Number(optionalControl(parsed.controls, 'timeout') ?? 60_000);
179
+ if (!Number.isFinite(timeout) || timeout <= 0)
180
+ throw new CliError('--timeout 必须是正整数毫秒', 64);
181
+ const client = new McpClient(config, timeout);
182
+ const parameters = {};
183
+ const body = {};
184
+ for (const argument of command.arguments) {
185
+ const value = parsed.values.get(argument.name);
186
+ if (value === undefined)
187
+ continue;
188
+ if (argument.location === 'body')
189
+ body[argument.name] = value;
190
+ else
191
+ parameters[argument.name] = value;
192
+ }
193
+ const operationId = await findOperation(client, command);
194
+ const result = await client.callTool('call_api_operation', {
195
+ operation_id: operationId,
196
+ parameters,
197
+ body,
198
+ });
199
+ const human = parsed.controls.get('json') !== true && parsed.controls.get('raw') !== true;
200
+ const text = human ? renderBusinessResult(result) : JSON.stringify({ ok: !result.isError, data: unwrapBusinessResult(result) }, null, 2);
201
+ if (result.isError) {
202
+ console.error(text);
203
+ throw new CliError(`「${command.title}」执行失败`, 1);
204
+ }
205
+ console.log(text);
206
+ }
207
+ function optionalControl(options, name) {
208
+ return optionalOption(options, name);
209
+ }
210
+ function unwrapBusinessResult(result) {
211
+ if (!isToolResult(result))
212
+ return result;
213
+ const structured = result.structuredContent;
214
+ if (structured && ('data' in structured || 'status' in structured)) {
215
+ return structured.data ?? null;
216
+ }
217
+ const text = result.content?.find((content) => content.type === 'text')?.text;
218
+ if (text) {
219
+ try {
220
+ const parsedText = JSON.parse(text);
221
+ if (parsedText && ('data' in parsedText || 'status' in parsedText))
222
+ return parsedText.data ?? null;
223
+ }
224
+ catch {
225
+ return text;
226
+ }
227
+ }
228
+ return structured ?? result.content ?? null;
229
+ }
230
+ function renderBusinessResult(result) {
231
+ const data = unwrapBusinessResult(result);
232
+ if (Array.isArray(data) && data.length && data.every((item) => item && typeof item === 'object' && !Array.isArray(item))) {
233
+ return renderTable(data);
234
+ }
235
+ if (data === null || data === undefined || (Array.isArray(data) && data.length === 0))
236
+ return '(空)';
237
+ if (typeof data === 'string')
238
+ return data;
239
+ return JSON.stringify(data, null, 2);
240
+ }
241
+ function renderTable(rows) {
242
+ const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))];
243
+ const cells = rows.map((row) => columns.map((column) => displayCell(row[column])));
244
+ const widths = columns.map((column, index) => Math.max(displayWidth(column), ...cells.map((row) => displayWidth(row[index]))));
245
+ const line = (values) => values.map((value, index) => value.padEnd(displayWidth(value) + widths[index] - displayWidth(value))).join(' ');
246
+ return [line(columns), line(widths.map((width) => '-'.repeat(width))), ...cells.map(line)].join('\n');
247
+ }
248
+ function displayCell(value) {
249
+ if (value === null || value === undefined)
250
+ return '-';
251
+ if (typeof value === 'object')
252
+ return JSON.stringify(value);
253
+ return String(value);
254
+ }
255
+ function displayWidth(value) {
256
+ let width = 0;
257
+ for (const char of value)
258
+ width += /[\u3000-\u9fff\uff01-\uff60]/.test(char) ? 2 : 1;
259
+ return width;
260
+ }
261
+ export function businessCommandUsage(command) {
262
+ console.log(`${command.title}
263
+
264
+ 用法:
265
+ eevee ${command.group} ${command.action} [参数]
266
+
267
+ ${command.destructive ? '注意: 这是破坏性操作,必须加 --yes。\n\n' : ''}参数:`);
268
+ if (!command.arguments.length)
269
+ console.log(' (无)');
270
+ for (const argument of command.arguments) {
271
+ const optionName = kebabCase(argument.name);
272
+ const marks = [
273
+ `[${argument.location}]`,
274
+ argument.required ? '必填' : '可选',
275
+ `--${optionName}`,
276
+ argument.description,
277
+ argument.kind ? `类型=${argument.kind}` : '',
278
+ argument.name !== optionName ? `payload=${argument.name}` : '',
279
+ ].filter(Boolean);
280
+ console.log(` ${marks.join(' ')}`);
281
+ }
282
+ }
283
+ export function businessCommandsUsage() {
284
+ console.log(businessCommandMatrix());
285
+ }
286
+ export function businessCommandMatrix() {
287
+ const groups = [...new Set(BUSINESS_COMMANDS.map((command) => command.group))];
288
+ const groupTitles = {
289
+ project: 'Projects',
290
+ version: 'Versions',
291
+ term: 'Terms',
292
+ translation: 'Translations',
293
+ 'tag-group': 'Tag groups',
294
+ tag: 'Tags',
295
+ permission: 'Permissions',
296
+ log: 'Logs',
297
+ profile: 'Profile',
298
+ config: 'Config',
299
+ user: 'Users',
300
+ };
301
+ const lines = ['Business commands', ''];
302
+ for (const group of groups) {
303
+ const commands = BUSINESS_COMMANDS.filter((item) => item.group === group);
304
+ lines.push(`${groupTitles[group] ?? group} (eevee ${group} <action>)`);
305
+ for (const command of commands) {
306
+ const flags = command.arguments
307
+ .filter((argument) => argument.location === 'body' || argument.location === 'query')
308
+ .map((argument) => `--${kebabCase(argument.name)}${argument.required ? '' : '?'}`)
309
+ .join(' ');
310
+ const pathArguments = command.arguments
311
+ .filter((argument) => argument.location === 'path')
312
+ .map((pathArgument) => `<${kebabCase(pathArgument.name)}>`)
313
+ .join(' ');
314
+ const suffix = [
315
+ pathArguments,
316
+ flags,
317
+ command.destructive ? '[--yes]' : '',
318
+ ].filter(Boolean).join(' ');
319
+ lines.push(` ${`${group} ${command.action}`.padEnd(34)} ${suffix}`);
320
+ }
321
+ lines.push('');
322
+ }
323
+ lines.push(...[
324
+ 'Examples',
325
+ ' eevee project list',
326
+ ' eevee project create --name Demo --locales zh-CN,en-US',
327
+ ' eevee project detail <project-id>',
328
+ ' eevee translation set-content --id <project-id> --term-id <term-id> --locale zh-CN --content 你好',
329
+ ' eevee project delete <project-id> --yes',
330
+ '',
331
+ 'All business commands accept --json --raw --url URL --token TOKEN --timeout MS.',
332
+ 'Use "eevee <group> <action> --help" for exact types and required parameters.',
333
+ '',
334
+ ]);
335
+ return lines.join('\n');
336
+ }
337
+ function kebabCase(value) {
338
+ return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[_\s]+/g, '-').toLowerCase();
339
+ }
340
+ //# sourceMappingURL=business-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-command.js","sourceRoot":"","sources":["../../../src/commands/business-command.ts"],"names":[],"mappings":"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"}