coder-link 0.0.9

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 (88) hide show
  1. package/README.md +200 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +684 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +12 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/amp-manager.d.ts +24 -0
  11. package/dist/lib/amp-manager.d.ts.map +1 -0
  12. package/dist/lib/amp-manager.js +46 -0
  13. package/dist/lib/amp-manager.js.map +1 -0
  14. package/dist/lib/claude-code-manager.d.ts +55 -0
  15. package/dist/lib/claude-code-manager.d.ts.map +1 -0
  16. package/dist/lib/claude-code-manager.js +408 -0
  17. package/dist/lib/claude-code-manager.js.map +1 -0
  18. package/dist/lib/crush-manager.d.ts +31 -0
  19. package/dist/lib/crush-manager.d.ts.map +1 -0
  20. package/dist/lib/crush-manager.js +262 -0
  21. package/dist/lib/crush-manager.js.map +1 -0
  22. package/dist/lib/factory-droid-manager.d.ts +36 -0
  23. package/dist/lib/factory-droid-manager.d.ts.map +1 -0
  24. package/dist/lib/factory-droid-manager.js +387 -0
  25. package/dist/lib/factory-droid-manager.js.map +1 -0
  26. package/dist/lib/kimi-manager.d.ts +34 -0
  27. package/dist/lib/kimi-manager.d.ts.map +1 -0
  28. package/dist/lib/kimi-manager.js +316 -0
  29. package/dist/lib/kimi-manager.js.map +1 -0
  30. package/dist/lib/opencode-manager.d.ts +31 -0
  31. package/dist/lib/opencode-manager.d.ts.map +1 -0
  32. package/dist/lib/opencode-manager.js +315 -0
  33. package/dist/lib/opencode-manager.js.map +1 -0
  34. package/dist/lib/pi-manager.d.ts +30 -0
  35. package/dist/lib/pi-manager.d.ts.map +1 -0
  36. package/dist/lib/pi-manager.js +196 -0
  37. package/dist/lib/pi-manager.js.map +1 -0
  38. package/dist/lib/tool-manager.d.ts +51 -0
  39. package/dist/lib/tool-manager.d.ts.map +1 -0
  40. package/dist/lib/tool-manager.js +113 -0
  41. package/dist/lib/tool-manager.js.map +1 -0
  42. package/dist/locales/en_US.json +49 -0
  43. package/dist/locales/zh_CN.json +49 -0
  44. package/dist/mcp-services.d.ts +3 -0
  45. package/dist/mcp-services.d.ts.map +1 -0
  46. package/dist/mcp-services.js +26 -0
  47. package/dist/mcp-services.js.map +1 -0
  48. package/dist/menu.d.ts +2 -0
  49. package/dist/menu.d.ts.map +1 -0
  50. package/dist/menu.js +1226 -0
  51. package/dist/menu.js.map +1 -0
  52. package/dist/utils/api-test.d.ts +32 -0
  53. package/dist/utils/api-test.d.ts.map +1 -0
  54. package/dist/utils/api-test.js +163 -0
  55. package/dist/utils/api-test.js.map +1 -0
  56. package/dist/utils/brand.d.ts +39 -0
  57. package/dist/utils/brand.d.ts.map +1 -0
  58. package/dist/utils/brand.js +195 -0
  59. package/dist/utils/brand.js.map +1 -0
  60. package/dist/utils/config.d.ts +100 -0
  61. package/dist/utils/config.d.ts.map +1 -0
  62. package/dist/utils/config.js +483 -0
  63. package/dist/utils/config.js.map +1 -0
  64. package/dist/utils/exec.d.ts +5 -0
  65. package/dist/utils/exec.d.ts.map +1 -0
  66. package/dist/utils/exec.js +145 -0
  67. package/dist/utils/exec.js.map +1 -0
  68. package/dist/utils/i18n.d.ts +56 -0
  69. package/dist/utils/i18n.d.ts.map +1 -0
  70. package/dist/utils/i18n.js +42 -0
  71. package/dist/utils/i18n.js.map +1 -0
  72. package/dist/utils/keyboard.d.ts +32 -0
  73. package/dist/utils/keyboard.d.ts.map +1 -0
  74. package/dist/utils/keyboard.js +109 -0
  75. package/dist/utils/keyboard.js.map +1 -0
  76. package/dist/utils/logger.d.ts +14 -0
  77. package/dist/utils/logger.d.ts.map +1 -0
  78. package/dist/utils/logger.js +55 -0
  79. package/dist/utils/logger.js.map +1 -0
  80. package/dist/utils/output.d.ts +58 -0
  81. package/dist/utils/output.d.ts.map +1 -0
  82. package/dist/utils/output.js +93 -0
  83. package/dist/utils/output.js.map +1 -0
  84. package/dist/wizard.d.ts +2 -0
  85. package/dist/wizard.d.ts.map +1 -0
  86. package/dist/wizard.js +114 -0
  87. package/dist/wizard.js.map +1 -0
  88. package/package.json +65 -0
