@claudeflows/cli 0.1.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.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/bin/claudeflows.js +2 -0
  4. package/dist/commands/doctor.d.ts +3 -0
  5. package/dist/commands/doctor.d.ts.map +1 -0
  6. package/dist/commands/doctor.js +111 -0
  7. package/dist/commands/doctor.js.map +1 -0
  8. package/dist/commands/init.d.ts +3 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +174 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/install.d.ts +3 -0
  13. package/dist/commands/install.d.ts.map +1 -0
  14. package/dist/commands/install.js +353 -0
  15. package/dist/commands/install.js.map +1 -0
  16. package/dist/commands/license.d.ts +3 -0
  17. package/dist/commands/license.d.ts.map +1 -0
  18. package/dist/commands/license.js +167 -0
  19. package/dist/commands/license.js.map +1 -0
  20. package/dist/commands/list.d.ts +3 -0
  21. package/dist/commands/list.d.ts.map +1 -0
  22. package/dist/commands/list.js +97 -0
  23. package/dist/commands/list.js.map +1 -0
  24. package/dist/commands/login.d.ts +3 -0
  25. package/dist/commands/login.d.ts.map +1 -0
  26. package/dist/commands/login.js +144 -0
  27. package/dist/commands/login.js.map +1 -0
  28. package/dist/commands/publish.d.ts +3 -0
  29. package/dist/commands/publish.d.ts.map +1 -0
  30. package/dist/commands/publish.js +121 -0
  31. package/dist/commands/publish.js.map +1 -0
  32. package/dist/commands/uninstall.d.ts +3 -0
  33. package/dist/commands/uninstall.d.ts.map +1 -0
  34. package/dist/commands/uninstall.js +66 -0
  35. package/dist/commands/uninstall.js.map +1 -0
  36. package/dist/commands/update.d.ts +3 -0
  37. package/dist/commands/update.d.ts.map +1 -0
  38. package/dist/commands/update.js +167 -0
  39. package/dist/commands/update.js.map +1 -0
  40. package/dist/commands/verify.d.ts +3 -0
  41. package/dist/commands/verify.d.ts.map +1 -0
  42. package/dist/commands/verify.js +129 -0
  43. package/dist/commands/verify.js.map +1 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +28 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/lib/config.d.ts +10 -0
  49. package/dist/lib/config.d.ts.map +1 -0
  50. package/dist/lib/config.js +37 -0
  51. package/dist/lib/config.js.map +1 -0
  52. package/dist/lib/doctor.d.ts +14 -0
  53. package/dist/lib/doctor.d.ts.map +1 -0
  54. package/dist/lib/doctor.js +344 -0
  55. package/dist/lib/doctor.js.map +1 -0
  56. package/dist/lib/env-manager.d.ts +10 -0
  57. package/dist/lib/env-manager.d.ts.map +1 -0
  58. package/dist/lib/env-manager.js +60 -0
  59. package/dist/lib/env-manager.js.map +1 -0
  60. package/dist/lib/installer.d.ts +3 -0
  61. package/dist/lib/installer.d.ts.map +1 -0
  62. package/dist/lib/installer.js +43 -0
  63. package/dist/lib/installer.js.map +1 -0
  64. package/dist/lib/integrity.d.ts +42 -0
  65. package/dist/lib/integrity.d.ts.map +1 -0
  66. package/dist/lib/integrity.js +119 -0
  67. package/dist/lib/integrity.js.map +1 -0
  68. package/dist/lib/license.d.ts +39 -0
  69. package/dist/lib/license.d.ts.map +1 -0
  70. package/dist/lib/license.js +108 -0
  71. package/dist/lib/license.js.map +1 -0
  72. package/dist/lib/manifest.d.ts +74 -0
  73. package/dist/lib/manifest.d.ts.map +1 -0
  74. package/dist/lib/manifest.js +47 -0
  75. package/dist/lib/manifest.js.map +1 -0
  76. package/dist/lib/mcp-setup.d.ts +18 -0
  77. package/dist/lib/mcp-setup.d.ts.map +1 -0
  78. package/dist/lib/mcp-setup.js +92 -0
  79. package/dist/lib/mcp-setup.js.map +1 -0
  80. package/dist/lib/registry.d.ts +28 -0
  81. package/dist/lib/registry.d.ts.map +1 -0
  82. package/dist/lib/registry.js +77 -0
  83. package/dist/lib/registry.js.map +1 -0
  84. package/dist/lib/skill-linker.d.ts +13 -0
  85. package/dist/lib/skill-linker.d.ts.map +1 -0
  86. package/dist/lib/skill-linker.js +134 -0
  87. package/dist/lib/skill-linker.js.map +1 -0
  88. package/package.json +49 -0
