@acip/cli 1.5.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 (64) hide show
  1. package/README.md +368 -0
  2. package/bin/acip.js +3 -0
  3. package/dist/commands/call.d.ts +3 -0
  4. package/dist/commands/call.d.ts.map +1 -0
  5. package/dist/commands/call.js +65 -0
  6. package/dist/commands/call.js.map +1 -0
  7. package/dist/commands/config.d.ts +3 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +144 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/deploy.d.ts +3 -0
  12. package/dist/commands/deploy.d.ts.map +1 -0
  13. package/dist/commands/deploy.js +280 -0
  14. package/dist/commands/deploy.js.map +1 -0
  15. package/dist/commands/dev.d.ts +3 -0
  16. package/dist/commands/dev.d.ts.map +1 -0
  17. package/dist/commands/dev.js +218 -0
  18. package/dist/commands/dev.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +3 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +289 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/init.d.ts +3 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +80 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/inspect.d.ts +3 -0
  28. package/dist/commands/inspect.d.ts.map +1 -0
  29. package/dist/commands/inspect.js +69 -0
  30. package/dist/commands/inspect.js.map +1 -0
  31. package/dist/commands/list.d.ts +3 -0
  32. package/dist/commands/list.d.ts.map +1 -0
  33. package/dist/commands/list.js +118 -0
  34. package/dist/commands/list.js.map +1 -0
  35. package/dist/commands/monitor.d.ts +3 -0
  36. package/dist/commands/monitor.d.ts.map +1 -0
  37. package/dist/commands/monitor.js +51 -0
  38. package/dist/commands/monitor.js.map +1 -0
  39. package/dist/commands/new.d.ts +3 -0
  40. package/dist/commands/new.d.ts.map +1 -0
  41. package/dist/commands/new.js +252 -0
  42. package/dist/commands/new.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +79 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/utils/project.d.ts +13 -0
  48. package/dist/utils/project.d.ts.map +1 -0
  49. package/dist/utils/project.js +149 -0
  50. package/dist/utils/project.js.map +1 -0
  51. package/package.json +87 -0
  52. package/templates/.env.example.template +9 -0
  53. package/templates/.gitignore.template +31 -0
  54. package/templates/README.md.template +33 -0
  55. package/templates/advanced/src/components/assistant.js.template +66 -0
  56. package/templates/advanced/src/components/assistant.ts.template +71 -0
  57. package/templates/advanced/src/index.js.template +45 -0
  58. package/templates/advanced/src/index.ts.template +45 -0
  59. package/templates/basic/src/config/index.js.template +28 -0
  60. package/templates/basic/src/config/index.ts.template +28 -0
  61. package/templates/basic/src/index.js.template +29 -0
  62. package/templates/basic/src/index.ts.template +29 -0
  63. package/templates/package.json.template +21 -0
  64. package/templates/tsconfig.json.template +17 -0
