comfyui-mcp 0.16.0 → 0.17.1

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 (46) hide show
  1. package/README.md +1 -0
  2. package/package.json +11 -1
  3. package/scripts/smoke-install.mjs +70 -0
  4. package/scripts/sync-agents.mjs +147 -0
  5. package/.beads/README.md +0 -81
  6. package/.beads/config.yaml +0 -54
  7. package/.beads/hooks/post-checkout +0 -24
  8. package/.beads/hooks/post-merge +0 -24
  9. package/.beads/hooks/pre-commit +0 -24
  10. package/.beads/hooks/pre-push +0 -24
  11. package/.beads/hooks/prepare-commit-msg +0 -24
  12. package/.beads/metadata.json +0 -7
  13. package/.codex/hooks.json +0 -15
  14. package/.dockerignore +0 -24
  15. package/.gitattributes +0 -4
  16. package/AGENTS.md +0 -84
  17. package/CHANGELOG.md +0 -755
  18. package/CLAUDE.md +0 -76
  19. package/CONTRIBUTING.md +0 -137
  20. package/Dockerfile +0 -61
  21. package/PACK-SPLIT-STATUS.md +0 -87
  22. package/ROADMAP.md +0 -135
  23. package/TODO.md +0 -75
  24. package/assets/controlnet_demo.png +0 -0
  25. package/assets/ideogram_demo.png +0 -0
  26. package/assets/ltx_sharp_demo.png +0 -0
  27. package/assets/ltx_t2v_demo.png +0 -0
  28. package/assets/qwen_edit_demo.png +0 -0
  29. package/assets/sample_woman.png +0 -0
  30. package/assets/sample_woman_video.mp4 +0 -0
  31. package/assets/wan_demo.png +0 -0
  32. package/assets/wan_sharp_demo.png +0 -0
  33. package/assets/wan_transparent_demo.png +0 -0
  34. package/assets/wan_v2v_demo.png +0 -0
  35. package/blog/comfyui-mcp-tdqs-case-study.md +0 -102
  36. package/design/embedded-agent-panel.md +0 -172
  37. package/design/remote-and-cloud-modes.md +0 -113
  38. package/glama.json +0 -6
  39. package/infra/cloudflare/README.md +0 -75
  40. package/infra/cloudflare/docs-proxy.js +0 -45
  41. package/infra/cloudflare/wrangler.jsonc +0 -19
  42. package/llms-install.md +0 -139
  43. package/model-settings.user.jsonc +0 -97
  44. package/server.json +0 -21
  45. package/web/extensions/comfyui-mcp-agent-panel/README.md +0 -105
  46. package/web/extensions/comfyui-mcp-agent-panel/comfyui-mcp-agent-panel.js +0 -604
package/README.md CHANGED
@@ -551,6 +551,7 @@ npm install
551
551
  | `npm run test:integration` | Run integration tests (requires running ComfyUI) |
552
552
  | `npm run lint` | Type-check without emitting |
553
553
  | `npm run generations:stats` | Show local generation tracking statistics |
554
+ | `npm run sync-agents` | Sync Claude skills/commands/hooks to Google Antigravity, OpenCode, and other AI IDE formats that supports .agents files |
554
555
 
555
556
  ### Local testing with Claude Code
556
557
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "comfyui-mcp",
3
- "version": "0.16.0",
3
+ "version": "0.17.1",
4
4
  "mcpName": "io.github.artokun/comfyui-mcp",
5
5
  "description": "Claude Code plugin + MCP server for ComfyUI - 96 tools, 16 AI skills (Flux, WAN, LTX video, Qwen, Civitai), live graph editing from your Claude session. Generate images, video & audio, manage models and custom nodes.",
6
6
  "homepage": "https://comfyui-mcp.artokun.io/docs",
@@ -9,12 +9,22 @@
9
9
  "bin": {
10
10
  "comfyui-mcp": "dist/index.js"
11
11
  },
