needware-cli 1.0.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.
- package/.editorconfig +21 -0
- package/AGENT_COMMAND_SUMMARY.md +364 -0
- package/CHANGELOG.md +138 -0
- package/FEATURE_INTERACTIVE_MODE.md +303 -0
- package/INTERACTIVE_EXAMPLE.md +305 -0
- package/LICENSE +22 -0
- package/PROJECT_SUMMARY.md +435 -0
- package/QUICK_START.md +216 -0
- package/README.md +310 -0
- package/SETUP.md +315 -0
- package/bin/cli.js +49 -0
- package/config/default.json +20 -0
- package/dist/commands/agent.d.ts +38 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +444 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/config.d.ts +48 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +197 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/example.d.ts +32 -0
- package/dist/commands/example.d.ts.map +1 -0
- package/dist/commands/example.js +154 -0
- package/dist/commands/example.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +15 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +25 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +158 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/core/cli.d.ts +37 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +160 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/command.d.ts +41 -0
- package/dist/core/command.d.ts.map +1 -0
- package/dist/core/command.js +87 -0
- package/dist/core/command.js.map +1 -0
- package/dist/core/logger.d.ts +30 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +163 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/dist/sdk/base-sdk.d.ts +61 -0
- package/dist/sdk/base-sdk.d.ts.map +1 -0
- package/dist/sdk/base-sdk.js +71 -0
- package/dist/sdk/base-sdk.js.map +1 -0
- package/dist/sdk/example-sdk.d.ts +40 -0
- package/dist/sdk/example-sdk.d.ts.map +1 -0
- package/dist/sdk/example-sdk.js +168 -0
- package/dist/sdk/example-sdk.js.map +1 -0
- package/dist/sdk/index.d.ts +59 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +169 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/types/command.d.ts +34 -0
- package/dist/types/command.d.ts.map +1 -0
- package/dist/types/command.js +13 -0
- package/dist/types/command.js.map +1 -0
- package/dist/types/config.d.ts +30 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/error.d.ts +24 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +33 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/sdk.d.ts +21 -0
- package/dist/types/sdk.d.ts.map +1 -0
- package/dist/types/sdk.js +6 -0
- package/dist/types/sdk.js.map +1 -0
- package/dist/utils/config.d.ts +59 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +237 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file.d.ts +66 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +162 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/validator.d.ts +66 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +120 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 主类
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from './command';
|
|
5
|
+
import { Logger } from './logger';
|
|
6
|
+
export declare class CLI {
|
|
7
|
+
private program;
|
|
8
|
+
private logger;
|
|
9
|
+
private commands;
|
|
10
|
+
private version;
|
|
11
|
+
constructor(version: string, logger?: Logger);
|
|
12
|
+
/**
|
|
13
|
+
* 设置程序基本信息
|
|
14
|
+
*/
|
|
15
|
+
private setupProgram;
|
|
16
|
+
/**
|
|
17
|
+
* 注册命令
|
|
18
|
+
*/
|
|
19
|
+
registerCommand(command: Command): void;
|
|
20
|
+
/**
|
|
21
|
+
* 运行 CLI
|
|
22
|
+
*/
|
|
23
|
+
run(argv?: string[]): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 错误处理
|
|
26
|
+
*/
|
|
27
|
+
handleError(error: unknown): void;
|
|
28
|
+
/**
|
|
29
|
+
* 获取 Logger 实例
|
|
30
|
+
*/
|
|
31
|
+
getLogger(): Logger;
|
|
32
|
+
/**
|
|
33
|
+
* 获取已注册的命令
|
|
34
|
+
*/
|
|
35
|
+
getCommands(): Map<string, Command>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAY,MAAM,UAAU,CAAC;AAI5C,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAS5C;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAyDvC;;OAEG;IACG,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAmCjC;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;CAGpC"}
|
package/dist/core/cli.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI 主类
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CLI = void 0;
|
|
10
|
+
const commander_1 = require("commander");
|
|
11
|
+
const logger_1 = require("./logger");
|
|
12
|
+
const types_1 = require("../types");
|
|
13
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
|
+
class CLI {
|
|
15
|
+
program;
|
|
16
|
+
logger;
|
|
17
|
+
commands;
|
|
18
|
+
version;
|
|
19
|
+
constructor(version, logger) {
|
|
20
|
+
this.version = version;
|
|
21
|
+
this.logger = logger || new logger_1.Logger();
|
|
22
|
+
this.program = new commander_1.Command();
|
|
23
|
+
this.commands = new Map();
|
|
24
|
+
this.setupProgram();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 设置程序基本信息
|
|
28
|
+
*/
|
|
29
|
+
setupProgram() {
|
|
30
|
+
this.program
|
|
31
|
+
.name('needware-cli')
|
|
32
|
+
.description('一个功能强大的 Node.js 命令行工具')
|
|
33
|
+
.version(this.version, '-v, --version', '显示版本信息')
|
|
34
|
+
.option('-V, --verbose', '详细输出模式')
|
|
35
|
+
.option('-q, --quiet', '静默模式')
|
|
36
|
+
.option('-c, --config <path>', '指定配置文件路径');
|
|
37
|
+
// 全局选项处理
|
|
38
|
+
this.program.hook('preAction', (thisCommand) => {
|
|
39
|
+
const opts = thisCommand.opts();
|
|
40
|
+
if (opts.verbose) {
|
|
41
|
+
this.logger.setLevel(logger_1.LogLevel.DEBUG);
|
|
42
|
+
}
|
|
43
|
+
else if (opts.quiet) {
|
|
44
|
+
this.logger.setLevel(logger_1.LogLevel.ERROR);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 注册命令
|
|
50
|
+
*/
|
|
51
|
+
registerCommand(command) {
|
|
52
|
+
this.commands.set(command.name, command);
|
|
53
|
+
const commandInstance = this.program.command(command.name);
|
|
54
|
+
commandInstance.description(command.description);
|
|
55
|
+
if (command.aliases) {
|
|
56
|
+
commandInstance.aliases(command.aliases);
|
|
57
|
+
}
|
|
58
|
+
// 为 agent 命令添加特定选项
|
|
59
|
+
if (command.name === 'agent') {
|
|
60
|
+
commandInstance
|
|
61
|
+
.argument('[prompt]', 'The task prompt for the AI agent (optional in interactive mode)')
|
|
62
|
+
.option('-i, --interactive', 'Enable interactive multi-turn conversation mode')
|
|
63
|
+
.option('--working-dir <path>', 'Specify the working directory')
|
|
64
|
+
.option('--additional-dirs <paths>', 'Specify additional directories (comma-separated)')
|
|
65
|
+
.option('--api-key <key>', 'Anthropic API Key (overrides ANTHROPIC_API_KEY env var)')
|
|
66
|
+
.option('--base-url <url>', 'Anthropic API Base URL (overrides ANTHROPIC_BASE_URL env var)');
|
|
67
|
+
}
|
|
68
|
+
commandInstance.action(async (...args) => {
|
|
69
|
+
try {
|
|
70
|
+
const options = args[args.length - 1];
|
|
71
|
+
const commandArgs = args.slice(0, -1);
|
|
72
|
+
const globalOpts = this.program.opts();
|
|
73
|
+
// 合并全局选项和命令选项
|
|
74
|
+
const mergedOptions = {
|
|
75
|
+
...globalOpts,
|
|
76
|
+
...options,
|
|
77
|
+
args: commandArgs,
|
|
78
|
+
};
|
|
79
|
+
const result = await command.run(mergedOptions);
|
|
80
|
+
if (result.status === 'success') {
|
|
81
|
+
if (result.message) {
|
|
82
|
+
this.logger.success(result.message);
|
|
83
|
+
}
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
if (result.message) {
|
|
88
|
+
this.logger.error(result.message);
|
|
89
|
+
}
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
this.handleError(error);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 运行 CLI
|
|
101
|
+
*/
|
|
102
|
+
async run(argv) {
|
|
103
|
+
try {
|
|
104
|
+
await this.program.parseAsync(argv || process.argv);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.handleError(error);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 错误处理
|
|
113
|
+
*/
|
|
114
|
+
handleError(error) {
|
|
115
|
+
if (error instanceof types_1.CLIError) {
|
|
116
|
+
// 自定义 CLI 错误
|
|
117
|
+
console.error(chalk_1.default.red(`\n❌ Error: ${error.message}\n`));
|
|
118
|
+
if (error.type !== types_1.ErrorType.UNKNOWN) {
|
|
119
|
+
console.error(chalk_1.default.gray(`Type: ${error.type}\n`));
|
|
120
|
+
}
|
|
121
|
+
if (error.suggestions.length > 0) {
|
|
122
|
+
console.error(chalk_1.default.yellow('Suggestions:'));
|
|
123
|
+
error.suggestions.forEach((suggestion) => {
|
|
124
|
+
console.error(chalk_1.default.yellow(` • ${suggestion}`));
|
|
125
|
+
});
|
|
126
|
+
console.error();
|
|
127
|
+
}
|
|
128
|
+
this.logger.error(error.message, {
|
|
129
|
+
type: error.type,
|
|
130
|
+
stack: error.stack,
|
|
131
|
+
context: error.context,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else if (error instanceof Error) {
|
|
135
|
+
// 标准错误
|
|
136
|
+
console.error(chalk_1.default.red(`\n❌ Error: ${error.message}\n`));
|
|
137
|
+
this.logger.error(error.message, { stack: error.stack });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// 未知错误
|
|
141
|
+
console.error(chalk_1.default.red('\n❌ An unknown error occurred\n'));
|
|
142
|
+
this.logger.error('Unknown error', { error });
|
|
143
|
+
}
|
|
144
|
+
console.error(chalk_1.default.gray('For more help, run: needware-cli --help\n'));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 获取 Logger 实例
|
|
148
|
+
*/
|
|
149
|
+
getLogger() {
|
|
150
|
+
return this.logger;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 获取已注册的命令
|
|
154
|
+
*/
|
|
155
|
+
getCommands() {
|
|
156
|
+
return this.commands;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.CLI = CLI;
|
|
160
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 命令基类
|
|
3
|
+
*/
|
|
4
|
+
import { CommandOptions, CommandResult } from '../types';
|
|
5
|
+
import { Logger } from './logger';
|
|
6
|
+
export declare abstract class Command {
|
|
7
|
+
abstract readonly name: string;
|
|
8
|
+
abstract readonly description: string;
|
|
9
|
+
readonly aliases?: string[];
|
|
10
|
+
protected logger: Logger;
|
|
11
|
+
constructor(logger: Logger);
|
|
12
|
+
/**
|
|
13
|
+
* 执行命令
|
|
14
|
+
*/
|
|
15
|
+
abstract execute(options: CommandOptions): Promise<CommandResult>;
|
|
16
|
+
/**
|
|
17
|
+
* 验证命令选项
|
|
18
|
+
*/
|
|
19
|
+
validate(_options: CommandOptions): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 命令执行前的钩子
|
|
22
|
+
*/
|
|
23
|
+
beforeExecute(_options: CommandOptions): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 命令执行后的钩子
|
|
26
|
+
*/
|
|
27
|
+
afterExecute(_result: CommandResult): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* 运行命令(包含完整生命周期)
|
|
30
|
+
*/
|
|
31
|
+
run(options: CommandOptions): Promise<CommandResult>;
|
|
32
|
+
/**
|
|
33
|
+
* 创建成功结果
|
|
34
|
+
*/
|
|
35
|
+
protected success(message?: string, data?: any): CommandResult;
|
|
36
|
+
/**
|
|
37
|
+
* 创建错误结果
|
|
38
|
+
*/
|
|
39
|
+
protected error(message: string, error?: Error): CommandResult;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/core/command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,8BAAsB,OAAO;IAC3B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEb,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAEjE;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAK3C;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzD;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAgC1D;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,aAAa;IAQ9D;;OAEG;IACH,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa;CAO/D"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 命令基类
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Command = void 0;
|
|
7
|
+
const types_1 = require("../types");
|
|
8
|
+
class Command {
|
|
9
|
+
aliases;
|
|
10
|
+
logger;
|
|
11
|
+
constructor(logger) {
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 验证命令选项
|
|
16
|
+
*/
|
|
17
|
+
validate(_options) {
|
|
18
|
+
// 默认实现,子类可以覆盖
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 命令执行前的钩子
|
|
23
|
+
*/
|
|
24
|
+
async beforeExecute(_options) {
|
|
25
|
+
// 默认实现为空,子类可以覆盖
|
|
26
|
+
this.logger.debug(`Executing command: ${this.name}`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 命令执行后的钩子
|
|
30
|
+
*/
|
|
31
|
+
async afterExecute(_result) {
|
|
32
|
+
// 默认实现为空,子类可以覆盖
|
|
33
|
+
this.logger.debug(`Command ${this.name} completed`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 运行命令(包含完整生命周期)
|
|
37
|
+
*/
|
|
38
|
+
async run(options) {
|
|
39
|
+
try {
|
|
40
|
+
// 验证
|
|
41
|
+
if (!this.validate(options)) {
|
|
42
|
+
return {
|
|
43
|
+
status: types_1.CommandStatus.ERROR,
|
|
44
|
+
message: 'Invalid command options',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// 执行前钩子
|
|
48
|
+
await this.beforeExecute(options);
|
|
49
|
+
// 执行命令
|
|
50
|
+
const result = await this.execute(options);
|
|
51
|
+
// 执行后钩子
|
|
52
|
+
await this.afterExecute(result);
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
57
|
+
this.logger.error(`Command ${this.name} failed: ${errorMessage}`);
|
|
58
|
+
return {
|
|
59
|
+
status: types_1.CommandStatus.ERROR,
|
|
60
|
+
message: errorMessage,
|
|
61
|
+
error: error instanceof Error ? error : new Error(errorMessage),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 创建成功结果
|
|
67
|
+
*/
|
|
68
|
+
success(message, data) {
|
|
69
|
+
return {
|
|
70
|
+
status: types_1.CommandStatus.SUCCESS,
|
|
71
|
+
message,
|
|
72
|
+
data,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 创建错误结果
|
|
77
|
+
*/
|
|
78
|
+
error(message, error) {
|
|
79
|
+
return {
|
|
80
|
+
status: types_1.CommandStatus.ERROR,
|
|
81
|
+
message,
|
|
82
|
+
error,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.Command = Command;
|
|
87
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/core/command.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,oCAAwE;AAGxE,MAAsB,OAAO;IAGlB,OAAO,CAAY;IAElB,MAAM,CAAS;IAEzB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAOD;;OAEG;IACH,QAAQ,CAAC,QAAwB;QAC/B,cAAc;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAwB;QAC1C,gBAAgB;QAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAsB;QACvC,gBAAgB;QAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,OAAuB;QAC/B,IAAI,CAAC;YACH,KAAK;YACL,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,MAAM,EAAE,qBAAa,CAAC,KAAK;oBAC3B,OAAO,EAAE,yBAAyB;iBACnC,CAAC;YACJ,CAAC;YAED,QAAQ;YACR,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAElC,OAAO;YACP,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE3C,QAAQ;YACR,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAEhC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,YAAY,YAAY,EAAE,CAAC,CAAC;YAElE,OAAO;gBACL,MAAM,EAAE,qBAAa,CAAC,KAAK;gBAC3B,OAAO,EAAE,YAAY;gBACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC;aAChE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACO,OAAO,CAAC,OAAgB,EAAE,IAAU;QAC5C,OAAO;YACL,MAAM,EAAE,qBAAa,CAAC,OAAO;YAC7B,OAAO;YACP,IAAI;SACL,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,OAAe,EAAE,KAAa;QAC5C,OAAO;YACL,MAAM,EAAE,qBAAa,CAAC,KAAK;YAC3B,OAAO;YACP,KAAK;SACN,CAAC;IACJ,CAAC;CACF;AAhGD,0BAgGC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日志管理器
|
|
3
|
+
*/
|
|
4
|
+
export declare enum LogLevel {
|
|
5
|
+
DEBUG = "debug",
|
|
6
|
+
INFO = "info",
|
|
7
|
+
WARN = "warn",
|
|
8
|
+
ERROR = "error",
|
|
9
|
+
SUCCESS = "success"
|
|
10
|
+
}
|
|
11
|
+
export declare class Logger {
|
|
12
|
+
private logLevel;
|
|
13
|
+
private logFile?;
|
|
14
|
+
private colorOutput;
|
|
15
|
+
constructor(logLevel?: LogLevel, logFile?: string, colorOutput?: boolean);
|
|
16
|
+
private ensureLogDirectory;
|
|
17
|
+
private shouldLog;
|
|
18
|
+
private formatMessage;
|
|
19
|
+
private writeToFile;
|
|
20
|
+
private log;
|
|
21
|
+
debug(message: string, context?: any): void;
|
|
22
|
+
info(message: string, context?: any): void;
|
|
23
|
+
warn(message: string, context?: any): void;
|
|
24
|
+
error(message: string, context?: any): void;
|
|
25
|
+
success(message: string, context?: any): void;
|
|
26
|
+
setLevel(level: LogLevel): void;
|
|
27
|
+
setColorOutput(enabled: boolean): void;
|
|
28
|
+
}
|
|
29
|
+
export declare const logger: Logger;
|
|
30
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,oBAAY,QAAQ;IAClB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AASD,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,WAAW,CAAU;gBAEjB,QAAQ,GAAE,QAAwB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,UAAO;IAUpF,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,GAAG;IAoBX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI1C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI1C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI3C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI7C,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAGvC;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 日志管理器
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.logger = exports.Logger = exports.LogLevel = void 0;
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
var LogLevel;
|
|
47
|
+
(function (LogLevel) {
|
|
48
|
+
LogLevel["DEBUG"] = "debug";
|
|
49
|
+
LogLevel["INFO"] = "info";
|
|
50
|
+
LogLevel["WARN"] = "warn";
|
|
51
|
+
LogLevel["ERROR"] = "error";
|
|
52
|
+
LogLevel["SUCCESS"] = "success";
|
|
53
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
54
|
+
class Logger {
|
|
55
|
+
logLevel;
|
|
56
|
+
logFile;
|
|
57
|
+
colorOutput;
|
|
58
|
+
constructor(logLevel = LogLevel.INFO, logFile, colorOutput = true) {
|
|
59
|
+
this.logLevel = logLevel;
|
|
60
|
+
this.logFile = logFile;
|
|
61
|
+
this.colorOutput = colorOutput;
|
|
62
|
+
if (this.logFile) {
|
|
63
|
+
this.ensureLogDirectory();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
ensureLogDirectory() {
|
|
67
|
+
if (!this.logFile)
|
|
68
|
+
return;
|
|
69
|
+
const dir = path.dirname(this.logFile);
|
|
70
|
+
if (!fs.existsSync(dir)) {
|
|
71
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
shouldLog(level) {
|
|
75
|
+
// SUCCESS should always be shown, like INFO
|
|
76
|
+
if (level === LogLevel.SUCCESS) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
const levels = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR];
|
|
80
|
+
const currentIndex = levels.indexOf(this.logLevel);
|
|
81
|
+
const messageIndex = levels.indexOf(level);
|
|
82
|
+
return messageIndex >= currentIndex;
|
|
83
|
+
}
|
|
84
|
+
formatMessage(level, message) {
|
|
85
|
+
const timestamp = new Date().toISOString().replace('T', ' ').substring(0, 19);
|
|
86
|
+
const levelStr = `[${level.toUpperCase()}]`;
|
|
87
|
+
if (!this.colorOutput) {
|
|
88
|
+
return `${levelStr} ${timestamp} - ${message}`;
|
|
89
|
+
}
|
|
90
|
+
let coloredLevel = levelStr;
|
|
91
|
+
switch (level) {
|
|
92
|
+
case LogLevel.DEBUG:
|
|
93
|
+
coloredLevel = chalk_1.default.gray(levelStr);
|
|
94
|
+
break;
|
|
95
|
+
case LogLevel.INFO:
|
|
96
|
+
coloredLevel = chalk_1.default.blue(levelStr);
|
|
97
|
+
break;
|
|
98
|
+
case LogLevel.WARN:
|
|
99
|
+
coloredLevel = chalk_1.default.yellow(levelStr);
|
|
100
|
+
break;
|
|
101
|
+
case LogLevel.ERROR:
|
|
102
|
+
coloredLevel = chalk_1.default.red(levelStr);
|
|
103
|
+
break;
|
|
104
|
+
case LogLevel.SUCCESS:
|
|
105
|
+
coloredLevel = chalk_1.default.green(levelStr);
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
return `${coloredLevel} ${chalk_1.default.gray(timestamp)} - ${message}`;
|
|
109
|
+
}
|
|
110
|
+
writeToFile(entry) {
|
|
111
|
+
if (!this.logFile)
|
|
112
|
+
return;
|
|
113
|
+
try {
|
|
114
|
+
const line = JSON.stringify(entry) + '\n';
|
|
115
|
+
fs.appendFileSync(this.logFile, line, 'utf8');
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Silently fail to avoid recursive logging
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
log(level, message, context) {
|
|
122
|
+
if (!this.shouldLog(level))
|
|
123
|
+
return;
|
|
124
|
+
const formatted = this.formatMessage(level, message);
|
|
125
|
+
console.log(formatted);
|
|
126
|
+
if (context) {
|
|
127
|
+
console.log(chalk_1.default.gray(JSON.stringify(context, null, 2)));
|
|
128
|
+
}
|
|
129
|
+
// Write to file
|
|
130
|
+
const entry = {
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
level,
|
|
133
|
+
message,
|
|
134
|
+
...(context && { context }),
|
|
135
|
+
};
|
|
136
|
+
this.writeToFile(entry);
|
|
137
|
+
}
|
|
138
|
+
debug(message, context) {
|
|
139
|
+
this.log(LogLevel.DEBUG, message, context);
|
|
140
|
+
}
|
|
141
|
+
info(message, context) {
|
|
142
|
+
this.log(LogLevel.INFO, message, context);
|
|
143
|
+
}
|
|
144
|
+
warn(message, context) {
|
|
145
|
+
this.log(LogLevel.WARN, message, context);
|
|
146
|
+
}
|
|
147
|
+
error(message, context) {
|
|
148
|
+
this.log(LogLevel.ERROR, message, context);
|
|
149
|
+
}
|
|
150
|
+
success(message, context) {
|
|
151
|
+
this.log(LogLevel.SUCCESS, message, context);
|
|
152
|
+
}
|
|
153
|
+
setLevel(level) {
|
|
154
|
+
this.logLevel = level;
|
|
155
|
+
}
|
|
156
|
+
setColorOutput(enabled) {
|
|
157
|
+
this.colorOutput = enabled;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.Logger = Logger;
|
|
161
|
+
// 导出单例实例
|
|
162
|
+
exports.logger = new Logger();
|
|
163
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Needware CLI 主入口
|
|
3
|
+
*/
|
|
4
|
+
import { CLI } from './core/cli';
|
|
5
|
+
import { Logger } from './core/logger';
|
|
6
|
+
import { ConfigManager } from './utils/config';
|
|
7
|
+
import { SDKManager } from './sdk';
|
|
8
|
+
export { CLI, Logger, ConfigManager, SDKManager };
|
|
9
|
+
export * from './types';
|
|
10
|
+
export * from './commands';
|
|
11
|
+
export * from './sdk';
|
|
12
|
+
export { Command } from './core/command';
|
|
13
|
+
export { Validator } from './utils/validator';
|
|
14
|
+
export { FileUtils } from './utils/file';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,MAAM,EAAY,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAc,MAAM,OAAO,CAAC;AA6F/C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAClD,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|