automagik-forge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +159 -0
- package/bin/cli.js +244 -0
- package/package.json +25 -0
package/README.md
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
# Automagik Forge
|
2
|
+
|
3
|
+
> A visual project management tool for developers that integrates with git repositories and coding agents like Claude Code and Amp.
|
4
|
+
|
5
|
+
## Quick Start
|
6
|
+
|
7
|
+
Run vibe kanban instantly without installation:
|
8
|
+
|
9
|
+
```bash
|
10
|
+
npx automagik-forge
|
11
|
+
```
|
12
|
+
|
13
|
+
This will launch the application locally and open it in your browser automatically.
|
14
|
+
|
15
|
+
## What is Automagik Forge?
|
16
|
+
|
17
|
+
Automagik Forge 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
|
+
|
19
|
+
### ⨠Key Features
|
20
|
+
|
21
|
+
**šļø Project Management**
|
22
|
+
- Add git repositories as projects (existing or create new ones)
|
23
|
+
- Automatic git integration and repository validation
|
24
|
+
- Project search functionality across all files
|
25
|
+
- Custom setup and development scripts per project
|
26
|
+
|
27
|
+
**š Task Management**
|
28
|
+
- Create and manage tasks with kanban-style boards
|
29
|
+
- Task status tracking (Todo, In Progress, Done)
|
30
|
+
- Rich task descriptions and notes
|
31
|
+
- Task execution with multiple AI agents
|
32
|
+
|
33
|
+
**š¤ AI Agent Integration**
|
34
|
+
- **Claude**: Advanced AI coding assistant
|
35
|
+
- **Amp**: Powerful development agent
|
36
|
+
- **Echo**: Simple testing/debugging agent
|
37
|
+
- Create tasks and immediately start agent execution
|
38
|
+
- Follow-up task execution for iterative development
|
39
|
+
|
40
|
+
**ā” Development Workflow**
|
41
|
+
- Create isolated git worktrees for each task attempt
|
42
|
+
- View diffs of changes made by agents
|
43
|
+
- Merge successful changes back to main branch
|
44
|
+
- Rebase task branches to stay up-to-date
|
45
|
+
- Manual file editing and deletion
|
46
|
+
- Integrated development server support
|
47
|
+
|
48
|
+
**šļø Developer Tools**
|
49
|
+
- Browse and validate git repositories from filesystem
|
50
|
+
- Open task worktrees in your preferred editor (VS Code, Cursor, Windsurf, IntelliJ, Zed)
|
51
|
+
- Real-time execution monitoring and process control
|
52
|
+
- Stop running processes individually or all at once
|
53
|
+
- Sound notifications for task completion
|
54
|
+
|
55
|
+
## How It Works
|
56
|
+
|
57
|
+
1. **Add Projects**: Import existing git repositories or create new ones
|
58
|
+
2. **Create Tasks**: Define what needs to be built or fixed
|
59
|
+
3. **Execute with AI**: Let coding agents work on your tasks in isolated environments
|
60
|
+
4. **Review Changes**: See exactly what was modified using git diffs
|
61
|
+
5. **Merge Results**: Incorporate successful changes into your main codebase
|
62
|
+
|
63
|
+
## Core Functionality
|
64
|
+
|
65
|
+
Automagik Forge provides a complete project management experience with these key capabilities:
|
66
|
+
|
67
|
+
**Project Repository Management**
|
68
|
+
- Full CRUD operations for managing coding projects
|
69
|
+
- Automatic git repository detection and validation
|
70
|
+
- Initialize new repositories or import existing ones
|
71
|
+
- Project-wide file search functionality
|
72
|
+
|
73
|
+
**Task Lifecycle Management**
|
74
|
+
- Create, update, and delete tasks with rich descriptions
|
75
|
+
- Track task progress through customizable status workflows
|
76
|
+
- One-click task creation with immediate AI agent execution
|
77
|
+
- Task attempt tracking with detailed execution history
|
78
|
+
|
79
|
+
**AI Agent Execution Environment**
|
80
|
+
- Isolated git worktrees for safe code experimentation
|
81
|
+
- Real-time execution monitoring and activity logging
|
82
|
+
- Process management with ability to stop individual or all processes
|
83
|
+
- Support for follow-up executions to iterate on solutions
|
84
|
+
|
85
|
+
**Code Change Management**
|
86
|
+
- View detailed diffs of all changes made during task execution
|
87
|
+
- Branch status monitoring to track divergence from main
|
88
|
+
- One-click merging of successful changes back to main branch
|
89
|
+
- Automatic rebasing to keep task branches up-to-date
|
90
|
+
- Manual file deletion and cleanup capabilities
|
91
|
+
|
92
|
+
**Development Integration**
|
93
|
+
- Open task worktrees directly in your preferred code editor
|
94
|
+
- Start and manage development servers for testing changes
|
95
|
+
- Browse local filesystem to add new projects
|
96
|
+
- Health monitoring for service availability
|
97
|
+
|
98
|
+
## Configuration
|
99
|
+
|
100
|
+
Automagik Forge supports customization through its configuration system:
|
101
|
+
|
102
|
+
- **Editor Integration**: Choose your preferred code editor
|
103
|
+
- **Sound Notifications**: Customize completion sounds
|
104
|
+
- **Project Defaults**: Set default setup and development scripts
|
105
|
+
|
106
|
+
## Technical Architecture
|
107
|
+
|
108
|
+
- **Backend**: Rust with Axum web framework
|
109
|
+
- **Frontend**: React with TypeScript
|
110
|
+
- **Database**: SQLite for local data storage
|
111
|
+
- **Git Integration**: Native git operations for repository management
|
112
|
+
- **Process Management**: Tokio-based async execution monitoring
|
113
|
+
|
114
|
+
## Requirements
|
115
|
+
|
116
|
+
- Node.js (for npx execution)
|
117
|
+
- Git (for repository operations)
|
118
|
+
- Your preferred code editor (optional, for opening task worktrees)
|
119
|
+
|
120
|
+
## Supported Platforms
|
121
|
+
|
122
|
+
- Linux x64
|
123
|
+
- Windows x64
|
124
|
+
- macOS x64 (Intel)
|
125
|
+
- macOS ARM64 (Apple Silicon)
|
126
|
+
|
127
|
+
## Use Cases
|
128
|
+
|
129
|
+
**š§ Bug Fixes**
|
130
|
+
- Create a task describing the bug
|
131
|
+
- Let an AI agent analyze and fix the issue
|
132
|
+
- Review the proposed changes
|
133
|
+
- Merge if satisfied, or provide follow-up instructions
|
134
|
+
|
135
|
+
**⨠Feature Development**
|
136
|
+
- Break down features into manageable tasks
|
137
|
+
- Use agents for initial implementation
|
138
|
+
- Iterate with follow-up executions
|
139
|
+
- Test using integrated development servers
|
140
|
+
|
141
|
+
**š Project Setup**
|
142
|
+
- Bootstrap new projects with AI assistance
|
143
|
+
- Set up development environments
|
144
|
+
- Configure build and deployment scripts
|
145
|
+
|
146
|
+
**š Code Documentation**
|
147
|
+
- Generate documentation for existing code
|
148
|
+
- Create README files and API documentation
|
149
|
+
- Maintain up-to-date project information
|
150
|
+
|
151
|
+
---
|
152
|
+
|
153
|
+
**Ready to supercharge your development workflow?**
|
154
|
+
|
155
|
+
```bash
|
156
|
+
npx automagik-forge
|
157
|
+
```
|
158
|
+
|
159
|
+
*Start managing your projects with the power of AI coding agents today!*
|
package/bin/cli.js
ADDED
@@ -0,0 +1,244 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
const { execSync, spawn } = require("child_process");
|
4
|
+
const path = require("path");
|
5
|
+
const fs = require("fs");
|
6
|
+
|
7
|
+
// Load .env file from current working directory
|
8
|
+
function loadEnvFile() {
|
9
|
+
const envPath = path.join(process.cwd(), '.env');
|
10
|
+
if (fs.existsSync(envPath)) {
|
11
|
+
const envContent = fs.readFileSync(envPath, 'utf8');
|
12
|
+
envContent.split('\n').forEach(line => {
|
13
|
+
const trimmed = line.trim();
|
14
|
+
if (trimmed && !trimmed.startsWith('#')) {
|
15
|
+
const [key, ...valueParts] = trimmed.split('=');
|
16
|
+
if (key && valueParts.length > 0) {
|
17
|
+
const value = valueParts.join('=');
|
18
|
+
if (!process.env[key]) {
|
19
|
+
process.env[key] = value;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
});
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
// Load environment variables from .env file
|
28
|
+
loadEnvFile();
|
29
|
+
|
30
|
+
// Detect true CPU arch on macOS (handles Rosetta)
|
31
|
+
function getUnderlyingArch() {
|
32
|
+
const platform = process.platform;
|
33
|
+
const nodeArch = process.arch;
|
34
|
+
|
35
|
+
if (platform !== "darwin") {
|
36
|
+
return nodeArch;
|
37
|
+
}
|
38
|
+
|
39
|
+
// If Node itself is arm64, weāre natively on Apple silicon
|
40
|
+
if (nodeArch === "arm64") {
|
41
|
+
return "arm64";
|
42
|
+
}
|
43
|
+
|
44
|
+
// Otherwise check for Rosetta translation
|
45
|
+
try {
|
46
|
+
const translated = execSync("sysctl -in sysctl.proc_translated", {
|
47
|
+
encoding: "utf8",
|
48
|
+
}).trim();
|
49
|
+
if (translated === "1") {
|
50
|
+
return "arm64";
|
51
|
+
}
|
52
|
+
} catch {
|
53
|
+
// sysctl key not present ā assume true Intel
|
54
|
+
}
|
55
|
+
|
56
|
+
return "x64";
|
57
|
+
}
|
58
|
+
|
59
|
+
const platform = process.platform;
|
60
|
+
const arch = getUnderlyingArch();
|
61
|
+
|
62
|
+
// Map to our build target names
|
63
|
+
function getPlatformDir() {
|
64
|
+
if (platform === "linux" && arch === "x64") return "linux-x64";
|
65
|
+
if (platform === "linux" && arch === "arm64") return "linux-arm64";
|
66
|
+
if (platform === "win32" && arch === "x64") return "windows-x64";
|
67
|
+
if (platform === "win32" && arch === "arm64") return "windows-arm64";
|
68
|
+
if (platform === "darwin" && arch === "x64") return "macos-x64";
|
69
|
+
if (platform === "darwin" && arch === "arm64") return "macos-arm64";
|
70
|
+
|
71
|
+
console.error(`ā Unsupported platform: ${platform}-${arch}`);
|
72
|
+
console.error("Supported platforms:");
|
73
|
+
console.error(" - Linux x64");
|
74
|
+
console.error(" - Linux ARM64");
|
75
|
+
console.error(" - Windows x64");
|
76
|
+
console.error(" - Windows ARM64");
|
77
|
+
console.error(" - macOS x64 (Intel)");
|
78
|
+
console.error(" - macOS ARM64 (Apple Silicon)");
|
79
|
+
process.exit(1);
|
80
|
+
}
|
81
|
+
|
82
|
+
function getBinaryName(base) {
|
83
|
+
return platform === "win32" ? `${base}.exe` : base;
|
84
|
+
}
|
85
|
+
|
86
|
+
const platformDir = getPlatformDir();
|
87
|
+
const extractDir = path.join(__dirname, "..", "dist", platformDir);
|
88
|
+
const isMcpMode = process.argv.includes("--mcp");
|
89
|
+
const isMcpSseMode = process.argv.includes("--mcp-sse");
|
90
|
+
|
91
|
+
// ensure output dir
|
92
|
+
fs.mkdirSync(extractDir, { recursive: true });
|
93
|
+
|
94
|
+
function extractAndRun(baseName, launch) {
|
95
|
+
const binName = getBinaryName(baseName);
|
96
|
+
const binPath = path.join(extractDir, binName);
|
97
|
+
const zipName = `${baseName}.zip`;
|
98
|
+
const zipPath = path.join(extractDir, zipName);
|
99
|
+
|
100
|
+
// clean old binary
|
101
|
+
if (fs.existsSync(binPath)) fs.unlinkSync(binPath);
|
102
|
+
if (!fs.existsSync(zipPath)) {
|
103
|
+
console.error(`ā ${zipName} not found at: ${zipPath}`);
|
104
|
+
console.error(`Current platform: ${platform}-${arch} (${platformDir})`);
|
105
|
+
process.exit(1);
|
106
|
+
}
|
107
|
+
|
108
|
+
// extract
|
109
|
+
const unzipCmd =
|
110
|
+
platform === "win32"
|
111
|
+
? `powershell -Command "Expand-Archive -Path '${zipPath}' -DestinationPath '${extractDir}' -Force"`
|
112
|
+
: `unzip -qq -o "${zipPath}" -d "${extractDir}"`;
|
113
|
+
execSync(unzipCmd, { stdio: "inherit" });
|
114
|
+
|
115
|
+
// perms & launch
|
116
|
+
if (platform !== "win32") {
|
117
|
+
try {
|
118
|
+
fs.chmodSync(binPath, 0o755);
|
119
|
+
} catch { }
|
120
|
+
}
|
121
|
+
return launch(binPath);
|
122
|
+
}
|
123
|
+
|
124
|
+
if (isMcpMode || isMcpSseMode) {
|
125
|
+
extractAndRun("automagik-forge-mcp", (bin) => {
|
126
|
+
const mcpArgs = isMcpSseMode ? ["--mcp-sse"] : [];
|
127
|
+
console.log(`Starting MCP server with ${isMcpSseMode ? 'SSE + STDIO' : 'STDIO'} transport...`);
|
128
|
+
|
129
|
+
// Environment variables are already loaded from .env file
|
130
|
+
|
131
|
+
const proc = spawn(bin, mcpArgs, {
|
132
|
+
stdio: ["pipe", "pipe", "pipe"],
|
133
|
+
env: { ...process.env }
|
134
|
+
});
|
135
|
+
process.stdin.pipe(proc.stdin);
|
136
|
+
proc.stdout.pipe(process.stdout);
|
137
|
+
proc.stderr.pipe(process.stdout);
|
138
|
+
|
139
|
+
proc.on("exit", (c) => process.exit(c || 0));
|
140
|
+
proc.on("error", (e) => {
|
141
|
+
console.error("ā MCP server error:", e.message);
|
142
|
+
process.exit(1);
|
143
|
+
});
|
144
|
+
process.on("SIGINT", () => {
|
145
|
+
console.error("\nš Shutting down MCP server...");
|
146
|
+
proc.kill("SIGINT");
|
147
|
+
});
|
148
|
+
process.on("SIGTERM", () => proc.kill("SIGTERM"));
|
149
|
+
});
|
150
|
+
} else {
|
151
|
+
// Start both main backend server and MCP SSE server concurrently
|
152
|
+
console.log(`š¦ Extracting automagik-forge and automagik-forge-mcp...`);
|
153
|
+
|
154
|
+
// Environment variables are loaded from .env file
|
155
|
+
// Use safe defaults (localhost only) unless overridden
|
156
|
+
const mcpSsePort = process.env.MCP_SSE_PORT || "8889";
|
157
|
+
const backendPort = process.env.BACKEND_PORT || process.env.PORT || "8887";
|
158
|
+
const host = process.env.HOST || "127.0.0.1";
|
159
|
+
|
160
|
+
let mainServerProc, mcpServerProc;
|
161
|
+
let shutdownInProgress = false;
|
162
|
+
|
163
|
+
// Function to gracefully shutdown both servers
|
164
|
+
const shutdown = (signal) => {
|
165
|
+
if (shutdownInProgress) return;
|
166
|
+
shutdownInProgress = true;
|
167
|
+
|
168
|
+
console.log(`\nš Shutting down servers (${signal})...`);
|
169
|
+
|
170
|
+
if (mainServerProc && !mainServerProc.killed) {
|
171
|
+
mainServerProc.kill(signal);
|
172
|
+
}
|
173
|
+
if (mcpServerProc && !mcpServerProc.killed) {
|
174
|
+
mcpServerProc.kill(signal);
|
175
|
+
}
|
176
|
+
|
177
|
+
// Force exit after timeout
|
178
|
+
setTimeout(() => {
|
179
|
+
console.log("ā° Force exit after timeout");
|
180
|
+
process.exit(1);
|
181
|
+
}, 5000);
|
182
|
+
};
|
183
|
+
|
184
|
+
// Extract and start main backend server
|
185
|
+
extractAndRun("automagik-forge", (mainBin) => {
|
186
|
+
console.log(`š Starting main backend server on http://${host}:${backendPort}...`);
|
187
|
+
mainServerProc = spawn(mainBin, [], {
|
188
|
+
stdio: ["pipe", "pipe", "pipe"],
|
189
|
+
env: { ...process.env }
|
190
|
+
});
|
191
|
+
|
192
|
+
mainServerProc.stdout.on("data", (data) => {
|
193
|
+
process.stdout.write(`[MAIN] ${data}`);
|
194
|
+
});
|
195
|
+
mainServerProc.stderr.on("data", (data) => {
|
196
|
+
process.stderr.write(`[MAIN] ${data}`);
|
197
|
+
});
|
198
|
+
|
199
|
+
mainServerProc.on("exit", (code) => {
|
200
|
+
if (!shutdownInProgress) {
|
201
|
+
console.error(`ā Main server exited with code ${code}`);
|
202
|
+
shutdown("SIGTERM");
|
203
|
+
}
|
204
|
+
});
|
205
|
+
|
206
|
+
mainServerProc.on("error", (e) => {
|
207
|
+
console.error("ā Main server error:", e.message);
|
208
|
+
shutdown("SIGTERM");
|
209
|
+
});
|
210
|
+
|
211
|
+
// Extract and start MCP SSE server
|
212
|
+
extractAndRun("automagik-forge-mcp", (mcpBin) => {
|
213
|
+
console.log(`š Starting MCP SSE server on http://${host}:${mcpSsePort}/sse...`);
|
214
|
+
mcpServerProc = spawn(mcpBin, ["--mcp-sse"], {
|
215
|
+
stdio: ["pipe", "pipe", "pipe"],
|
216
|
+
env: { ...process.env }
|
217
|
+
});
|
218
|
+
|
219
|
+
mcpServerProc.stdout.on("data", (data) => {
|
220
|
+
process.stdout.write(`[MCP] ${data}`);
|
221
|
+
});
|
222
|
+
mcpServerProc.stderr.on("data", (data) => {
|
223
|
+
process.stderr.write(`[MCP] ${data}`);
|
224
|
+
});
|
225
|
+
|
226
|
+
mcpServerProc.on("exit", (code) => {
|
227
|
+
if (!shutdownInProgress) {
|
228
|
+
console.error(`ā MCP server exited with code ${code}`);
|
229
|
+
shutdown("SIGTERM");
|
230
|
+
}
|
231
|
+
});
|
232
|
+
|
233
|
+
mcpServerProc.on("error", (e) => {
|
234
|
+
console.error("ā MCP server error:", e.message);
|
235
|
+
shutdown("SIGTERM");
|
236
|
+
});
|
237
|
+
});
|
238
|
+
});
|
239
|
+
|
240
|
+
// Handle shutdown signals
|
241
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
242
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
243
|
+
process.on("exit", () => shutdown("SIGTERM"));
|
244
|
+
}
|
package/package.json
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
{
|
2
|
+
"name": "automagik-forge",
|
3
|
+
"private": false,
|
4
|
+
"version": "0.1.0",
|
5
|
+
"main": "index.js",
|
6
|
+
"bin": {
|
7
|
+
"automagik-forge": "bin/cli.js"
|
8
|
+
},
|
9
|
+
"keywords": ["ai", "agent", "claude", "gemini", "automation", "kanban", "task-management", "mcp", "assistant"],
|
10
|
+
"author": "Namastex Labs",
|
11
|
+
"license": "MIT",
|
12
|
+
"description": "AI Agent Execution Substrate - Get 10X more out of Claude Code, Gemini CLI, and other coding agents with kanban task management",
|
13
|
+
"repository": {
|
14
|
+
"type": "git",
|
15
|
+
"url": "https://github.com/namastexlabs/automagik-forge.git"
|
16
|
+
},
|
17
|
+
"homepage": "https://namastex.ai",
|
18
|
+
"bugs": {
|
19
|
+
"url": "https://github.com/namastexlabs/automagik-forge/issues"
|
20
|
+
},
|
21
|
+
"files": [
|
22
|
+
"dist",
|
23
|
+
"bin"
|
24
|
+
]
|
25
|
+
}
|