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.
Files changed (90) hide show
  1. package/.mcp.json +11 -0
  2. package/dist/comfyui/client.d.ts +16 -0
  3. package/dist/comfyui/client.d.ts.map +1 -0
  4. package/dist/comfyui/client.js +75 -0
  5. package/dist/comfyui/client.js.map +1 -0
  6. package/dist/comfyui/events.d.ts +9 -0
  7. package/dist/comfyui/events.d.ts.map +1 -0
  8. package/dist/comfyui/events.js +40 -0
  9. package/dist/comfyui/events.js.map +1 -0
  10. package/dist/comfyui/types.d.ts +66 -0
  11. package/dist/comfyui/types.d.ts.map +1 -0
  12. package/dist/comfyui/types.js +3 -0
  13. package/dist/comfyui/types.js.map +1 -0
  14. package/dist/config.d.ts +28 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +93 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +22 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/services/mermaid-converter.d.ts +8 -0
  23. package/dist/services/mermaid-converter.d.ts.map +1 -0
  24. package/dist/services/mermaid-converter.js +235 -0
  25. package/dist/services/mermaid-converter.js.map +1 -0
  26. package/dist/services/mermaid-parser.d.ts +31 -0
  27. package/dist/services/mermaid-parser.d.ts.map +1 -0
  28. package/dist/services/mermaid-parser.js +464 -0
  29. package/dist/services/mermaid-parser.js.map +1 -0
  30. package/dist/services/model-resolver.d.ts +25 -0
  31. package/dist/services/model-resolver.d.ts.map +1 -0
  32. package/dist/services/model-resolver.js +123 -0
  33. package/dist/services/model-resolver.js.map +1 -0
  34. package/dist/services/registry-client.d.ts +28 -0
  35. package/dist/services/registry-client.d.ts.map +1 -0
  36. package/dist/services/registry-client.js +32 -0
  37. package/dist/services/registry-client.js.map +1 -0
  38. package/dist/services/skill-generator.d.ts +33 -0
  39. package/dist/services/skill-generator.d.ts.map +1 -0
  40. package/dist/services/skill-generator.js +438 -0
  41. package/dist/services/skill-generator.js.map +1 -0
  42. package/dist/services/workflow-composer.d.ts +43 -0
  43. package/dist/services/workflow-composer.d.ts.map +1 -0
  44. package/dist/services/workflow-composer.js +333 -0
  45. package/dist/services/workflow-composer.js.map +1 -0
  46. package/dist/services/workflow-executor.d.ts +15 -0
  47. package/dist/services/workflow-executor.d.ts.map +1 -0
  48. package/dist/services/workflow-executor.js +63 -0
  49. package/dist/services/workflow-executor.js.map +1 -0
  50. package/dist/tools/index.d.ts +3 -0
  51. package/dist/tools/index.d.ts.map +1 -0
  52. package/dist/tools/index.js +15 -0
  53. package/dist/tools/index.js.map +1 -0
  54. package/dist/tools/model-management.d.ts +3 -0
  55. package/dist/tools/model-management.d.ts.map +1 -0
  56. package/dist/tools/model-management.js +97 -0
  57. package/dist/tools/model-management.js.map +1 -0
  58. package/dist/tools/registry-search.d.ts +3 -0
  59. package/dist/tools/registry-search.d.ts.map +1 -0
  60. package/dist/tools/registry-search.js +70 -0
  61. package/dist/tools/registry-search.js.map +1 -0
  62. package/dist/tools/skill-generator.d.ts +3 -0
  63. package/dist/tools/skill-generator.d.ts.map +1 -0
  64. package/dist/tools/skill-generator.js +42 -0
  65. package/dist/tools/skill-generator.js.map +1 -0
  66. package/dist/tools/workflow-compose.d.ts +3 -0
  67. package/dist/tools/workflow-compose.d.ts.map +1 -0
  68. package/dist/tools/workflow-compose.js +180 -0
  69. package/dist/tools/workflow-compose.js.map +1 -0
  70. package/dist/tools/workflow-execute.d.ts +3 -0
  71. package/dist/tools/workflow-execute.d.ts.map +1 -0
  72. package/dist/tools/workflow-execute.js +115 -0
  73. package/dist/tools/workflow-execute.js.map +1 -0
  74. package/dist/tools/workflow-visualize.d.ts +3 -0
  75. package/dist/tools/workflow-visualize.d.ts.map +1 -0
  76. package/dist/tools/workflow-visualize.js +111 -0
  77. package/dist/tools/workflow-visualize.js.map +1 -0
  78. package/dist/utils/errors.d.ts +24 -0
  79. package/dist/utils/errors.d.ts.map +1 -0
  80. package/dist/utils/errors.js +65 -0
  81. package/dist/utils/errors.js.map +1 -0
  82. package/dist/utils/image.d.ts +4 -0
  83. package/dist/utils/image.d.ts.map +1 -0
  84. package/dist/utils/image.js +10 -0
  85. package/dist/utils/image.js.map +1 -0
  86. package/dist/utils/logger.d.ts +7 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +22 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. 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"}