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.
Files changed (3) hide show
  1. package/README.md +159 -0
  2. package/bin/cli.js +244 -0
  3. 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
+ }