gemkit-cli 0.2.3 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +141 -7
  2. package/dist/commands/agent/index.d.ts +9 -0
  3. package/dist/commands/agent/index.js +1329 -0
  4. package/dist/commands/cache/index.d.ts +5 -0
  5. package/dist/commands/cache/index.js +43 -0
  6. package/dist/commands/catalog/index.d.ts +2 -0
  7. package/dist/commands/catalog/index.js +57 -0
  8. package/dist/commands/config/index.d.ts +7 -0
  9. package/dist/commands/config/index.js +122 -0
  10. package/dist/commands/convert/index.d.ts +8 -0
  11. package/dist/commands/convert/index.js +391 -0
  12. package/dist/commands/doctor/index.d.ts +2 -0
  13. package/dist/commands/doctor/index.js +243 -0
  14. package/dist/commands/extension/index.d.ts +5 -0
  15. package/dist/commands/extension/index.js +52 -0
  16. package/dist/commands/index.d.ts +5 -0
  17. package/dist/commands/index.js +37 -0
  18. package/dist/commands/init/index.d.ts +6 -0
  19. package/dist/commands/init/index.js +345 -0
  20. package/dist/commands/new/index.d.ts +5 -0
  21. package/dist/commands/new/index.js +49 -0
  22. package/dist/commands/office/index.d.ts +5 -0
  23. package/dist/commands/office/index.js +283 -0
  24. package/dist/commands/paste/index.d.ts +10 -0
  25. package/dist/commands/paste/index.js +533 -0
  26. package/dist/commands/plan/index.d.ts +8 -0
  27. package/dist/commands/plan/index.js +247 -0
  28. package/dist/commands/session/index.d.ts +8 -0
  29. package/dist/commands/session/index.js +289 -0
  30. package/dist/commands/tokens/index.d.ts +6 -0
  31. package/dist/commands/tokens/index.js +148 -0
  32. package/dist/commands/update/index.d.ts +26 -0
  33. package/dist/commands/update/index.js +199 -0
  34. package/dist/commands/versions/index.d.ts +5 -0
  35. package/dist/commands/versions/index.js +39 -0
  36. package/dist/domains/agent/index.d.ts +8 -0
  37. package/dist/domains/agent/index.js +8 -0
  38. package/dist/domains/agent/mappings.d.ts +32 -0
  39. package/dist/domains/agent/mappings.js +164 -0
  40. package/dist/domains/agent/profile.d.ts +26 -0
  41. package/dist/domains/agent/profile.js +225 -0
  42. package/dist/domains/agent/pty-context.d.ts +11 -0
  43. package/dist/domains/agent/pty-context.js +83 -0
  44. package/dist/domains/agent/pty-providers.d.ts +18 -0
  45. package/dist/domains/agent/pty-providers.js +66 -0
  46. package/dist/domains/agent/pty-session.d.ts +33 -0
  47. package/dist/domains/agent/pty-session.js +82 -0
  48. package/dist/domains/agent/pty-types.d.ts +127 -0
  49. package/dist/domains/agent/pty-types.js +4 -0
  50. package/dist/domains/agent/search.d.ts +45 -0
  51. package/dist/domains/agent/search.js +614 -0
  52. package/dist/domains/agent/types.d.ts +78 -0
  53. package/dist/domains/agent/types.js +5 -0
  54. package/dist/domains/agent-office/documents-scanner.d.ts +9 -0
  55. package/dist/domains/agent-office/documents-scanner.js +143 -0
  56. package/dist/domains/agent-office/event-emitter.d.ts +43 -0
  57. package/dist/domains/agent-office/event-emitter.js +86 -0
  58. package/dist/domains/agent-office/file-watcher.d.ts +40 -0
  59. package/dist/domains/agent-office/file-watcher.js +173 -0
  60. package/dist/domains/agent-office/icons.d.ts +11 -0
  61. package/dist/domains/agent-office/icons.js +36 -0
  62. package/dist/domains/agent-office/index.d.ts +12 -0
  63. package/dist/domains/agent-office/index.js +20 -0
  64. package/dist/domains/agent-office/renderer/web/assets.d.ts +11 -0
  65. package/dist/domains/agent-office/renderer/web/assets.js +3419 -0
  66. package/dist/domains/agent-office/renderer/web/server.d.ts +42 -0
  67. package/dist/domains/agent-office/renderer/web/server.js +228 -0
  68. package/dist/domains/agent-office/renderer/web.d.ts +30 -0
  69. package/dist/domains/agent-office/renderer/web.js +111 -0
  70. package/dist/domains/agent-office/session-bridge.d.ts +23 -0
  71. package/dist/domains/agent-office/session-bridge.js +171 -0
  72. package/dist/domains/agent-office/state-machine.d.ts +5 -0
  73. package/dist/domains/agent-office/state-machine.js +82 -0
  74. package/dist/domains/agent-office/types.d.ts +91 -0
  75. package/dist/domains/agent-office/types.js +4 -0
  76. package/dist/domains/cache/index.d.ts +1 -0
  77. package/dist/domains/cache/index.js +1 -0
  78. package/dist/domains/cache/manager.d.ts +22 -0
  79. package/dist/domains/cache/manager.js +84 -0
  80. package/dist/domains/config/index.d.ts +5 -0
  81. package/dist/domains/config/index.js +5 -0
  82. package/dist/domains/config/manager.d.ts +24 -0
  83. package/dist/domains/config/manager.js +85 -0
  84. package/dist/domains/config/schema.d.ts +17 -0
  85. package/dist/domains/config/schema.js +96 -0
  86. package/dist/domains/convert/converter.d.ts +78 -0
  87. package/dist/domains/convert/converter.js +471 -0
  88. package/dist/domains/convert/index.d.ts +5 -0
  89. package/dist/domains/convert/index.js +5 -0
  90. package/dist/domains/convert/types.d.ts +88 -0
  91. package/dist/domains/convert/types.js +18 -0
  92. package/dist/domains/github/download.d.ts +12 -0
  93. package/dist/domains/github/download.js +51 -0
  94. package/dist/domains/github/index.d.ts +2 -0
  95. package/dist/domains/github/index.js +2 -0
  96. package/dist/domains/github/releases.d.ts +16 -0
  97. package/dist/domains/github/releases.js +68 -0
  98. package/dist/domains/installation/conflict.d.ts +13 -0
  99. package/dist/domains/installation/conflict.js +38 -0
  100. package/dist/domains/installation/file-sync.d.ts +16 -0
  101. package/dist/domains/installation/file-sync.js +77 -0
  102. package/dist/domains/installation/index.d.ts +3 -0
  103. package/dist/domains/installation/index.js +3 -0
  104. package/dist/domains/installation/metadata.d.ts +20 -0
  105. package/dist/domains/installation/metadata.js +52 -0
  106. package/dist/domains/plan/index.d.ts +2 -0
  107. package/dist/domains/plan/index.js +2 -0
  108. package/dist/domains/plan/resolver.d.ts +24 -0
  109. package/dist/domains/plan/resolver.js +164 -0
  110. package/dist/domains/plan/types.d.ts +13 -0
  111. package/dist/domains/plan/types.js +4 -0
  112. package/dist/domains/session/env.d.ts +51 -0
  113. package/dist/domains/session/env.js +118 -0
  114. package/dist/domains/session/index.d.ts +8 -0
  115. package/dist/domains/session/index.js +8 -0
  116. package/dist/domains/session/manager.d.ts +56 -0
  117. package/dist/domains/session/manager.js +205 -0
  118. package/dist/domains/session/paths.d.ts +6 -0
  119. package/dist/domains/session/paths.js +6 -0
  120. package/dist/domains/session/types.d.ts +121 -0
  121. package/dist/domains/session/types.js +5 -0
  122. package/dist/domains/session/writer.d.ts +82 -0
  123. package/dist/domains/session/writer.js +431 -0
  124. package/dist/domains/tokens/index.d.ts +5 -0
  125. package/dist/domains/tokens/index.js +5 -0
  126. package/dist/domains/tokens/pricing.d.ts +38 -0
  127. package/dist/domains/tokens/pricing.js +129 -0
  128. package/dist/domains/tokens/scanner.d.ts +42 -0
  129. package/dist/domains/tokens/scanner.js +168 -0
  130. package/dist/index.d.ts +5 -0
  131. package/dist/index.js +90 -59
  132. package/dist/services/aipty.d.ts +76 -0
  133. package/dist/services/aipty.js +276 -0
  134. package/dist/services/archive.d.ts +22 -0
  135. package/dist/services/archive.js +53 -0
  136. package/dist/services/auto-update.d.ts +26 -0
  137. package/dist/services/auto-update.js +117 -0
  138. package/dist/services/hash.d.ts +36 -0
  139. package/dist/services/hash.js +63 -0
  140. package/dist/services/logger.d.ts +28 -0
  141. package/dist/services/logger.js +102 -0
  142. package/dist/services/music.d.ts +67 -0
  143. package/dist/services/music.js +290 -0
  144. package/dist/services/npm.d.ts +22 -0
  145. package/dist/services/npm.js +65 -0
  146. package/dist/services/pty-client.d.ts +66 -0
  147. package/dist/services/pty-client.js +154 -0
  148. package/dist/services/pty-server.d.ts +102 -0
  149. package/dist/services/pty-server.js +613 -0
  150. package/dist/types/index.d.ts +155 -0
  151. package/dist/types/index.js +4 -0
  152. package/dist/utils/colors.d.ts +43 -0
  153. package/dist/utils/colors.js +98 -0
  154. package/dist/utils/errors.d.ts +24 -0
  155. package/dist/utils/errors.js +56 -0
  156. package/dist/utils/paths.d.ts +46 -0
  157. package/dist/utils/paths.js +89 -0
  158. package/dist/utils/platform.d.ts +11 -0
  159. package/dist/utils/platform.js +31 -0
  160. package/package.json +55 -54