12
+ "files": [
13
+ "dist",
14
+ "plugin",
15
+ "packs",
16
+ "scripts",
17
+ "model-settings.json",
18
+ "model-settings.user.jsonc.example"
19
+ ],
12
20
  "scripts": {
21
+ "sync-agents": "node scripts/sync-agents.mjs",
13
22
  "build": "tsc",
14
23
  "dev": "tsx src/index.ts",
15
24
  "dev:agent-poc": "tsx src/experimental/run.ts",
16
25
  "start": "node dist/index.js",
17
26
  "test": "vitest run --passWithNoTests",
27
+ "smoke": "npm run build && node scripts/smoke-install.mjs",
18
28
  "test:watch": "vitest",
19
29
  "test:integration": "cross-env COMFYUI_INTEGRATION=true vitest run",
20
30
  "test:agent": "npm run build && node scripts/test-agent.mjs",
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Release smoke test: pack the package exactly as `npm publish` would, install
4
+ * that tarball into a clean throwaway project (which RUNS the postinstall hook),
5
+ * and verify the published layout + entrypoint actually boot.
6
+ *
7
+ * Catches the class of bug that shipped in 0.17.0: a `files` allowlist that
8
+ * dropped `scripts/` while `package.json` still declared
9
+ * `postinstall: node scripts/postinstall.mjs` — so every `npm install` / `npx`
10
+ * crashed on a missing file. Unit tests (`npm test`) never exercise the packed
11
+ * tarball, so this is the gap. Run in CI and as a pre-publish gate.
12
+ */
13
+ import { execSync, spawnSync } from "node:child_process";
14
+ import { mkdtempSync, writeFileSync, existsSync, readdirSync } from "node:fs";
15
+ import { tmpdir } from "node:os";
16
+ import { join } from "node:path";
17
+
18
+ const run = (cmd, opts = {}) => {
19
+ console.log(`$ ${cmd}${opts.cwd ? ` (cwd: ${opts.cwd})` : ""}`);
20
+ execSync(cmd, { stdio: "inherit", ...opts });
21
+ };
22
+
23
+ // 1. Pack exactly what `npm publish` would upload.
24
+ const packDir = mkdtempSync(join(tmpdir(), "cmcp-pack-"));
25
+ run(`npm pack --pack-destination "${packDir}"`);
26
+ const tgz = readdirSync(packDir).find((f) => f.endsWith(".tgz"));
27
+ if (!tgz) throw new Error("npm pack produced no tarball");
28
+ const tarball = join(packDir, tgz);
29
+
30
+ // 2. Install the tarball in a clean project — this RUNS the postinstall hook.
31
+ const proj = mkdtempSync(join(tmpdir(), "cmcp-smoke-"));
32
+ writeFileSync(
33
+ join(proj, "package.json"),
34
+ JSON.stringify({ name: "comfyui-mcp-smoke", private: true, version: "0.0.0" }),
35
+ );
36
+ // --foreground-scripts surfaces postinstall output; a crashing hook exits non-zero.
37
+ run(`npm install --foreground-scripts --no-audit --no-fund "${tarball}"`, { cwd: proj });
38
+
39
+ // 3. Verify the published layout is intact (files the runtime/install need).
40
+ const pkg = join(proj, "node_modules", "comfyui-mcp");
41
+ for (const f of ["dist/index.js", "scripts/postinstall.mjs", "package.json"]) {
42
+ if (!existsSync(join(pkg, f))) {
43
+ console.error(`❌ published package is missing ${f}`);
44
+ process.exit(1);
45
+ }
46
+ }
47
+ if (!existsSync(join(proj, "node_modules", ".bin", "comfyui-mcp")) &&
48
+ !existsSync(join(proj, "node_modules", ".bin", "comfyui-mcp.cmd"))) {
49
+ console.error("❌ comfyui-mcp bin was not linked");
50
+ process.exit(1);
51
+ }
52
+
53
+ // 4. Entrypoint parses (syntax) and boots without an immediate crash.
54
+ run(`node --check "${join(pkg, "dist/index.js")}"`);
55
+ const boot = spawnSync(process.execPath, [join(pkg, "dist/index.js")], {
56
+ input: "",
57
+ timeout: 8000,
58
+ encoding: "utf8",
59
+ });
60
+ // Pass if it stayed up until the timeout (SIGTERM) or exited cleanly on stdin EOF.
61
+ if (boot.signal === "SIGTERM" || boot.status === 0) {
62
+ console.log(`✅ entrypoint boots (signal=${boot.signal}, status=${boot.status})`);
63
+ } else {
64
+ console.error(`❌ entrypoint crashed on boot (status=${boot.status}, signal=${boot.signal})`);
65
+ if (boot.stdout) console.error("stdout:\n" + boot.stdout);
66
+ if (boot.stderr) console.error("stderr:\n" + boot.stderr);
67
+ process.exit(1);
68
+ }
69
+
70
+ console.log("✅ pack/install smoke passed — tarball installs cleanly and boots");
@@ -0,0 +1,147 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+
4
+ const PLUGIN_DIR = 'plugin';
5
+ const AGENTS_DIR = '.agents';
6
+ const GEMINI_DIR = '.gemini/commands';
7
+
8
+ // Ensure directories exist
9
+ fs.mkdirSync(path.join(AGENTS_DIR, 'skills'), { recursive: true });
10
+ fs.mkdirSync(GEMINI_DIR, { recursive: true });
11
+
12
+ function extractFrontmatter(content) {
13
+ const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
14
+ if (!match) return { frontmatter: {}, body: content };
15
+
16
+ const frontmatterStr = match[1];
17
+ const body = match[2];
18
+
19
+ const frontmatter = {};
20
+ for (const line of frontmatterStr.split('\n')) {
21
+ const colonIdx = line.indexOf(':');
22
+ if (colonIdx !== -1) {
23
+ const key = line.slice(0, colonIdx).trim();
24
+ const value = line.slice(colonIdx + 1).trim();
25
+ if (!key.startsWith('globs') && !line.trim().startsWith('-')) {
26
+ frontmatter[key] = value.replace(/^['"]|['"]$/g, '');
27
+ }
28
+ }
29
+ }
30
+ return { frontmatter, body };
31
+ }
32
+
33
+ function processSkillOrAgent(srcPath, destPath, defaultName, isAgent) {
34
+ if (!fs.existsSync(srcPath)) return;
35
+ const content = fs.readFileSync(srcPath, 'utf8');
36
+ let { frontmatter, body } = extractFrontmatter(content);
37
+
38
+ const name = frontmatter.name || defaultName;
39
+ const description = frontmatter.description || (isAgent ? `Agent specialized in ${name}` : '');
40
+
41
+ // Replace CLAUDE_PLUGIN_ROOT with ./plugin
42
+ body = body.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, './plugin');
43
+
44
+ const newContent = `---
45
+ name: ${name}
46
+ description: ${description}
47
+ ---
48
+
49
+ ${body.trim()}`;
50
+
51
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
52
+ fs.writeFileSync(destPath, newContent, 'utf8');
53
+ console.log(`Synced ${srcPath} -> ${destPath}`);
54
+ }
55
+
56
+ // 1. Translate skills
57
+ const skillsDir = path.join(PLUGIN_DIR, 'skills');
58
+ if (fs.existsSync(skillsDir)) {
59
+ for (const skillName of fs.readdirSync(skillsDir)) {
60
+ const srcPath = path.join(skillsDir, skillName, 'SKILL.md');
61
+ const destPath = path.join(AGENTS_DIR, 'skills', skillName, 'SKILL.md');
62
+ processSkillOrAgent(srcPath, destPath, skillName, false);
63
+ }
64
+ }
65
+
66
+ // 2. Translate agents
67
+ const agentsDir = path.join(PLUGIN_DIR, 'agents');
68
+ if (fs.existsSync(agentsDir)) {
69
+ for (const file of fs.readdirSync(agentsDir)) {
70
+ if (file.endsWith('.md')) {
71
+ const agentName = path.basename(file, '.md');
72
+ const srcPath = path.join(agentsDir, file);
73
+ const destPath = path.join(AGENTS_DIR, 'skills', `comfy-${agentName}`, 'SKILL.md');
74
+ processSkillOrAgent(srcPath, destPath, `comfy-${agentName}`, true);
75
+ }
76
+ }
77
+ }
78
+
79
+ // 3. Translate commands
80
+ const commandsDir = path.join(PLUGIN_DIR, 'commands');
81
+ if (fs.existsSync(commandsDir)) {
82
+ for (const file of fs.readdirSync(commandsDir)) {
83
+ if (file.endsWith('.md')) {
84
+ const commandName = path.basename(file, '.md');
85
+ const srcPath = path.join(commandsDir, file);
86
+ const destPath = path.join(GEMINI_DIR, `comfy-${commandName}.toml`);
87
+
88
+ const content = fs.readFileSync(srcPath, 'utf8');
89
+ let { frontmatter, body } = extractFrontmatter(content);
90
+
91
+ body = body.replace(/\$ARGUMENTS/g, '{{args}}');
92
+ body = body.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, './plugin');
93
+
94
+ const desc = frontmatter.description || `Command comfy-${commandName}`;
95
+
96
+ const tomlContent = `name = "comfy-${commandName}"
97
+ description = "${desc}"
98
+
99
+ prompt = """
100
+ ${body.trim()}
101
+ """
102
+ `;
103
+ fs.writeFileSync(destPath, tomlContent, 'utf8');
104
+ console.log(`Synced ${srcPath} -> ${destPath}`);
105
+ }
106
+ }
107
+ }
108
+
109
+ // 4. Translate hooks
110
+ const hooksSrc = path.join(PLUGIN_DIR, 'hooks', 'hooks.json');
111
+ const hooksDest = path.join(AGENTS_DIR, 'hooks.json');
112
+ if (fs.existsSync(hooksSrc)) {
113
+ let hooksContent = fs.readFileSync(hooksSrc, 'utf8');
114
+ hooksContent = hooksContent.replace(/mcp__plugin_comfy_comfyui__/g, 'mcp__comfyui__');
115
+ hooksContent = hooksContent.replace(/\$\{CLAUDE_PLUGIN_ROOT\}\/hooks/g, './plugin/hooks');
116
+ hooksContent = hooksContent.replace(/\$\{CLAUDE_PLUGIN_ROOT\}\/scripts/g, './plugin/scripts');
117
+ fs.writeFileSync(hooksDest, hooksContent, 'utf8');
118
+ console.log(`Synced hooks -> ${hooksDest}`);
119
+ }
120
+
121
+ // 5. Create default mcp_config.json
122
+ const mcpConfigPath = path.join(AGENTS_DIR, 'mcp_config.json');
123
+ const mcpConfig = {
124
+ mcpServers: {
125
+ comfyui: {
126
+ command: "npx",
127
+ args: ["-y", "comfyui-mcp"],
128
+ env: {
129
+ CIVITAI_API_TOKEN: ""
130
+ }
131
+ },
132
+ civitai: {
133
+ url: "https://mcp.civitai.com/mcp",
134
+ headers: {
135
+ Authorization: "Bearer ${CIVITAI_API_TOKEN:-}"
136
+ }
137
+ },
138
+ huggingface: {
139
+ url: "https://huggingface.co/mcp",
140
+ headers: {
141
+ Authorization: "Bearer ${HUGGINGFACE_TOKEN:-}"
142
+ }
143
+ }
144
+ }
145
+ };
146
+ fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2), 'utf8');
147
+ console.log(`Created default ${mcpConfigPath}`);
package/.beads/README.md DELETED
@@ -1,81 +0,0 @@
1
- # Beads - AI-Native Issue Tracking
2
-
3
- Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
4
-
5
- ## What is Beads?
6
-
7
- Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
8
-
9
- **Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
10
-
11
- ## Quick Start
12
-
13
- ### Essential Commands
14
-
15
- ```bash
16
- # Create new issues
17
- bd create "Add user authentication"
18
-
19
- # View all issues
20
- bd list
21
-
22
- # View issue details
23
- bd show <issue-id>
24
-
25
- # Update issue status
26
- bd update <issue-id> --claim
27
- bd update <issue-id> --status done
28
-
29
- # Sync with Dolt remote
30
- bd dolt push
31
- ```
32
-
33
- ### Working with Issues
34
-
35
- Issues in Beads are:
36
- - **Git-native**: Stored in Dolt database with version control and branching
37
- - **AI-friendly**: CLI-first design works perfectly with AI coding agents
38
- - **Branch-aware**: Issues can follow your branch workflow
39
- - **Always in sync**: Auto-syncs with your commits
40
-
41
- ## Why Beads?
42
-
43
- ✨ **AI-Native Design**
44
- - Built specifically for AI-assisted development workflows
45
- - CLI-first interface works seamlessly with AI coding agents
46
- - No context switching to web UIs
47
-
48
- 🚀 **Developer Focused**
49
- - Issues live in your repo, right next to your code
50
- - Works offline, syncs when you push
51
- - Fast, lightweight, and stays out of your way
52
-
53
- 🔧 **Git Integration**
54
- - Automatic sync with git commits
55
- - Branch-aware issue tracking
56
- - Dolt-native three-way merge resolution
57
-
58
- ## Get Started with Beads
59
-
60
- Try Beads in your own projects:
61
-
62
- ```bash
63
- # Install Beads
64
- curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
65
-
66
- # Initialize in your repo
67
- bd init
68
-
69
- # Create your first issue
70
- bd create "Try out Beads"
71
- ```
72
-
73
- ## Learn More
74
-
75
- - **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
76
- - **Quick Start Guide**: Run `bd quickstart`
77
- - **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
78
-
79
- ---
80
-
81
- *Beads: Issue tracking that moves at the speed of thought* ⚡
@@ -1,54 +0,0 @@
1
- # Beads Configuration File
2
- # This file configures default behavior for all bd commands in this repository
3
- # All settings can also be set via environment variables (BD_* prefix)
4
- # or overridden with command-line flags
5
-
6
- # Issue prefix for this repository (used by bd init)
7
- # If not set, bd init will auto-detect from directory name
8
- # Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
9
- # issue-prefix: ""
10
-
11
- # Use no-db mode: JSONL-only, no Dolt database
12
- # When true, bd will use .beads/issues.jsonl as the source of truth
13
- # no-db: false
14
-
15
- # Enable JSON output by default
16
- # json: false
17
-
18
- # Feedback title formatting for mutating commands (create/update/close/dep/edit)
19
- # 0 = hide titles, N > 0 = truncate to N characters
20
- # output:
21
- # title-length: 255
22
-
23
- # Default actor for audit trails (overridden by BEADS_ACTOR or --actor)
24
- # actor: ""
25
-
26
- # Export events (audit trail) to .beads/events.jsonl on each flush/sync
27
- # When enabled, new events are appended incrementally using a high-water mark.
28
- # Use 'bd export --events' to trigger manually regardless of this setting.
29
- # events-export: false
30
-
31
- # Multi-repo configuration (experimental - bd-307)
32
- # Allows hydrating from multiple repositories and routing writes to the correct database
33
- # repos:
34
- # primary: "." # Primary repo (where this database lives)
35
- # additional: # Additional repos to hydrate from (read-only)
36
- # - ~/beads-planning # Personal planning repo
37
- # - ~/work-planning # Work planning repo
38
-
39
- # JSONL backup (periodic export for off-machine recovery)
40
- # Auto-enabled when a git remote exists. Override explicitly:
41
- # backup:
42
- # enabled: false # Disable auto-backup entirely
43
- # interval: 15m # Minimum time between auto-exports
44
- # git-push: false # Disable git push (export locally only)
45
- # git-repo: "" # Separate git repo for backups (default: project repo)
46
-
47
- # Integration settings (access with 'bd config get/set')
48
- # These are stored in the database, not in this file:
49
- # - jira.url
50
- # - jira.project
51
- # - linear.url
52
- # - linear.api-key
53
- # - github.org
54
- # - github.repo
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env sh
2
- # --- BEGIN BEADS INTEGRATION v1.0.0 ---
3
- # This section is managed by beads. Do not remove these markers.
4
- if command -v bd >/dev/null 2>&1; then
5
- export BD_GIT_HOOK=1
6
- _bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
7
- if command -v timeout >/dev/null 2>&1; then
8
- timeout "$_bd_timeout" bd hooks run post-checkout "$@"
9
- _bd_exit=$?
10
- if [ $_bd_exit -eq 124 ]; then
11
- echo >&2 "beads: hook 'post-checkout' timed out after ${_bd_timeout}s — continuing without beads"
12
- _bd_exit=0
13
- fi
14
- else
15
- bd hooks run post-checkout "$@"
16
- _bd_exit=$?
17
- fi
18
- if [ $_bd_exit -eq 3 ]; then
19
- echo >&2 "beads: database not initialized — skipping hook 'post-checkout'"
20
- _bd_exit=0
21
- fi
22
- if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
23
- fi
24
- # --- END BEADS INTEGRATION v1.0.0 ---
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env sh
2
- # --- BEGIN BEADS INTEGRATION v1.0.0 ---
3
- # This section is managed by beads. Do not remove these markers.
4
- if command -v bd >/dev/null 2>&1; then
5
- export BD_GIT_HOOK=1
6
- _bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
7
- if command -v timeout >/dev/null 2>&1; then
8
- timeout "$_bd_timeout" bd hooks run post-merge "$@"
9
- _bd_exit=$?
10
- if [ $_bd_exit -eq 124 ]; then
11
- echo >&2 "beads: hook 'post-merge' timed out after ${_bd_timeout}s — continuing without beads"
12
- _bd_exit=0
13
- fi
14
- else
15
- bd hooks run post-merge "$@"
16
- _bd_exit=$?
17
- fi
18
- if [ $_bd_exit -eq 3 ]; then
19
- echo >&2 "beads: database not initialized — skipping hook 'post-merge'"
20
- _bd_exit=0
21
- fi
22
- if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
23
- fi
24
- # --- END BEADS INTEGRATION v1.0.0 ---
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env sh
2
- # --- BEGIN BEADS INTEGRATION v1.0.0 ---
3
- # This section is managed by beads. Do not remove these markers.
4
- if command -v bd >/dev/null 2>&1; then
5
- export BD_GIT_HOOK=1
6
- _bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
7
- if command -v timeout >/dev/null 2>&1; then
8
- timeout "$_bd_timeout" bd hooks run pre-commit "$@"
9
- _bd_exit=$?
10
- if [ $_bd_exit -eq 124 ]; then
11
- echo >&2 "beads: hook 'pre-commit' timed out after ${_bd_timeout}s — continuing without beads"
12
- _bd_exit=0
13
- fi
14
- else
15
- bd hooks run pre-commit "$@"
16
- _bd_exit=$?
17
- fi
18
- if [ $_bd_exit -eq 3 ]; then
19
- echo >&2 "beads: database not initialized — skipping hook 'pre-commit'"
20
- _bd_exit=0
21
- fi
22
- if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
23
- fi
24
- # --- END BEADS INTEGRATION v1.0.0 ---
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env sh
2
- # --- BEGIN BEADS INTEGRATION v1.0.0 ---
3
- # This section is managed by beads. Do not remove these markers.
4
- if command -v bd >/dev/null 2>&1; then
5
- export BD_GIT_HOOK=1
6
- _bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
7
- if command -v timeout >/dev/null 2>&1; then
8
- timeout "$_bd_timeout" bd hooks run pre-push "$@"
9
- _bd_exit=$?
10
- if [ $_bd_exit -eq 124 ]; then
11
- echo >&2 "beads: hook 'pre-push' timed out after ${_bd_timeout}s — continuing without beads"
12
- _bd_exit=0
13
- fi
14
- else
15
- bd hooks run pre-push "$@"
16
- _bd_exit=$?
17
- fi
18
- if [ $_bd_exit -eq 3 ]; then
19
- echo >&2 "beads: database not initialized — skipping hook 'pre-push'"
20
- _bd_exit=0
21
- fi
22
- if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
23
- fi
24
- # --- END BEADS INTEGRATION v1.0.0 ---
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env sh
2
- # --- BEGIN BEADS INTEGRATION v1.0.0 ---
3
- # This section is managed by beads. Do not remove these markers.
4
- if command -v bd >/dev/null 2>&1; then
5
- export BD_GIT_HOOK=1
6
- _bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
7
- if command -v timeout >/dev/null 2>&1; then
8
- timeout "$_bd_timeout" bd hooks run prepare-commit-msg "$@"
9
- _bd_exit=$?
10
- if [ $_bd_exit -eq 124 ]; then
11
- echo >&2 "beads: hook 'prepare-commit-msg' timed out after ${_bd_timeout}s — continuing without beads"
12
- _bd_exit=0
13
- fi
14
- else
15
- bd hooks run prepare-commit-msg "$@"
16
- _bd_exit=$?
17
- fi
18
- if [ $_bd_exit -eq 3 ]; then
19
- echo >&2 "beads: database not initialized — skipping hook 'prepare-commit-msg'"
20
- _bd_exit=0
21
- fi
22
- if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
23
- fi
24
- # --- END BEADS INTEGRATION v1.0.0 ---
@@ -1,7 +0,0 @@
1
- {
2
- "database": "dolt",
3
- "backend": "dolt",
4
- "dolt_mode": "embedded",
5
- "dolt_database": "comfyui_mcp",
6
- "project_id": "36b5b81f-eb4b-408e-9917-4eaae6aaaa0c"
7
- }
package/.codex/hooks.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "hooks": {
3
- "SessionStart": [
4
- {
5
- "matcher": "",
6
- "hooks": [
7
- {
8
- "type": "command",
9
- "command": "bd prime"
10
- }
11
- ]
12
- }
13
- ]
14
- }
15
- }
package/.dockerignore DELETED
@@ -1,24 +0,0 @@
1
- # Build artifacts and deps — rebuilt inside the image
2
- node_modules
3
- dist
4
-
5
- # VCS and local agent worktrees
6
- .git
7
- .claude
8
-
9
- # Env / secrets / local user config
10
- .env
11
- .env.*
12
- model-settings.user.jsonc
13
-
14
- # Tests and docs not needed at runtime
15
- src/__tests__
16
- **/*.test.ts
17
- *.md
18
- TODO.md
19
-
20
- # Editor / OS cruft
21
- .vscode
22
- .idea
23
- .DS_Store
24
- npm-debug.log*
package/.gitattributes DELETED
@@ -1,4 +0,0 @@
1
- # Keep generated pack installers deterministic across OSes so CI's
2
- # "installers up to date" check is stable.
3
- *.sh text eol=lf
4
- *.bat text eol=crlf
package/AGENTS.md DELETED
@@ -1,84 +0,0 @@
1
- # Agent Instructions
2
-
3
- This project uses **bd** (beads) for issue tracking. Run `bd prime` for full workflow context.
4
-
5
- ## Quick Reference
6
-
7
- ```bash
8
- bd ready # Find available work
9
- bd show <id> # View issue details
10
- bd update <id> --claim # Claim work atomically
11
- bd close <id> # Complete work
12
- bd dolt push # Push beads data to remote
13
- ```
14
-
15
- ## Non-Interactive Shell Commands
16
-
17
- **ALWAYS use non-interactive flags** with file operations to avoid hanging on confirmation prompts.
18
-
19
- Shell commands like `cp`, `mv`, and `rm` may be aliased to include `-i` (interactive) mode on some systems, causing the agent to hang indefinitely waiting for y/n input.
20
-
21
- **Use these forms instead:**
22
- ```bash
23
- # Force overwrite without prompting
24
- cp -f source dest # NOT: cp source dest
25
- mv -f source dest # NOT: mv source dest
26
- rm -f file # NOT: rm file
27
-
28
- # For recursive operations
29
- rm -rf directory # NOT: rm -r directory
30
- cp -rf source dest # NOT: cp -r source dest
31
- ```
32
-
33
- **Other commands that may prompt:**
34
- - `scp` - use `-o BatchMode=yes` for non-interactive
35
- - `ssh` - use `-o BatchMode=yes` to fail instead of prompting
36
- - `apt-get` - use `-y` flag
37
- - `brew` - use `HOMEBREW_NO_AUTO_UPDATE=1` env var
38
-
39
- <!-- BEGIN BEADS INTEGRATION v:1 profile:minimal hash:ca08a54f -->
40
- ## Beads Issue Tracker
41
-
42
- This project uses **bd (beads)** for issue tracking. Run `bd prime` to see full workflow context and commands.
43
-
44
- ### Quick Reference
45
-
46
- ```bash
47
- bd ready # Find available work
48
- bd show <id> # View issue details
49
- bd update <id> --claim # Claim work
50
- bd close <id> # Complete work
51
- ```
52
-
53
- ### Rules
54
-
55
- - Use `bd` for ALL task tracking — do NOT use TodoWrite, TaskCreate, or markdown TODO lists
56
- - Run `bd prime` for detailed command reference and session close protocol
57
- - Use `bd remember` for persistent knowledge — do NOT use MEMORY.md files
58
-
59
- ## Session Completion
60
-
61
- **When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
62
-
63
- **MANDATORY WORKFLOW:**
64
-
65
- 1. **File issues for remaining work** - Create issues for anything that needs follow-up
66
- 2. **Run quality gates** (if code changed) - Tests, linters, builds
67
- 3. **Update issue status** - Close finished work, update in-progress items
68
- 4. **PUSH TO REMOTE** - This is MANDATORY:
69
- ```bash
70
- git pull --rebase
71
- bd dolt push
72
- git push
73
- git status # MUST show "up to date with origin"
74
- ```
75
- 5. **Clean up** - Clear stashes, prune remote branches
76
- 6. **Verify** - All changes committed AND pushed
77
- 7. **Hand off** - Provide context for next session
78
-
79
- **CRITICAL RULES:**
80
- - Work is NOT complete until `git push` succeeds
81
- - NEVER stop before pushing - that leaves work stranded locally
82
- - NEVER say "ready to push when you are" - YOU must push
83
- - If push fails, resolve and retry until it succeeds
84
- <!-- END BEADS INTEGRATION -->