@@ -0,0 +1,145 @@
1
+ import { spawnSync, spawn } from 'child_process';
2
+ function restoreTtyAfterChild() {
3
+ try {
4
+ if (process.stdin.isTTY) {
5
+ process.stdin.setRawMode(false);
6
+ process.stdin.resume();
7
+ }
8
+ }
9
+ catch {
10
+ // ignore
11
+ }
12
+ }
13
+ function detachStdinListenersForChild() {
14
+ // Snapshot and remove every listener that could consume stdin bytes
15
+ // before the child process sees them.
16
+ const saved = [];
17
+ for (const event of ['data', 'keypress', 'readable']) {
18
+ for (const fn of process.stdin.listeners(event)) {
19
+ saved.push({ event, fn: fn });
20
+ process.stdin.removeListener(event, fn);
21
+ }
22
+ }
23
+ // Exit raw mode so the child gets normal cooked input.
24
+ try {
25
+ if (process.stdin.isTTY)
26
+ process.stdin.setRawMode(false);
27
+ }
28
+ catch { /* */ }
29
+ // CRITICAL: **pause** stdin so Node's internal reader thread stops
30
+ // consuming console input. Without this the child never receives
31
+ // keystrokes because the parent's libuv loop eats them first.
32
+ process.stdin.pause();
33
+ const restore = () => {
34
+ // Put stdin back into the state Inquirer expects.
35
+ try {
36
+ if (process.stdin.isTTY)
37
+ process.stdin.setRawMode(false);
38
+ }
39
+ catch { /* */ }
40
+ process.stdin.resume();
41
+ // Reattach saved listeners (skip duplicates).
42
+ for (const { event, fn } of saved) {
43
+ if (!process.stdin.listeners(event).includes(fn)) {
44
+ process.stdin.on(event, fn);
45
+ }
46
+ }
47
+ };
48
+ return { restore };
49
+ }
50
+ export function commandExists(command) {
51
+ const checker = process.platform === 'win32' ? 'where' : 'which';
52
+ const result = spawnSync(checker, [command], { stdio: 'ignore' });
53
+ if (result.status === 0)
54
+ return true;
55
+ // Fallback: some tools are available via shell aliases/shims and won't show up in where/which.
56
+ const shell = process.platform === 'win32';
57
+ const probe1 = spawnSync(command, ['--version'], { stdio: 'ignore', shell });
58
+ if (probe1.status === 0)
59
+ return true;
60
+ const probe2 = spawnSync(command, ['-v'], { stdio: 'ignore', shell });
61
+ return probe2.status === 0;
62
+ }
63
+ export async function runInteractive(command, args = []) {
64
+ return await new Promise((resolve) => {
65
+ const stdin = detachStdinListenersForChild();
66
+ const child = spawn(command, args, { stdio: 'inherit', shell: process.platform === 'win32' });
67
+ child.on('exit', (code) => {
68
+ stdin.restore();
69
+ resolve(code ?? 0);
70
+ });
71
+ child.on('error', () => {
72
+ stdin.restore();
73
+ resolve(1);
74
+ });
75
+ });
76
+ }
77
+ export async function runInteractiveWithEnv(command, args = [], envOverrides = {}) {
78
+ const env = { ...process.env };
79
+ for (const [key, value] of Object.entries(envOverrides)) {
80
+ if (typeof value === 'string' && value.length > 0)
81
+ env[key] = value;
82
+ else
83
+ delete env[key];
84
+ }
85
+ return await new Promise((resolve) => {
86
+ const stdin = detachStdinListenersForChild();
87
+ const child = spawn(command, args, {
88
+ stdio: 'inherit',
89
+ shell: process.platform === 'win32',
90
+ env
91
+ });
92
+ child.on('exit', (code) => {
93
+ stdin.restore();
94
+ resolve(code ?? 0);
95
+ });
96
+ child.on('error', () => {
97
+ stdin.restore();
98
+ resolve(1);
99
+ });
100
+ });
101
+ }
102
+ export function runInNewTerminal(command, args = [], envOverrides = {}) {
103
+ const env = { ...process.env };
104
+ for (const [key, value] of Object.entries(envOverrides)) {
105
+ if (typeof value === 'string' && value.length > 0)
106
+ env[key] = value;
107
+ else
108
+ delete env[key];
109
+ }
110
+ if (process.platform !== 'win32') {
111
+ // Best-effort; currently only implemented for Windows.
112
+ return false;
113
+ }
114
+ try {
115
+ // Prefer Windows Terminal (new tab) when available.
116
+ if (commandExists('wt')) {
117
+ const child = spawn('wt', ['-w', '0', 'nt', '--', command, ...args], {
118
+ detached: true,
119
+ stdio: 'ignore',
120
+ env,
121
+ });
122
+ child.unref();
123
+ return true;
124
+ }
125
+ }
126
+ catch {
127
+ // ignore and fall back
128
+ }
129
+ try {
130
+ // Fallback: open a new console window via cmd.exe `start`.
131
+ // Note: `start` requires a window title argument; we pass an empty string.
132
+ const child = spawn('cmd.exe', ['/c', 'start', '""', command, ...args], {
133
+ detached: true,
134
+ stdio: 'ignore',
135
+ env,
136
+ windowsHide: false,
137
+ });
138
+ child.unref();
139
+ return true;
140
+ }
141
+ catch {
142
+ return false;
143
+ }
144
+ }
145
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export interface Translations {
2
+ cli: {
3
+ error_general: string;
4
+ };
5
+ lang: {
6
+ current: string;
7
+ changed: string;
8
+ };
9
+ auth: {
10
+ set_success: string;
11
+ revoke_success: string;
12
+ reload_success: string;
13
+ not_set: string;
14
+ };
15
+ tools: {
16
+ list_header: string;
17
+ install_success: string;
18
+ uninstall_success: string;
19
+ };
20
+ mcp: {
21
+ list_header: string;
22
+ installed_header: string;
23
+ install_success: string;
24
+ uninstall_success: string;
25
+ };
26
+ doctor: {
27
+ header: string;
28
+ config_path: string;
29
+ current_auth: string;
30
+ plan: string;
31
+ api_key: string;
32
+ not_set: string;
33
+ tools_header: string;
34
+ mcp_header: string;
35
+ none: string;
36
+ };
37
+ wizard: {
38
+ welcome: string;
39
+ select_language: string;
40
+ select_plan: string;
41
+ enter_api_key: string;
42
+ select_tools: string;
43
+ installing_tools: string;
44
+ tool_installed: string;
45
+ loading_plan: string;
46
+ manage_mcp: string;
47
+ complete: string;
48
+ };
49
+ }
50
+ export declare function setLang(lang: 'zh_CN' | 'en_US'): void;
51
+ export declare function t(key: string, params?: Record<string, string>): string;
52
+ export declare const i18n: {
53
+ t: typeof t;
54
+ setLang: typeof setLang;
55
+ };
56
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE;QACH,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,GAAG,EAAE;QACH,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAiBD,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,QAE9C;AAED,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAsBtE;AAED,eAAO,MAAM,IAAI;;;CAAiB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ let translations = null;
7
+ let currentLang = 'en_US';
8
+ function loadTranslations() {
9
+ if (translations)
10
+ return translations;
11
+ // At runtime, this file lives in dist/utils, and locales are copied to dist/locales
12
+ const localesDir = join(__dirname, '..', 'locales');
13
+ const zh_CN = JSON.parse(readFileSync(join(localesDir, 'zh_CN.json'), 'utf-8'));
14
+ const en_US = JSON.parse(readFileSync(join(localesDir, 'en_US.json'), 'utf-8'));
15
+ translations = { zh_CN, en_US };
16
+ return translations;
17
+ }
18
+ export function setLang(lang) {
19
+ currentLang = lang;
20
+ }
21
+ export function t(key, params) {
22
+ const allTranslations = loadTranslations();
23
+ const trans = allTranslations[currentLang];
24
+ const keys = key.split('.');
25
+ let value = trans;
26
+ for (const k of keys) {
27
+ if (value && typeof value === 'object' && k in value) {
28
+ value = value[k];
29
+ }
30
+ else {
31
+ return key; // fallback to key if not found
32
+ }
33
+ }
34
+ if (typeof value !== 'string')
35
+ return key;
36
+ if (params) {
37
+ return value.replace(/\{(\w+)\}/g, (match, p1) => params[p1] || match);
38
+ }
39
+ return value;
40
+ }
41
+ export const i18n = { t, setLang };
42
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAoDtC,IAAI,YAAY,GAAmD,IAAI,CAAC;AACxE,IAAI,WAAW,GAAsB,OAAO,CAAC;AAE7C,SAAS,gBAAgB;IACvB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,oFAAoF;IACpF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAiB,CAAC;IAChG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAiB,CAAC;IAEhG,YAAY,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAChC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAuB;IAC7C,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,CAAC,CAAC,GAAW,EAAE,MAA+B;IAC5D,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,KAAK,GAAQ,KAAK,CAAC;IAEvB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACrD,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,CAAC,+BAA+B;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAE1C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Keyboard shortcut handler for interactive menus
3
+ * Adds support for: q/Q to quit, Ctrl+C graceful exit, Esc to go back
4
+ */
5
+ export declare class KeyboardHandler {
6
+ private static instance;
7
+ private rl;
8
+ private quitCallback;
9
+ private backCallback;
10
+ private isActive;
11
+ static getInstance(): KeyboardHandler;
12
+ private setupRawMode;
13
+ private restoreRawMode;
14
+ /**
15
+ * Enable keyboard shortcuts
16
+ * @param onQuit Called when user presses 'q' or Ctrl+C
17
+ * @param onBack Called when user presses Esc
18
+ */
19
+ enable(onQuit?: () => void, onBack?: () => void): void;
20
+ /**
21
+ * Disable keyboard shortcuts
22
+ */
23
+ disable(): void;
24
+ /**
25
+ * Show available shortcuts hint
26
+ */
27
+ showHints(): void;
28
+ private handleInput;
29
+ private handleSigint;
30
+ }
31
+ export declare const keyboardHandler: KeyboardHandler;
32
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/utils/keyboard.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IACvD,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAS;IAEzB,MAAM,CAAC,WAAW,IAAI,eAAe;IAOrC,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,cAAc;IAMtB;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAoBtD;;OAEG;IACH,OAAO,IAAI,IAAI;IAef;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB,OAAO,CAAC,WAAW,CA2BjB;IAEF,OAAO,CAAC,YAAY,CAOlB;CACH;AAED,eAAO,MAAM,eAAe,iBAAgC,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { createInterface } from 'readline';
2
+ import chalk from 'chalk';
3
+ /**
4
+ * Keyboard shortcut handler for interactive menus
5
+ * Adds support for: q/Q to quit, Ctrl+C graceful exit, Esc to go back
6
+ */
7
+ export class KeyboardHandler {
8
+ static instance = null;
9
+ rl = null;
10
+ quitCallback = null;
11
+ backCallback = null;
12
+ isActive = false;
13
+ static getInstance() {
14
+ if (!KeyboardHandler.instance) {
15
+ KeyboardHandler.instance = new KeyboardHandler();
16
+ }
17
+ return KeyboardHandler.instance;
18
+ }
19
+ setupRawMode() {
20
+ if (process.stdin.isTTY) {
21
+ process.stdin.setRawMode(true);
22
+ process.stdin.resume();
23
+ process.stdin.setEncoding('utf8');
24
+ }
25
+ }
26
+ restoreRawMode() {
27
+ if (process.stdin.isTTY) {
28
+ process.stdin.setRawMode(false);
29
+ }
30
+ }
31
+ /**
32
+ * Enable keyboard shortcuts
33
+ * @param onQuit Called when user presses 'q' or Ctrl+C
34
+ * @param onBack Called when user presses Esc
35
+ */
36
+ enable(onQuit, onBack) {
37
+ if (this.isActive)
38
+ return;
39
+ this.quitCallback = onQuit || null;
40
+ this.backCallback = onBack || null;
41
+ this.isActive = true;
42
+ this.rl = createInterface({
43
+ input: process.stdin,
44
+ output: process.stdout,
45
+ });
46
+ this.setupRawMode();
47
+ process.stdin.on('data', this.handleInput);
48
+ // Handle Ctrl+C
49
+ process.on('SIGINT', this.handleSigint);
50
+ }
51
+ /**
52
+ * Disable keyboard shortcuts
53
+ */
54
+ disable() {
55
+ if (!this.isActive)
56
+ return;
57
+ this.isActive = false;
58
+ process.stdin.removeListener('data', this.handleInput);
59
+ process.removeListener('SIGINT', this.handleSigint);
60
+ this.restoreRawMode();
61
+ if (this.rl) {
62
+ this.rl.close();
63
+ this.rl = null;
64
+ }
65
+ }
66
+ /**
67
+ * Show available shortcuts hint
68
+ */
69
+ showHints() {
70
+ console.log(chalk.gray(' Press q to quit · Esc to go back · ↑/↓ Navigate · Enter Select'));
71
+ }
72
+ handleInput = (key) => {
73
+ const str = key.toString();
74
+ // Ctrl+C
75
+ if (str === '\u0003') {
76
+ this.handleSigint();
77
+ return;
78
+ }
79
+ // Esc
80
+ if (str === '\u001B') {
81
+ if (this.backCallback) {
82
+ this.backCallback();
83
+ }
84
+ return;
85
+ }
86
+ // q or Q
87
+ if (str === 'q' || str === 'Q') {
88
+ if (this.quitCallback) {
89
+ this.quitCallback();
90
+ }
91
+ else {
92
+ console.log(chalk.gray('\n Goodbye!\n'));
93
+ process.exit(0);
94
+ }
95
+ return;
96
+ }
97
+ };
98
+ handleSigint = () => {
99
+ console.log(chalk.gray('\n\n Interrupted.\n'));
100
+ if (this.quitCallback) {
101
+ this.quitCallback();
102
+ }
103
+ else {
104
+ process.exit(0);
105
+ }
106
+ };
107
+ }
108
+ export const keyboardHandler = KeyboardHandler.getInstance();
109
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/utils/keyboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare class Logger {
2
+ private static instance;
3
+ private enabled;
4
+ static getInstance(): Logger;
5
+ private constructor();
6
+ private ensureLogDir;
7
+ private log;
8
+ logError(context: string, error: unknown): void;
9
+ logWarn(message: string): void;
10
+ logInfo(message: string): void;
11
+ setEnabled(enabled: boolean): void;
12
+ }
13
+ export declare const logger: Logger;
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AASA,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAC9C,OAAO,CAAC,OAAO,CAAiB;IAEhC,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,OAAO;IAIP,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,GAAG;IAmBX,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAKxC,OAAO,CAAC,OAAO,EAAE,MAAM;IAIvB,OAAO,CAAC,OAAO,EAAE,MAAM;IAIvB,UAAU,CAAC,OAAO,EAAE,OAAO;CAG5B;AAED,eAAO,MAAM,MAAM,QAAuB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { existsSync, mkdirSync, appendFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { CONFIG_DIR } from './config.js';
4
+ const LOG_DIR = join(CONFIG_DIR, 'logs');
5
+ const LOG_FILE = join(LOG_DIR, 'error.log');
6
+ export class Logger {
7
+ static instance = null;
8
+ enabled = true;
9
+ static getInstance() {
10
+ if (!Logger.instance) {
11
+ Logger.instance = new Logger();
12
+ }
13
+ return Logger.instance;
14
+ }
15
+ constructor() {
16
+ this.ensureLogDir();
17
+ }
18
+ ensureLogDir() {
19
+ if (!existsSync(LOG_DIR)) {
20
+ mkdirSync(LOG_DIR, { recursive: true });
21
+ }
22
+ }
23
+ log(level, message, error) {
24
+ if (!this.enabled)
25
+ return;
26
+ const timestamp = new Date().toISOString();
27
+ const logMessage = `[${timestamp}] [${level}] ${message}${error ? '\n' + error.stack : ''}\n`;
28
+ // Write to log file
29
+ try {
30
+ appendFileSync(LOG_FILE, logMessage, 'utf-8');
31
+ }
32
+ catch (e) {
33
+ // Silent fail for logging errors
34
+ }
35
+ // Also output to stderr for errors
36
+ if (level === 'ERROR') {
37
+ console.error(logMessage);
38
+ }
39
+ }
40
+ logError(context, error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ this.log('ERROR', `${context}: ${message}`, error instanceof Error ? error : undefined);
43
+ }
44
+ logWarn(message) {
45
+ this.log('WARN', message);
46
+ }
47
+ logInfo(message) {
48
+ this.log('INFO', message);
49
+ }
50
+ setEnabled(enabled) {
51
+ this.enabled = enabled;
52
+ }
53
+ }
54
+ export const logger = Logger.getInstance();
55
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAA+B,cAAc,EAAE,MAAM,IAAI,CAAC;AACxF,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAE5C,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,QAAQ,GAAkB,IAAI,CAAC;IACtC,OAAO,GAAY,IAAI,CAAC;IAEhC,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;QACE,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEO,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa;QACvD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,SAAS,MAAM,KAAK,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAE9F,oBAAoB;QACpB,IAAI,CAAC;YACH,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,iCAAiC;QACnC,CAAC;QAED,mCAAmC;QACnC,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,KAAc;QACtC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,KAAK,OAAO,EAAE,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;;AAGH,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Terminal output utilities with width awareness and JSON formatting
3
+ */
4
+ export interface OutputFormatter {
5
+ isJson: boolean;
6
+ indent: number;
7
+ }
8
+ declare let globalFormatter: OutputFormatter;
9
+ /**
10
+ * Set global output format
11
+ */
12
+ export declare function setOutputFormat(format?: 'json' | 'pretty', indent?: number): void;
13
+ /**
14
+ * Get current output format
15
+ */
16
+ export declare function getOutputFormat(): OutputFormatter;
17
+ export { globalFormatter };
18
+ declare const _default: {
19
+ setOutputFormat: typeof setOutputFormat;
20
+ getOutputFormat: typeof getOutputFormat;
21
+ printData: typeof printData;
22
+ formatTable: typeof formatTable;
23
+ truncateText: typeof truncateText;
24
+ printError: typeof printError;
25
+ printSuccess: typeof printSuccess;
26
+ printWarning: typeof printWarning;
27
+ printInfo: typeof printInfo;
28
+ };
29
+ export default _default;
30
+ /**
31
+ * Print data based on current format
32
+ */
33
+ export declare function printData(data: unknown): void;
34
+ /**
35
+ * Format a table for terminal output
36
+ */
37
+ export declare function formatTable(headers: string[], rows: (string | number | boolean | undefined)[][]): string;
38
+ /**
39
+ * Truncate text to fit terminal width
40
+ */
41
+ export declare function truncateText(text: string, maxWidth?: number): string;
42
+ /**
43
+ * Print error with actionable hint
44
+ */
45
+ export declare function printError(message: string, hint?: string): void;
46
+ /**
47
+ * Print success message
48
+ */
49
+ export declare function printSuccess(message: string): void;
50
+ /**
51
+ * Print warning with suggestion
52
+ */
53
+ export declare function printWarning(message: string, suggestion?: string): void;
54
+ /**
55
+ * Print info message
56
+ */
57
+ export declare function printInfo(message: string): void;
58
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,IAAI,eAAe,EAAE,eAA8C,CAAC;AAEpE;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAE,MAAM,GAAG,QAAmB,EAAE,MAAM,SAAI,GAAG,IAAI,CAEtF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,eAAe,CAEjD;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;;;;;;;;;;;;AAC3B,wBAA6I;AAE7I;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAM7C;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,GAChD,MAAM,CA2BR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAK/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAKvE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C"}
@@ -0,0 +1,93 @@
1
+ import chalk from 'chalk';
2
+ let globalFormatter = { isJson: false, indent: 2 };
3
+ /**
4
+ * Set global output format
5
+ */
6
+ export function setOutputFormat(format = 'pretty', indent = 2) {
7
+ globalFormatter = { isJson: format === 'json', indent };
8
+ }
9
+ /**
10
+ * Get current output format
11
+ */
12
+ export function getOutputFormat() {
13
+ return globalFormatter;
14
+ }
15
+ export { globalFormatter };
16
+ export default { setOutputFormat, getOutputFormat, printData, formatTable, truncateText, printError, printSuccess, printWarning, printInfo };
17
+ /**
18
+ * Print data based on current format
19
+ */
20
+ export function printData(data) {
21
+ if (globalFormatter.isJson) {
22
+ console.log(JSON.stringify(data, null, globalFormatter.indent));
23
+ }
24
+ else {
25
+ console.log(data);
26
+ }
27
+ }
28
+ /**
29
+ * Format a table for terminal output
30
+ */
31
+ export function formatTable(headers, rows) {
32
+ if (globalFormatter.isJson) {
33
+ return JSON.stringify({ headers, rows }, null, globalFormatter.indent);
34
+ }
35
+ // Calculate column widths
36
+ const widths = headers.map((h, i) => {
37
+ const headerLen = String(h).length;
38
+ const maxDataLen = Math.max(...rows.map(r => String(r[i] ?? '').length));
39
+ return Math.max(headerLen, maxDataLen);
40
+ });
41
+ // Build table
42
+ const lines = [];
43
+ // Header
44
+ const headerRow = headers.map((h, i) => String(h).padEnd(widths[i])).join(' │ ');
45
+ lines.push(headerRow);
46
+ lines.push(widths.map(w => '─'.repeat(w)).join('─┼─'));
47
+ // Rows
48
+ for (const row of rows) {
49
+ const dataRow = row.map((cell, i) => String(cell ?? '').padEnd(widths[i])).join(' │ ');
50
+ lines.push(dataRow);
51
+ }
52
+ return lines.join('\n');
53
+ }
54
+ /**
55
+ * Truncate text to fit terminal width
56
+ */
57
+ export function truncateText(text, maxWidth) {
58
+ const width = maxWidth || process.stdout.columns || 80;
59
+ if (text.length <= width)
60
+ return text;
61
+ return text.slice(0, width - 3) + '...';
62
+ }
63
+ /**
64
+ * Print error with actionable hint
65
+ */
66
+ export function printError(message, hint) {
67
+ console.error(chalk.red(`✗ ${message}`));
68
+ if (hint) {
69
+ console.error(chalk.gray(` ${hint}`));
70
+ }
71
+ }
72
+ /**
73
+ * Print success message
74
+ */
75
+ export function printSuccess(message) {
76
+ console.log(chalk.green(`✓ ${message}`));
77
+ }
78
+ /**
79
+ * Print warning with suggestion
80
+ */
81
+ export function printWarning(message, suggestion) {
82
+ console.log(chalk.yellow(`⚠ ${message}`));
83
+ if (suggestion) {
84
+ console.log(chalk.gray(` ${suggestion}`));
85
+ }
86
+ }
87
+ /**
88
+ * Print info message
89
+ */
90
+ export function printInfo(message) {
91
+ console.log(chalk.gray(`ℹ ${message}`));
92
+ }
93
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runWizard(): Promise<void>;
2
+ //# sourceMappingURL=wizard.d.ts.map