@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.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/bin/claudeflows.js +2 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +111 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +174 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +353 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/license.d.ts +3 -0
- package/dist/commands/license.d.ts.map +1 -0
- package/dist/commands/license.js +167 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +97 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +144 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +121 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +66 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +167 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +129 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +10 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +37 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/doctor.d.ts +14 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +344 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/env-manager.d.ts +10 -0
- package/dist/lib/env-manager.d.ts.map +1 -0
- package/dist/lib/env-manager.js +60 -0
- package/dist/lib/env-manager.js.map +1 -0
- package/dist/lib/installer.d.ts +3 -0
- package/dist/lib/installer.d.ts.map +1 -0
- package/dist/lib/installer.js +43 -0
- package/dist/lib/installer.js.map +1 -0
- package/dist/lib/integrity.d.ts +42 -0
- package/dist/lib/integrity.d.ts.map +1 -0
- package/dist/lib/integrity.js +119 -0
- package/dist/lib/integrity.js.map +1 -0
- package/dist/lib/license.d.ts +39 -0
- package/dist/lib/license.d.ts.map +1 -0
- package/dist/lib/license.js +108 -0
- package/dist/lib/license.js.map +1 -0
- package/dist/lib/manifest.d.ts +74 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/manifest.js +47 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/mcp-setup.d.ts +18 -0
- package/dist/lib/mcp-setup.d.ts.map +1 -0
- package/dist/lib/mcp-setup.js +92 -0
- package/dist/lib/mcp-setup.js.map +1 -0
- package/dist/lib/registry.d.ts +28 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +77 -0
- package/dist/lib/registry.js.map +1 -0
- package/dist/lib/skill-linker.d.ts +13 -0
- package/dist/lib/skill-linker.d.ts.map +1 -0
- package/dist/lib/skill-linker.js +134 -0
- package/dist/lib/skill-linker.js.map +1 -0
- 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 @@
|
|
|
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":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;AACpE,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAC1C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsC,CAAC;oBAClE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC,CAAC;wBACnH,OAAO;oBACT,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,wCAAwC;gBAC1C,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE9C,0DAA0D;YAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,sCAAsC,CAAC,CAAC,KAAK,EAAE,CAAC;YAEpE,MAAM,WAAW,GAAG,IAAI,OAAO,CAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACnF,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,mBAAmB,EAAE,CAAC,CAAC;oBAE/E,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;wBACjC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAC1C,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAEpD,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;4BAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;4BACpD,GAAG,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;4BACjF,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;4BAC9C,OAAO;wBACT,CAAC;wBAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;wBACpD,GAAG,CAAC,GAAG,CACL,iGAAiG,CAClG,CAAC;wBACF,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;oBAC1C,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,EAAE;oBACtC,kBAAkB;gBACpB,CAAC,CAAC,CAAC;gBAEH,0BAA0B;gBAC1B,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBAChD,CAAC,EAAE,MAAM,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;YAEH,gCAAgC;YAChC,MAAM,OAAO,GACX,0CAA0C;gBAC1C,aAAa,eAAe,GAAG;gBAC/B,iCAAiC,mBAAmB,YAAY;gBAChE,SAAS,KAAK,EAAE,CAAC;YAEnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,oCAAoC;YACpC,IAAI,CAAC;gBACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACxD,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;wBAC5B,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,UAAU,CAAC;gBACnB,QAAQ,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;YAC7D,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,WAAW,CAAC;YAEzD,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,0BAA0B;YAC1B,OAAO,CAAC,IAAI,GAAG,kCAAkC,CAAC;YAElD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,wCAAwC,EAAE;gBAC1E,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;aAC3D,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAAoC,CAAC;YAElF,YAAY;YACZ,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,MAAM,SAAS,CACb,SAAS,EACT,IAAI,CAAC,SAAS,CACZ;gBACE,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC1C,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,EACR,OAAO,CACR,CAAC;YAEF,OAAO,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAkB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAChD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|