@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,353 @@
1
+ import { mkdir, writeFile, rm, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { execSync } from 'node:child_process';
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import { confirm } from '@inquirer/prompts';
8
+ import { ensureDirs, getInstalledDir } from '../lib/config.js';
9
+ import { parseManifest } from '../lib/manifest.js';
10
+ import { resolveWorkflow, getVersionIntegrity } from '../lib/registry.js';
11
+ import { downloadFromGithub } from '../lib/installer.js';
12
+ import { setupMcpServers } from '../lib/mcp-setup.js';
13
+ import { linkSkills } from '../lib/skill-linker.js';
14
+ import { setupEnvVars } from '../lib/env-manager.js';
15
+ import { runDoctor } from '../lib/doctor.js';
16
+ import { verifyIntegrity, verifySignature } from '../lib/integrity.js';
17
+ import { loadLicense, validateLicense } from '../lib/license.js';
18
+ function isGithubUrl(source) {
19
+ return (source.startsWith('https://github.com/') ||
20
+ source.startsWith('http://github.com/') ||
21
+ source.startsWith('github.com/') ||
22
+ source.startsWith('git@github.com:'));
23
+ }
24
+ function extractNameFromUrl(url) {
25
+ // Extract repo name from GitHub URL
26
+ const cleaned = url.replace(/\.git$/, '').replace(/\/$/, '');
27
+ const parts = cleaned.split('/');
28
+ return parts[parts.length - 1] ?? 'unknown';
29
+ }
30
+ function formatHealthCheck(check) {
31
+ const icon = check.status === 'ok'
32
+ ? chalk.green('\u2713')
33
+ : check.status === 'warn'
34
+ ? chalk.yellow('\u26A0')
35
+ : chalk.red('\u2717');
36
+ const color = check.status === 'ok'
37
+ ? chalk.green
38
+ : check.status === 'warn'
39
+ ? chalk.yellow
40
+ : chalk.red;
41
+ return ` ${icon} ${color(check.message)}`;
42
+ }
43
+ async function fileExists(path) {
44
+ try {
45
+ await stat(path);
46
+ return true;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ export function registerInstall(program) {
53
+ program
54
+ .command('install <source>')
55
+ .description('Install a workflow from the registry or a GitHub URL')
56
+ .option('-f, --force', 'Overwrite existing installation', false)
57
+ .action(async (source, options) => {
58
+ try {
59
+ // Step 0: Pre-install prerequisite checks
60
+ const claudeDir = join(homedir(), '.claude');
61
+ try {
62
+ await stat(claudeDir);
63
+ }
64
+ catch {
65
+ console.error(chalk.red('Claude Code is not set up.'));
66
+ console.error(chalk.dim(`Expected directory: ${claudeDir}`));
67
+ console.error('');
68
+ console.error('Please install and run Claude Code first:');
69
+ console.error(chalk.cyan(' npm install -g @anthropic-ai/claude-code'));
70
+ console.error(chalk.cyan(' claude'));
71
+ process.exit(1);
72
+ }
73
+ try {
74
+ execSync('claude --version', { stdio: 'pipe', encoding: 'utf-8' });
75
+ }
76
+ catch {
77
+ console.error(chalk.red('Claude Code CLI is not accessible.'));
78
+ console.error('');
79
+ console.error('Ensure `claude` is in your PATH:');
80
+ console.error(chalk.cyan(' npm install -g @anthropic-ai/claude-code'));
81
+ process.exit(1);
82
+ }
83
+ await ensureDirs();
84
+ // Step 1: Resolve source
85
+ let repoUrl;
86
+ let workflowName;
87
+ const spinner = ora('Resolving workflow source...').start();
88
+ if (isGithubUrl(source)) {
89
+ repoUrl = source.startsWith('http') || source.startsWith('git@')
90
+ ? source
91
+ : `https://${source}`;
92
+ workflowName = extractNameFromUrl(source);
93
+ spinner.succeed(`Resolved GitHub URL: ${chalk.cyan(repoUrl)}`);
94
+ }
95
+ else {
96
+ // Look up in registry
97
+ const entry = await resolveWorkflow(source);
98
+ if (!entry) {
99
+ spinner.fail(`Workflow "${source}" not found in registry`);
100
+ process.exit(1);
101
+ }
102
+ repoUrl = entry.repository;
103
+ workflowName = entry.name;
104
+ spinner.succeed(`Found "${chalk.bold(entry.displayName)}" v${entry.version} in registry`);
105
+ }
106
+ // Check if already installed
107
+ const installDir = join(getInstalledDir(), workflowName);
108
+ if (await fileExists(installDir)) {
109
+ if (!options.force) {
110
+ const overwrite = await confirm({
111
+ message: `Workflow "${workflowName}" is already installed. Overwrite?`,
112
+ default: false,
113
+ });
114
+ if (!overwrite) {
115
+ console.log(chalk.yellow('Installation cancelled.'));
116
+ return;
117
+ }
118
+ }
119
+ await rm(installDir, { recursive: true, force: true });
120
+ }
121
+ // Step 2: Download
122
+ const downloadSpinner = ora('Downloading workflow...').start();
123
+ await mkdir(installDir, { recursive: true });
124
+ await downloadFromGithub(repoUrl, installDir);
125
+ downloadSpinner.succeed('Downloaded workflow');
126
+ // Step 3: Validate
127
+ const validateSpinner = ora('Validating workflow.json...').start();
128
+ let manifest;
129
+ try {
130
+ manifest = await parseManifest(installDir);
131
+ validateSpinner.succeed(`Validated: ${chalk.bold(manifest.displayName)} v${manifest.version}`);
132
+ }
133
+ catch (err) {
134
+ validateSpinner.fail('Validation failed');
135
+ console.error(chalk.red(err.message));
136
+ await rm(installDir, { recursive: true, force: true });
137
+ process.exit(1);
138
+ }
139
+ // Step 3b: Verify integrity (if integrity block exists)
140
+ if (manifest.integrity) {
141
+ const integritySpinner = ora('Verifying file integrity...').start();
142
+ const integrityResult = await verifyIntegrity(installDir, manifest.integrity);
143
+ if (integrityResult.valid) {
144
+ integritySpinner.succeed('File integrity verified');
145
+ }
146
+ else {
147
+ integritySpinner.warn('Integrity check found differences');
148
+ if (integrityResult.mismatches.length > 0) {
149
+ console.log(chalk.yellow(' Modified files:'));
150
+ for (const f of integrityResult.mismatches) {
151
+ console.log(chalk.yellow(` - ${f}`));
152
+ }
153
+ }
154
+ if (integrityResult.missing.length > 0) {
155
+ console.log(chalk.yellow(' Missing files:'));
156
+ for (const f of integrityResult.missing) {
157
+ console.log(chalk.yellow(` - ${f}`));
158
+ }
159
+ }
160
+ const continueInstall = await confirm({
161
+ message: 'Continue installation despite integrity differences?',
162
+ default: false,
163
+ });
164
+ if (!continueInstall) {
165
+ await rm(installDir, { recursive: true, force: true });
166
+ console.log(chalk.yellow('Installation cancelled.'));
167
+ return;
168
+ }
169
+ }
170
+ }
171
+ // Step 3c: Verify registry signature
172
+ if (!isGithubUrl(source)) {
173
+ const registryIntegrity = await getVersionIntegrity(workflowName, manifest.version);
174
+ if (registryIntegrity && manifest.integrity) {
175
+ const sigValid = verifySignature(manifest.integrity.root, registryIntegrity.signature);
176
+ if (sigValid) {
177
+ console.log(chalk.green(' Signature: verified'));
178
+ }
179
+ else {
180
+ console.log(chalk.red(' WARNING: Registry signature mismatch — this workflow may have been tampered with'));
181
+ const continueInstall = await confirm({
182
+ message: 'Continue installation despite signature mismatch?',
183
+ default: false,
184
+ });
185
+ if (!continueInstall) {
186
+ await rm(installDir, { recursive: true, force: true });
187
+ console.log(chalk.yellow('Installation cancelled.'));
188
+ return;
189
+ }
190
+ }
191
+ }
192
+ }
193
+ // Step 3d: License validation for paid workflows
194
+ if (manifest.pricing?.model === 'paid') {
195
+ const licenseToken = await loadLicense(workflowName);
196
+ if (!licenseToken) {
197
+ console.error(chalk.red(`\nThis workflow requires a license.`));
198
+ console.error(chalk.dim('To purchase and activate:'));
199
+ console.error(chalk.cyan(' 1. Log in: claudeflows login'));
200
+ console.error(chalk.cyan(' 2. Purchase at https://claudeflows.dev/workflows/' + workflowName));
201
+ console.error(chalk.cyan(' 3. Retry: claudeflows install ' + source));
202
+ await rm(installDir, { recursive: true, force: true });
203
+ process.exit(1);
204
+ }
205
+ const licenseResult = validateLicense(licenseToken, workflowName, manifest.version);
206
+ if (!licenseResult.valid) {
207
+ console.error(chalk.red(`\nLicense validation failed: ${licenseResult.error}`));
208
+ if (licenseResult.error?.includes('expired')) {
209
+ console.error(chalk.dim('Refresh your license: claudeflows license refresh ' + workflowName));
210
+ }
211
+ await rm(installDir, { recursive: true, force: true });
212
+ process.exit(1);
213
+ }
214
+ console.log(chalk.green(` License: valid (${licenseResult.claims?.tier ?? 'standard'})`));
215
+ if (licenseResult.claims?.exp) {
216
+ const expDate = new Date(licenseResult.claims.exp * 1000).toLocaleDateString();
217
+ console.log(chalk.dim(` Expires: ${expDate}`));
218
+ }
219
+ }
220
+ else if (manifest.pricing?.model === 'freemium') {
221
+ const licenseToken = await loadLicense(workflowName);
222
+ if (licenseToken) {
223
+ const licenseResult = validateLicense(licenseToken, workflowName, manifest.version);
224
+ if (licenseResult.valid) {
225
+ console.log(chalk.green(` License: ${licenseResult.claims?.tier ?? 'free'} tier`));
226
+ }
227
+ }
228
+ }
229
+ // Update workflowName to match manifest
230
+ if (manifest.name !== workflowName) {
231
+ const correctDir = join(getInstalledDir(), manifest.name);
232
+ if (correctDir !== installDir) {
233
+ const { rename } = await import('node:fs/promises');
234
+ await rename(installDir, correctDir);
235
+ workflowName = manifest.name;
236
+ }
237
+ }
238
+ const finalInstallDir = join(getInstalledDir(), workflowName);
239
+ // Step 4: Dependencies
240
+ if (manifest.dependencies && Object.keys(manifest.dependencies).length > 0) {
241
+ console.log(chalk.bold('\nDependencies:'));
242
+ for (const [depName, depConfig] of Object.entries(manifest.dependencies)) {
243
+ const depDir = join(getInstalledDir(), depName);
244
+ const isInstalled = await fileExists(join(depDir, 'workflow.json'));
245
+ const isRequired = depConfig.required !== false;
246
+ if (isInstalled) {
247
+ console.log(chalk.green(` \u2713 ${depName} is installed`));
248
+ }
249
+ else if (isRequired) {
250
+ console.log(chalk.red(` \u2717 ${depName} is required but not installed`));
251
+ const shouldInstall = await confirm({
252
+ message: `Install required dependency "${depName}"?`,
253
+ default: true,
254
+ });
255
+ if (shouldInstall) {
256
+ console.log(chalk.yellow(` Run: ${chalk.bold(`claudeflows install ${depName}`)}`));
257
+ }
258
+ }
259
+ else {
260
+ const shouldInstall = await confirm({
261
+ message: `Install optional dependency "${depName}"?`,
262
+ default: false,
263
+ });
264
+ if (shouldInstall) {
265
+ console.log(chalk.yellow(` Run: ${chalk.bold(`claudeflows install ${depName}`)}`));
266
+ }
267
+ }
268
+ }
269
+ }
270
+ // Write .deps.json
271
+ if (manifest.dependencies) {
272
+ const depsMap = {};
273
+ for (const depName of Object.keys(manifest.dependencies)) {
274
+ depsMap[depName] = join(getInstalledDir(), depName);
275
+ }
276
+ await writeFile(join(finalInstallDir, '.deps.json'), JSON.stringify(depsMap, null, 2) + '\n', 'utf-8');
277
+ }
278
+ // Step 5: MCP setup
279
+ if (manifest.mcp && Object.keys(manifest.mcp).length > 0) {
280
+ console.log(chalk.bold('\nMCP Server Setup:'));
281
+ const { configured, skipped } = await setupMcpServers(manifest.mcp);
282
+ for (const name of configured) {
283
+ console.log(chalk.green(` \u2713 ${name} configured`));
284
+ }
285
+ for (const name of skipped) {
286
+ console.log(chalk.yellow(` \u26A0 ${name} skipped`));
287
+ }
288
+ }
289
+ // Step 5b: Standalone env vars
290
+ if (manifest.env && Object.keys(manifest.env).length > 0) {
291
+ console.log(chalk.bold('\nEnvironment Variables:'));
292
+ const { set, missing, suggestions } = await setupEnvVars(manifest.env);
293
+ for (const name of set) {
294
+ console.log(chalk.green(` \u2713 ${name} set`));
295
+ }
296
+ for (const name of missing) {
297
+ console.log(chalk.yellow(` \u26A0 ${name} not set`));
298
+ }
299
+ if (suggestions.length > 0) {
300
+ console.log('');
301
+ for (const s of suggestions) {
302
+ console.log(s);
303
+ }
304
+ }
305
+ }
306
+ // Step 6: Create dirs
307
+ if (manifest.postInstall?.createDirs) {
308
+ const dirsSpinner = ora('Creating directories...').start();
309
+ for (const dir of manifest.postInstall.createDirs) {
310
+ const dirPath = join(finalInstallDir, dir);
311
+ await mkdir(dirPath, { recursive: true });
312
+ }
313
+ dirsSpinner.succeed(`Created ${manifest.postInstall.createDirs.length} directories`);
314
+ }
315
+ // Step 7: Wire skills
316
+ console.log(chalk.bold('\nLinking skills:'));
317
+ const { linked, skipped: skillsSkipped } = await linkSkills(workflowName, manifest.skills, finalInstallDir);
318
+ for (const name of linked) {
319
+ console.log(chalk.green(` \u2713 ${name}`));
320
+ }
321
+ for (const name of skillsSkipped) {
322
+ console.log(chalk.yellow(` \u26A0 ${name} (skipped)`));
323
+ }
324
+ // Step 9: Run doctor
325
+ console.log(chalk.bold('\nHealth check:'));
326
+ const healthResults = await runDoctor(manifest, finalInstallDir);
327
+ for (const check of healthResults) {
328
+ console.log(formatHealthCheck(check));
329
+ }
330
+ const errors = healthResults.filter((c) => c.status === 'error');
331
+ const warnings = healthResults.filter((c) => c.status === 'warn');
332
+ if (errors.length > 0) {
333
+ console.log(chalk.red(`\n${errors.length} error(s) found. Run ${chalk.bold(`claudeflows doctor ${workflowName}`)} for details.`));
334
+ }
335
+ else if (warnings.length > 0) {
336
+ console.log(chalk.yellow(`\n${warnings.length} warning(s). Run ${chalk.bold(`claudeflows doctor ${workflowName}`)} for details.`));
337
+ }
338
+ else {
339
+ console.log(chalk.green('\nAll checks passed!'));
340
+ }
341
+ // Step 10: Post-install message
342
+ console.log(chalk.green(`\n\u2713 Successfully installed ${chalk.bold(manifest.displayName)} v${manifest.version}`));
343
+ if (manifest.postInstall?.message) {
344
+ console.log(chalk.cyan(`\n${manifest.postInstall.message}`));
345
+ }
346
+ }
347
+ catch (err) {
348
+ console.error(chalk.red(`Install failed: ${err.message}`));
349
+ process.exit(1);
350
+ }
351
+ });
352
+ }
353
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerLicense(program: Command): void;
3
+ //# sourceMappingURL=license.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/commands/license.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6JtD"}
@@ -0,0 +1,167 @@
1
+ import { mkdir, writeFile, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { loadLicense, validateLicense, loadAuthSession } from '../lib/license.js';
7
+ import { getInstalledDir } from '../lib/config.js';
8
+ import { parseManifest } from '../lib/manifest.js';
9
+ async function fileExists(path) {
10
+ try {
11
+ await stat(path);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ export function registerLicense(program) {
19
+ const licenseCmd = program
20
+ .command('license')
21
+ .description('Manage workflow licenses');
22
+ // cw license <name> — view license status
23
+ licenseCmd
24
+ .command('status <name>')
25
+ .description('View license status for a workflow')
26
+ .action(async (name) => {
27
+ try {
28
+ const token = await loadLicense(name);
29
+ if (!token) {
30
+ console.log(chalk.yellow(`No license found for "${name}"`));
31
+ console.log(chalk.dim('Licenses are stored at ~/.claude-workflows/licenses/'));
32
+ return;
33
+ }
34
+ // Try to read installed manifest for version info
35
+ const installDir = join(getInstalledDir(), name);
36
+ let version;
37
+ if (await fileExists(join(installDir, 'workflow.json'))) {
38
+ try {
39
+ const manifest = await parseManifest(installDir);
40
+ version = manifest.version;
41
+ }
42
+ catch {
43
+ // Can't parse manifest — proceed without version
44
+ }
45
+ }
46
+ const result = validateLicense(token, name, version);
47
+ if (result.valid) {
48
+ console.log(chalk.green(`License for "${name}": valid`));
49
+ if (result.claims) {
50
+ console.log(` User: ${result.claims.sub}`);
51
+ console.log(` Tier: ${result.claims.tier ?? 'standard'}`);
52
+ if (result.claims.versionRange) {
53
+ console.log(` Versions: ${result.claims.versionRange}`);
54
+ }
55
+ if (result.claims.exp) {
56
+ const expDate = new Date(result.claims.exp * 1000);
57
+ const daysLeft = Math.ceil((expDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24));
58
+ console.log(` Expires: ${expDate.toLocaleDateString()} (${daysLeft} days remaining)`);
59
+ }
60
+ }
61
+ }
62
+ else {
63
+ console.log(chalk.red(`License for "${name}": invalid`));
64
+ console.log(chalk.red(` ${result.error}`));
65
+ }
66
+ }
67
+ catch (err) {
68
+ console.error(chalk.red(`Failed: ${err.message}`));
69
+ process.exit(1);
70
+ }
71
+ });
72
+ // cw license refresh <name> — re-fetch license from server
73
+ licenseCmd
74
+ .command('refresh <name>')
75
+ .description('Refresh a license token from the server')
76
+ .action(async (name) => {
77
+ try {
78
+ const auth = await loadAuthSession();
79
+ if (!auth) {
80
+ console.error(chalk.red('Not logged in. Run `claudeflows login` first.'));
81
+ process.exit(1);
82
+ }
83
+ const spinner = ora('Fetching license from server...').start();
84
+ const response = await fetch(`https://claudeflows.dev/api/licenses?workflow=${name}`, {
85
+ headers: {
86
+ Authorization: `Bearer ${auth.token}`,
87
+ },
88
+ });
89
+ if (!response.ok) {
90
+ if (response.status === 401) {
91
+ spinner.fail('Session expired. Run `claudeflows login` to re-authenticate.');
92
+ }
93
+ else if (response.status === 403) {
94
+ spinner.fail(`No license found for "${name}". Purchase at https://claudeflows.dev/workflows/${name}`);
95
+ }
96
+ else {
97
+ spinner.fail(`Server error: ${response.status}`);
98
+ }
99
+ process.exit(1);
100
+ }
101
+ const data = (await response.json());
102
+ // Save license
103
+ const licensesDir = join(homedir(), '.claude-workflows', 'licenses');
104
+ await mkdir(licensesDir, { recursive: true });
105
+ await writeFile(join(licensesDir, `${name}.jwt`), data.token + '\n', 'utf-8');
106
+ spinner.succeed(`License refreshed for "${name}"`);
107
+ // Show updated status
108
+ const result = validateLicense(data.token, name);
109
+ if (result.valid && result.claims) {
110
+ console.log(` Tier: ${result.claims.tier ?? 'standard'}`);
111
+ if (result.claims.exp) {
112
+ const expDate = new Date(result.claims.exp * 1000);
113
+ console.log(` Expires: ${expDate.toLocaleDateString()}`);
114
+ }
115
+ }
116
+ }
117
+ catch (err) {
118
+ console.error(chalk.red(`Failed: ${err.message}`));
119
+ process.exit(1);
120
+ }
121
+ });
122
+ // cw license list — list all local licenses
123
+ licenseCmd
124
+ .command('list')
125
+ .alias('ls')
126
+ .description('List all local license tokens')
127
+ .action(async () => {
128
+ try {
129
+ const licensesDir = join(homedir(), '.claude-workflows', 'licenses');
130
+ const { readdir } = await import('node:fs/promises');
131
+ let files;
132
+ try {
133
+ files = (await readdir(licensesDir)).filter((f) => f.endsWith('.jwt'));
134
+ }
135
+ catch {
136
+ console.log(chalk.yellow('No licenses found.'));
137
+ return;
138
+ }
139
+ if (files.length === 0) {
140
+ console.log(chalk.yellow('No licenses found.'));
141
+ return;
142
+ }
143
+ console.log(chalk.bold(`${files.length} license(s):\n`));
144
+ for (const file of files) {
145
+ const name = file.replace('.jwt', '');
146
+ const token = await loadLicense(name);
147
+ if (!token)
148
+ continue;
149
+ const result = validateLicense(token, name);
150
+ if (result.valid) {
151
+ const expInfo = result.claims?.exp
152
+ ? ` (expires ${new Date(result.claims.exp * 1000).toLocaleDateString()})`
153
+ : '';
154
+ console.log(chalk.green(` ${name}: valid${expInfo}`));
155
+ }
156
+ else {
157
+ console.log(chalk.red(` ${name}: ${result.error}`));
158
+ }
159
+ }
160
+ }
161
+ catch (err) {
162
+ console.error(chalk.red(`Failed: ${err.message}`));
163
+ process.exit(1);
164
+ }
165
+ });
166
+ }
167
+ //# sourceMappingURL=license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/commands/license.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerList(program: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiHnD"}