@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 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../src/lib/integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface LicenseClaims {
|
|
2
|
+
/** Subject (user ID or email) */
|
|
3
|
+
sub: string;
|
|
4
|
+
/** Workflow name this license is for */
|
|
5
|
+
workflow: string;
|
|
6
|
+
/** Semver range of versions this license covers */
|
|
7
|
+
versionRange?: string;
|
|
8
|
+
/** License tier (e.g. "pro", "team", "enterprise") */
|
|
9
|
+
tier?: string;
|
|
10
|
+
/** Issued at (Unix timestamp) */
|
|
11
|
+
iat: number;
|
|
12
|
+
/** Expiry (Unix timestamp) */
|
|
13
|
+
exp: number;
|
|
14
|
+
/** Issuer */
|
|
15
|
+
iss?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface LicenseValidation {
|
|
18
|
+
valid: boolean;
|
|
19
|
+
claims?: LicenseClaims;
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Decode and validate a JWT license token.
|
|
24
|
+
* Uses Ed25519 signature verification with the registry public key.
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateLicense(token: string, workflowName: string, workflowVersion?: string, publicKey?: string): LicenseValidation;
|
|
27
|
+
/**
|
|
28
|
+
* Load a license token from the local filesystem.
|
|
29
|
+
* Licenses are stored at ~/.claude-workflows/licenses/{name}.jwt
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadLicense(workflowName: string): Promise<string | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the auth session token (from claudeflows login).
|
|
34
|
+
*/
|
|
35
|
+
export declare function loadAuthSession(): Promise<{
|
|
36
|
+
token: string;
|
|
37
|
+
user: string;
|
|
38
|
+
} | null>;
|
|
39
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,EACxB,SAAS,GAAE,MAA4B,GACtC,iBAAiB,CAoDnB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS9E;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAYvF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { verify as cryptoVerify } from 'node:crypto';
|
|
5
|
+
import semver from 'semver';
|
|
6
|
+
import { REGISTRY_PUBLIC_KEY } from './integrity.js';
|
|
7
|
+
function getLicensesDir() {
|
|
8
|
+
return join(homedir(), '.claude-workflows', 'licenses');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Base64url decode (JWT uses base64url, not standard base64)
|
|
12
|
+
*/
|
|
13
|
+
function base64urlDecode(str) {
|
|
14
|
+
const padded = str + '='.repeat((4 - (str.length % 4)) % 4);
|
|
15
|
+
const base64 = padded.replace(/-/g, '+').replace(/_/g, '/');
|
|
16
|
+
return Buffer.from(base64, 'base64').toString('utf-8');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Base64url to Buffer (for signature verification)
|
|
20
|
+
*/
|
|
21
|
+
function base64urlToBuffer(str) {
|
|
22
|
+
const padded = str + '='.repeat((4 - (str.length % 4)) % 4);
|
|
23
|
+
const base64 = padded.replace(/-/g, '+').replace(/_/g, '/');
|
|
24
|
+
return Buffer.from(base64, 'base64');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Decode and validate a JWT license token.
|
|
28
|
+
* Uses Ed25519 signature verification with the registry public key.
|
|
29
|
+
*/
|
|
30
|
+
export function validateLicense(token, workflowName, workflowVersion, publicKey = REGISTRY_PUBLIC_KEY) {
|
|
31
|
+
try {
|
|
32
|
+
const parts = token.trim().split('.');
|
|
33
|
+
if (parts.length !== 3) {
|
|
34
|
+
return { valid: false, error: 'Invalid JWT format' };
|
|
35
|
+
}
|
|
36
|
+
const [headerB64, payloadB64, signatureB64] = parts;
|
|
37
|
+
// Verify header
|
|
38
|
+
const header = JSON.parse(base64urlDecode(headerB64));
|
|
39
|
+
if (header.alg !== 'EdDSA') {
|
|
40
|
+
return { valid: false, error: `Unsupported algorithm: ${header.alg}` };
|
|
41
|
+
}
|
|
42
|
+
// Verify signature
|
|
43
|
+
const signedContent = `${headerB64}.${payloadB64}`;
|
|
44
|
+
const signature = base64urlToBuffer(signatureB64);
|
|
45
|
+
const isValidSig = cryptoVerify(null, Buffer.from(signedContent), publicKey, signature);
|
|
46
|
+
if (!isValidSig) {
|
|
47
|
+
return { valid: false, error: 'Invalid signature' };
|
|
48
|
+
}
|
|
49
|
+
// Parse claims
|
|
50
|
+
const claims = JSON.parse(base64urlDecode(payloadB64));
|
|
51
|
+
// Check expiry
|
|
52
|
+
const now = Math.floor(Date.now() / 1000);
|
|
53
|
+
if (claims.exp && claims.exp < now) {
|
|
54
|
+
return { valid: false, claims, error: `License expired on ${new Date(claims.exp * 1000).toISOString()}` };
|
|
55
|
+
}
|
|
56
|
+
// Check workflow name
|
|
57
|
+
if (claims.workflow !== workflowName) {
|
|
58
|
+
return { valid: false, claims, error: `License is for "${claims.workflow}", not "${workflowName}"` };
|
|
59
|
+
}
|
|
60
|
+
// Check version range (if specified in claims and a version is provided)
|
|
61
|
+
if (claims.versionRange && workflowVersion) {
|
|
62
|
+
if (!semver.satisfies(workflowVersion, claims.versionRange)) {
|
|
63
|
+
return {
|
|
64
|
+
valid: false,
|
|
65
|
+
claims,
|
|
66
|
+
error: `License covers versions ${claims.versionRange}, but installing ${workflowVersion}`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { valid: true, claims };
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return { valid: false, error: `Failed to decode license: ${err.message}` };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Load a license token from the local filesystem.
|
|
78
|
+
* Licenses are stored at ~/.claude-workflows/licenses/{name}.jwt
|
|
79
|
+
*/
|
|
80
|
+
export async function loadLicense(workflowName) {
|
|
81
|
+
const licensePath = join(getLicensesDir(), `${workflowName}.jwt`);
|
|
82
|
+
try {
|
|
83
|
+
await stat(licensePath);
|
|
84
|
+
const token = await readFile(licensePath, 'utf-8');
|
|
85
|
+
return token.trim();
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the auth session token (from claudeflows login).
|
|
93
|
+
*/
|
|
94
|
+
export async function loadAuthSession() {
|
|
95
|
+
const authPath = join(homedir(), '.claude-workflows', 'auth.json');
|
|
96
|
+
try {
|
|
97
|
+
const raw = await readFile(authPath, 'utf-8');
|
|
98
|
+
const data = JSON.parse(raw);
|
|
99
|
+
if (data.token && data.user) {
|
|
100
|
+
return { token: data.token, user: data.user };
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface ManifestAuthor {
|
|
2
|
+
name: string;
|
|
3
|
+
github?: string;
|
|
4
|
+
email?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ManifestSkill {
|
|
7
|
+
name: string;
|
|
8
|
+
path: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface McpEnvVar {
|
|
12
|
+
description?: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface McpServer {
|
|
17
|
+
package: string;
|
|
18
|
+
required?: boolean;
|
|
19
|
+
env?: Record<string, McpEnvVar>;
|
|
20
|
+
args?: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface EnvVar {
|
|
23
|
+
description?: string;
|
|
24
|
+
required?: boolean;
|
|
25
|
+
url?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface Dependency {
|
|
28
|
+
version?: string;
|
|
29
|
+
required?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface PostInstall {
|
|
32
|
+
createDirs?: string[];
|
|
33
|
+
message?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface IntegrityBlock {
|
|
36
|
+
algorithm: 'sha256';
|
|
37
|
+
files: Record<string, string>;
|
|
38
|
+
root: string;
|
|
39
|
+
signature?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface PricingConfig {
|
|
42
|
+
model?: 'free' | 'paid' | 'freemium';
|
|
43
|
+
tier?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface WorkflowManifest {
|
|
46
|
+
name: string;
|
|
47
|
+
version: string;
|
|
48
|
+
displayName: string;
|
|
49
|
+
description: string;
|
|
50
|
+
author: ManifestAuthor;
|
|
51
|
+
repository?: string;
|
|
52
|
+
license?: string;
|
|
53
|
+
tags?: string[];
|
|
54
|
+
category?: string;
|
|
55
|
+
runtime?: Record<string, string>;
|
|
56
|
+
mcp?: Record<string, McpServer>;
|
|
57
|
+
env?: Record<string, EnvVar>;
|
|
58
|
+
dependencies?: Record<string, Dependency>;
|
|
59
|
+
skills: ManifestSkill[];
|
|
60
|
+
files?: {
|
|
61
|
+
include?: string[];
|
|
62
|
+
exclude?: string[];
|
|
63
|
+
};
|
|
64
|
+
postInstall?: PostInstall;
|
|
65
|
+
integrity?: IntegrityBlock;
|
|
66
|
+
pricing?: PricingConfig;
|
|
67
|
+
}
|
|
68
|
+
export interface ValidationResult {
|
|
69
|
+
valid: boolean;
|
|
70
|
+
errors: string[];
|
|
71
|
+
}
|
|
72
|
+
export declare function validateManifest(data: unknown): Promise<ValidationResult>;
|
|
73
|
+
export declare function parseManifest(dir: string): Promise<WorkflowManifest>;
|
|
74
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/lib/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve, dirname } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import Ajv from 'ajv';
|
|
5
|
+
let cachedSchema = null;
|
|
6
|
+
async function loadSchema() {
|
|
7
|
+
if (cachedSchema)
|
|
8
|
+
return cachedSchema;
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
// From dist/lib/ we need to go up to packages/cli/ then to packages/schema/
|
|
12
|
+
const schemaPath = resolve(__dirname, '..', '..', '..', 'schema', 'workflow.schema.json');
|
|
13
|
+
const raw = await readFile(schemaPath, 'utf-8');
|
|
14
|
+
cachedSchema = JSON.parse(raw);
|
|
15
|
+
return cachedSchema;
|
|
16
|
+
}
|
|
17
|
+
export async function validateManifest(data) {
|
|
18
|
+
const schema = await loadSchema();
|
|
19
|
+
const ajv = new Ajv({ allErrors: true });
|
|
20
|
+
const validate = ajv.compile(schema);
|
|
21
|
+
const valid = validate(data);
|
|
22
|
+
if (valid) {
|
|
23
|
+
return { valid: true, errors: [] };
|
|
24
|
+
}
|
|
25
|
+
const errors = (validate.errors ?? []).map((e) => {
|
|
26
|
+
const path = e.instancePath || '/';
|
|
27
|
+
return `${path}: ${e.message}`;
|
|
28
|
+
});
|
|
29
|
+
return { valid: false, errors };
|
|
30
|
+
}
|
|
31
|
+
export async function parseManifest(dir) {
|
|
32
|
+
const manifestPath = join(dir, 'workflow.json');
|
|
33
|
+
const raw = await readFile(manifestPath, 'utf-8');
|
|
34
|
+
let data;
|
|
35
|
+
try {
|
|
36
|
+
data = JSON.parse(raw);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new Error(`Invalid JSON in ${manifestPath}`);
|
|
40
|
+
}
|
|
41
|
+
const result = await validateManifest(data);
|
|
42
|
+
if (!result.valid) {
|
|
43
|
+
throw new Error(`Invalid workflow.json:\n${result.errors.map((e) => ` - ${e}`).join('\n')}`);
|
|
44
|
+
}
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/lib/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,GAAyB,MAAM,KAAK,CAAC;AA4E5C,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,KAAK,UAAU,UAAU;IACvB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,4EAA4E;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IAC1F,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,CAAC;IACzC,OAAO,YAAY,CAAC;AACtB,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa;IAClD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAK,GAAqC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE;QAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC;QACnC,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;IACJ,CAAC;IAED,OAAO,IAAwB,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { McpServer, McpEnvVar } from './manifest.js';
|
|
2
|
+
interface McpJsonServer {
|
|
3
|
+
command: string;
|
|
4
|
+
args?: string[];
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
interface McpJson {
|
|
8
|
+
mcpServers: Record<string, McpJsonServer>;
|
|
9
|
+
}
|
|
10
|
+
export declare function checkMcpServer(name: string, mcpJson: McpJson): boolean;
|
|
11
|
+
export declare function promptForEnvVars(envConfig: Record<string, McpEnvVar>): Promise<Record<string, string>>;
|
|
12
|
+
export declare function installMcpServer(name: string, config: McpServer): Promise<boolean>;
|
|
13
|
+
export declare function setupMcpServers(mcpConfig: Record<string, McpServer>): Promise<{
|
|
14
|
+
configured: string[];
|
|
15
|
+
skipped: string[];
|
|
16
|
+
}>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=mcp-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-setup.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-setup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1D,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,UAAU,OAAO;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC3C;AAqBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAEtE;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwBjC;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACnC,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBtD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { input, confirm } from '@inquirer/prompts';
|
|
5
|
+
function getMcpJsonPath() {
|
|
6
|
+
return join(homedir(), '.claude', '.mcp.json');
|
|
7
|
+
}
|
|
8
|
+
async function loadMcpJson() {
|
|
9
|
+
try {
|
|
10
|
+
const raw = await readFile(getMcpJsonPath(), 'utf-8');
|
|
11
|
+
return JSON.parse(raw);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return { mcpServers: {} };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function saveMcpJson(data) {
|
|
18
|
+
const dir = join(homedir(), '.claude');
|
|
19
|
+
await mkdir(dir, { recursive: true });
|
|
20
|
+
await writeFile(getMcpJsonPath(), JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
21
|
+
}
|
|
22
|
+
export function checkMcpServer(name, mcpJson) {
|
|
23
|
+
return name in mcpJson.mcpServers;
|
|
24
|
+
}
|
|
25
|
+
export async function promptForEnvVars(envConfig) {
|
|
26
|
+
const result = {};
|
|
27
|
+
for (const [varName, config] of Object.entries(envConfig)) {
|
|
28
|
+
const existing = process.env[varName];
|
|
29
|
+
if (existing) {
|
|
30
|
+
result[varName] = existing;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
let message = `Enter value for ${varName}`;
|
|
34
|
+
if (config.description) {
|
|
35
|
+
message += ` (${config.description})`;
|
|
36
|
+
}
|
|
37
|
+
if (config.url) {
|
|
38
|
+
message += `\n Get it at: ${config.url}`;
|
|
39
|
+
}
|
|
40
|
+
message += ':';
|
|
41
|
+
const value = await input({ message });
|
|
42
|
+
result[varName] = value;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
export async function installMcpServer(name, config) {
|
|
47
|
+
const mcpJson = await loadMcpJson();
|
|
48
|
+
if (checkMcpServer(name, mcpJson)) {
|
|
49
|
+
return true; // Already configured
|
|
50
|
+
}
|
|
51
|
+
const shouldInstall = await confirm({
|
|
52
|
+
message: `MCP server "${name}" (${config.package}) is not configured. Add it now?`,
|
|
53
|
+
default: true,
|
|
54
|
+
});
|
|
55
|
+
if (!shouldInstall) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
let envVars = {};
|
|
59
|
+
if (config.env && Object.keys(config.env).length > 0) {
|
|
60
|
+
envVars = await promptForEnvVars(config.env);
|
|
61
|
+
}
|
|
62
|
+
const serverEntry = {
|
|
63
|
+
command: 'npx',
|
|
64
|
+
args: ['-y', config.package, ...(config.args ?? [])],
|
|
65
|
+
};
|
|
66
|
+
if (Object.keys(envVars).length > 0) {
|
|
67
|
+
serverEntry.env = envVars;
|
|
68
|
+
}
|
|
69
|
+
mcpJson.mcpServers[name] = serverEntry;
|
|
70
|
+
await saveMcpJson(mcpJson);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
export async function setupMcpServers(mcpConfig) {
|
|
74
|
+
const configured = [];
|
|
75
|
+
const skipped = [];
|
|
76
|
+
const mcpJson = await loadMcpJson();
|
|
77
|
+
for (const [name, config] of Object.entries(mcpConfig)) {
|
|
78
|
+
if (checkMcpServer(name, mcpJson)) {
|
|
79
|
+
configured.push(name);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const installed = await installMcpServer(name, config);
|
|
83
|
+
if (installed) {
|
|
84
|
+
configured.push(name);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
skipped.push(name);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { configured, skipped };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=mcp-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-setup.js","sourceRoot":"","sources":["../../src/lib/mcp-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface RegistryVersionIntegrity {
|
|
2
|
+
root: string;
|
|
3
|
+
signature: string;
|
|
4
|
+
}
|
|
5
|
+
export interface RegistryVersionEntry {
|
|
6
|
+
tag: string;
|
|
7
|
+
published: string;
|
|
8
|
+
integrity?: RegistryVersionIntegrity;
|
|
9
|
+
}
|
|
10
|
+
export interface RegistryEntry {
|
|
11
|
+
name: string;
|
|
12
|
+
displayName: string;
|
|
13
|
+
description: string;
|
|
14
|
+
repository: string;
|
|
15
|
+
version: string;
|
|
16
|
+
author: string;
|
|
17
|
+
category: string;
|
|
18
|
+
tags: string[];
|
|
19
|
+
versions?: Record<string, RegistryVersionEntry>;
|
|
20
|
+
}
|
|
21
|
+
export declare function searchWorkflows(query: string): Promise<RegistryEntry[]>;
|
|
22
|
+
export declare function resolveWorkflow(name: string): Promise<RegistryEntry | null>;
|
|
23
|
+
export declare function getLatestVersion(name: string): Promise<string | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the integrity data (root hash + signature) for a specific workflow version.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getVersionIntegrity(name: string, version?: string): Promise<RegistryVersionIntegrity | null>;
|
|
28
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CACjD;AA4ED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAU7E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAGjF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAO1C"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getConfig, getWorkflowsDir } from './config.js';
|
|
4
|
+
function getCachePath() {
|
|
5
|
+
return join(getWorkflowsDir(), 'registry-cache.json');
|
|
6
|
+
}
|
|
7
|
+
async function fetchRegistry() {
|
|
8
|
+
const config = await getConfig();
|
|
9
|
+
const response = await fetch(config.registryUrl);
|
|
10
|
+
if (!response.ok) {
|
|
11
|
+
throw new Error(`Failed to fetch registry: ${response.status} ${response.statusText}`);
|
|
12
|
+
}
|
|
13
|
+
const data = (await response.json());
|
|
14
|
+
if (!data.workflows)
|
|
15
|
+
return [];
|
|
16
|
+
return Object.entries(data.workflows).map(([name, wf]) => ({
|
|
17
|
+
name,
|
|
18
|
+
displayName: wf.displayName,
|
|
19
|
+
description: wf.description,
|
|
20
|
+
repository: `https://github.com/${wf.repository}`,
|
|
21
|
+
version: wf.latest,
|
|
22
|
+
author: wf.author.name,
|
|
23
|
+
category: wf.category,
|
|
24
|
+
tags: wf.tags ?? [],
|
|
25
|
+
versions: wf.versions,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
async function getCachedOrFetch() {
|
|
29
|
+
const config = await getConfig();
|
|
30
|
+
const cachePath = getCachePath();
|
|
31
|
+
try {
|
|
32
|
+
const raw = await readFile(cachePath, 'utf-8');
|
|
33
|
+
const cache = JSON.parse(raw);
|
|
34
|
+
const ageMs = Date.now() - cache.fetchedAt;
|
|
35
|
+
const ttlMs = config.cacheTtlMinutes * 60 * 1000;
|
|
36
|
+
if (ageMs < ttlMs) {
|
|
37
|
+
return cache.entries;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Cache miss or corrupt — fetch fresh
|
|
42
|
+
}
|
|
43
|
+
const entries = await fetchRegistry();
|
|
44
|
+
const cacheDir = getWorkflowsDir();
|
|
45
|
+
await mkdir(cacheDir, { recursive: true });
|
|
46
|
+
const cache = { fetchedAt: Date.now(), entries };
|
|
47
|
+
await writeFile(cachePath, JSON.stringify(cache, null, 2) + '\n', 'utf-8');
|
|
48
|
+
return entries;
|
|
49
|
+
}
|
|
50
|
+
export async function searchWorkflows(query) {
|
|
51
|
+
const entries = await getCachedOrFetch();
|
|
52
|
+
const lower = query.toLowerCase();
|
|
53
|
+
return entries.filter((e) => e.name.toLowerCase().includes(lower) ||
|
|
54
|
+
e.displayName.toLowerCase().includes(lower) ||
|
|
55
|
+
e.description.toLowerCase().includes(lower) ||
|
|
56
|
+
e.tags.some((t) => t.toLowerCase().includes(lower)));
|
|
57
|
+
}
|
|
58
|
+
export async function resolveWorkflow(name) {
|
|
59
|
+
const entries = await getCachedOrFetch();
|
|
60
|
+
return entries.find((e) => e.name === name) ?? null;
|
|
61
|
+
}
|
|
62
|
+
export async function getLatestVersion(name) {
|
|
63
|
+
const entry = await resolveWorkflow(name);
|
|
64
|
+
return entry?.version ?? null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the integrity data (root hash + signature) for a specific workflow version.
|
|
68
|
+
*/
|
|
69
|
+
export async function getVersionIntegrity(name, version) {
|
|
70
|
+
const entry = await resolveWorkflow(name);
|
|
71
|
+
if (!entry?.versions)
|
|
72
|
+
return null;
|
|
73
|
+
const ver = version ?? entry.version;
|
|
74
|
+
const versionEntry = entry.versions[ver];
|
|
75
|
+
return versionEntry?.integrity ?? null;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ManifestSkill } from './manifest.js';
|
|
2
|
+
export declare function checkCollisions(targetName: string): Promise<{
|
|
3
|
+
exists: boolean;
|
|
4
|
+
isLink: boolean;
|
|
5
|
+
linkTarget?: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function backupSkill(name: string): Promise<string>;
|
|
8
|
+
export declare function linkSkills(workflowName: string, skills: ManifestSkill[], installDir: string): Promise<{
|
|
9
|
+
linked: string[];
|
|
10
|
+
skipped: string[];
|
|
11
|
+
}>;
|
|
12
|
+
export declare function unlinkSkills(workflowName: string, installDir: string): Promise<string[]>;
|
|
13
|
+
//# sourceMappingURL=skill-linker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-linker.d.ts","sourceRoot":"","sources":["../../src/lib/skill-linker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAoDnD,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAcpE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU/D;AAED,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0DlD;AAED,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB"}
|