automagik-forge 0.2.20 → 0.3.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
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Vibe Kanban
|
|
2
2
|
|
|
3
3
|
> A visual project management tool for developers that integrates with git repositories and coding agents like Claude Code and Amp.
|
|
4
4
|
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
Run vibe kanban instantly without installation:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx
|
|
10
|
+
npx vibe-kanban
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
This will launch the application locally and open it in your browser automatically.
|
|
14
14
|
|
|
15
|
-
## What is
|
|
15
|
+
## What is Vibe Kanban?
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Vibe Kanban is a modern project management tool designed specifically for developers. It helps you organize your coding projects with kanban-style task management while providing powerful integrations with git repositories and AI coding agents.
|
|
18
18
|
|
|
19
19
|
### ✨ Key Features
|
|
20
20
|
|
|
@@ -62,7 +62,7 @@ Automagik Forge is a modern project management tool designed specifically for de
|
|
|
62
62
|
|
|
63
63
|
## Core Functionality
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
Vibe Kanban provides a complete project management experience with these key capabilities:
|
|
66
66
|
|
|
67
67
|
**Project Repository Management**
|
|
68
68
|
- Full CRUD operations for managing coding projects
|
|
@@ -97,7 +97,7 @@ Automagik Forge provides a complete project management experience with these key
|
|
|
97
97
|
|
|
98
98
|
## Configuration
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
Vibe Kanban supports customization through its configuration system:
|
|
101
101
|
|
|
102
102
|
- **Editor Integration**: Choose your preferred code editor
|
|
103
103
|
- **Sound Notifications**: Customize completion sounds
|
|
@@ -153,7 +153,7 @@ Automagik Forge supports customization through its configuration system:
|
|
|
153
153
|
**Ready to supercharge your development workflow?**
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
|
-
npx
|
|
156
|
+
npx vibe-kanban
|
|
157
157
|
```
|
|
158
158
|
|
|
159
159
|
*Start managing your projects with the power of AI coding agents today!*
|
package/bin/cli.js
CHANGED
|
@@ -3,75 +3,6 @@
|
|
|
3
3
|
const { execSync, spawn } = require("child_process");
|
|
4
4
|
const path = require("path");
|
|
5
5
|
const fs = require("fs");
|
|
6
|
-
const zlib = require("zlib");
|
|
7
|
-
|
|
8
|
-
// Fallback ZIP extraction using Node.js when unzip is not available
|
|
9
|
-
function extractZipWithNode(zipPath, extractDir) {
|
|
10
|
-
const buffer = fs.readFileSync(zipPath);
|
|
11
|
-
let offset = 0;
|
|
12
|
-
|
|
13
|
-
// Simple ZIP parser - look for file entries
|
|
14
|
-
while (offset < buffer.length - 30) {
|
|
15
|
-
// Look for local file header signature (0x04034b50)
|
|
16
|
-
if (buffer.readUInt32LE(offset) === 0x04034b50) {
|
|
17
|
-
const filenameLength = buffer.readUInt16LE(offset + 26);
|
|
18
|
-
const extraFieldLength = buffer.readUInt16LE(offset + 28);
|
|
19
|
-
const compressedSize = buffer.readUInt32LE(offset + 18);
|
|
20
|
-
const uncompressedSize = buffer.readUInt32LE(offset + 22);
|
|
21
|
-
const compressionMethod = buffer.readUInt16LE(offset + 8);
|
|
22
|
-
|
|
23
|
-
offset += 30; // Skip local file header
|
|
24
|
-
|
|
25
|
-
const filename = buffer.toString('utf8', offset, offset + filenameLength);
|
|
26
|
-
offset += filenameLength + extraFieldLength;
|
|
27
|
-
|
|
28
|
-
const fileData = buffer.slice(offset, offset + compressedSize);
|
|
29
|
-
offset += compressedSize;
|
|
30
|
-
|
|
31
|
-
// Skip directories
|
|
32
|
-
if (filename.endsWith('/')) continue;
|
|
33
|
-
|
|
34
|
-
const outputPath = path.join(extractDir, filename);
|
|
35
|
-
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
36
|
-
|
|
37
|
-
if (compressionMethod === 0) {
|
|
38
|
-
// No compression
|
|
39
|
-
fs.writeFileSync(outputPath, fileData);
|
|
40
|
-
} else if (compressionMethod === 8) {
|
|
41
|
-
// Deflate compression
|
|
42
|
-
const decompressed = zlib.inflateRawSync(fileData);
|
|
43
|
-
fs.writeFileSync(outputPath, decompressed);
|
|
44
|
-
} else {
|
|
45
|
-
throw new Error(`Unsupported compression method: ${compressionMethod}`);
|
|
46
|
-
}
|
|
47
|
-
} else {
|
|
48
|
-
offset++;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Load .env file from current working directory
|
|
54
|
-
function loadEnvFile() {
|
|
55
|
-
const envPath = path.join(process.cwd(), '.env');
|
|
56
|
-
if (fs.existsSync(envPath)) {
|
|
57
|
-
const envContent = fs.readFileSync(envPath, 'utf8');
|
|
58
|
-
envContent.split('\n').forEach(line => {
|
|
59
|
-
const trimmed = line.trim();
|
|
60
|
-
if (trimmed && !trimmed.startsWith('#')) {
|
|
61
|
-
const [key, ...valueParts] = trimmed.split('=');
|
|
62
|
-
if (key && valueParts.length > 0) {
|
|
63
|
-
const value = valueParts.join('=');
|
|
64
|
-
if (!process.env[key]) {
|
|
65
|
-
process.env[key] = value;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Load environment variables from .env file
|
|
74
|
-
loadEnvFile();
|
|
75
6
|
|
|
76
7
|
// Detect true CPU arch on macOS (handles Rosetta)
|
|
77
8
|
function getUnderlyingArch() {
|
|
@@ -102,39 +33,6 @@ function getUnderlyingArch() {
|
|
|
102
33
|
return "x64";
|
|
103
34
|
}
|
|
104
35
|
|
|
105
|
-
// Handle help and version flags first
|
|
106
|
-
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
107
|
-
console.log(`
|
|
108
|
-
automagik-forge v${require("../package.json").version}
|
|
109
|
-
|
|
110
|
-
Usage: npx automagik-forge [options]
|
|
111
|
-
|
|
112
|
-
Options:
|
|
113
|
-
--help, -h Show this help message
|
|
114
|
-
--version, -v Show version
|
|
115
|
-
--mcp Run only MCP server (STDIO mode)
|
|
116
|
-
--mcp-sse Run only MCP server (SSE mode)
|
|
117
|
-
|
|
118
|
-
Without options: Runs only backend server (no MCP server)
|
|
119
|
-
|
|
120
|
-
Environment Variables:
|
|
121
|
-
BACKEND_PORT Backend server port (default: 8887)
|
|
122
|
-
MCP_SSE_PORT MCP SSE server port (default: 8889)
|
|
123
|
-
HOST Server host (default: 127.0.0.1)
|
|
124
|
-
|
|
125
|
-
Examples:
|
|
126
|
-
npx automagik-forge # Start backend server only
|
|
127
|
-
npx automagik-forge --mcp # MCP server only (STDIO)
|
|
128
|
-
npx automagik-forge --mcp-sse # MCP server only (SSE)
|
|
129
|
-
`);
|
|
130
|
-
process.exit(0);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (process.argv.includes("--version") || process.argv.includes("-v")) {
|
|
134
|
-
console.log(require("../package.json").version);
|
|
135
|
-
process.exit(0);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
36
|
const platform = process.platform;
|
|
139
37
|
const arch = getUnderlyingArch();
|
|
140
38
|
|
|
@@ -165,7 +63,6 @@ function getBinaryName(base) {
|
|
|
165
63
|
const platformDir = getPlatformDir();
|
|
166
64
|
const extractDir = path.join(__dirname, "..", "dist", platformDir);
|
|
167
65
|
const isMcpMode = process.argv.includes("--mcp");
|
|
168
|
-
const isMcpSseMode = process.argv.includes("--mcp-sse");
|
|
169
66
|
|
|
170
67
|
// ensure output dir
|
|
171
68
|
fs.mkdirSync(extractDir, { recursive: true });
|
|
@@ -184,29 +81,12 @@ function extractAndRun(baseName, launch) {
|
|
|
184
81
|
process.exit(1);
|
|
185
82
|
}
|
|
186
83
|
|
|
187
|
-
// extract
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
try {
|
|
194
|
-
execSync(`unzip -qq -o "${zipPath}" -d "${extractDir}"`, { stdio: "inherit" });
|
|
195
|
-
} catch (unzipError) {
|
|
196
|
-
console.log("⚠️ unzip not found, using Node.js extraction...");
|
|
197
|
-
try {
|
|
198
|
-
// Fallback to Node.js extraction using yauzl if available, or basic implementation
|
|
199
|
-
extractZipWithNode(zipPath, extractDir);
|
|
200
|
-
} catch (nodeError) {
|
|
201
|
-
console.error("❌ Extraction failed. Please install unzip:");
|
|
202
|
-
console.error(" Ubuntu/Debian: sudo apt-get install unzip");
|
|
203
|
-
console.error(" RHEL/CentOS: sudo yum install unzip");
|
|
204
|
-
console.error(" Alpine: apk add unzip");
|
|
205
|
-
console.error("\nOriginal error:", unzipError.message);
|
|
206
|
-
process.exit(1);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
84
|
+
// extract
|
|
85
|
+
const unzipCmd =
|
|
86
|
+
platform === "win32"
|
|
87
|
+
? `powershell -Command "Expand-Archive -Path '${zipPath}' -DestinationPath '${extractDir}' -Force"`
|
|
88
|
+
: `unzip -qq -o "${zipPath}" -d "${extractDir}"`;
|
|
89
|
+
execSync(unzipCmd, { stdio: "inherit" });
|
|
210
90
|
|
|
211
91
|
// perms & launch
|
|
212
92
|
if (platform !== "win32") {
|
|
@@ -217,21 +97,9 @@ function extractAndRun(baseName, launch) {
|
|
|
217
97
|
return launch(binPath);
|
|
218
98
|
}
|
|
219
99
|
|
|
220
|
-
if (isMcpMode
|
|
221
|
-
extractAndRun("
|
|
222
|
-
const
|
|
223
|
-
console.log(`Starting MCP server with ${isMcpSseMode ? 'SSE' : 'STDIO'} transport...`);
|
|
224
|
-
|
|
225
|
-
// Environment variables are already loaded from .env file
|
|
226
|
-
|
|
227
|
-
const proc = spawn(bin, mcpArgs, {
|
|
228
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
229
|
-
env: { ...process.env }
|
|
230
|
-
});
|
|
231
|
-
process.stdin.pipe(proc.stdin);
|
|
232
|
-
proc.stdout.pipe(process.stdout);
|
|
233
|
-
proc.stderr.pipe(process.stderr);
|
|
234
|
-
|
|
100
|
+
if (isMcpMode) {
|
|
101
|
+
extractAndRun("vibe-kanban-mcp", (bin) => {
|
|
102
|
+
const proc = spawn(bin, [], { stdio: "inherit" });
|
|
235
103
|
proc.on("exit", (c) => process.exit(c || 0));
|
|
236
104
|
proc.on("error", (e) => {
|
|
237
105
|
console.error("❌ MCP server error:", e.message);
|
|
@@ -244,49 +112,13 @@ if (isMcpMode || isMcpSseMode) {
|
|
|
244
112
|
process.on("SIGTERM", () => proc.kill("SIGTERM"));
|
|
245
113
|
});
|
|
246
114
|
} else {
|
|
247
|
-
// Start only main backend server (no MCP server by default)
|
|
248
115
|
console.log(`📦 Extracting automagik-forge...`);
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
extractAndRun("automagik-forge", (mainBin) => {
|
|
257
|
-
console.log(`🚀 Starting main backend server on http://${host}:${backendPort}...`);
|
|
258
|
-
const mainServerProc = spawn(mainBin, [], {
|
|
259
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
260
|
-
env: {
|
|
261
|
-
...process.env,
|
|
262
|
-
BACKEND_PORT: backendPort,
|
|
263
|
-
PORT: backendPort,
|
|
264
|
-
HOST: host
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
mainServerProc.stdout.on("data", (data) => {
|
|
269
|
-
process.stdout.write(`${data}`);
|
|
270
|
-
});
|
|
271
|
-
mainServerProc.stderr.on("data", (data) => {
|
|
272
|
-
process.stderr.write(`${data}`);
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
mainServerProc.on("exit", (code) => {
|
|
276
|
-
console.error(`❌ Backend server exited with code ${code}`);
|
|
277
|
-
process.exit(code || 1);
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
mainServerProc.on("error", (e) => {
|
|
281
|
-
console.error("❌ Backend server error:", e.message);
|
|
282
|
-
process.exit(1);
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
// Handle shutdown signals
|
|
286
|
-
process.on("SIGINT", () => {
|
|
287
|
-
console.log("\n🛑 Shutting down backend server...");
|
|
288
|
-
mainServerProc.kill("SIGINT");
|
|
289
|
-
});
|
|
290
|
-
process.on("SIGTERM", () => mainServerProc.kill("SIGTERM"));
|
|
116
|
+
extractAndRun("vibe-kanban", (bin) => {
|
|
117
|
+
console.log(`🚀 Launching automagik-forge...`);
|
|
118
|
+
if (platform === "win32") {
|
|
119
|
+
execSync(`"${bin}"`, { stdio: "inherit" });
|
|
120
|
+
} else {
|
|
121
|
+
execSync(`"${bin}"`, { stdio: "inherit" });
|
|
122
|
+
}
|
|
291
123
|
});
|
|
292
124
|
}
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "automagik-forge",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"automagik-forge": "bin/cli.js"
|
|
8
8
|
},
|
|
9
9
|
"keywords": [],
|
|
10
|
-
"author": "
|
|
10
|
+
"author": "namastex",
|
|
11
11
|
"license": "",
|
|
12
12
|
"description": "NPX wrapper around automagik-forge and automagik-forge-mcp",
|
|
13
13
|
"files": [
|
|
14
14
|
"dist",
|
|
15
15
|
"bin"
|
|
16
|
-
]
|
|
17
|
-
"dependencies": {}
|
|
16
|
+
]
|
|
18
17
|
}
|
|
Binary file
|