@@ -0,0 +1,289 @@
1
+ import chalk from 'chalk';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import fs from 'fs-extra';
5
+ import path from 'path';
6
+ const execAsync = promisify(exec);
7
+ export default function doctorCommand(program) {
8
+ program
9
+ .command('doctor')
10
+ .description('Check your ACIP development environment')
11
+ .option('--verbose', 'Show detailed output')
12
+ .action(async (options) => {
13
+ console.log(chalk.bold.blue('\n🏥 ACIP Environment Doctor\n'));
14
+ console.log('Running diagnostics...\n');
15
+ const checks = [];
16
+ // 检查 Node.js 版本
17
+ checks.push(await checkNodeVersion());
18
+ // 检查 npm/pnpm
19
+ checks.push(await checkPackageManager());
20
+ // 检查 TypeScript
21
+ checks.push(await checkTypeScript());
22
+ // 检查当前项目
23
+ checks.push(await checkCurrentProject());
24
+ // 检查 ACIP core
25
+ checks.push(await checkACIPCore());
26
+ // 检查环境变量
27
+ checks.push(await checkEnvironmentVariables());
28
+ // 检查网络连接
29
+ checks.push(await checkNetworkConnection());
30
+ // 显示结果
31
+ console.log(chalk.bold('\n📊 Diagnostic Results:\n'));
32
+ let hasErrors = false;
33
+ let hasWarnings = false;
34
+ checks.forEach((check) => {
35
+ let icon = '';
36
+ let statusColor = chalk.white;
37
+ if (check.status === 'success') {
38
+ icon = '✅';
39
+ statusColor = chalk.green;
40
+ }
41
+ else if (check.status === 'warning') {
42
+ icon = '⚠️';
43
+ statusColor = chalk.yellow;
44
+ hasWarnings = true;
45
+ }
46
+ else {
47
+ icon = '❌';
48
+ statusColor = chalk.red;
49
+ hasErrors = true;
50
+ }
51
+ console.log(`${icon} ${chalk.bold(check.name)}: ${statusColor(check.message)}`);
52
+ if (options.verbose && check.details) {
53
+ console.log(chalk.dim(` ${check.details}`));
54
+ }
55
+ });
56
+ // 总结
57
+ console.log('');
58
+ if (hasErrors) {
59
+ console.log(chalk.red.bold('❌ Some critical issues were found. Please fix them before continuing.'));
60
+ }
61
+ else if (hasWarnings) {
62
+ console.log(chalk.yellow.bold('⚠️ Some warnings were found. Your environment should work but could be improved.'));
63
+ }
64
+ else {
65
+ console.log(chalk.green.bold('✨ Your ACIP development environment looks great!'));
66
+ }
67
+ console.log('');
68
+ });
69
+ }
70
+ async function checkNodeVersion() {
71
+ try {
72
+ const { stdout } = await execAsync('node --version');
73
+ const version = stdout.trim();
74
+ const majorVersion = parseInt(version.substring(1).split('.')[0]);
75
+ if (majorVersion >= 18) {
76
+ return {
77
+ name: 'Node.js',
78
+ status: 'success',
79
+ message: `${version} (✓ >= 18.0.0)`,
80
+ details: 'Node.js version meets requirements'
81
+ };
82
+ }
83
+ else {
84
+ return {
85
+ name: 'Node.js',
86
+ status: 'error',
87
+ message: `${version} (requires >= 18.0.0)`,
88
+ details: 'Please upgrade Node.js to version 18 or higher'
89
+ };
90
+ }
91
+ }
92
+ catch (error) {
93
+ return {
94
+ name: 'Node.js',
95
+ status: 'error',
96
+ message: 'Not found',
97
+ details: 'Node.js is not installed or not in PATH'
98
+ };
99
+ }
100
+ }
101
+ async function checkPackageManager() {
102
+ try {
103
+ // 优先检查pnpm
104
+ try {
105
+ const { stdout } = await execAsync('pnpm --version');
106
+ return {
107
+ name: 'Package Manager',
108
+ status: 'success',
109
+ message: `pnpm ${stdout.trim()}`,
110
+ details: 'Using pnpm (recommended for ACIP)'
111
+ };
112
+ }
113
+ catch {
114
+ // 检查npm
115
+ const { stdout } = await execAsync('npm --version');
116
+ return {
117
+ name: 'Package Manager',
118
+ status: 'warning',
119
+ message: `npm ${stdout.trim()}`,
120
+ details: 'Consider using pnpm for better performance'
121
+ };
122
+ }
123
+ }
124
+ catch (error) {
125
+ return {
126
+ name: 'Package Manager',
127
+ status: 'error',
128
+ message: 'Not found',
129
+ details: 'Neither pnpm nor npm found in PATH'
130
+ };
131
+ }
132
+ }
133
+ async function checkTypeScript() {
134
+ try {
135
+ const { stdout } = await execAsync('npx tsc --version');
136
+ return {
137
+ name: 'TypeScript',
138
+ status: 'success',
139
+ message: stdout.trim(),
140
+ details: 'TypeScript compiler available'
141
+ };
142
+ }
143
+ catch (error) {
144
+ return {
145
+ name: 'TypeScript',
146
+ status: 'warning',
147
+ message: 'Not found globally',
148
+ details: 'TypeScript can be installed locally in your project'
149
+ };
150
+ }
151
+ }
152
+ async function checkCurrentProject() {
153
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
154
+ if (await fs.pathExists(packageJsonPath)) {
155
+ try {
156
+ const packageJson = await fs.readJson(packageJsonPath);
157
+ const isACIPProject = packageJson.dependencies?.['@acip/sdk'] ||
158
+ packageJson.devDependencies?.['@acip/sdk'] ||
159
+ packageJson.name?.includes('acip');
160
+ if (isACIPProject) {
161
+ return {
162
+ name: 'Current Project',
163
+ status: 'success',
164
+ message: `${packageJson.name} (ACIP project)`,
165
+ details: 'You are in an ACIP project directory'
166
+ };
167
+ }
168
+ else {
169
+ return {
170
+ name: 'Current Project',
171
+ status: 'warning',
172
+ message: `${packageJson.name} (not an ACIP project)`,
173
+ details: 'Current directory is not an ACIP project'
174
+ };
175
+ }
176
+ }
177
+ catch {
178
+ return {
179
+ name: 'Current Project',
180
+ status: 'warning',
181
+ message: 'Invalid package.json',
182
+ details: 'package.json exists but cannot be read'
183
+ };
184
+ }
185
+ }
186
+ else {
187
+ return {
188
+ name: 'Current Project',
189
+ status: 'warning',
190
+ message: 'No project found',
191
+ details: 'Not in a Node.js project directory'
192
+ };
193
+ }
194
+ }
195
+ async function checkACIPCore() {
196
+ const corePaths = [
197
+ path.join(process.cwd(), 'node_modules', '@acip', 'core'),
198
+ path.join(process.cwd(), '../../core'), // monorepo相对路径
199
+ ];
200
+ for (const corePath of corePaths) {
201
+ if (await fs.pathExists(corePath)) {
202
+ return {
203
+ name: 'ACIP Core',
204
+ status: 'success',
205
+ message: 'Found',
206
+ details: `Located at ${corePath}`
207
+ };
208
+ }
209
+ }
210
+ return {
211
+ name: 'ACIP Core',
212
+ status: 'warning',
213
+ message: 'Not found',
214
+ details: 'ACIP core module not found in node_modules or monorepo'
215
+ };
216
+ }
217
+ async function checkEnvironmentVariables() {
218
+ const envVars = ['ACIP_API_KEY', 'DEFAULT_MODEL_ID', 'NODE_ENV'];
219
+ const found = envVars.filter(varName => process.env[varName]);
220
+ if (found.length === 0) {
221
+ return {
222
+ name: 'Environment Variables',
223
+ status: 'warning',
224
+ message: 'No ACIP env vars found',
225
+ details: 'Consider setting ACIP_API_KEY and other variables in .env'
226
+ };
227
+ }
228
+ else {
229
+ return {
230
+ name: 'Environment Variables',
231
+ status: 'success',
232
+ message: `${found.length} found: ${found.join(', ')}`,
233
+ details: 'Environment variables configured'
234
+ };
235
+ }
236
+ }
237
+ async function checkNetworkConnection() {
238
+ try {
239
+ // 简单的网络检查 - 尝试解析域名
240
+ const https = await import('https');
241
+ return new Promise((resolve) => {
242
+ const req = https.request('https://registry.npmjs.org/', { method: 'HEAD' }, (res) => {
243
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 400) {
244
+ resolve({
245
+ name: 'Network Connection',
246
+ status: 'success',
247
+ message: 'Online',
248
+ details: 'Can access npm registry'
249
+ });
250
+ }
251
+ else {
252
+ resolve({
253
+ name: 'Network Connection',
254
+ status: 'warning',
255
+ message: 'Limited',
256
+ details: `npm registry returned status ${res.statusCode}`
257
+ });
258
+ }
259
+ });
260
+ req.on('error', () => {
261
+ resolve({
262
+ name: 'Network Connection',
263
+ status: 'warning',
264
+ message: 'Offline or restricted',
265
+ details: 'Cannot access npm registry'
266
+ });
267
+ });
268
+ req.setTimeout(3000, () => {
269
+ req.destroy();
270
+ resolve({
271
+ name: 'Network Connection',
272
+ status: 'warning',
273
+ message: 'Timeout',
274
+ details: 'Network request timed out'
275
+ });
276
+ });
277
+ req.end();
278
+ });
279
+ }
280
+ catch (error) {
281
+ return {
282
+ name: 'Network Connection',
283
+ status: 'warning',
284
+ message: 'Cannot check',
285
+ details: 'Network check failed'
286
+ };
287
+ }
288
+ }
289
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function initCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6E1D"}
@@ -0,0 +1,80 @@
1
+ import path from 'path';
2
+ import inquirer from 'inquirer';
3
+ import chalk from 'chalk';
4
+ import { createProjectStructure } from '../utils/project.js';
5
+ export default function initCommand(program) {
6
+ program
7
+ .command('init [projectName]')
8
+ .description('Initialize a new ACIP project')
9
+ .option('--typescript', 'Use TypeScript (default)', true)
10
+ .option('--javascript', 'Use JavaScript instead of TypeScript')
11
+ .option('-f, --force', 'Overwrite existing files')
12
+ .option('--skip-prompts', 'Skip all prompts and use default values')
13
+ .option('-t, --template <name>', 'Specify a template (default: basic)', 'basic')
14
+ .action(async (projectName, options) => {
15
+ let finalProjectName = projectName;
16
+ let useTypeScript = options.javascript ? false : options.typescript;
17
+ // 如果没有提供项目名称且没有跳过提示,询问用户
18
+ if (!finalProjectName && !options.skipPrompts) {
19
+ const answers = await inquirer.prompt([
20
+ {
21
+ type: 'input',
22
+ name: 'projectName',
23
+ message: 'What is the name of your project?',
24
+ default: 'my-acip-project',
25
+ validate: (input) => {
26
+ if (/^[a-z0-9-]+$/.test(input))
27
+ return true;
28
+ return 'Project name must contain only lowercase letters, numbers, and hyphens.';
29
+ }
30
+ }
31
+ ]);
32
+ finalProjectName = answers.projectName;
33
+ }
34
+ else if (!finalProjectName) {
35
+ // 如果跳过提示则使用默认名称
36
+ finalProjectName = 'my-acip-project';
37
+ }
38
+ // 如果允许提示且没有明确指定JavaScript,询问语言偏好
39
+ if (!options.skipPrompts && !options.javascript && !options.typescript) {
40
+ const answers = await inquirer.prompt([
41
+ {
42
+ type: 'list',
43
+ name: 'language',
44
+ message: 'Which language would you like to use?',
45
+ choices: [
46
+ { name: 'TypeScript', value: 'typescript' },
47
+ { name: 'JavaScript', value: 'javascript' }
48
+ ],
49
+ default: 'typescript'
50
+ }
51
+ ]);
52
+ useTypeScript = answers.language === 'typescript';
53
+ }
54
+ // 确定项目路径
55
+ const projectPath = path.resolve(process.cwd(), finalProjectName);
56
+ console.log(chalk.blue(`\nCreating a new ACIP project in ${chalk.bold(projectPath)}`));
57
+ console.log(`Using ${chalk.bold(useTypeScript ? 'TypeScript' : 'JavaScript')}\n`);
58
+ try {
59
+ // 创建项目结构
60
+ await createProjectStructure({
61
+ projectName: finalProjectName,
62
+ projectPath,
63
+ useTypeScript,
64
+ template: options.template,
65
+ force: options.force
66
+ });
67
+ console.log(chalk.green('\n✅ Project created successfully!'));
68
+ console.log('\nNext steps:');
69
+ console.log(` cd ${finalProjectName}`);
70
+ console.log(' npm install');
71
+ console.log(' npm run dev\n');
72
+ console.log(`To learn more about ACIP, check out the documentation at ${chalk.cyan('https://acip.dev/docs')}`);
73
+ }
74
+ catch (error) {
75
+ console.error(chalk.red('\n❌ Failed to create project:'), error instanceof Error ? error.message : String(error));
76
+ process.exit(1);
77
+ }
78
+ });
79
+ }
80
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function inspectCommand(program: Command): void;
3
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyC7D"}
@@ -0,0 +1,69 @@
1
+ import chalk from 'chalk';
2
+ import { NodeClient, NodeType } from '@acip/core';
3
+ export default function inspectCommand(program) {
4
+ program
5
+ .command('inspect <deviceId>')
6
+ .description('Inspect a node\'s detailed capabilities and status')
7
+ .option('-g, --gateway <url>', 'Gateway URL', 'ws://localhost:51000/acip-node/admin-panel/auth=')
8
+ .option('-j, --json', 'Output as JSON')
9
+ .action(async (deviceId, options) => {
10
+ console.log(chalk.blue(`[CLI] Connecting to Gateway at ${options.gateway}...`));
11
+ const client = new NodeClient({
12
+ nodeType: NodeType.AdminPanel,
13
+ nodeName: 'ACIP-CLI-Inspector',
14
+ gatewayUrl: options.gateway || 'ws://localhost:51000/acip-node/admin-panel/auth='
15
+ });
16
+ try {
17
+ await client.connect();
18
+ console.log(chalk.green(`[CLI] Connected. Inspecting device: ${deviceId}`));
19
+ // 真实查询逻辑 (v1.2.0 基础设施化)
20
+ const devices = await client.queryRegistry({ deviceId });
21
+ const device = devices[0];
22
+ if (!device) {
23
+ console.error(chalk.red(`[CLI] Error: Device ${deviceId} not found in registry.`));
24
+ await client.disconnect();
25
+ process.exit(1);
26
+ }
27
+ if (options.json) {
28
+ console.log(JSON.stringify(device, null, 2));
29
+ }
30
+ else {
31
+ displayInspectResult(device);
32
+ }
33
+ await client.disconnect();
34
+ }
35
+ catch (error) {
36
+ console.error(chalk.red(`[CLI] Error: ${error instanceof Error ? error.message : String(error)}`));
37
+ process.exit(1);
38
+ }
39
+ });
40
+ }
41
+ function displayInspectResult(data) {
42
+ console.log('');
43
+ console.log(chalk.bold.cyan(`Device: ${data.nodeId}`));
44
+ console.log(`${chalk.dim('Name:')} ${data.nodeName}`);
45
+ console.log(`${chalk.dim('Type:')} ${data.nodeType}`);
46
+ console.log(`${chalk.dim('Status:')} ${data.status === 'authenticated' ? chalk.green('● Online') : chalk.red('○ Offline')}`);
47
+ console.log(`${chalk.dim('Last Seen:')} ${new Date(data.lastHeartbeat).toLocaleString()}`);
48
+ console.log('');
49
+ const caps = data.metadata?.capabilities || {};
50
+ console.log(chalk.bold.yellow('Capabilities:'));
51
+ console.log(` ${chalk.dim('├─ Compute Power:')} ${chalk.white(caps.computePower || 'Unknown')}`);
52
+ console.log(` ${chalk.dim('├─ Secure Signing:')} ${caps.secureSigning ? chalk.green('Yes') : chalk.red('No')}`);
53
+ console.log(` ${chalk.dim('└─ Modalities:')} ${chalk.white((caps.supportedModalities || []).join(', ') || 'None')}`);
54
+ console.log('');
55
+ console.log(chalk.bold.yellow('Loaded Models:'));
56
+ const models = caps.loadedModels || [];
57
+ if (models.length === 0) {
58
+ console.log(chalk.dim(' (No models loaded)'));
59
+ }
60
+ else {
61
+ models.forEach((model, index) => {
62
+ const isLast = index === models.length - 1;
63
+ const prefix = isLast ? ' └─' : ' ├─';
64
+ console.log(`${prefix} ${chalk.green(model.name)} ${chalk.dim(`(v${model.version}, ${model.type})`)}`);
65
+ });
66
+ }
67
+ console.log('');
68
+ }
69
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOlD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,qBAAqB,EAAE,aAAa,EAAE,kDAAkD,CAAC;SAChG,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAuB,EAAE,EAAE;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;QAEhF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;YAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;YAC7B,QAAQ,EAAE,oBAAoB;YAC9B,UAAU,EAAE,OAAO,CAAC,OAAO,IAAI,kDAAkD;SAClF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAE5E,wBAAwB;YACxB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,QAAQ,yBAAyB,CAAC,CAAC,CAAC;gBACnF,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAS;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7H,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjH,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;IAEtH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,KAAa,EAAE,EAAE;YAC3C,MAAM,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function listCommand(program: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuD1D"}
@@ -0,0 +1,118 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ export default function listCommand(program) {
5
+ program
6
+ .command('list [type]')
7
+ .alias('ls')
8
+ .description('List project resources (components, models, tools, config)')
9
+ .option('-v, --verbose', 'Show详细信息')
10
+ .option('-j, --json', 'Output as JSON')
11
+ .action(async (type, options) => {
12
+ const cwd = process.cwd();
13
+ const srcDir = path.join(cwd, 'src');
14
+ // 检查是否在项目目录中
15
+ if (!await fs.pathExists(srcDir)) {
16
+ console.log(chalk.yellow('Not in an ACIP project directory.'));
17
+ console.log(chalk.dim('Run this command from the root of an ACIP project.'));
18
+ return;
19
+ }
20
+ const types = type ? [type] : ['components', 'models', 'tools', 'config'];
21
+ const results = {};
22
+ for (const resourceType of types) {
23
+ const typeDir = path.join(srcDir, resourceType);
24
+ if (await fs.pathExists(typeDir)) {
25
+ const files = await fs.readdir(typeDir);
26
+ const resources = files
27
+ .filter(file => file.endsWith('.ts') || file.endsWith('.js'))
28
+ .map(file => {
29
+ const name = file.replace(/\.(ts|js)$/, '');
30
+ const filePath = path.join(typeDir, file);
31
+ const stats = fs.statSync(filePath);
32
+ return {
33
+ name,
34
+ file,
35
+ path: path.relative(cwd, filePath),
36
+ size: stats.size,
37
+ modified: stats.mtime
38
+ };
39
+ });
40
+ results[resourceType] = resources;
41
+ }
42
+ else {
43
+ results[resourceType] = [];
44
+ }
45
+ }
46
+ // 输出结果
47
+ if (options.json) {
48
+ console.log(JSON.stringify(results, null, 2));
49
+ }
50
+ else {
51
+ displayResults(results, options.verbose || false);
52
+ }
53
+ });
54
+ }
55
+ function displayResults(results, verbose) {
56
+ let totalCount = 0;
57
+ Object.entries(results).forEach(([type, resources]) => {
58
+ const count = resources.length;
59
+ totalCount += count;
60
+ console.log('');
61
+ console.log(chalk.bold.blue(`${type.charAt(0).toUpperCase() + type.slice(1)} (${count})`));
62
+ if (count === 0) {
63
+ console.log(chalk.dim(' No files found'));
64
+ }
65
+ else {
66
+ resources.forEach((resource, index) => {
67
+ const isLast = index === resources.length - 1;
68
+ const prefix = isLast ? '└─' : '├─';
69
+ if (verbose) {
70
+ console.log(` ${prefix} ${chalk.green(resource.name)}`);
71
+ console.log(` ${isLast ? ' ' : '│ '} ${chalk.dim('File:')} ${resource.file}`);
72
+ console.log(` ${isLast ? ' ' : '│ '} ${chalk.dim('Path:')} ${resource.path}`);
73
+ console.log(` ${isLast ? ' ' : '│ '} ${chalk.dim('Size:')} ${formatBytes(resource.size)}`);
74
+ console.log(` ${isLast ? ' ' : '│ '} ${chalk.dim('Modified:')} ${formatDate(resource.modified)}`);
75
+ if (!isLast)
76
+ console.log(' │');
77
+ }
78
+ else {
79
+ console.log(` ${prefix} ${chalk.green(resource.name)} ${chalk.dim(`(${resource.file})`)}`);
80
+ }
81
+ });
82
+ }
83
+ });
84
+ console.log('');
85
+ console.log(chalk.bold(`Total: ${totalCount} resource${totalCount !== 1 ? 's' : ''}`));
86
+ console.log('');
87
+ }
88
+ function formatBytes(bytes) {
89
+ if (bytes < 1024)
90
+ return `${bytes} B`;
91
+ if (bytes < 1024 * 1024)
92
+ return `${(bytes / 1024).toFixed(2)} KB`;
93
+ return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
94
+ }
95
+ function formatDate(date) {
96
+ const now = new Date();
97
+ const diff = now.getTime() - date.getTime();
98
+ const seconds = Math.floor(diff / 1000);
99
+ const minutes = Math.floor(seconds / 60);
100
+ const hours = Math.floor(minutes / 60);
101
+ const days = Math.floor(hours / 24);
102
+ if (days > 7) {
103
+ return date.toLocaleDateString();
104
+ }
105
+ else if (days > 0) {
106
+ return `${days} day${days !== 1 ? 's' : ''} ago`;
107
+ }
108
+ else if (hours > 0) {
109
+ return `${hours} hour${hours !== 1 ? 's' : ''} ago`;
110
+ }
111
+ else if (minutes > 0) {
112
+ return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`;
113
+ }
114
+ else {
115
+ return 'Just now';
116
+ }
117
+ }
118
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function monitorCommand(program: Command): void;
3
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuC7D"}