comfyui-mcp 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/.mcp.json +11 -0
- package/dist/comfyui/client.d.ts +16 -0
- package/dist/comfyui/client.d.ts.map +1 -0
- package/dist/comfyui/client.js +75 -0
- package/dist/comfyui/client.js.map +1 -0
- package/dist/comfyui/events.d.ts +9 -0
- package/dist/comfyui/events.d.ts.map +1 -0
- package/dist/comfyui/events.js +40 -0
- package/dist/comfyui/events.js.map +1 -0
- package/dist/comfyui/types.d.ts +66 -0
- package/dist/comfyui/types.d.ts.map +1 -0
- package/dist/comfyui/types.js +3 -0
- package/dist/comfyui/types.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +93 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/services/mermaid-converter.d.ts +8 -0
- package/dist/services/mermaid-converter.d.ts.map +1 -0
- package/dist/services/mermaid-converter.js +235 -0
- package/dist/services/mermaid-converter.js.map +1 -0
- package/dist/services/mermaid-parser.d.ts +31 -0
- package/dist/services/mermaid-parser.d.ts.map +1 -0
- package/dist/services/mermaid-parser.js +464 -0
- package/dist/services/mermaid-parser.js.map +1 -0
- package/dist/services/model-resolver.d.ts +25 -0
- package/dist/services/model-resolver.d.ts.map +1 -0
- package/dist/services/model-resolver.js +123 -0
- package/dist/services/model-resolver.js.map +1 -0
- package/dist/services/registry-client.d.ts +28 -0
- package/dist/services/registry-client.d.ts.map +1 -0
- package/dist/services/registry-client.js +32 -0
- package/dist/services/registry-client.js.map +1 -0
- package/dist/services/skill-generator.d.ts +33 -0
- package/dist/services/skill-generator.d.ts.map +1 -0
- package/dist/services/skill-generator.js +438 -0
- package/dist/services/skill-generator.js.map +1 -0
- package/dist/services/workflow-composer.d.ts +43 -0
- package/dist/services/workflow-composer.d.ts.map +1 -0
- package/dist/services/workflow-composer.js +333 -0
- package/dist/services/workflow-composer.js.map +1 -0
- package/dist/services/workflow-executor.d.ts +15 -0
- package/dist/services/workflow-executor.d.ts.map +1 -0
- package/dist/services/workflow-executor.js +63 -0
- package/dist/services/workflow-executor.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/model-management.d.ts +3 -0
- package/dist/tools/model-management.d.ts.map +1 -0
- package/dist/tools/model-management.js +97 -0
- package/dist/tools/model-management.js.map +1 -0
- package/dist/tools/registry-search.d.ts +3 -0
- package/dist/tools/registry-search.d.ts.map +1 -0
- package/dist/tools/registry-search.js +70 -0
- package/dist/tools/registry-search.js.map +1 -0
- package/dist/tools/skill-generator.d.ts +3 -0
- package/dist/tools/skill-generator.d.ts.map +1 -0
- package/dist/tools/skill-generator.js +42 -0
- package/dist/tools/skill-generator.js.map +1 -0
- package/dist/tools/workflow-compose.d.ts +3 -0
- package/dist/tools/workflow-compose.d.ts.map +1 -0
- package/dist/tools/workflow-compose.js +180 -0
- package/dist/tools/workflow-compose.js.map +1 -0
- package/dist/tools/workflow-execute.d.ts +3 -0
- package/dist/tools/workflow-execute.d.ts.map +1 -0
- package/dist/tools/workflow-execute.js +115 -0
- package/dist/tools/workflow-execute.js.map +1 -0
- package/dist/tools/workflow-visualize.d.ts +3 -0
- package/dist/tools/workflow-visualize.d.ts.map +1 -0
- package/dist/tools/workflow-visualize.js +111 -0
- package/dist/tools/workflow-visualize.js.map +1 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +65 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/image.d.ts +4 -0
- package/dist/utils/image.d.ts.map +1 -0
- package/dist/utils/image.js +10 -0
- package/dist/utils/image.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface RegistrySearchResult {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
author: string;
|
|
6
|
+
repository: string;
|
|
7
|
+
latest_version: string;
|
|
8
|
+
total_install: number;
|
|
9
|
+
tags?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface NodePackDetails extends RegistrySearchResult {
|
|
12
|
+
versions: Array<{
|
|
13
|
+
version: string;
|
|
14
|
+
changelog?: string;
|
|
15
|
+
}>;
|
|
16
|
+
nodes: string[];
|
|
17
|
+
license?: string;
|
|
18
|
+
created_at: string;
|
|
19
|
+
updated_at: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SearchNodesOptions {
|
|
22
|
+
page?: number;
|
|
23
|
+
limit?: number;
|
|
24
|
+
tags?: string[];
|
|
25
|
+
}
|
|
26
|
+
export declare function searchNodes(query: string, options?: SearchNodesOptions): Promise<RegistrySearchResult[]>;
|
|
27
|
+
export declare function getNodePackDetails(id: string): Promise<NodePackDetails>;
|
|
28
|
+
//# sourceMappingURL=registry-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC3D,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAiBD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAgBjC;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,CAAC,CAI1B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { RegistryError } from "../utils/errors.js";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
const REGISTRY_BASE = "https://api.comfy.org";
|
|
4
|
+
async function registryFetch(path) {
|
|
5
|
+
const url = `${REGISTRY_BASE}${path}`;
|
|
6
|
+
logger.debug("Registry API request", { url });
|
|
7
|
+
const res = await fetch(url);
|
|
8
|
+
if (!res.ok) {
|
|
9
|
+
const body = await res.text().catch(() => "");
|
|
10
|
+
throw new RegistryError(`Registry API ${res.status}: ${res.statusText}`, { url, status: res.status, body });
|
|
11
|
+
}
|
|
12
|
+
return res.json();
|
|
13
|
+
}
|
|
14
|
+
export async function searchNodes(query, options = {}) {
|
|
15
|
+
const { page = 1, limit = 10 } = options;
|
|
16
|
+
const params = new URLSearchParams({
|
|
17
|
+
search: query,
|
|
18
|
+
page: String(page),
|
|
19
|
+
limit: String(limit),
|
|
20
|
+
});
|
|
21
|
+
const data = await registryFetch(`/nodes?${params}`);
|
|
22
|
+
// The API may wrap results in a `nodes` array or return them directly
|
|
23
|
+
const results = Array.isArray(data) ? data : (data.nodes ?? []);
|
|
24
|
+
logger.info(`Registry search for "${query}" returned ${results.length} results`);
|
|
25
|
+
return results;
|
|
26
|
+
}
|
|
27
|
+
export async function getNodePackDetails(id) {
|
|
28
|
+
const data = await registryFetch(`/nodes/${encodeURIComponent(id)}`);
|
|
29
|
+
logger.info(`Fetched details for node pack "${id}"`);
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=registry-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,aAAa,GAAG,uBAAuB,CAAC;AA2B9C,KAAK,UAAU,aAAa,CAAI,IAAY;IAC1C,MAAM,GAAG,GAAG,GAAG,aAAa,GAAG,IAAI,EAAE,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,aAAa,CACrB,gBAAgB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,EAC/C,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAClC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,UAA8B,EAAE;IAEhC,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;KACrB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,aAAa,CAC9B,UAAU,MAAM,EAAE,CACnB,CAAC;IAEF,sEAAsE;IACtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,cAAc,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IACjF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAU;IAEV,MAAM,IAAI,GAAG,MAAM,aAAa,CAAkB,UAAU,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface SkillData {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
description: string;
|
|
5
|
+
repository: string;
|
|
6
|
+
nodes: SkillNodeInfo[];
|
|
7
|
+
examples: SkillExample[];
|
|
8
|
+
}
|
|
9
|
+
export interface SkillNodeInfo {
|
|
10
|
+
className: string;
|
|
11
|
+
displayName: string;
|
|
12
|
+
category: string;
|
|
13
|
+
inputs: Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
type: string;
|
|
16
|
+
required: boolean;
|
|
17
|
+
default?: unknown;
|
|
18
|
+
}>;
|
|
19
|
+
outputs: Array<{
|
|
20
|
+
name: string;
|
|
21
|
+
type: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export interface SkillExample {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
workflow?: unknown;
|
|
28
|
+
}
|
|
29
|
+
export declare function fetchGitHubFile(owner: string, repo: string, path: string): Promise<string>;
|
|
30
|
+
export declare function parseNodeClassMappings(pythonSource: string): Record<string, string>;
|
|
31
|
+
export declare function renderSkillMarkdown(data: SkillData): string;
|
|
32
|
+
export declare function generateSkill(source: string): Promise<string>;
|
|
33
|
+
//# sourceMappingURL=skill-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../../src/services/skill-generator.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA4BD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAcjB;AAmED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwCxB;AA4OD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CA4G3D;AAMD,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DnE"}
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { config } from "../config.js";
|
|
2
|
+
import { getObjectInfo } from "../comfyui/client.js";
|
|
3
|
+
import { ComfyUIError } from "../utils/errors.js";
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// GitHub helpers
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function githubHeaders() {
|
|
9
|
+
const headers = {
|
|
10
|
+
Accept: "application/vnd.github.v3+json",
|
|
11
|
+
};
|
|
12
|
+
if (config.githubToken) {
|
|
13
|
+
headers["Authorization"] = `Bearer ${config.githubToken}`;
|
|
14
|
+
}
|
|
15
|
+
return headers;
|
|
16
|
+
}
|
|
17
|
+
export async function fetchGitHubFile(owner, repo, path) {
|
|
18
|
+
const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;
|
|
19
|
+
const res = await fetch(url, { headers: githubHeaders() });
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
throw new ComfyUIError(`GitHub API error ${res.status} fetching ${path}`, "GITHUB_ERROR");
|
|
22
|
+
}
|
|
23
|
+
const data = (await res.json());
|
|
24
|
+
if (data.encoding === "base64") {
|
|
25
|
+
return Buffer.from(data.content, "base64").toString("utf-8");
|
|
26
|
+
}
|
|
27
|
+
return data.content;
|
|
28
|
+
}
|
|
29
|
+
async function listGitHubDir(owner, repo, path = "") {
|
|
30
|
+
const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;
|
|
31
|
+
const res = await fetch(url, { headers: githubHeaders() });
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
throw new ComfyUIError(`GitHub API error ${res.status} listing ${path || "/"}`, "GITHUB_ERROR");
|
|
34
|
+
}
|
|
35
|
+
const data = await res.json();
|
|
36
|
+
if (!Array.isArray(data))
|
|
37
|
+
return [];
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Registry helper
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
async function resolveRegistryRepo(registryId) {
|
|
44
|
+
const url = `https://api.comfy.org/nodes/${encodeURIComponent(registryId)}`;
|
|
45
|
+
const res = await fetch(url, {
|
|
46
|
+
headers: { Accept: "application/json" },
|
|
47
|
+
});
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
throw new ComfyUIError(`ComfyUI Registry error ${res.status} for "${registryId}"`, "REGISTRY_ERROR");
|
|
50
|
+
}
|
|
51
|
+
const data = (await res.json());
|
|
52
|
+
if (!data.repository) {
|
|
53
|
+
throw new ComfyUIError(`No repository URL found for registry ID "${registryId}"`, "REGISTRY_ERROR");
|
|
54
|
+
}
|
|
55
|
+
return data.repository;
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Parse owner/repo from a GitHub URL
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function parseGitHubUrl(url) {
|
|
61
|
+
// Handles: https://github.com/owner/repo, https://github.com/owner/repo.git
|
|
62
|
+
const match = url.match(/github\.com\/([^/]+)\/([^/?.#]+)/);
|
|
63
|
+
if (!match) {
|
|
64
|
+
throw new ComfyUIError(`Cannot parse GitHub owner/repo from "${url}"`, "VALIDATION_ERROR");
|
|
65
|
+
}
|
|
66
|
+
return { owner: match[1], repo: match[2].replace(/\.git$/, "") };
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// NODE_CLASS_MAPPINGS parser
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
export function parseNodeClassMappings(pythonSource) {
|
|
72
|
+
const mappings = {};
|
|
73
|
+
// Pattern 1: NODE_CLASS_MAPPINGS = { "DisplayName": ClassName, ... }
|
|
74
|
+
// Handles multiline dicts with various quoting
|
|
75
|
+
const dictMatch = pythonSource.match(/NODE_CLASS_MAPPINGS\s*=\s*\{([^}]*)\}/s);
|
|
76
|
+
if (dictMatch) {
|
|
77
|
+
const body = dictMatch[1];
|
|
78
|
+
// Match entries like "DisplayName": ClassName or 'DisplayName': ClassName
|
|
79
|
+
const entryPattern = /["']([^"']+)["']\s*:\s*([A-Za-z_]\w*)/g;
|
|
80
|
+
let m;
|
|
81
|
+
while ((m = entryPattern.exec(body)) !== null) {
|
|
82
|
+
mappings[m[1]] = m[2];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Pattern 2: NODE_CLASS_MAPPINGS["DisplayName"] = ClassName
|
|
86
|
+
const assignPattern = /NODE_CLASS_MAPPINGS\[["']([^"']+)["']\]\s*=\s*([A-Za-z_]\w*)/g;
|
|
87
|
+
let m;
|
|
88
|
+
while ((m = assignPattern.exec(pythonSource)) !== null) {
|
|
89
|
+
mappings[m[1]] = m[2];
|
|
90
|
+
}
|
|
91
|
+
// Pattern 3: NODE_CLASS_MAPPINGS.update({ ... })
|
|
92
|
+
const updateMatch = pythonSource.match(/NODE_CLASS_MAPPINGS\.update\(\s*\{([^}]*)\}\s*\)/s);
|
|
93
|
+
if (updateMatch) {
|
|
94
|
+
const body = updateMatch[1];
|
|
95
|
+
const entryPattern = /["']([^"']+)["']\s*:\s*([A-Za-z_]\w*)/g;
|
|
96
|
+
let m2;
|
|
97
|
+
while ((m2 = entryPattern.exec(body)) !== null) {
|
|
98
|
+
mappings[m2[1]] = m2[2];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return mappings;
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Collect Python files with NODE_CLASS_MAPPINGS from a repo
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
async function findNodeMappings(owner, repo) {
|
|
107
|
+
const allMappings = {};
|
|
108
|
+
// List root directory
|
|
109
|
+
const rootEntries = await listGitHubDir(owner, repo);
|
|
110
|
+
// Gather Python files at root level + common sub-directories
|
|
111
|
+
const pyFiles = [];
|
|
112
|
+
const subDirs = [];
|
|
113
|
+
for (const entry of rootEntries) {
|
|
114
|
+
if (entry.type === "file" && entry.name.endsWith(".py")) {
|
|
115
|
+
pyFiles.push(entry.path);
|
|
116
|
+
}
|
|
117
|
+
else if (entry.type === "dir") {
|
|
118
|
+
subDirs.push(entry.path);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Check common node directories (first level only to avoid excessive API calls)
|
|
122
|
+
for (const dir of subDirs.slice(0, 10)) {
|
|
123
|
+
try {
|
|
124
|
+
const dirEntries = await listGitHubDir(owner, repo, dir);
|
|
125
|
+
for (const entry of dirEntries) {
|
|
126
|
+
if (entry.type === "file" && entry.name.endsWith(".py")) {
|
|
127
|
+
pyFiles.push(entry.path);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Skip directories we can't read
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Fetch Python files and parse NODE_CLASS_MAPPINGS (limit to avoid rate limits)
|
|
136
|
+
const filesToCheck = pyFiles.slice(0, 30);
|
|
137
|
+
const fetches = filesToCheck.map(async (path) => {
|
|
138
|
+
try {
|
|
139
|
+
const source = await fetchGitHubFile(owner, repo, path);
|
|
140
|
+
if (source.includes("NODE_CLASS_MAPPINGS")) {
|
|
141
|
+
const parsed = parseNodeClassMappings(source);
|
|
142
|
+
Object.assign(allMappings, parsed);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Skip files we can't fetch
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
await Promise.all(fetches);
|
|
150
|
+
return allMappings;
|
|
151
|
+
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Find example workflows in the repo
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
async function findExampleWorkflows(owner, repo) {
|
|
156
|
+
const examples = [];
|
|
157
|
+
const jsonPaths = [];
|
|
158
|
+
// Check root and common example dirs
|
|
159
|
+
const dirsToCheck = ["", "examples", "workflows", "example_workflows"];
|
|
160
|
+
for (const dir of dirsToCheck) {
|
|
161
|
+
try {
|
|
162
|
+
const entries = await listGitHubDir(owner, repo, dir);
|
|
163
|
+
for (const entry of entries) {
|
|
164
|
+
if (entry.type === "file" && entry.name.endsWith(".json")) {
|
|
165
|
+
jsonPaths.push(entry.path);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Directory may not exist
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Fetch up to 5 example workflows
|
|
174
|
+
for (const path of jsonPaths.slice(0, 5)) {
|
|
175
|
+
try {
|
|
176
|
+
const content = await fetchGitHubFile(owner, repo, path);
|
|
177
|
+
const workflow = JSON.parse(content);
|
|
178
|
+
// Quick heuristic: ComfyUI workflows have nodes with class_type
|
|
179
|
+
const isWorkflow = typeof workflow === "object" &&
|
|
180
|
+
workflow !== null &&
|
|
181
|
+
Object.values(workflow).some((v) => typeof v === "object" &&
|
|
182
|
+
v !== null &&
|
|
183
|
+
"class_type" in v);
|
|
184
|
+
if (isWorkflow) {
|
|
185
|
+
const name = path
|
|
186
|
+
.split("/")
|
|
187
|
+
.pop()
|
|
188
|
+
.replace(/\.json$/, "")
|
|
189
|
+
.replace(/[_-]/g, " ");
|
|
190
|
+
examples.push({
|
|
191
|
+
name,
|
|
192
|
+
description: `Example workflow from ${path}`,
|
|
193
|
+
workflow,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Skip unparseable files
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return examples;
|
|
202
|
+
}
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
// Fetch README for description
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
async function fetchReadme(owner, repo) {
|
|
207
|
+
const candidates = ["README.md", "readme.md", "README.rst", "README"];
|
|
208
|
+
for (const name of candidates) {
|
|
209
|
+
try {
|
|
210
|
+
return await fetchGitHubFile(owner, repo, name);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Try next
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
function extractFirstParagraph(markdown) {
|
|
219
|
+
// Skip leading headings/badges, grab first non-empty text block
|
|
220
|
+
const lines = markdown.split("\n");
|
|
221
|
+
const paragraphLines = [];
|
|
222
|
+
let started = false;
|
|
223
|
+
for (const line of lines) {
|
|
224
|
+
const trimmed = line.trim();
|
|
225
|
+
if (!started) {
|
|
226
|
+
// Skip headings, blank lines, badge images, HTML
|
|
227
|
+
if (trimmed === "" ||
|
|
228
|
+
trimmed.startsWith("#") ||
|
|
229
|
+
trimmed.startsWith("![") ||
|
|
230
|
+
trimmed.startsWith("<") ||
|
|
231
|
+
trimmed.startsWith("[![")) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
started = true;
|
|
235
|
+
}
|
|
236
|
+
if (started) {
|
|
237
|
+
if (trimmed === "" || trimmed.startsWith("#"))
|
|
238
|
+
break;
|
|
239
|
+
paragraphLines.push(trimmed);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return paragraphLines.join(" ").slice(0, 500);
|
|
243
|
+
}
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// Match nodes against ComfyUI object_info
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
function buildNodeInfo(classNameToDisplay, objectInfo) {
|
|
248
|
+
const nodes = [];
|
|
249
|
+
for (const [displayName, className] of Object.entries(classNameToDisplay)) {
|
|
250
|
+
// object_info is keyed by the internal class name
|
|
251
|
+
const nodeDef = objectInfo[className];
|
|
252
|
+
const inputs = [];
|
|
253
|
+
const outputs = [];
|
|
254
|
+
if (nodeDef) {
|
|
255
|
+
// Required inputs
|
|
256
|
+
if (nodeDef.input.required) {
|
|
257
|
+
for (const [name, spec] of Object.entries(nodeDef.input.required)) {
|
|
258
|
+
const type = Array.isArray(spec[0]) ? spec[0].join(" | ") : spec[0];
|
|
259
|
+
const defaultVal = spec[1]?.default;
|
|
260
|
+
inputs.push({ name, type, required: true, default: defaultVal });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Optional inputs
|
|
264
|
+
if (nodeDef.input.optional) {
|
|
265
|
+
for (const [name, spec] of Object.entries(nodeDef.input.optional)) {
|
|
266
|
+
const type = Array.isArray(spec[0]) ? spec[0].join(" | ") : spec[0];
|
|
267
|
+
const defaultVal = spec[1]?.default;
|
|
268
|
+
inputs.push({ name, type, required: false, default: defaultVal });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Outputs
|
|
272
|
+
for (let i = 0; i < nodeDef.output.length; i++) {
|
|
273
|
+
outputs.push({
|
|
274
|
+
name: nodeDef.output_name[i] || nodeDef.output[i],
|
|
275
|
+
type: nodeDef.output[i],
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
nodes.push({
|
|
280
|
+
className,
|
|
281
|
+
displayName: nodeDef?.display_name || displayName,
|
|
282
|
+
category: nodeDef?.category || "unknown",
|
|
283
|
+
inputs,
|
|
284
|
+
outputs,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// Sort by category then display name for consistent output
|
|
288
|
+
nodes.sort((a, b) => a.category === b.category
|
|
289
|
+
? a.displayName.localeCompare(b.displayName)
|
|
290
|
+
: a.category.localeCompare(b.category));
|
|
291
|
+
return nodes;
|
|
292
|
+
}
|
|
293
|
+
// ---------------------------------------------------------------------------
|
|
294
|
+
// Markdown renderer
|
|
295
|
+
// ---------------------------------------------------------------------------
|
|
296
|
+
export function renderSkillMarkdown(data) {
|
|
297
|
+
const tags = new Set(["comfyui"]);
|
|
298
|
+
for (const node of data.nodes) {
|
|
299
|
+
if (node.category && node.category !== "unknown") {
|
|
300
|
+
// Take the top-level category
|
|
301
|
+
const top = node.category.split("/")[0].trim().toLowerCase();
|
|
302
|
+
if (top)
|
|
303
|
+
tags.add(top);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
const lines = [];
|
|
307
|
+
// Frontmatter
|
|
308
|
+
lines.push("---");
|
|
309
|
+
lines.push(`name: ${data.name}`);
|
|
310
|
+
lines.push(`version: ${data.version}`);
|
|
311
|
+
lines.push(`description: ${data.description}`);
|
|
312
|
+
lines.push(`tags: [${[...tags].join(", ")}]`);
|
|
313
|
+
lines.push("---");
|
|
314
|
+
lines.push("");
|
|
315
|
+
// Title
|
|
316
|
+
lines.push(`# ${data.name}`);
|
|
317
|
+
lines.push("");
|
|
318
|
+
if (data.description) {
|
|
319
|
+
lines.push(data.description);
|
|
320
|
+
lines.push("");
|
|
321
|
+
}
|
|
322
|
+
if (data.repository) {
|
|
323
|
+
lines.push(`Repository: ${data.repository}`);
|
|
324
|
+
lines.push("");
|
|
325
|
+
}
|
|
326
|
+
// Nodes
|
|
327
|
+
lines.push("## Nodes");
|
|
328
|
+
lines.push("");
|
|
329
|
+
for (const node of data.nodes) {
|
|
330
|
+
lines.push(`### ${node.displayName}`);
|
|
331
|
+
lines.push(`**Class**: \`${node.className}\``);
|
|
332
|
+
lines.push(`**Category**: ${node.category}`);
|
|
333
|
+
lines.push("");
|
|
334
|
+
if (node.inputs.length > 0) {
|
|
335
|
+
lines.push("**Inputs**:");
|
|
336
|
+
lines.push("| Name | Type | Required | Default |");
|
|
337
|
+
lines.push("|------|------|----------|---------|");
|
|
338
|
+
for (const inp of node.inputs) {
|
|
339
|
+
const def = inp.default !== undefined ? String(inp.default) : "";
|
|
340
|
+
lines.push(`| ${inp.name} | ${inp.type} | ${inp.required ? "Yes" : "No"} | ${def} |`);
|
|
341
|
+
}
|
|
342
|
+
lines.push("");
|
|
343
|
+
}
|
|
344
|
+
if (node.outputs.length > 0) {
|
|
345
|
+
lines.push("**Outputs**:");
|
|
346
|
+
lines.push("| Name | Type |");
|
|
347
|
+
lines.push("|------|------|");
|
|
348
|
+
for (const out of node.outputs) {
|
|
349
|
+
lines.push(`| ${out.name} | ${out.type} |`);
|
|
350
|
+
}
|
|
351
|
+
lines.push("");
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Examples
|
|
355
|
+
if (data.examples.length > 0) {
|
|
356
|
+
lines.push("## Usage Examples");
|
|
357
|
+
lines.push("");
|
|
358
|
+
for (const ex of data.examples) {
|
|
359
|
+
lines.push(`### ${ex.name}`);
|
|
360
|
+
lines.push(ex.description);
|
|
361
|
+
lines.push("");
|
|
362
|
+
if (ex.workflow && typeof ex.workflow === "object") {
|
|
363
|
+
const wf = ex.workflow;
|
|
364
|
+
const nodeTypes = [
|
|
365
|
+
...new Set(Object.values(wf)
|
|
366
|
+
.filter((v) => v.class_type)
|
|
367
|
+
.map((v) => v.class_type)),
|
|
368
|
+
];
|
|
369
|
+
if (nodeTypes.length > 0) {
|
|
370
|
+
lines.push(`Key nodes used: ${nodeTypes.join(", ")}`);
|
|
371
|
+
lines.push("");
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// Composition Patterns
|
|
377
|
+
lines.push("## Composition Patterns");
|
|
378
|
+
lines.push("");
|
|
379
|
+
lines.push("- To use with LoRA: Insert LoraLoader between CheckpointLoader and the first node that uses MODEL/CLIP");
|
|
380
|
+
lines.push("- To chain with ControlNet: Add ControlNetLoader and ControlNetApply before the sampler");
|
|
381
|
+
lines.push("");
|
|
382
|
+
return lines.join("\n");
|
|
383
|
+
}
|
|
384
|
+
// ---------------------------------------------------------------------------
|
|
385
|
+
// Main entry point
|
|
386
|
+
// ---------------------------------------------------------------------------
|
|
387
|
+
export async function generateSkill(source) {
|
|
388
|
+
logger.info("Generating skill", { source });
|
|
389
|
+
// Step 1: Resolve repository URL
|
|
390
|
+
let repoUrl;
|
|
391
|
+
if (source.includes("github.com")) {
|
|
392
|
+
repoUrl = source;
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// Assume it's a registry ID
|
|
396
|
+
logger.info("Looking up registry ID", { registryId: source });
|
|
397
|
+
repoUrl = await resolveRegistryRepo(source);
|
|
398
|
+
}
|
|
399
|
+
const { owner, repo } = parseGitHubUrl(repoUrl);
|
|
400
|
+
logger.info("Resolved repository", { owner, repo });
|
|
401
|
+
// Step 2: Fetch README for description
|
|
402
|
+
const readme = await fetchReadme(owner, repo);
|
|
403
|
+
const description = readme
|
|
404
|
+
? extractFirstParagraph(readme)
|
|
405
|
+
: "ComfyUI custom node pack";
|
|
406
|
+
// Step 3: Find NODE_CLASS_MAPPINGS in Python files
|
|
407
|
+
const classNameToDisplay = await findNodeMappings(owner, repo);
|
|
408
|
+
const nodeCount = Object.keys(classNameToDisplay).length;
|
|
409
|
+
logger.info("Found node class mappings", { count: nodeCount });
|
|
410
|
+
if (nodeCount === 0) {
|
|
411
|
+
logger.warn("No NODE_CLASS_MAPPINGS found in repository");
|
|
412
|
+
}
|
|
413
|
+
// Step 4: Match against ComfyUI object_info (best-effort)
|
|
414
|
+
let objectInfo = {};
|
|
415
|
+
try {
|
|
416
|
+
objectInfo = await getObjectInfo();
|
|
417
|
+
}
|
|
418
|
+
catch (err) {
|
|
419
|
+
logger.warn("Could not fetch object_info from ComfyUI (server may be offline)", {
|
|
420
|
+
error: err instanceof Error ? err.message : String(err),
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
const nodes = buildNodeInfo(classNameToDisplay, objectInfo);
|
|
424
|
+
// Step 5: Find example workflows
|
|
425
|
+
const examples = await findExampleWorkflows(owner, repo);
|
|
426
|
+
logger.info("Found example workflows", { count: examples.length });
|
|
427
|
+
// Step 6: Render SKILL.md
|
|
428
|
+
const data = {
|
|
429
|
+
name: repo,
|
|
430
|
+
version: "1.0.0",
|
|
431
|
+
description,
|
|
432
|
+
repository: repoUrl,
|
|
433
|
+
nodes,
|
|
434
|
+
examples,
|
|
435
|
+
};
|
|
436
|
+
return renderSkillMarkdown(data);
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=skill-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/services/skill-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { WorkflowJSON } from "../comfyui/types.js";
|
|
2
|
+
export declare function getNextNodeId(workflow: WorkflowJSON): string;
|
|
3
|
+
export declare const TEMPLATE_NAMES: string[];
|
|
4
|
+
export declare function createWorkflow(template: string, params?: Record<string, unknown>): WorkflowJSON;
|
|
5
|
+
interface SetInputOp {
|
|
6
|
+
op: "set_input";
|
|
7
|
+
node_id: string;
|
|
8
|
+
input_name: string;
|
|
9
|
+
value: unknown;
|
|
10
|
+
}
|
|
11
|
+
interface AddNodeOp {
|
|
12
|
+
op: "add_node";
|
|
13
|
+
class_type: string;
|
|
14
|
+
inputs?: Record<string, unknown>;
|
|
15
|
+
id?: string;
|
|
16
|
+
}
|
|
17
|
+
interface RemoveNodeOp {
|
|
18
|
+
op: "remove_node";
|
|
19
|
+
node_id: string;
|
|
20
|
+
}
|
|
21
|
+
interface ConnectOp {
|
|
22
|
+
op: "connect";
|
|
23
|
+
source_id: string;
|
|
24
|
+
output_index: number;
|
|
25
|
+
target_id: string;
|
|
26
|
+
input_name: string;
|
|
27
|
+
}
|
|
28
|
+
interface InsertBetweenOp {
|
|
29
|
+
op: "insert_between";
|
|
30
|
+
source_id: string;
|
|
31
|
+
output_index: number;
|
|
32
|
+
target_id: string;
|
|
33
|
+
input_name: string;
|
|
34
|
+
new_class_type: string;
|
|
35
|
+
new_inputs?: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
export type ModifyOperation = SetInputOp | AddNodeOp | RemoveNodeOp | ConnectOp | InsertBetweenOp;
|
|
38
|
+
export declare function modifyWorkflow(workflow: WorkflowJSON, operations: ModifyOperation[]): {
|
|
39
|
+
workflow: WorkflowJSON;
|
|
40
|
+
added_ids: string[];
|
|
41
|
+
};
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=workflow-composer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-composer.d.ts","sourceRoot":"","sources":["../../src/services/workflow-composer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AAKtE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAG5D;AAoQD,eAAO,MAAM,cAAc,UAAyB,CAAC;AAErD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,YAAY,CAQd;AAID,UAAU,UAAU;IAClB,EAAE,EAAE,WAAW,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,aAAa,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,gBAAgB,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,SAAS,GACT,YAAY,GACZ,SAAS,GACT,eAAe,CAAC;AA+EpB,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,eAAe,EAAE,GAC5B;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCjD"}
|