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.
- package/README.md +1 -0
- package/package.json +11 -1
- package/scripts/smoke-install.mjs +70 -0
- package/scripts/sync-agents.mjs +147 -0
- package/.beads/README.md +0 -81
- package/.beads/config.yaml +0 -54
- package/.beads/hooks/post-checkout +0 -24
- package/.beads/hooks/post-merge +0 -24
- package/.beads/hooks/pre-commit +0 -24
- package/.beads/hooks/pre-push +0 -24
- package/.beads/hooks/prepare-commit-msg +0 -24
- package/.beads/metadata.json +0 -7
- package/.codex/hooks.json +0 -15
- package/.dockerignore +0 -24
- package/.gitattributes +0 -4
- package/AGENTS.md +0 -84
- package/CHANGELOG.md +0 -755
- package/CLAUDE.md +0 -76
- package/CONTRIBUTING.md +0 -137
- package/Dockerfile +0 -61
- package/PACK-SPLIT-STATUS.md +0 -87
- package/ROADMAP.md +0 -135
- package/TODO.md +0 -75
- package/assets/controlnet_demo.png +0 -0
- package/assets/ideogram_demo.png +0 -0
- package/assets/ltx_sharp_demo.png +0 -0
- package/assets/ltx_t2v_demo.png +0 -0
- package/assets/qwen_edit_demo.png +0 -0
- package/assets/sample_woman.png +0 -0
- package/assets/sample_woman_video.mp4 +0 -0
- package/assets/wan_demo.png +0 -0
- package/assets/wan_sharp_demo.png +0 -0
- package/assets/wan_transparent_demo.png +0 -0
- package/assets/wan_v2v_demo.png +0 -0
- package/blog/comfyui-mcp-tdqs-case-study.md +0 -102
- package/design/embedded-agent-panel.md +0 -172
- package/design/remote-and-cloud-modes.md +0 -113
- package/glama.json +0 -6
- package/infra/cloudflare/README.md +0 -75
- package/infra/cloudflare/docs-proxy.js +0 -45
- package/infra/cloudflare/wrangler.jsonc +0 -19
- package/llms-install.md +0 -139
- package/model-settings.user.jsonc +0 -97
- package/server.json +0 -21
- package/web/extensions/comfyui-mcp-agent-panel/README.md +0 -105
- 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.
|
|
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* ⚡
|
package/.beads/config.yaml
DELETED
|
@@ -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 ---
|
package/.beads/hooks/post-merge
DELETED
|
@@ -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 ---
|
package/.beads/hooks/pre-commit
DELETED
|
@@ -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 ---
|
package/.beads/hooks/pre-push
DELETED
|
@@ -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 ---
|
package/.beads/metadata.json
DELETED
package/.codex/hooks.json
DELETED
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
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 -->
|