@@ -0,0 +1,97 @@
1
+ import { readdir, readFile, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { getInstalledDir, ensureDirs } from '../lib/config.js';
5
+ import { runDoctor } from '../lib/doctor.js';
6
+ export function registerList(program) {
7
+ program
8
+ .command('list')
9
+ .alias('ls')
10
+ .description('List installed workflows')
11
+ .action(async () => {
12
+ try {
13
+ await ensureDirs();
14
+ const installedDir = getInstalledDir();
15
+ let entries;
16
+ try {
17
+ entries = await readdir(installedDir);
18
+ }
19
+ catch {
20
+ entries = [];
21
+ }
22
+ // Filter to only directories with workflow.json
23
+ const workflows = [];
24
+ for (const entry of entries) {
25
+ const dir = join(installedDir, entry);
26
+ const manifestPath = join(dir, 'workflow.json');
27
+ try {
28
+ const s = await stat(dir);
29
+ if (!s.isDirectory())
30
+ continue;
31
+ const raw = await readFile(manifestPath, 'utf-8');
32
+ const manifest = JSON.parse(raw);
33
+ // Quick health check
34
+ const checks = await runDoctor(manifest, dir);
35
+ const hasErrors = checks.some((c) => c.status === 'error');
36
+ const hasWarns = checks.some((c) => c.status === 'warn');
37
+ const status = hasErrors
38
+ ? 'error'
39
+ : hasWarns
40
+ ? 'warn'
41
+ : 'ok';
42
+ workflows.push({
43
+ name: manifest.name,
44
+ displayName: manifest.displayName,
45
+ version: manifest.version,
46
+ skillsCount: manifest.skills.length,
47
+ status,
48
+ dir,
49
+ });
50
+ }
51
+ catch {
52
+ // Skip entries that aren't valid workflows
53
+ workflows.push({
54
+ name: entry,
55
+ displayName: entry,
56
+ version: '?',
57
+ skillsCount: 0,
58
+ status: 'error',
59
+ dir,
60
+ });
61
+ }
62
+ }
63
+ if (workflows.length === 0) {
64
+ console.log(chalk.dim('No workflows installed.'));
65
+ console.log(chalk.dim(`Install one with: ${chalk.bold('claudeflows install <name>')}`));
66
+ return;
67
+ }
68
+ // Calculate column widths
69
+ const nameWidth = Math.max(4, // "NAME"
70
+ ...workflows.map((w) => w.displayName.length));
71
+ const versionWidth = Math.max(7, // "VERSION"
72
+ ...workflows.map((w) => w.version.length));
73
+ const skillsWidth = 6; // "SKILLS"
74
+ // Header
75
+ console.log('');
76
+ console.log(chalk.bold(` ${'NAME'.padEnd(nameWidth)} ${'VERSION'.padEnd(versionWidth)} ${'SKILLS'.padEnd(skillsWidth)} STATUS`));
77
+ console.log(chalk.dim(` ${'\u2500'.repeat(nameWidth)} ${'\u2500'.repeat(versionWidth)} ${'\u2500'.repeat(skillsWidth)} ${'\u2500'.repeat(6)}`));
78
+ // Rows
79
+ for (const w of workflows) {
80
+ const statusIcon = w.status === 'ok'
81
+ ? chalk.green('\u2713 ok')
82
+ : w.status === 'warn'
83
+ ? chalk.yellow('\u26A0 warn')
84
+ : chalk.red('\u2717 err');
85
+ console.log(` ${w.displayName.padEnd(nameWidth)} ${w.version.padEnd(versionWidth)} ${String(w.skillsCount).padEnd(skillsWidth)} ${statusIcon}`);
86
+ }
87
+ console.log('');
88
+ console.log(chalk.dim(`${workflows.length} workflow(s) installed`));
89
+ console.log('');
90
+ }
91
+ catch (err) {
92
+ console.error(chalk.red(`Error listing workflows: ${err.message}`));
93
+ process.exit(1);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerLogin(program: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsJpD"}
@@ -0,0 +1,144 @@
1
+ import { mkdir, writeFile, readFile, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { createServer } from 'node:http';
5
+ import { randomBytes } from 'node:crypto';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ const AUTH_FILE = join(homedir(), '.claude-workflows', 'auth.json');
9
+ const OAUTH_CLIENT_ID = 'claudeflows-cli';
10
+ const OAUTH_CALLBACK_PORT = 9876;
11
+ async function fileExists(path) {
12
+ try {
13
+ await stat(path);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ export function registerLogin(program) {
21
+ program
22
+ .command('login')
23
+ .description('Authenticate with Claude Flows using GitHub OAuth')
24
+ .action(async () => {
25
+ try {
26
+ // Check if already logged in
27
+ if (await fileExists(AUTH_FILE)) {
28
+ try {
29
+ const raw = await readFile(AUTH_FILE, 'utf-8');
30
+ const auth = JSON.parse(raw);
31
+ if (auth.user && auth.token) {
32
+ console.log(chalk.green(`Already logged in as ${chalk.bold(auth.user)}`));
33
+ console.log(chalk.dim('Run `claudeflows logout` to sign out, or `claudeflows login --force` to re-authenticate.'));
34
+ return;
35
+ }
36
+ }
37
+ catch {
38
+ // Corrupt auth file, proceed with login
39
+ }
40
+ }
41
+ const state = randomBytes(16).toString('hex');
42
+ // Start a local HTTP server to receive the OAuth callback
43
+ const spinner = ora('Waiting for GitHub authentication...').start();
44
+ const authPromise = new Promise((resolve, reject) => {
45
+ const server = createServer((req, res) => {
46
+ const url = new URL(req.url ?? '/', `http://localhost:${OAUTH_CALLBACK_PORT}`);
47
+ if (url.pathname === '/callback') {
48
+ const code = url.searchParams.get('code');
49
+ const returnedState = url.searchParams.get('state');
50
+ if (!code || !returnedState) {
51
+ res.writeHead(400, { 'Content-Type': 'text/html' });
52
+ res.end('<h1>Authentication failed</h1><p>Missing code or state parameter.</p>');
53
+ reject(new Error('Missing OAuth parameters'));
54
+ return;
55
+ }
56
+ res.writeHead(200, { 'Content-Type': 'text/html' });
57
+ res.end('<h1>Authentication successful!</h1><p>You can close this window and return to the terminal.</p>');
58
+ server.close();
59
+ resolve({ code, state: returnedState });
60
+ }
61
+ else {
62
+ res.writeHead(404);
63
+ res.end();
64
+ }
65
+ });
66
+ server.listen(OAUTH_CALLBACK_PORT, () => {
67
+ // Server is ready
68
+ });
69
+ // Timeout after 2 minutes
70
+ setTimeout(() => {
71
+ server.close();
72
+ reject(new Error('Authentication timed out'));
73
+ }, 120000);
74
+ });
75
+ // Open browser for GitHub OAuth
76
+ const authUrl = `https://claudeflows.dev/api/auth/github?` +
77
+ `client_id=${OAUTH_CLIENT_ID}&` +
78
+ `redirect_uri=http://localhost:${OAUTH_CALLBACK_PORT}/callback&` +
79
+ `state=${state}`;
80
+ console.log('');
81
+ console.log(chalk.bold('Open this URL in your browser to authenticate:'));
82
+ console.log(chalk.cyan(authUrl));
83
+ console.log('');
84
+ // Try to open browser automatically
85
+ try {
86
+ const { execSync } = await import('node:child_process');
87
+ const openCmd = process.platform === 'darwin'
88
+ ? 'open'
89
+ : process.platform === 'win32'
90
+ ? 'start'
91
+ : 'xdg-open';
92
+ execSync(`${openCmd} "${authUrl}"`, { stdio: 'ignore' });
93
+ }
94
+ catch {
95
+ // Couldn't open browser automatically — user will copy URL
96
+ }
97
+ const { code, state: returnedState } = await authPromise;
98
+ if (returnedState !== state) {
99
+ spinner.fail('OAuth state mismatch — possible CSRF attack');
100
+ process.exit(1);
101
+ }
102
+ // Exchange code for token
103
+ spinner.text = 'Exchanging authorization code...';
104
+ const tokenResponse = await fetch('https://claudeflows.dev/api/auth/token', {
105
+ method: 'POST',
106
+ headers: { 'Content-Type': 'application/json' },
107
+ body: JSON.stringify({ code, client_id: OAUTH_CLIENT_ID }),
108
+ });
109
+ if (!tokenResponse.ok) {
110
+ spinner.fail('Failed to exchange authorization code');
111
+ console.error(chalk.red(`Server returned ${tokenResponse.status}`));
112
+ process.exit(1);
113
+ }
114
+ const tokenData = (await tokenResponse.json());
115
+ // Save auth
116
+ await mkdir(join(homedir(), '.claude-workflows'), { recursive: true });
117
+ await writeFile(AUTH_FILE, JSON.stringify({
118
+ user: tokenData.user,
119
+ token: tokenData.token,
120
+ authenticatedAt: new Date().toISOString(),
121
+ }, null, 2) + '\n', 'utf-8');
122
+ spinner.succeed(`Authenticated as ${chalk.bold(tokenData.user)}`);
123
+ }
124
+ catch (err) {
125
+ console.error(chalk.red(`Login failed: ${err.message}`));
126
+ process.exit(1);
127
+ }
128
+ });
129
+ program
130
+ .command('logout')
131
+ .description('Sign out of Claude Flows')
132
+ .action(async () => {
133
+ try {
134
+ const { rm } = await import('node:fs/promises');
135
+ await rm(AUTH_FILE, { force: true });
136
+ console.log(chalk.green('Signed out successfully.'));
137
+ }
138
+ catch (err) {
139
+ console.error(chalk.red(`Logout failed: ${err.message}`));
140
+ process.exit(1);
141
+ }
142
+ });
143
+ }
144
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPublish(program: Command): void;
3
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8HtD"}
@@ -0,0 +1,121 @@
1
+ import { stat, readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { parseManifest, validateManifest } from '../lib/manifest.js';
6
+ import { buildIntegrityBlock } from '../lib/integrity.js';
7
+ async function fileExists(path) {
8
+ try {
9
+ await stat(path);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export function registerPublish(program) {
17
+ program
18
+ .command('publish')
19
+ .description('Validate and prepare a workflow for publishing to the registry')
20
+ .action(async () => {
21
+ try {
22
+ const cwd = process.cwd();
23
+ const manifestPath = join(cwd, 'workflow.json');
24
+ // Check workflow.json exists
25
+ if (!(await fileExists(manifestPath))) {
26
+ console.error(chalk.red('No workflow.json found in current directory.'));
27
+ console.error(chalk.dim('Run `claudeflows init` to create a new workflow.'));
28
+ process.exit(1);
29
+ }
30
+ // Validate
31
+ const spinner = ora('Validating workflow.json...').start();
32
+ const raw = await readFile(manifestPath, 'utf-8');
33
+ let data;
34
+ try {
35
+ data = JSON.parse(raw);
36
+ }
37
+ catch {
38
+ spinner.fail('workflow.json contains invalid JSON');
39
+ process.exit(1);
40
+ }
41
+ const result = await validateManifest(data);
42
+ if (!result.valid) {
43
+ spinner.fail('Validation failed');
44
+ console.error('');
45
+ for (const error of result.errors) {
46
+ console.error(chalk.red(` \u2717 ${error}`));
47
+ }
48
+ process.exit(1);
49
+ }
50
+ const manifest = await parseManifest(cwd);
51
+ spinner.succeed('Validation passed');
52
+ // Check for recommended files
53
+ console.log(chalk.bold('\nChecklist:'));
54
+ const hasReadme = await fileExists(join(cwd, 'CLAUDE.md'));
55
+ console.log(hasReadme
56
+ ? chalk.green(' \u2713 CLAUDE.md found')
57
+ : chalk.yellow(' \u26A0 CLAUDE.md not found (recommended)'));
58
+ const hasLicense = await fileExists(join(cwd, 'LICENSE'));
59
+ console.log(hasLicense
60
+ ? chalk.green(' \u2713 LICENSE found')
61
+ : chalk.yellow(' \u26A0 LICENSE not found (recommended)'));
62
+ if (manifest.repository) {
63
+ console.log(chalk.green(` \u2713 Repository: ${manifest.repository}`));
64
+ }
65
+ else {
66
+ console.log(chalk.yellow(' \u26A0 No repository URL in workflow.json (recommended)'));
67
+ }
68
+ // Check that all skill files exist
69
+ let allSkillsExist = true;
70
+ for (const skill of manifest.skills) {
71
+ const skillPath = join(cwd, skill.path);
72
+ if (await fileExists(skillPath)) {
73
+ console.log(chalk.green(` \u2713 Skill "${skill.name}": ${skill.path}`));
74
+ }
75
+ else {
76
+ console.log(chalk.red(` \u2717 Skill "${skill.name}": ${skill.path} NOT FOUND`));
77
+ allSkillsExist = false;
78
+ }
79
+ }
80
+ if (!allSkillsExist) {
81
+ console.error(chalk.red('\nSome skill files are missing. Fix them before publishing.'));
82
+ process.exit(1);
83
+ }
84
+ // Compute and inject integrity block
85
+ const integritySpinner = ora('Computing file integrity hashes...').start();
86
+ const integrityBlock = await buildIntegrityBlock(cwd);
87
+ const fileCount = Object.keys(integrityBlock.files).length;
88
+ // Read raw workflow.json and inject integrity
89
+ const rawJson = await readFile(manifestPath, 'utf-8');
90
+ const manifestData = JSON.parse(rawJson);
91
+ manifestData.integrity = integrityBlock;
92
+ await writeFile(manifestPath, JSON.stringify(manifestData, null, 2) + '\n', 'utf-8');
93
+ integritySpinner.succeed(`Computed integrity hashes for ${fileCount} files (root: ${integrityBlock.root.slice(0, 12)}...)`);
94
+ // Print publish instructions
95
+ console.log(chalk.bold('\nReady to publish!\n'));
96
+ console.log('To submit your workflow to the Claude Flows registry:\n');
97
+ console.log(chalk.dim(' 1. Push your workflow to a public GitHub repository'));
98
+ console.log(chalk.dim(' 2. Fork https://github.com/claudeflows/registry'));
99
+ console.log(chalk.dim(' 3. Add your workflow to registry.json:'));
100
+ console.log('');
101
+ console.log(chalk.cyan(JSON.stringify({
102
+ name: manifest.name,
103
+ displayName: manifest.displayName,
104
+ description: manifest.description,
105
+ repository: manifest.repository ?? 'https://github.com/your-username/your-repo',
106
+ version: manifest.version,
107
+ author: manifest.author.name,
108
+ category: manifest.category ?? 'other',
109
+ tags: manifest.tags ?? [],
110
+ }, null, 4)));
111
+ console.log('');
112
+ console.log(chalk.dim(' 4. Open a pull request to the registry repository'));
113
+ console.log('');
114
+ }
115
+ catch (err) {
116
+ console.error(chalk.red(`Publish failed: ${err.message}`));
117
+ process.exit(1);
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerUninstall(program: Command): void;
3
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoDxD"}
@@ -0,0 +1,66 @@
1
+ import { rm, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { confirm } from '@inquirer/prompts';
6
+ import { getInstalledDir, ensureDirs } from '../lib/config.js';
7
+ import { unlinkSkills } from '../lib/skill-linker.js';
8
+ async function fileExists(path) {
9
+ try {
10
+ await stat(path);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ export function registerUninstall(program) {
18
+ program
19
+ .command('uninstall <name>')
20
+ .alias('rm')
21
+ .description('Uninstall a workflow')
22
+ .option('-f, --force', 'Skip confirmation prompt', false)
23
+ .action(async (name, options) => {
24
+ try {
25
+ await ensureDirs();
26
+ const installedDir = getInstalledDir();
27
+ const installDir = join(installedDir, name);
28
+ if (!(await fileExists(installDir))) {
29
+ console.error(chalk.red(`Workflow "${name}" is not installed.`));
30
+ process.exit(1);
31
+ }
32
+ if (!options.force) {
33
+ const shouldRemove = await confirm({
34
+ message: `Are you sure you want to uninstall "${name}"? This will remove all skill links and the installed files.`,
35
+ default: false,
36
+ });
37
+ if (!shouldRemove) {
38
+ console.log(chalk.yellow('Uninstall cancelled.'));
39
+ return;
40
+ }
41
+ }
42
+ // Step 1: Remove skill symlinks
43
+ const unlinkSpinner = ora('Removing skill links...').start();
44
+ const removed = await unlinkSkills(name, installDir);
45
+ if (removed.length > 0) {
46
+ unlinkSpinner.succeed(`Removed ${removed.length} skill link(s)`);
47
+ for (const r of removed) {
48
+ console.log(chalk.dim(` - ${r}`));
49
+ }
50
+ }
51
+ else {
52
+ unlinkSpinner.succeed('No skill links to remove');
53
+ }
54
+ // Step 2: Remove installed directory
55
+ const removeSpinner = ora('Removing workflow files...').start();
56
+ await rm(installDir, { recursive: true, force: true });
57
+ removeSpinner.succeed('Workflow files removed');
58
+ console.log(chalk.green(`\n\u2713 Successfully uninstalled "${name}"`));
59
+ }
60
+ catch (err) {
61
+ console.error(chalk.red(`Uninstall failed: ${err.message}`));
62
+ process.exit(1);
63
+ }
64
+ });
65
+ }
66
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerUpdate(program: Command): void;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqJpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8CrD"}