gemkit-cli 0.2.3 → 0.3.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/README.md +141 -7
- package/dist/commands/agent/index.d.ts +9 -0
- package/dist/commands/agent/index.js +1329 -0
- package/dist/commands/cache/index.d.ts +5 -0
- package/dist/commands/cache/index.js +43 -0
- package/dist/commands/catalog/index.d.ts +2 -0
- package/dist/commands/catalog/index.js +57 -0
- package/dist/commands/config/index.d.ts +7 -0
- package/dist/commands/config/index.js +122 -0
- package/dist/commands/convert/index.d.ts +8 -0
- package/dist/commands/convert/index.js +391 -0
- package/dist/commands/doctor/index.d.ts +2 -0
- package/dist/commands/doctor/index.js +243 -0
- package/dist/commands/extension/index.d.ts +5 -0
- package/dist/commands/extension/index.js +52 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.js +37 -0
- package/dist/commands/init/index.d.ts +6 -0
- package/dist/commands/init/index.js +345 -0
- package/dist/commands/new/index.d.ts +5 -0
- package/dist/commands/new/index.js +49 -0
- package/dist/commands/office/index.d.ts +5 -0
- package/dist/commands/office/index.js +283 -0
- package/dist/commands/paste/index.d.ts +10 -0
- package/dist/commands/paste/index.js +533 -0
- package/dist/commands/plan/index.d.ts +8 -0
- package/dist/commands/plan/index.js +247 -0
- package/dist/commands/session/index.d.ts +8 -0
- package/dist/commands/session/index.js +289 -0
- package/dist/commands/tokens/index.d.ts +6 -0
- package/dist/commands/tokens/index.js +148 -0
- package/dist/commands/update/index.d.ts +26 -0
- package/dist/commands/update/index.js +199 -0
- package/dist/commands/versions/index.d.ts +5 -0
- package/dist/commands/versions/index.js +39 -0
- package/dist/domains/agent/index.d.ts +8 -0
- package/dist/domains/agent/index.js +8 -0
- package/dist/domains/agent/mappings.d.ts +32 -0
- package/dist/domains/agent/mappings.js +164 -0
- package/dist/domains/agent/profile.d.ts +26 -0
- package/dist/domains/agent/profile.js +225 -0
- package/dist/domains/agent/pty-context.d.ts +11 -0
- package/dist/domains/agent/pty-context.js +83 -0
- package/dist/domains/agent/pty-providers.d.ts +18 -0
- package/dist/domains/agent/pty-providers.js +66 -0
- package/dist/domains/agent/pty-session.d.ts +33 -0
- package/dist/domains/agent/pty-session.js +82 -0
- package/dist/domains/agent/pty-types.d.ts +127 -0
- package/dist/domains/agent/pty-types.js +4 -0
- package/dist/domains/agent/search.d.ts +45 -0
- package/dist/domains/agent/search.js +614 -0
- package/dist/domains/agent/types.d.ts +78 -0
- package/dist/domains/agent/types.js +5 -0
- package/dist/domains/agent-office/documents-scanner.d.ts +9 -0
- package/dist/domains/agent-office/documents-scanner.js +143 -0
- package/dist/domains/agent-office/event-emitter.d.ts +43 -0
- package/dist/domains/agent-office/event-emitter.js +86 -0
- package/dist/domains/agent-office/file-watcher.d.ts +40 -0
- package/dist/domains/agent-office/file-watcher.js +173 -0
- package/dist/domains/agent-office/icons.d.ts +11 -0
- package/dist/domains/agent-office/icons.js +36 -0
- package/dist/domains/agent-office/index.d.ts +12 -0
- package/dist/domains/agent-office/index.js +20 -0
- package/dist/domains/agent-office/renderer/web/assets.d.ts +11 -0
- package/dist/domains/agent-office/renderer/web/assets.js +3419 -0
- package/dist/domains/agent-office/renderer/web/server.d.ts +42 -0
- package/dist/domains/agent-office/renderer/web/server.js +228 -0
- package/dist/domains/agent-office/renderer/web.d.ts +30 -0
- package/dist/domains/agent-office/renderer/web.js +111 -0
- package/dist/domains/agent-office/session-bridge.d.ts +23 -0
- package/dist/domains/agent-office/session-bridge.js +171 -0
- package/dist/domains/agent-office/state-machine.d.ts +5 -0
- package/dist/domains/agent-office/state-machine.js +82 -0
- package/dist/domains/agent-office/types.d.ts +91 -0
- package/dist/domains/agent-office/types.js +4 -0
- package/dist/domains/cache/index.d.ts +1 -0
- package/dist/domains/cache/index.js +1 -0
- package/dist/domains/cache/manager.d.ts +22 -0
- package/dist/domains/cache/manager.js +84 -0
- package/dist/domains/config/index.d.ts +5 -0
- package/dist/domains/config/index.js +5 -0
- package/dist/domains/config/manager.d.ts +24 -0
- package/dist/domains/config/manager.js +85 -0
- package/dist/domains/config/schema.d.ts +17 -0
- package/dist/domains/config/schema.js +96 -0
- package/dist/domains/convert/converter.d.ts +78 -0
- package/dist/domains/convert/converter.js +471 -0
- package/dist/domains/convert/index.d.ts +5 -0
- package/dist/domains/convert/index.js +5 -0
- package/dist/domains/convert/types.d.ts +88 -0
- package/dist/domains/convert/types.js +18 -0
- package/dist/domains/github/download.d.ts +12 -0
- package/dist/domains/github/download.js +51 -0
- package/dist/domains/github/index.d.ts +2 -0
- package/dist/domains/github/index.js +2 -0
- package/dist/domains/github/releases.d.ts +16 -0
- package/dist/domains/github/releases.js +68 -0
- package/dist/domains/installation/conflict.d.ts +13 -0
- package/dist/domains/installation/conflict.js +38 -0
- package/dist/domains/installation/file-sync.d.ts +16 -0
- package/dist/domains/installation/file-sync.js +77 -0
- package/dist/domains/installation/index.d.ts +3 -0
- package/dist/domains/installation/index.js +3 -0
- package/dist/domains/installation/metadata.d.ts +20 -0
- package/dist/domains/installation/metadata.js +52 -0
- package/dist/domains/plan/index.d.ts +2 -0
- package/dist/domains/plan/index.js +2 -0
- package/dist/domains/plan/resolver.d.ts +24 -0
- package/dist/domains/plan/resolver.js +164 -0
- package/dist/domains/plan/types.d.ts +13 -0
- package/dist/domains/plan/types.js +4 -0
- package/dist/domains/session/env.d.ts +51 -0
- package/dist/domains/session/env.js +118 -0
- package/dist/domains/session/index.d.ts +8 -0
- package/dist/domains/session/index.js +8 -0
- package/dist/domains/session/manager.d.ts +56 -0
- package/dist/domains/session/manager.js +205 -0
- package/dist/domains/session/paths.d.ts +6 -0
- package/dist/domains/session/paths.js +6 -0
- package/dist/domains/session/types.d.ts +121 -0
- package/dist/domains/session/types.js +5 -0
- package/dist/domains/session/writer.d.ts +82 -0
- package/dist/domains/session/writer.js +431 -0
- package/dist/domains/tokens/index.d.ts +5 -0
- package/dist/domains/tokens/index.js +5 -0
- package/dist/domains/tokens/pricing.d.ts +38 -0
- package/dist/domains/tokens/pricing.js +129 -0
- package/dist/domains/tokens/scanner.d.ts +42 -0
- package/dist/domains/tokens/scanner.js +168 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +87 -58
- package/dist/services/aipty.d.ts +76 -0
- package/dist/services/aipty.js +276 -0
- package/dist/services/archive.d.ts +22 -0
- package/dist/services/archive.js +53 -0
- package/dist/services/auto-update.d.ts +26 -0
- package/dist/services/auto-update.js +117 -0
- package/dist/services/hash.d.ts +36 -0
- package/dist/services/hash.js +63 -0
- package/dist/services/logger.d.ts +28 -0
- package/dist/services/logger.js +102 -0
- package/dist/services/music.d.ts +67 -0
- package/dist/services/music.js +290 -0
- package/dist/services/npm.d.ts +22 -0
- package/dist/services/npm.js +65 -0
- package/dist/services/pty-client.d.ts +66 -0
- package/dist/services/pty-client.js +154 -0
- package/dist/services/pty-server.d.ts +102 -0
- package/dist/services/pty-server.js +613 -0
- package/dist/types/index.d.ts +155 -0
- package/dist/types/index.js +4 -0
- package/dist/utils/colors.d.ts +43 -0
- package/dist/utils/colors.js +98 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.js +56 -0
- package/dist/utils/paths.d.ts +46 -0
- package/dist/utils/paths.js +89 -0
- package/dist/utils/platform.d.ts +11 -0
- package/dist/utils/platform.js +31 -0
- package/package.json +55 -54
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache command - Manage release cache
|
|
3
|
+
*/
|
|
4
|
+
import { clearCache, getCacheStats } from '../../domains/cache/manager.js';
|
|
5
|
+
import { logger } from '../../services/logger.js';
|
|
6
|
+
import { brand, pc } from '../../utils/colors.js';
|
|
7
|
+
export function registerCacheCommand(cli) {
|
|
8
|
+
const cache = cli.command('cache <subcommand>', 'Cache management');
|
|
9
|
+
// Subcommands
|
|
10
|
+
cache.example('gk cache stats # Show cache statistics');
|
|
11
|
+
cache.example('gk cache clear # Clear all cache');
|
|
12
|
+
cache.action(async (subcommand) => {
|
|
13
|
+
const sub = subcommand || 'stats';
|
|
14
|
+
switch (sub) {
|
|
15
|
+
case 'stats':
|
|
16
|
+
await handleStats();
|
|
17
|
+
break;
|
|
18
|
+
case 'clear':
|
|
19
|
+
await handleClear();
|
|
20
|
+
break;
|
|
21
|
+
default:
|
|
22
|
+
console.log();
|
|
23
|
+
logger.error(`Unknown subcommand: ${sub}`);
|
|
24
|
+
console.log();
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function handleStats() {
|
|
30
|
+
const stats = getCacheStats();
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(pc.bold(brand.geminiPurple('Cache Statistics')));
|
|
33
|
+
console.log();
|
|
34
|
+
console.log(` ${brand.dim('Entries:')} ${brand.primary(String(stats.entries))}`);
|
|
35
|
+
console.log(` ${brand.dim('Size:')} ${brand.primary((stats.size / 1024).toFixed(2))} KB`);
|
|
36
|
+
console.log();
|
|
37
|
+
}
|
|
38
|
+
async function handleClear() {
|
|
39
|
+
const count = clearCache();
|
|
40
|
+
console.log();
|
|
41
|
+
logger.success(`Cleared ${brand.success(String(count))} cache entries.`);
|
|
42
|
+
console.log();
|
|
43
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { listAllSkills, listAgentProfiles } from '../../domains/agent/index.js';
|
|
2
|
+
import { logger } from '../../services/logger.js';
|
|
3
|
+
import { brand, pc } from '../../utils/colors.js';
|
|
4
|
+
export function registerCatalogCommand(cli) {
|
|
5
|
+
const catalog = cli.command('catalog [subcommand]', 'Catalog of skills and agents');
|
|
6
|
+
catalog.action(async (subcommand) => {
|
|
7
|
+
const sub = subcommand || 'skills';
|
|
8
|
+
switch (sub) {
|
|
9
|
+
case 'skills':
|
|
10
|
+
await handleSkills();
|
|
11
|
+
break;
|
|
12
|
+
case 'agents':
|
|
13
|
+
await handleAgents();
|
|
14
|
+
break;
|
|
15
|
+
default:
|
|
16
|
+
console.log();
|
|
17
|
+
logger.error(`Unknown subcommand: ${sub}`);
|
|
18
|
+
console.log();
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async function handleSkills() {
|
|
24
|
+
const skills = listAllSkills();
|
|
25
|
+
console.log();
|
|
26
|
+
console.log(pc.bold(brand.geminiPurple('Available Skills')));
|
|
27
|
+
console.log();
|
|
28
|
+
if (skills.length === 0) {
|
|
29
|
+
logger.info(' No skills found.');
|
|
30
|
+
console.log();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
for (const s of skills) {
|
|
34
|
+
console.log(` ${brand.success('✓')} ${brand.primary(s.name)}`);
|
|
35
|
+
}
|
|
36
|
+
console.log();
|
|
37
|
+
console.log(brand.dim(` Total: ${skills.length} skills`));
|
|
38
|
+
console.log();
|
|
39
|
+
}
|
|
40
|
+
async function handleAgents() {
|
|
41
|
+
const profiles = listAgentProfiles();
|
|
42
|
+
console.log();
|
|
43
|
+
console.log(pc.bold(brand.geminiPurple('Available Agent Profiles')));
|
|
44
|
+
console.log();
|
|
45
|
+
if (profiles.length === 0) {
|
|
46
|
+
logger.info(' No agent profiles found.');
|
|
47
|
+
console.log();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
for (const p of profiles) {
|
|
51
|
+
console.log(` ${brand.success('●')} ${brand.primary(p.name)}`);
|
|
52
|
+
console.log(` ${brand.dim(p.description)}`);
|
|
53
|
+
}
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(brand.dim(` Total: ${profiles.length} profiles`));
|
|
56
|
+
console.log();
|
|
57
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config command - View and edit configuration
|
|
3
|
+
*
|
|
4
|
+
* Subcommands organized with custom help display.
|
|
5
|
+
*/
|
|
6
|
+
import { loadConfig, getConfigValue, setConfigValue, resetConfig } from '../../domains/config/manager.js';
|
|
7
|
+
import { logger } from '../../services/logger.js';
|
|
8
|
+
import { brand, pc } from '../../utils/colors.js';
|
|
9
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
10
|
+
// HELP FUNCTIONS
|
|
11
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
12
|
+
function showMainHelp() {
|
|
13
|
+
console.log();
|
|
14
|
+
console.log(pc.bold(brand.geminiPurple('Configuration Management')));
|
|
15
|
+
console.log();
|
|
16
|
+
console.log('Usage:');
|
|
17
|
+
console.log(` ${brand.primary('gk config')} <subcommand> [options]`);
|
|
18
|
+
console.log();
|
|
19
|
+
console.log('Subcommands:');
|
|
20
|
+
console.log(` ${brand.primary('list')} Show all config (default)`);
|
|
21
|
+
console.log(` ${brand.primary('get')} <key> Get config value`);
|
|
22
|
+
console.log(` ${brand.primary('set')} <key> <val> Set config value`);
|
|
23
|
+
console.log(` ${brand.primary('reset')} Reset to defaults`);
|
|
24
|
+
console.log();
|
|
25
|
+
console.log('Options:');
|
|
26
|
+
console.log(` ${brand.dim('--json')} [list] Output as JSON`);
|
|
27
|
+
console.log();
|
|
28
|
+
console.log('Examples:');
|
|
29
|
+
console.log(` ${brand.dim('gk config list')}`);
|
|
30
|
+
console.log(` ${brand.dim('gk config get spawn.defaultModel')}`);
|
|
31
|
+
console.log(` ${brand.dim('gk config set spawn.music true')}`);
|
|
32
|
+
console.log(` ${brand.dim('gk config reset')}`);
|
|
33
|
+
console.log();
|
|
34
|
+
}
|
|
35
|
+
export function registerConfigCommand(cli) {
|
|
36
|
+
cli
|
|
37
|
+
.command('config [subcommand] [key] [value]', 'Configuration management (list, get, set, reset)')
|
|
38
|
+
.alias('c')
|
|
39
|
+
.option('--json', '[list] Output as JSON')
|
|
40
|
+
.action(async (subcommand, key, value, options) => {
|
|
41
|
+
const sub = subcommand || 'list';
|
|
42
|
+
switch (sub) {
|
|
43
|
+
case 'list':
|
|
44
|
+
await handleList(options);
|
|
45
|
+
break;
|
|
46
|
+
case 'get':
|
|
47
|
+
if (!key) {
|
|
48
|
+
console.log();
|
|
49
|
+
logger.error('Config key required');
|
|
50
|
+
console.log(brand.dim('Usage: gk config get <key>'));
|
|
51
|
+
console.log();
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
await handleGet(key);
|
|
55
|
+
break;
|
|
56
|
+
case 'set':
|
|
57
|
+
if (!key || value === undefined) {
|
|
58
|
+
console.log();
|
|
59
|
+
logger.error('Config key and value required');
|
|
60
|
+
console.log(brand.dim('Usage: gk config set <key> <value>'));
|
|
61
|
+
console.log();
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
await handleSet(key, value);
|
|
65
|
+
break;
|
|
66
|
+
case 'reset':
|
|
67
|
+
await handleReset();
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
showMainHelp();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async function handleList(options) {
|
|
75
|
+
const c = loadConfig();
|
|
76
|
+
if (options.json) {
|
|
77
|
+
console.log(JSON.stringify(c, null, 2));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log();
|
|
81
|
+
console.log(pc.bold(brand.geminiPurple('GemKit Configuration')));
|
|
82
|
+
console.log();
|
|
83
|
+
console.log(JSON.stringify(c, null, 2));
|
|
84
|
+
console.log();
|
|
85
|
+
}
|
|
86
|
+
async function handleGet(key) {
|
|
87
|
+
const value = getConfigValue(key);
|
|
88
|
+
if (value === undefined) {
|
|
89
|
+
console.log();
|
|
90
|
+
logger.error(`Config key not found: ${key}`);
|
|
91
|
+
console.log();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
console.log(value);
|
|
95
|
+
}
|
|
96
|
+
async function handleSet(key, value) {
|
|
97
|
+
// Basic type conversion
|
|
98
|
+
let typedValue = value;
|
|
99
|
+
if (value === 'true')
|
|
100
|
+
typedValue = true;
|
|
101
|
+
else if (value === 'false')
|
|
102
|
+
typedValue = false;
|
|
103
|
+
else if (!isNaN(Number(value)))
|
|
104
|
+
typedValue = Number(value);
|
|
105
|
+
try {
|
|
106
|
+
setConfigValue(key, typedValue);
|
|
107
|
+
console.log();
|
|
108
|
+
logger.success(`Config updated: ${brand.primary(key)} = ${brand.success(String(typedValue))}`);
|
|
109
|
+
console.log();
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.log();
|
|
113
|
+
logger.error(`Failed to set config: ${error instanceof Error ? error.message : String(error)}`);
|
|
114
|
+
console.log();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function handleReset() {
|
|
118
|
+
resetConfig();
|
|
119
|
+
console.log();
|
|
120
|
+
logger.success('Configuration reset to defaults.');
|
|
121
|
+
console.log();
|
|
122
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert command - Convert .claude resources to .gemini
|
|
3
|
+
*
|
|
4
|
+
* Types organized with custom help display.
|
|
5
|
+
* All options apply to all types (skill/agent).
|
|
6
|
+
*/
|
|
7
|
+
import type { CAC } from 'cac';
|
|
8
|
+
export declare function registerConvertCommand(cli: CAC): void;
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert command - Convert .claude resources to .gemini
|
|
3
|
+
*
|
|
4
|
+
* Types organized with custom help display.
|
|
5
|
+
* All options apply to all types (skill/agent).
|
|
6
|
+
*/
|
|
7
|
+
import { listSkills, convertSkill, convertAllSkills, getConversionSummary, extensionExists, getSkillsDir, getExtensionsDir, listAgents, convertAgent, convertAllAgents, geminiAgentExists, getClaudeAgentsDir, getGeminiAgentsDir } from '../../domains/convert/index.js';
|
|
8
|
+
import { logger } from '../../services/logger.js';
|
|
9
|
+
import { brand, ui, pc } from '../../utils/colors.js';
|
|
10
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
11
|
+
// HELP FUNCTIONS
|
|
12
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
13
|
+
function showMainHelp() {
|
|
14
|
+
console.log();
|
|
15
|
+
console.log(pc.bold(brand.geminiPurple('Convert .claude to .gemini')));
|
|
16
|
+
console.log();
|
|
17
|
+
console.log('Usage:');
|
|
18
|
+
console.log(` ${brand.primary('gk convert')} <type> [name] [options]`);
|
|
19
|
+
console.log();
|
|
20
|
+
console.log('Types:');
|
|
21
|
+
console.log(` ${brand.primary('skill')} <name> Convert a single skill to extension`);
|
|
22
|
+
console.log(` ${brand.primary('skills')} Convert all skills to extensions`);
|
|
23
|
+
console.log(` ${brand.primary('agent')} <name> Convert a single agent`);
|
|
24
|
+
console.log(` ${brand.primary('agents')} Convert all agents`);
|
|
25
|
+
console.log();
|
|
26
|
+
console.log('Options:');
|
|
27
|
+
console.log(` ${brand.dim('--list')} List available items`);
|
|
28
|
+
console.log(` ${brand.dim('--force')} Overwrite existing items`);
|
|
29
|
+
console.log(` ${brand.dim('--dry-run')} Show what would be done without changes`);
|
|
30
|
+
console.log(` ${brand.dim('--json')} Output as JSON`);
|
|
31
|
+
console.log();
|
|
32
|
+
console.log('Examples:');
|
|
33
|
+
console.log(` ${brand.dim('gk convert skill --list')}`);
|
|
34
|
+
console.log(` ${brand.dim('gk convert skill my-skill')}`);
|
|
35
|
+
console.log(` ${brand.dim('gk convert skills --force')}`);
|
|
36
|
+
console.log(` ${brand.dim('gk convert agent --list')}`);
|
|
37
|
+
console.log(` ${brand.dim('gk convert agents --dry-run')}`);
|
|
38
|
+
console.log();
|
|
39
|
+
}
|
|
40
|
+
export function registerConvertCommand(cli) {
|
|
41
|
+
cli
|
|
42
|
+
.command('convert [type] [name]', 'Convert .claude to .gemini resources')
|
|
43
|
+
.alias('cv')
|
|
44
|
+
.option('--all', '[all] Convert all items')
|
|
45
|
+
.option('--list', '[all] List available items')
|
|
46
|
+
.option('--force', '[all] Overwrite existing items')
|
|
47
|
+
.option('--dry-run', '[all] Show what would be done without making changes')
|
|
48
|
+
.option('--json', '[all] Output as JSON')
|
|
49
|
+
.action(async (type, name, options) => {
|
|
50
|
+
if (!type) {
|
|
51
|
+
showMainHelp();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Handle skill/skills
|
|
55
|
+
if (type === 'skill' || type === 'skills') {
|
|
56
|
+
if (options.list) {
|
|
57
|
+
await handleListSkills(options);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (options.all || type === 'skills') {
|
|
61
|
+
await handleConvertAllSkills(options);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (!name) {
|
|
65
|
+
console.log();
|
|
66
|
+
logger.error('Skill name required');
|
|
67
|
+
console.log(brand.dim('Usage: gk convert skill <name>'));
|
|
68
|
+
console.log(brand.dim(' gk convert skill --list (to see available skills)'));
|
|
69
|
+
console.log(brand.dim(' gk convert skills (to convert all)'));
|
|
70
|
+
console.log();
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
await handleConvertSingleSkill(name, options);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Handle agent/agents
|
|
77
|
+
if (type === 'agent' || type === 'agents') {
|
|
78
|
+
if (options.list) {
|
|
79
|
+
await handleListAgents(options);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (options.all || type === 'agents') {
|
|
83
|
+
await handleConvertAllAgents(options);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!name) {
|
|
87
|
+
console.log();
|
|
88
|
+
logger.error('Agent name required');
|
|
89
|
+
console.log(brand.dim('Usage: gk convert agent <name>'));
|
|
90
|
+
console.log(brand.dim(' gk convert agent --list (to see available agents)'));
|
|
91
|
+
console.log(brand.dim(' gk convert agents (to convert all)'));
|
|
92
|
+
console.log();
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
await handleConvertSingleAgent(name, options);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Unknown type
|
|
99
|
+
showMainHelp();
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async function handleListSkills(options) {
|
|
103
|
+
const skills = listSkills();
|
|
104
|
+
if (options.json) {
|
|
105
|
+
console.log(JSON.stringify(skills, null, 2));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
console.log();
|
|
109
|
+
console.log(pc.bold(brand.geminiPurple('Available Claude Skills')));
|
|
110
|
+
console.log(brand.dim(` Source: ${getSkillsDir()}`));
|
|
111
|
+
console.log();
|
|
112
|
+
if (skills.length === 0) {
|
|
113
|
+
logger.info('No skills found in .claude/skills/');
|
|
114
|
+
console.log();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
for (const skill of skills) {
|
|
118
|
+
const exists = extensionExists(skill.name);
|
|
119
|
+
const statusIcon = exists ? brand.success('✓') : brand.dim('○');
|
|
120
|
+
const statusText = exists ? brand.dim(' (converted)') : '';
|
|
121
|
+
console.log(` ${statusIcon} ${brand.primary(skill.name)}${statusText}`);
|
|
122
|
+
if (skill.description) {
|
|
123
|
+
const shortDesc = skill.description.length > 70
|
|
124
|
+
? skill.description.slice(0, 70) + '...'
|
|
125
|
+
: skill.description;
|
|
126
|
+
console.log(` ${brand.dim(shortDesc)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
console.log();
|
|
130
|
+
console.log(brand.dim(` Total: ${skills.length} skills`));
|
|
131
|
+
console.log();
|
|
132
|
+
}
|
|
133
|
+
async function handleConvertSingleSkill(name, options) {
|
|
134
|
+
const result = convertSkill(name, {
|
|
135
|
+
force: options.force,
|
|
136
|
+
dryRun: options.dryRun
|
|
137
|
+
});
|
|
138
|
+
if (options.json) {
|
|
139
|
+
console.log(JSON.stringify(result, null, 2));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
console.log();
|
|
143
|
+
if (result.errors.length > 0) {
|
|
144
|
+
logger.error(`Failed to convert skill: ${name}`);
|
|
145
|
+
for (const error of result.errors) {
|
|
146
|
+
console.log(` ${brand.error('✗')} ${error}`);
|
|
147
|
+
}
|
|
148
|
+
console.log();
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
if (result.skipped.length > 0) {
|
|
152
|
+
logger.warn(`Skipped skill: ${name}`);
|
|
153
|
+
for (const skip of result.skipped) {
|
|
154
|
+
console.log(` ${brand.dim('○')} ${skip}`);
|
|
155
|
+
}
|
|
156
|
+
console.log();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (options.dryRun) {
|
|
160
|
+
logger.info(`[DRY RUN] Would convert skill: ${name}`);
|
|
161
|
+
for (const item of result.created) {
|
|
162
|
+
console.log(` ${brand.dim('→')} ${item}`);
|
|
163
|
+
}
|
|
164
|
+
console.log();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
logger.success(`Converted skill: ${brand.primary(name)}`);
|
|
168
|
+
console.log();
|
|
169
|
+
console.log(` ${brand.dim('Created files:')}`);
|
|
170
|
+
for (const item of result.created.slice(0, 5)) {
|
|
171
|
+
const shortPath = item.replace(process.cwd(), '.');
|
|
172
|
+
console.log(` ${brand.success('+')} ${shortPath}`);
|
|
173
|
+
}
|
|
174
|
+
if (result.created.length > 5) {
|
|
175
|
+
console.log(` ${brand.dim(`... and ${result.created.length - 5} more`)}`);
|
|
176
|
+
}
|
|
177
|
+
console.log();
|
|
178
|
+
console.log(brand.dim(` Extension created at: ${getExtensionsDir()}/${name}`));
|
|
179
|
+
console.log();
|
|
180
|
+
}
|
|
181
|
+
async function handleConvertAllSkills(options) {
|
|
182
|
+
const skills = listSkills();
|
|
183
|
+
if (skills.length === 0) {
|
|
184
|
+
if (options.json) {
|
|
185
|
+
console.log(JSON.stringify({ results: [], summary: { total: 0, success: 0, skipped: 0, failed: 0 } }, null, 2));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
console.log();
|
|
189
|
+
logger.info('No skills found in .claude/skills/');
|
|
190
|
+
console.log();
|
|
191
|
+
}
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const results = convertAllSkills({
|
|
195
|
+
force: options.force,
|
|
196
|
+
dryRun: options.dryRun
|
|
197
|
+
});
|
|
198
|
+
const summary = getConversionSummary(results);
|
|
199
|
+
if (options.json) {
|
|
200
|
+
console.log(JSON.stringify({ results, summary }, null, 2));
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
console.log();
|
|
204
|
+
if (options.dryRun) {
|
|
205
|
+
console.log(pc.bold(brand.geminiPurple('[DRY RUN] Skill Conversion Preview')));
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
console.log(pc.bold(brand.geminiPurple('Skill Conversion Results')));
|
|
209
|
+
}
|
|
210
|
+
console.log(ui.line());
|
|
211
|
+
console.log();
|
|
212
|
+
for (const result of results) {
|
|
213
|
+
if (result.errors.length > 0) {
|
|
214
|
+
console.log(` ${brand.error('✗')} ${result.skill}`);
|
|
215
|
+
for (const error of result.errors) {
|
|
216
|
+
console.log(` ${brand.dim(error)}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (result.skipped.length > 0) {
|
|
220
|
+
console.log(` ${brand.dim('○')} ${result.skill} ${brand.dim('(skipped)')}`);
|
|
221
|
+
}
|
|
222
|
+
else if (result.success) {
|
|
223
|
+
const prefix = options.dryRun ? brand.dim('→') : brand.success('✓');
|
|
224
|
+
console.log(` ${prefix} ${result.skill}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
console.log();
|
|
228
|
+
console.log(ui.line());
|
|
229
|
+
console.log();
|
|
230
|
+
if (options.dryRun) {
|
|
231
|
+
console.log(` ${brand.dim('Would convert:')} ${summary.success} skills`);
|
|
232
|
+
console.log(` ${brand.dim('Would skip:')} ${summary.skipped} skills`);
|
|
233
|
+
console.log(` ${brand.dim('Would fail:')} ${summary.failed} skills`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
console.log(` ${brand.success('Converted:')} ${summary.success}`);
|
|
237
|
+
console.log(` ${brand.dim('Skipped:')} ${summary.skipped}`);
|
|
238
|
+
console.log(` ${brand.error('Failed:')} ${summary.failed}`);
|
|
239
|
+
}
|
|
240
|
+
console.log();
|
|
241
|
+
if (summary.skipped > 0 && !options.force) {
|
|
242
|
+
logger.info('Use --force to overwrite existing extensions');
|
|
243
|
+
console.log();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
247
|
+
// AGENT HANDLERS
|
|
248
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
249
|
+
async function handleListAgents(options) {
|
|
250
|
+
const agents = listAgents();
|
|
251
|
+
if (options.json) {
|
|
252
|
+
console.log(JSON.stringify(agents, null, 2));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
console.log();
|
|
256
|
+
console.log(pc.bold(brand.geminiPurple('Available Claude Agents')));
|
|
257
|
+
console.log(brand.dim(` Source: ${getClaudeAgentsDir()}`));
|
|
258
|
+
console.log();
|
|
259
|
+
if (agents.length === 0) {
|
|
260
|
+
logger.info('No agents found in .claude/agents/');
|
|
261
|
+
console.log();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
for (const agent of agents) {
|
|
265
|
+
const exists = geminiAgentExists(agent.name);
|
|
266
|
+
const statusIcon = exists ? brand.success('✓') : brand.dim('○');
|
|
267
|
+
const statusText = exists ? brand.dim(' (converted)') : '';
|
|
268
|
+
console.log(` ${statusIcon} ${brand.primary(agent.name)}${statusText}`);
|
|
269
|
+
if (agent.model) {
|
|
270
|
+
console.log(` ${brand.dim('Model:')} ${agent.model}`);
|
|
271
|
+
}
|
|
272
|
+
if (agent.description) {
|
|
273
|
+
const shortDesc = agent.description.length > 60
|
|
274
|
+
? agent.description.slice(0, 60) + '...'
|
|
275
|
+
: agent.description;
|
|
276
|
+
console.log(` ${brand.dim(shortDesc)}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
console.log();
|
|
280
|
+
console.log(brand.dim(` Total: ${agents.length} agents`));
|
|
281
|
+
console.log();
|
|
282
|
+
}
|
|
283
|
+
async function handleConvertSingleAgent(name, options) {
|
|
284
|
+
const result = convertAgent(name, {
|
|
285
|
+
force: options.force,
|
|
286
|
+
dryRun: options.dryRun
|
|
287
|
+
});
|
|
288
|
+
if (options.json) {
|
|
289
|
+
console.log(JSON.stringify(result, null, 2));
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
console.log();
|
|
293
|
+
if (result.errors.length > 0) {
|
|
294
|
+
logger.error(`Failed to convert agent: ${name}`);
|
|
295
|
+
for (const error of result.errors) {
|
|
296
|
+
console.log(` ${brand.error('✗')} ${error}`);
|
|
297
|
+
}
|
|
298
|
+
console.log();
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
if (result.skipped.length > 0) {
|
|
302
|
+
logger.warn(`Skipped agent: ${name}`);
|
|
303
|
+
for (const skip of result.skipped) {
|
|
304
|
+
console.log(` ${brand.dim('○')} ${skip}`);
|
|
305
|
+
}
|
|
306
|
+
console.log();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (options.dryRun) {
|
|
310
|
+
logger.info(`[DRY RUN] Would convert agent: ${name}`);
|
|
311
|
+
for (const item of result.created) {
|
|
312
|
+
console.log(` ${brand.dim('→')} ${item}`);
|
|
313
|
+
}
|
|
314
|
+
console.log();
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
logger.success(`Converted agent: ${brand.primary(name)}`);
|
|
318
|
+
console.log();
|
|
319
|
+
for (const item of result.created) {
|
|
320
|
+
const shortPath = item.replace(process.cwd(), '.');
|
|
321
|
+
console.log(` ${brand.success('+')} ${shortPath}`);
|
|
322
|
+
}
|
|
323
|
+
console.log();
|
|
324
|
+
console.log(brand.dim(` Agent created at: ${getGeminiAgentsDir()}/${name}.md`));
|
|
325
|
+
console.log();
|
|
326
|
+
}
|
|
327
|
+
async function handleConvertAllAgents(options) {
|
|
328
|
+
const agents = listAgents();
|
|
329
|
+
if (agents.length === 0) {
|
|
330
|
+
if (options.json) {
|
|
331
|
+
console.log(JSON.stringify({ results: [], summary: { total: 0, success: 0, skipped: 0, failed: 0 } }, null, 2));
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
console.log();
|
|
335
|
+
logger.info('No agents found in .claude/agents/');
|
|
336
|
+
console.log();
|
|
337
|
+
}
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const results = convertAllAgents({
|
|
341
|
+
force: options.force,
|
|
342
|
+
dryRun: options.dryRun
|
|
343
|
+
});
|
|
344
|
+
const summary = getConversionSummary(results);
|
|
345
|
+
if (options.json) {
|
|
346
|
+
console.log(JSON.stringify({ results, summary }, null, 2));
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
console.log();
|
|
350
|
+
if (options.dryRun) {
|
|
351
|
+
console.log(pc.bold(brand.geminiPurple('[DRY RUN] Agent Conversion Preview')));
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
console.log(pc.bold(brand.geminiPurple('Agent Conversion Results')));
|
|
355
|
+
}
|
|
356
|
+
console.log(ui.line());
|
|
357
|
+
console.log();
|
|
358
|
+
for (const result of results) {
|
|
359
|
+
if (result.errors.length > 0) {
|
|
360
|
+
console.log(` ${brand.error('✗')} ${result.skill}`);
|
|
361
|
+
for (const error of result.errors) {
|
|
362
|
+
console.log(` ${brand.dim(error)}`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
else if (result.skipped.length > 0) {
|
|
366
|
+
console.log(` ${brand.dim('○')} ${result.skill} ${brand.dim('(skipped)')}`);
|
|
367
|
+
}
|
|
368
|
+
else if (result.success) {
|
|
369
|
+
const prefix = options.dryRun ? brand.dim('→') : brand.success('✓');
|
|
370
|
+
console.log(` ${prefix} ${result.skill}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
console.log();
|
|
374
|
+
console.log(ui.line());
|
|
375
|
+
console.log();
|
|
376
|
+
if (options.dryRun) {
|
|
377
|
+
console.log(` ${brand.dim('Would convert:')} ${summary.success} agents`);
|
|
378
|
+
console.log(` ${brand.dim('Would skip:')} ${summary.skipped} agents`);
|
|
379
|
+
console.log(` ${brand.dim('Would fail:')} ${summary.failed} agents`);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
console.log(` ${brand.success('Converted:')} ${summary.success}`);
|
|
383
|
+
console.log(` ${brand.dim('Skipped:')} ${summary.skipped}`);
|
|
384
|
+
console.log(` ${brand.error('Failed:')} ${summary.failed}`);
|
|
385
|
+
}
|
|
386
|
+
console.log();
|
|
387
|
+
if (summary.skipped > 0 && !options.force) {
|
|
388
|
+
logger.info('Use --force to overwrite existing agents');
|
|
389
|
+
console.log();
|
|
390
|
+
}
|
|
391
|
+
}
|