yuangs 1.3.38 → 1.3.41

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 (57) hide show
  1. package/README.md +44 -0
  2. package/dist/ai/client.d.ts +9 -0
  3. package/dist/ai/client.js +118 -0
  4. package/dist/ai/client.js.map +1 -0
  5. package/dist/ai/prompt.d.ts +3 -0
  6. package/dist/ai/prompt.js +56 -0
  7. package/dist/ai/prompt.js.map +1 -0
  8. package/dist/ai/types.d.ts +5 -0
  9. package/dist/ai/types.js +3 -0
  10. package/dist/ai/types.js.map +1 -0
  11. package/dist/cli.d.ts +2 -0
  12. package/dist/cli.js +125 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/handleAIChat.d.ts +1 -0
  15. package/dist/commands/handleAIChat.js +92 -0
  16. package/dist/commands/handleAIChat.js.map +1 -0
  17. package/dist/commands/handleAICommand.d.ts +4 -0
  18. package/dist/commands/handleAICommand.js +97 -0
  19. package/dist/commands/handleAICommand.js.map +1 -0
  20. package/dist/commands/handleConfig.d.ts +1 -0
  21. package/dist/commands/handleConfig.js +73 -0
  22. package/dist/commands/handleConfig.js.map +1 -0
  23. package/dist/core/apps.d.ts +7 -0
  24. package/dist/core/apps.js +64 -0
  25. package/dist/core/apps.js.map +1 -0
  26. package/dist/core/autofix.d.ts +3 -0
  27. package/dist/core/autofix.js +24 -0
  28. package/dist/core/autofix.js.map +1 -0
  29. package/dist/core/executor.d.ts +6 -0
  30. package/dist/core/executor.js +28 -0
  31. package/dist/core/executor.js.map +1 -0
  32. package/dist/core/macros.d.ts +9 -0
  33. package/dist/core/macros.js +51 -0
  34. package/dist/core/macros.js.map +1 -0
  35. package/dist/core/os.d.ts +7 -0
  36. package/dist/core/os.js +36 -0
  37. package/dist/core/os.js.map +1 -0
  38. package/dist/core/risk.d.ts +1 -0
  39. package/dist/core/risk.js +11 -0
  40. package/dist/core/risk.js.map +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +3 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/utils/confirm.d.ts +1 -0
  45. package/dist/utils/confirm.js +21 -0
  46. package/dist/utils/confirm.js.map +1 -0
  47. package/dist/utils/history.d.ts +10 -0
  48. package/dist/utils/history.js +31 -0
  49. package/dist/utils/history.js.map +1 -0
  50. package/package.json +25 -9
  51. package/cli.js +0 -560
  52. package/index.js +0 -361
  53. package/test/index.test.js +0 -78
  54. package/test/macros.test.js +0 -91
  55. package/yuangs.config.example.json +0 -11
  56. package/yuangs.config.example.yaml +0 -23
  57. package/yuangs.config.json +0 -9
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleConfig = handleConfig;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const CONFIG_FILE = path_1.default.join(os_1.default.homedir(), '.yuangs.json');
12
+ function handleConfig(args) {
13
+ const action = args[0]; // get, set, list
14
+ if (!action || action === 'list') {
15
+ const config = readConfig();
16
+ console.log(chalk_1.default.bold.cyan('\n⚙️ 当前配置 (~/.yuangs.json):\n'));
17
+ if (Object.keys(config).length === 0) {
18
+ console.log(chalk_1.default.gray(' (配置文件不存在或为空)'));
19
+ }
20
+ else {
21
+ Object.entries(config).forEach(([key, value]) => {
22
+ console.log(` ${chalk_1.default.white(key)}: ${chalk_1.default.green(value)}`);
23
+ });
24
+ }
25
+ console.log('\n使用方法:');
26
+ console.log(chalk_1.default.gray(' yuangs config set <key> <value>'));
27
+ console.log(chalk_1.default.gray(' yuangs config get <key>\n'));
28
+ return;
29
+ }
30
+ if (action === 'set') {
31
+ const key = args[1];
32
+ const value = args[2];
33
+ if (!key || !value) {
34
+ console.log(chalk_1.default.red('错误: 请提供 key 和 value。例如: yuangs config set defaultModel Assistant'));
35
+ return;
36
+ }
37
+ const config = readConfig();
38
+ config[key] = value;
39
+ writeConfig(config);
40
+ console.log(chalk_1.default.green(`✓ 已将 ${key} 设置为 ${value}`));
41
+ return;
42
+ }
43
+ if (action === 'get') {
44
+ const key = args[1];
45
+ if (!key) {
46
+ console.log(chalk_1.default.red('错误: 请提供 key。例如: yuangs config get defaultModel'));
47
+ return;
48
+ }
49
+ const config = readConfig();
50
+ if (config[key] !== undefined) {
51
+ console.log(config[key]);
52
+ }
53
+ else {
54
+ console.log(chalk_1.default.yellow(`配置项 ${key} 不存在`));
55
+ }
56
+ return;
57
+ }
58
+ }
59
+ function readConfig() {
60
+ if (fs_1.default.existsSync(CONFIG_FILE)) {
61
+ try {
62
+ return JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, 'utf8'));
63
+ }
64
+ catch (e) {
65
+ return {};
66
+ }
67
+ }
68
+ return {};
69
+ }
70
+ function writeConfig(config) {
71
+ fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
72
+ }
73
+ //# sourceMappingURL=handleConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleConfig.js","sourceRoot":"","sources":["../../src/commands/handleConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const DEFAULT_APPS: {
2
+ shici: string;
3
+ dict: string;
4
+ pong: string;
5
+ };
6
+ export declare function loadAppsConfig(): Record<string, string>;
7
+ export declare function openUrl(url: string): void;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_APPS = void 0;
7
+ exports.loadAppsConfig = loadAppsConfig;
8
+ exports.openUrl = openUrl;
9
+ const child_process_1 = require("child_process");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const js_yaml_1 = __importDefault(require("js-yaml"));
13
+ const os_1 = __importDefault(require("os"));
14
+ exports.DEFAULT_APPS = {
15
+ shici: 'https://wealth.want.biz/shici/index.html',
16
+ dict: 'https://wealth.want.biz/pages/dict.html',
17
+ pong: 'https://wealth.want.biz/pages/pong.html'
18
+ };
19
+ function loadAppsConfig() {
20
+ const configPaths = [
21
+ path_1.default.join(process.cwd(), 'yuangs.config.json'),
22
+ path_1.default.join(process.cwd(), 'yuangs.config.yaml'),
23
+ path_1.default.join(process.cwd(), 'yuangs.config.yml'),
24
+ path_1.default.join(process.cwd(), '.yuangs.json'),
25
+ path_1.default.join(process.cwd(), '.yuangs.yaml'),
26
+ path_1.default.join(process.cwd(), '.yuangs.yml'),
27
+ path_1.default.join(os_1.default.homedir(), '.yuangs.json'),
28
+ path_1.default.join(os_1.default.homedir(), '.yuangs.yaml'),
29
+ path_1.default.join(os_1.default.homedir(), '.yuangs.yml'),
30
+ ];
31
+ for (const configPath of configPaths) {
32
+ if (fs_1.default.existsSync(configPath)) {
33
+ try {
34
+ const configContent = fs_1.default.readFileSync(configPath, 'utf8');
35
+ let config;
36
+ if (configPath.endsWith('.yaml') || configPath.endsWith('.yml')) {
37
+ config = js_yaml_1.default.load(configContent);
38
+ }
39
+ else {
40
+ config = JSON.parse(configContent);
41
+ }
42
+ return config.apps || config;
43
+ }
44
+ catch (error) { }
45
+ }
46
+ }
47
+ return exports.DEFAULT_APPS;
48
+ }
49
+ function openUrl(url) {
50
+ let command;
51
+ switch (process.platform) {
52
+ case 'darwin':
53
+ command = `open "${url}"`;
54
+ break;
55
+ case 'win32':
56
+ command = `start "${url}"`;
57
+ break;
58
+ default:
59
+ command = `xdg-open "${url}"`;
60
+ break;
61
+ }
62
+ (0, child_process_1.exec)(command);
63
+ }
64
+ //# sourceMappingURL=apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.js","sourceRoot":"","sources":["../../src/core/apps.ts"],"names":[],"mappings":";;;;;;AAYA,wCA4BC;AAGD,0BAQC;AAnDD,iDAAqC;AACrC,4CAAoB;AACpB,gDAAwB;AACxB,sDAA2B;AAC3B,4CAAoB;AAEP,QAAA,YAAY,GAAG;IACxB,KAAK,EAAE,0CAA0C;IACjD,IAAI,EAAE,yCAAyC;IAC/C,IAAI,EAAE,yCAAyC;CAClD,CAAC;AAEF,SAAgB,cAAc;IAC1B,MAAM,WAAW,GAAG;QAChB,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC;QAC9C,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC;QAC9C,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC;QAC7C,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC;QACxC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC;QACxC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC;QACvC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC;QACvC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC;QACvC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC;KACzC,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACnC,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACD,MAAM,aAAa,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC1D,IAAI,MAAW,CAAC;gBAChB,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9D,MAAM,GAAG,iBAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACtC,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACvC,CAAC;gBACD,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IACD,OAAO,oBAAY,CAAC;AACxB,CAAC;AAGD,SAAgB,OAAO,CAAC,GAAW;IAC/B,IAAI,OAAO,CAAC;IACZ,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,QAAQ;YAAE,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;YAAC,MAAM;QAChD,KAAK,OAAO;YAAE,OAAO,GAAG,UAAU,GAAG,GAAG,CAAC;YAAC,MAAM;QAChD;YAAS,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;YAAC,MAAM;IAClD,CAAC;IACD,IAAA,oBAAI,EAAC,OAAO,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { OSProfile } from './os';
2
+ import { AICommandPlan } from '../ai/types';
3
+ export declare function autoFixCommand(originalCmd: string, stderr: string, os: OSProfile, model?: string): Promise<AICommandPlan | null>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.autoFixCommand = autoFixCommand;
4
+ const prompt_1 = require("../ai/prompt");
5
+ const client_1 = require("../ai/client");
6
+ async function autoFixCommand(originalCmd, stderr, os, model) {
7
+ const prompt = (0, prompt_1.buildFixPrompt)(originalCmd, stderr, os);
8
+ const raw = await (0, client_1.askAI)(prompt, model);
9
+ try {
10
+ // Extract JSON if AI wrapped it in triple backticks
11
+ let jsonContent = raw;
12
+ if (raw.includes('```json')) {
13
+ jsonContent = raw.split('```json')[1].split('```')[0].trim();
14
+ }
15
+ else if (raw.includes('```')) {
16
+ jsonContent = raw.split('```')[1].split('```')[0].trim();
17
+ }
18
+ return JSON.parse(jsonContent);
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ //# sourceMappingURL=autofix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autofix.js","sourceRoot":"","sources":["../../src/core/autofix.ts"],"names":[],"mappings":";;AAKA,wCAsBC;AA1BD,yCAA8C;AAC9C,yCAAqC;AAG9B,KAAK,UAAU,cAAc,CAChC,WAAmB,EACnB,MAAc,EACd,EAAa,EACb,KAAc;IAEd,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,IAAA,cAAK,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEvC,IAAI,CAAC;QACD,oDAAoD;QACpD,IAAI,WAAW,GAAG,GAAG,CAAC;QACtB,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type ExecResult = {
2
+ stdout: string;
3
+ stderr: string;
4
+ code: number | null;
5
+ };
6
+ export declare function exec(command: string): Promise<ExecResult>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exec = exec;
4
+ const child_process_1 = require("child_process");
5
+ async function exec(command) {
6
+ return new Promise((resolve) => {
7
+ let stdout = '';
8
+ let stderr = '';
9
+ // Using shell: true to support things like pipes
10
+ const child = (0, child_process_1.spawn)(command, [], { shell: true });
11
+ child.stdout.on('data', (data) => {
12
+ stdout += data.toString();
13
+ process.stdout.write(data);
14
+ });
15
+ child.stderr.on('data', (data) => {
16
+ stderr += data.toString();
17
+ process.stderr.write(data);
18
+ });
19
+ child.on('close', (code) => {
20
+ resolve({ stdout, stderr, code });
21
+ });
22
+ child.on('error', (err) => {
23
+ stderr += err.message;
24
+ resolve({ stdout, stderr, code: 1 });
25
+ });
26
+ });
27
+ }
28
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":";;AAQA,oBA2BC;AAnCD,iDAAsC;AAQ/B,KAAK,UAAU,IAAI,CAAC,OAAe;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,iDAAiD;QACjD,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC7B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC7B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC;YACtB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type Macro = {
2
+ commands: string;
3
+ description: string;
4
+ createdAt: string;
5
+ };
6
+ export declare function getMacros(): Record<string, Macro>;
7
+ export declare function saveMacro(name: string, commands: string, description?: string): boolean;
8
+ export declare function deleteMacro(name: string): boolean;
9
+ export declare function runMacro(name: string): boolean;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getMacros = getMacros;
7
+ exports.saveMacro = saveMacro;
8
+ exports.deleteMacro = deleteMacro;
9
+ exports.runMacro = runMacro;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const os_1 = __importDefault(require("os"));
13
+ const MACROS_FILE = path_1.default.join(os_1.default.homedir(), '.yuangs_macros.json');
14
+ function getMacros() {
15
+ if (fs_1.default.existsSync(MACROS_FILE)) {
16
+ try {
17
+ return JSON.parse(fs_1.default.readFileSync(MACROS_FILE, 'utf8'));
18
+ }
19
+ catch (e) { }
20
+ }
21
+ return {};
22
+ }
23
+ function saveMacro(name, commands, description = '') {
24
+ const macros = getMacros();
25
+ macros[name] = {
26
+ commands,
27
+ description,
28
+ createdAt: new Date().toISOString()
29
+ };
30
+ fs_1.default.writeFileSync(MACROS_FILE, JSON.stringify(macros, null, 2));
31
+ return true;
32
+ }
33
+ function deleteMacro(name) {
34
+ const macros = getMacros();
35
+ if (macros[name]) {
36
+ delete macros[name];
37
+ fs_1.default.writeFileSync(MACROS_FILE, JSON.stringify(macros, null, 2));
38
+ return true;
39
+ }
40
+ return false;
41
+ }
42
+ function runMacro(name) {
43
+ const macros = getMacros();
44
+ const macro = macros[name];
45
+ if (!macro)
46
+ return false;
47
+ const { spawn } = require('child_process');
48
+ spawn(macro.commands, [], { shell: true, stdio: 'inherit' });
49
+ return true;
50
+ }
51
+ //# sourceMappingURL=macros.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macros.js","sourceRoot":"","sources":["../../src/core/macros.ts"],"names":[],"mappings":";;;;;AAYA,8BAOC;AAED,8BASC;AAED,kCAQC;AAED,4BAQC;AAlDD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAQnE,SAAgB,SAAS;IACrB,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY,EAAE,QAAgB,EAAE,cAAsB,EAAE;IAC9E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,GAAG;QACX,QAAQ;QACR,WAAW;QACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;IACF,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAY;IACjC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type OSProfile = {
2
+ name: string;
3
+ shell: string;
4
+ find: 'bsd' | 'gnu';
5
+ stat: 'bsd' | 'gnu';
6
+ };
7
+ export declare function getOSProfile(): OSProfile;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getOSProfile = getOSProfile;
4
+ function getOSProfile() {
5
+ switch (process.platform) {
6
+ case 'darwin':
7
+ return {
8
+ name: 'macOS',
9
+ shell: 'zsh',
10
+ find: 'bsd',
11
+ stat: 'bsd',
12
+ };
13
+ case 'linux':
14
+ return {
15
+ name: 'Linux',
16
+ shell: 'bash',
17
+ find: 'gnu',
18
+ stat: 'gnu',
19
+ };
20
+ case 'win32':
21
+ return {
22
+ name: 'Windows',
23
+ shell: 'cmd',
24
+ find: 'gnu', // Win32 find is different, but for AI context let's assume GNU style tools if they are there, or just label it.
25
+ stat: 'gnu',
26
+ };
27
+ default:
28
+ return {
29
+ name: process.platform,
30
+ shell: 'sh',
31
+ find: 'gnu',
32
+ stat: 'gnu',
33
+ };
34
+ }
35
+ }
36
+ //# sourceMappingURL=os.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os.js","sourceRoot":"","sources":["../../src/core/os.ts"],"names":[],"mappings":";;AAOA,oCA+BC;AA/BD,SAAgB,YAAY;IACxB,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,QAAQ;YACT,OAAO;gBACH,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,KAAK;aACd,CAAC;QACN,KAAK,OAAO;YACR,OAAO;gBACH,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,KAAK;aACd,CAAC;QACN,KAAK,OAAO;YACR,OAAO;gBACH,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,KAAK,EAAE,gHAAgH;gBAC7H,IAAI,EAAE,KAAK;aACd,CAAC;QACN;YACI,OAAO;gBACH,IAAI,EAAE,OAAO,CAAC,QAAQ;gBACtB,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,KAAK;aACd,CAAC;IACV,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function assessRisk(command: string, aiRisk: 'low' | 'medium' | 'high'): 'low' | 'medium' | 'high';
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assessRisk = assessRisk;
4
+ function assessRisk(command, aiRisk) {
5
+ const highRiskCommands = ['rm ', 'sudo ', 'mv ', 'dd ', '> /dev/', ':(){ :|:& };:'];
6
+ const hasHighRisk = highRiskCommands.some(cmd => command.includes(cmd));
7
+ if (hasHighRisk)
8
+ return 'high';
9
+ return aiRisk;
10
+ }
11
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/core/risk.ts"],"names":[],"mappings":";;AAAA,gCAOC;AAPD,SAAgB,UAAU,CAAC,OAAe,EAAE,MAAiC;IACzE,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAEpF,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAExE,IAAI,WAAW;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare function confirm(message: string): Promise<boolean>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.confirm = confirm;
7
+ const readline_1 = __importDefault(require("readline"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ async function confirm(message) {
10
+ const rl = readline_1.default.createInterface({
11
+ input: process.stdin,
12
+ output: process.stdout,
13
+ });
14
+ return new Promise((resolve) => {
15
+ rl.question(chalk_1.default.yellow(`\n⚠️ ${message} (y/N) `), (answer) => {
16
+ rl.close();
17
+ resolve(answer.toLowerCase() === 'y');
18
+ });
19
+ });
20
+ }
21
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../src/utils/confirm.ts"],"names":[],"mappings":";;;;;AAGA,0BAYC;AAfD,wDAAgC;AAChC,kDAA0B;AAEnB,KAAK,UAAU,OAAO,CAAC,OAAe;IACzC,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,EAAE,CAAC,QAAQ,CAAC,eAAK,CAAC,MAAM,CAAC,SAAS,OAAO,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;YAC5D,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type HistoryEntry = {
2
+ question: string;
3
+ command: string;
4
+ time: string;
5
+ };
6
+ export declare function getCommandHistory(): HistoryEntry[];
7
+ export declare function saveHistory(entry: {
8
+ question: string;
9
+ command: string;
10
+ }): void;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getCommandHistory = getCommandHistory;
7
+ exports.saveHistory = saveHistory;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const HISTORY_FILE = path_1.default.join(os_1.default.homedir(), '.yuangs_cmd_history.json');
12
+ function getCommandHistory() {
13
+ if (fs_1.default.existsSync(HISTORY_FILE)) {
14
+ try {
15
+ return JSON.parse(fs_1.default.readFileSync(HISTORY_FILE, 'utf8'));
16
+ }
17
+ catch (e) { }
18
+ }
19
+ return [];
20
+ }
21
+ function saveHistory(entry) {
22
+ let history = getCommandHistory();
23
+ const newEntry = {
24
+ ...entry,
25
+ time: new Date().toLocaleString()
26
+ };
27
+ // Keep last 5, unique commands
28
+ history = [newEntry, ...history.filter(item => item.command !== entry.command)].slice(0, 5);
29
+ fs_1.default.writeFileSync(HISTORY_FILE, JSON.stringify(history, null, 2));
30
+ }
31
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":";;;;;AAYA,8CAOC;AAED,kCASC;AA9BD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,0BAA0B,CAAC,CAAC;AAQzE,SAAgB,iBAAiB;IAC7B,IAAI,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,SAAgB,WAAW,CAAC,KAA4C;IACpE,IAAI,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAiB;QAC3B,GAAG,KAAK;QACR,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE;KACpC,CAAC;IACF,+BAA+B;IAC/B,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,21 @@
1
1
  {
2
2
  "name": "yuangs",
3
- "version": "1.3.38",
3
+ "version": "1.3.41",
4
4
  "description": "苑广山的个人应用集合 CLI(彩色版)",
5
- "main": "index.js",
5
+ "author": "苑广山",
6
+ "license": "ISC",
6
7
  "bin": {
7
- "yuangs": "cli.js"
8
+ "yuangs": "dist/cli.js"
8
9
  },
10
+ "main": "dist/cli.js",
11
+ "types": "dist/cli.d.ts",
12
+ "files": [
13
+ "dist"
14
+ ],
9
15
  "scripts": {
16
+ "dev": "ts-node src/cli.ts",
17
+ "build": "tsc",
18
+ "prepublishOnly": "npm run build",
10
19
  "test": "jest"
11
20
  },
12
21
  "keywords": [
@@ -15,7 +24,6 @@
15
24
  "tools",
16
25
  "colorful"
17
26
  ],
18
- "homepage": "https://github.com/yauangshan/npm_yuangs#readme",
19
27
  "repository": {
20
28
  "type": "git",
21
29
  "url": "git+https://github.com/yuanguangshan/npm_yuangs.git"
@@ -23,20 +31,28 @@
23
31
  "bugs": {
24
32
  "url": "https://github.com/yuanguangshan/npm_yuangs/issues"
25
33
  },
26
- "author": "yuanguangshan",
27
- "license": "ISC",
34
+ "homepage": "https://github.com/yauangshan/npm_yuangs#readme",
28
35
  "dependencies": {
29
36
  "axios": "^1.13.2",
30
37
  "chalk": "^4.1.2",
31
38
  "js-yaml": "^4.1.0",
32
39
  "marked": "^15.0.12",
33
40
  "marked-terminal": "^7.3.0",
34
- "ora": "^9.0.0"
41
+ "ora": "^6.3.1"
35
42
  },
36
43
  "devDependencies": {
37
- "jest": "^29.7.0"
44
+ "@types/js-yaml": "^4.0.9",
45
+ "@types/marked": "^5.0.2",
46
+ "@types/node": "^20.11.30",
47
+ "@types/ora": "^3.1.0",
48
+ "jest": "^29.7.0",
49
+ "ts-node": "^10.9.2",
50
+ "typescript": "^5.9.3"
51
+ },
52
+ "engines": {
53
+ "node": ">=18"
38
54
  },
39
55
  "publishConfig": {
40
56
  "access": "public"
41
57
  }
42
- }
58
+ }