@@ -0,0 +1,243 @@
1
+ import { existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { spawn } from 'child_process';
4
+ import ora from 'ora';
5
+ import { getLocalGeminiDir, getAgentsDir, getExtensionsDir } from '../../utils/paths.js';
6
+ import { loadMetadata } from '../../domains/installation/metadata.js';
7
+ import { brand, pc } from '../../utils/colors.js';
8
+ /**
9
+ * Check if spawn-agent extension is installed in Gemini CLI
10
+ * by running: gemini extensions list
11
+ */
12
+ async function checkSpawnAgentInstalled() {
13
+ return new Promise((resolve) => {
14
+ const child = spawn('gemini', ['extensions', 'list'], {
15
+ stdio: ['pipe', 'pipe', 'pipe'],
16
+ shell: process.platform === 'win32'
17
+ });
18
+ let stdout = '';
19
+ let stderr = '';
20
+ let resolved = false;
21
+ // Timeout after 20 seconds (gemini CLI can be slow)
22
+ const timeout = setTimeout(() => {
23
+ if (!resolved) {
24
+ resolved = true;
25
+ child.kill();
26
+ resolve({
27
+ installed: false,
28
+ error: 'Check timed out'
29
+ });
30
+ }
31
+ }, 20000);
32
+ child.stdout?.on('data', (data) => {
33
+ stdout += data.toString();
34
+ });
35
+ child.stderr?.on('data', (data) => {
36
+ stderr += data.toString();
37
+ });
38
+ child.on('close', (code) => {
39
+ if (!resolved) {
40
+ resolved = true;
41
+ clearTimeout(timeout);
42
+ if (code === 0) {
43
+ // Check if spawn-agent appears in the output
44
+ const isInstalled = stdout.toLowerCase().includes('spawn-agent');
45
+ resolve({ installed: isInstalled });
46
+ }
47
+ else {
48
+ resolve({
49
+ installed: false,
50
+ error: stderr || 'Failed to check extensions'
51
+ });
52
+ }
53
+ }
54
+ });
55
+ child.on('error', (err) => {
56
+ if (!resolved) {
57
+ resolved = true;
58
+ clearTimeout(timeout);
59
+ resolve({
60
+ installed: false,
61
+ error: `Gemini CLI not available: ${err.message}`
62
+ });
63
+ }
64
+ });
65
+ });
66
+ }
67
+ /**
68
+ * Check if Gemini CLI is available
69
+ */
70
+ async function checkGeminiCli() {
71
+ return new Promise((resolve) => {
72
+ const child = spawn('gemini', ['--version'], {
73
+ stdio: ['pipe', 'pipe', 'pipe'],
74
+ shell: process.platform === 'win32'
75
+ });
76
+ let stdout = '';
77
+ let resolved = false;
78
+ // Timeout after 15 seconds (gemini CLI can be slow to start)
79
+ const timeout = setTimeout(() => {
80
+ if (!resolved) {
81
+ resolved = true;
82
+ child.kill();
83
+ resolve({ available: false, error: 'Timed out' });
84
+ }
85
+ }, 15000);
86
+ child.stdout?.on('data', (data) => {
87
+ stdout += data.toString();
88
+ });
89
+ child.on('close', (code) => {
90
+ if (!resolved) {
91
+ resolved = true;
92
+ clearTimeout(timeout);
93
+ if (code === 0) {
94
+ const version = stdout.trim().split('\n')[0] || 'unknown';
95
+ resolve({ available: true, version });
96
+ }
97
+ else {
98
+ resolve({ available: false, error: 'Command failed' });
99
+ }
100
+ }
101
+ });
102
+ child.on('error', (err) => {
103
+ if (!resolved) {
104
+ resolved = true;
105
+ clearTimeout(timeout);
106
+ resolve({ available: false, error: err.message });
107
+ }
108
+ });
109
+ });
110
+ }
111
+ export function registerDoctorCommand(cli) {
112
+ cli
113
+ .command('doctor', 'Check installation health')
114
+ .option('--fix', 'Attempt to fix issues')
115
+ .action(async (options) => {
116
+ console.log();
117
+ console.log(pc.bold(brand.geminiPurple('GemKit Health Check')));
118
+ console.log();
119
+ let issues = 0;
120
+ let warnings = 0;
121
+ // Results storage for display after all checks
122
+ const results = [];
123
+ // Check Node.js version (sync - instant)
124
+ const nodeVersion = process.version;
125
+ const major = parseInt(nodeVersion.slice(1).split('.')[0], 10);
126
+ if (major >= 18) {
127
+ results.push({ icon: brand.success('✓'), message: `Node.js ${nodeVersion}` });
128
+ }
129
+ else {
130
+ results.push({ icon: brand.error('✗'), message: `Node.js ${nodeVersion} ${brand.error('(requires >= 18)')}` });
131
+ issues++;
132
+ }
133
+ // Check Gemini CLI (async - with spinner)
134
+ const geminiSpinner = ora({
135
+ text: 'Checking Gemini CLI...',
136
+ color: 'magenta'
137
+ }).start();
138
+ const geminiCheck = await checkGeminiCli();
139
+ geminiSpinner.stop();
140
+ if (geminiCheck.available) {
141
+ results.push({ icon: brand.success('✓'), message: `Gemini CLI ${brand.dim(`(${geminiCheck.version})`)}` });
142
+ }
143
+ else {
144
+ results.push({ icon: brand.error('✗'), message: `Gemini CLI not found ${brand.dim(`(${geminiCheck.error})`)}` });
145
+ issues++;
146
+ }
147
+ // Check .gemini directory (sync)
148
+ const geminiDir = getLocalGeminiDir();
149
+ if (existsSync(geminiDir)) {
150
+ results.push({ icon: brand.success('✓'), message: '.gemini directory exists' });
151
+ }
152
+ else {
153
+ results.push({ icon: brand.error('✗'), message: '.gemini directory missing' });
154
+ issues++;
155
+ }
156
+ // Check agents directory (sync)
157
+ const agentsDir = getAgentsDir();
158
+ if (existsSync(agentsDir)) {
159
+ results.push({ icon: brand.success('✓'), message: 'Agents directory exists' });
160
+ }
161
+ else {
162
+ results.push({ icon: brand.warn('○'), message: 'Agents directory missing' });
163
+ warnings++;
164
+ }
165
+ // Check extensions directory (sync)
166
+ const extensionsDir = getExtensionsDir();
167
+ if (existsSync(extensionsDir)) {
168
+ results.push({ icon: brand.success('✓'), message: 'Extensions directory exists' });
169
+ }
170
+ else {
171
+ results.push({ icon: brand.warn('○'), message: 'Extensions directory missing' });
172
+ warnings++;
173
+ }
174
+ // Check spawn-agent extension directory exists locally (sync)
175
+ const spawnAgentDir = join(extensionsDir, 'spawn-agent');
176
+ if (existsSync(spawnAgentDir)) {
177
+ results.push({ icon: brand.success('✓'), message: 'spawn-agent extension files present' });
178
+ }
179
+ else {
180
+ results.push({ icon: brand.warn('○'), message: 'spawn-agent extension files missing' });
181
+ warnings++;
182
+ }
183
+ // Check spawn-agent extension is installed in Gemini CLI (async - with spinner)
184
+ if (geminiCheck.available) {
185
+ const extensionSpinner = ora({
186
+ text: 'Checking spawn-agent extension...',
187
+ color: 'magenta'
188
+ }).start();
189
+ const spawnAgentCheck = await checkSpawnAgentInstalled();
190
+ extensionSpinner.stop();
191
+ if (spawnAgentCheck.installed) {
192
+ results.push({ icon: brand.success('✓'), message: 'spawn-agent extension installed in Gemini' });
193
+ }
194
+ else {
195
+ results.push({
196
+ icon: brand.error('✗'),
197
+ message: 'spawn-agent extension NOT installed in Gemini',
198
+ hint: spawnAgentCheck.error
199
+ ? `${spawnAgentCheck.error}\n Run: gemini extensions install .gemini/extensions/spawn-agent`
200
+ : 'Run: gemini extensions install .gemini/extensions/spawn-agent'
201
+ });
202
+ issues++;
203
+ }
204
+ }
205
+ // Check metadata (sync)
206
+ const metadata = loadMetadata();
207
+ if (metadata) {
208
+ results.push({ icon: brand.success('✓'), message: `Installation metadata ${brand.primary(`(v${metadata.version})`)}` });
209
+ }
210
+ else {
211
+ results.push({ icon: brand.warn('○'), message: 'Installation metadata missing' });
212
+ warnings++;
213
+ }
214
+ // Display all results
215
+ for (const result of results) {
216
+ console.log(` ${result.icon} ${result.message}`);
217
+ if (result.hint) {
218
+ for (const line of result.hint.split('\n')) {
219
+ console.log(` ${brand.dim(line)}`);
220
+ }
221
+ }
222
+ }
223
+ // Summary
224
+ console.log();
225
+ if (issues === 0 && warnings === 0) {
226
+ console.log(brand.success('All checks passed!'));
227
+ }
228
+ else if (issues === 0) {
229
+ console.log(brand.success(`All critical checks passed! ${brand.dim(`(${warnings} warning${warnings > 1 ? 's' : ''})`)}`));
230
+ }
231
+ else {
232
+ console.log(brand.error(`${issues} issue(s) found.`));
233
+ if (warnings > 0) {
234
+ console.log(brand.warn(`${warnings} warning(s).`));
235
+ }
236
+ console.log();
237
+ console.log('To fix issues:');
238
+ console.log(` ${brand.dim('1.')} Run ${brand.primary('gk init')} to install GemKit`);
239
+ console.log(` ${brand.dim('2.')} Run ${brand.primary('gemini extensions install .gemini/extensions/spawn-agent')} to install extension`);
240
+ }
241
+ console.log();
242
+ });
243
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Extension command - Manage GemKit extensions
3
+ */
4
+ import type { CAC } from 'cac';
5
+ export declare function registerExtensionCommand(cli: CAC): void;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Extension command - Manage GemKit extensions
3
+ */
4
+ import { existsSync, readdirSync } from 'fs';
5
+ import { getExtensionsDir } from '../../utils/paths.js';
6
+ import { logger } from '../../services/logger.js';
7
+ import { brand, pc } from '../../utils/colors.js';
8
+ export function registerExtensionCommand(cli) {
9
+ const extension = cli.command('extension <subcommand>', 'Extension management').alias('ext');
10
+ // Subcommands
11
+ extension.example('gk extension list # List installed extensions');
12
+ extension.action(async (subcommand) => {
13
+ const sub = subcommand || 'list';
14
+ switch (sub) {
15
+ case 'list':
16
+ await handleList();
17
+ break;
18
+ default:
19
+ console.log();
20
+ logger.error(`Unknown subcommand: ${sub}`);
21
+ console.log();
22
+ process.exit(1);
23
+ }
24
+ });
25
+ }
26
+ async function handleList() {
27
+ const extDir = getExtensionsDir();
28
+ if (!existsSync(extDir)) {
29
+ console.log();
30
+ logger.info('No extensions directory found.');
31
+ console.log();
32
+ return;
33
+ }
34
+ const extensions = readdirSync(extDir, { withFileTypes: true })
35
+ .filter(d => d.isDirectory())
36
+ .map(d => d.name);
37
+ if (extensions.length === 0) {
38
+ console.log();
39
+ logger.info('No extensions installed.');
40
+ console.log();
41
+ return;
42
+ }
43
+ console.log();
44
+ console.log(pc.bold(brand.geminiPurple('Installed Extensions')));
45
+ console.log();
46
+ for (const e of extensions) {
47
+ console.log(` ${brand.success('✓')} ${brand.primary(e)}`);
48
+ }
49
+ console.log();
50
+ console.log(brand.dim(` Total: ${extensions.length} extensions`));
51
+ console.log();
52
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Command registry for GemKit CLI
3
+ */
4
+ import type { CAC } from 'cac';
5
+ export declare function registerCommands(cli: CAC): void;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Command registry for GemKit CLI
3
+ */
4
+ import { registerInitCommand } from './init/index.js';
5
+ import { registerUpdateCommand } from './update/index.js';
6
+ import { registerVersionsCommand } from './versions/index.js';
7
+ import { registerDoctorCommand } from './doctor/index.js';
8
+ import { registerConfigCommand } from './config/index.js';
9
+ import { registerCacheCommand } from './cache/index.js';
10
+ import { registerNewCommand } from './new/index.js';
11
+ import { registerAgentCommand } from './agent/index.js';
12
+ import { registerSessionCommand } from './session/index.js';
13
+ import { registerPlanCommand } from './plan/index.js';
14
+ import { registerTokensCommand } from './tokens/index.js';
15
+ import { registerExtensionCommand } from './extension/index.js';
16
+ import { registerCatalogCommand } from './catalog/index.js';
17
+ import { registerPasteCommand } from './paste/index.js';
18
+ import { registerConvertCommand } from './convert/index.js';
19
+ import { registerOfficeCommand } from './office/index.js';
20
+ export function registerCommands(cli) {
21
+ registerInitCommand(cli);
22
+ registerUpdateCommand(cli);
23
+ registerVersionsCommand(cli);
24
+ registerDoctorCommand(cli);
25
+ registerConfigCommand(cli);
26
+ registerCacheCommand(cli);
27
+ registerNewCommand(cli);
28
+ registerAgentCommand(cli);
29
+ registerSessionCommand(cli);
30
+ registerPlanCommand(cli);
31
+ registerTokensCommand(cli);
32
+ registerExtensionCommand(cli);
33
+ registerCatalogCommand(cli);
34
+ registerPasteCommand(cli);
35
+ registerConvertCommand(cli);
36
+ registerOfficeCommand(cli);
37
+ }
@@ -0,0 +1,6 @@
1
+ import type { CAC } from 'cac';
2
+ /**
3
+ * Check if spawn-agent extension is installed in Gemini
4
+ */
5
+ export declare function isSpawnAgentInstalled(): Promise<boolean>;
6
+ export declare function registerInitCommand(cli: CAC): void;