bobs-workshop 0.3.3 → 3.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/LICENSE +2 -2
- package/README.md +199 -210
- package/bin/bobs-workshop.js +109 -0
- package/config/agents.json +27 -0
- package/dist/plugins/bobs-workshop.js +34 -0
- package/dist/tools/background-agent/cancel.d.ts +3 -0
- package/dist/tools/background-agent/cancel.d.ts.map +1 -0
- package/dist/tools/background-agent/cancel.js +52 -0
- package/dist/tools/background-agent/concurrency.d.ts +15 -0
- package/dist/tools/background-agent/concurrency.d.ts.map +1 -0
- package/dist/tools/background-agent/concurrency.js +61 -0
- package/dist/tools/background-agent/index.d.ts +8 -0
- package/dist/tools/background-agent/index.d.ts.map +1 -0
- package/dist/tools/background-agent/index.js +7 -0
- package/dist/tools/background-agent/launch.d.ts +6 -0
- package/dist/tools/background-agent/launch.d.ts.map +1 -0
- package/dist/tools/background-agent/launch.js +33 -0
- package/dist/tools/background-agent/list.d.ts +7 -0
- package/dist/tools/background-agent/list.d.ts.map +1 -0
- package/dist/tools/background-agent/list.js +40 -0
- package/dist/tools/background-agent/manager.d.ts +29 -0
- package/dist/tools/background-agent/manager.d.ts.map +1 -0
- package/dist/tools/background-agent/manager.js +377 -0
- package/dist/tools/background-agent/output.d.ts +3 -0
- package/dist/tools/background-agent/output.d.ts.map +1 -0
- package/dist/tools/background-agent/output.js +41 -0
- package/dist/tools/background-agent/types.d.ts +46 -0
- package/dist/tools/background-agent/types.d.ts.map +1 -0
- package/dist/tools/background-agent/types.js +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/manual/index.d.ts +3 -0
- package/dist/tools/manual/index.d.ts.map +1 -0
- package/dist/tools/manual/index.js +2 -0
- package/dist/tools/manual/manual-update.d.ts +4 -0
- package/dist/tools/manual/manual-update.d.ts.map +1 -0
- package/dist/tools/manual/manual-update.js +190 -0
- package/dist/tools/manual/verify-manual.d.ts +4 -0
- package/dist/tools/manual/verify-manual.d.ts.map +1 -0
- package/dist/tools/manual/verify-manual.js +46 -0
- package/package.json +34 -66
- package/postinstall.js +190 -0
- package/src/agents/alice.md +466 -0
- package/src/agents/bob-rev.md +493 -0
- package/src/agents/bob-send.md +277 -0
- package/src/agents/bob.md +442 -0
- package/src/agents/trace.md +451 -0
- package/src/plugins/bobs-workshop.ts +45 -0
- package/src/skills/api-patterns/SKILL.md +376 -0
- package/src/skills/architecture/SKILL.md +271 -0
- package/src/skills/bobs-workshop/performance/icon.svg +3 -0
- package/src/skills/brainstorming/SKILL.md +210 -0
- package/src/skills/clean-code/SKILL.md +151 -0
- package/src/skills/code-review-checklist/SKILL.md +220 -0
- package/src/skills/database-design/SKILL.md +271 -0
- package/src/skills/exploration/SKILL.md +257 -0
- package/src/skills/frontend-ui-ux/SKILL.md +78 -0
- package/src/skills/git-master/SKILL.md +1105 -0
- package/src/skills/performance/SKILL.md +144 -0
- package/src/skills/performance/icon.svg +3 -0
- package/src/skills/plan-writing/SKILL.md +225 -0
- package/src/skills/security/SKILL.md +410 -0
- package/src/skills/simplification/SKILL.md +238 -0
- package/src/skills/systematic-debugging/SKILL.md +175 -0
- package/src/skills/testing-patterns/SKILL.md +305 -0
- package/src/skills/verification/SKILL.md +286 -0
- package/src/tools/background-agent/cancel.ts +67 -0
- package/src/tools/background-agent/concurrency.ts +71 -0
- package/src/tools/background-agent/index.ts +7 -0
- package/src/tools/background-agent/launch.ts +39 -0
- package/src/tools/background-agent/list.ts +50 -0
- package/src/tools/background-agent/manager.ts +455 -0
- package/src/tools/background-agent/output.ts +57 -0
- package/src/tools/background-agent/types.ts +55 -0
- package/src/tools/index.ts +8 -0
- package/src/tools/manual/index.ts +2 -0
- package/src/tools/manual/manual-update.ts +197 -0
- package/src/tools/manual/verify-manual.ts +55 -0
- package/uninstall.js +64 -0
- package/Claude.md +0 -162
- package/bin/bobs-mcp-server.js +0 -11
- package/bin/bobs-mcp.js +0 -130
- package/dist/api/taskLogger.js +0 -106
- package/dist/api/taskLogger.js.map +0 -1
- package/dist/cli/checker.js +0 -401
- package/dist/cli/checker.js.map +0 -1
- package/dist/cli/cleanup.js +0 -131
- package/dist/cli/cleanup.js.map +0 -1
- package/dist/cli/debug.js +0 -157
- package/dist/cli/debug.js.map +0 -1
- package/dist/cli/health.js +0 -97
- package/dist/cli/health.js.map +0 -1
- package/dist/cli/setup.js +0 -81
- package/dist/cli/setup.js.map +0 -1
- package/dist/cli/workshop.js +0 -42
- package/dist/cli/workshop.js.map +0 -1
- package/dist/dashboard/server.js +0 -1203
- package/dist/dashboard/server.js.map +0 -1
- package/dist/index.js +0 -960
- package/dist/index.js.map +0 -1
- package/dist/prompts/architect.js +0 -221
- package/dist/prompts/architect.js.map +0 -1
- package/dist/prompts/debugger.js +0 -257
- package/dist/prompts/debugger.js.map +0 -1
- package/dist/prompts/engineer.js +0 -249
- package/dist/prompts/engineer.js.map +0 -1
- package/dist/prompts/orchestrator.js +0 -304
- package/dist/prompts/orchestrator.js.map +0 -1
- package/dist/prompts/reviewer.js +0 -289
- package/dist/prompts/reviewer.js.map +0 -1
- package/dist/services/activitySummarizer.js +0 -388
- package/dist/services/activitySummarizer.js.map +0 -1
- package/dist/services/changeValidator.js +0 -396
- package/dist/services/changeValidator.js.map +0 -1
- package/dist/services/claudeOrchestrator.js +0 -343
- package/dist/services/claudeOrchestrator.js.map +0 -1
- package/dist/services/fileMonitor.js +0 -250
- package/dist/services/fileMonitor.js.map +0 -1
- package/dist/services/implementationSummarizer.js +0 -306
- package/dist/services/implementationSummarizer.js.map +0 -1
- package/dist/services/liveMonitor.js +0 -315
- package/dist/services/liveMonitor.js.map +0 -1
- package/dist/services/mcpAuditLogger.js +0 -104
- package/dist/services/mcpAuditLogger.js.map +0 -1
- package/dist/services/mcpLogger.js +0 -223
- package/dist/services/mcpLogger.js.map +0 -1
- package/dist/services/tmuxManager.js +0 -541
- package/dist/services/tmuxManager.js.map +0 -1
- package/dist/tools/approvalTools.js +0 -244
- package/dist/tools/approvalTools.js.map +0 -1
- package/dist/tools/autoDebugger.js +0 -147
- package/dist/tools/autoDebugger.js.map +0 -1
- package/dist/tools/cleanupService.js +0 -221
- package/dist/tools/cleanupService.js.map +0 -1
- package/dist/tools/dashboardTools.js +0 -342
- package/dist/tools/dashboardTools.js.map +0 -1
- package/dist/tools/developmentNudges.js +0 -336
- package/dist/tools/developmentNudges.js.map +0 -1
- package/dist/tools/gitTools.js +0 -741
- package/dist/tools/gitTools.js.map +0 -1
- package/dist/tools/orchestratorTools.js +0 -832
- package/dist/tools/orchestratorTools.js.map +0 -1
- package/dist/tools/searchCache.js +0 -64
- package/dist/tools/searchCache.js.map +0 -1
- package/dist/tools/searchTools.js +0 -1107
- package/dist/tools/searchTools.js.map +0 -1
- package/dist/tools/semgrep-patterns.js +0 -296
- package/dist/tools/semgrep-patterns.js.map +0 -1
- package/dist/tools/specTools.js +0 -332
- package/dist/tools/specTools.js.map +0 -1
- package/dist/tools/structural/__tests__/orchestrator.test.js +0 -61
- package/dist/tools/structural/__tests__/orchestrator.test.js.map +0 -1
- package/dist/tools/structural/cache.js +0 -226
- package/dist/tools/structural/cache.js.map +0 -1
- package/dist/tools/structural/engines/python/index.js +0 -118
- package/dist/tools/structural/engines/python/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js +0 -97
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js.map +0 -1
- package/dist/tools/structural/engines/typescript/analyzer.js +0 -433
- package/dist/tools/structural/engines/typescript/analyzer.js.map +0 -1
- package/dist/tools/structural/engines/typescript/index.js +0 -381
- package/dist/tools/structural/engines/typescript/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/utils.js +0 -279
- package/dist/tools/structural/engines/typescript/utils.js.map +0 -1
- package/dist/tools/structural/index.js +0 -248
- package/dist/tools/structural/index.js.map +0 -1
- package/dist/tools/structural/types.js +0 -18
- package/dist/tools/structural/types.js.map +0 -1
- package/dist/tools/tmuxTools.js +0 -100
- package/dist/tools/tmuxTools.js.map +0 -1
- package/dist/tools/workRecorder.js +0 -215
- package/dist/tools/workRecorder.js.map +0 -1
- package/dist/tools/worktreeTools.js +0 -705
- package/dist/tools/worktreeTools.js.map +0 -1
- package/dist/utils/__tests__/integration.test.js +0 -57
- package/dist/utils/__tests__/integration.test.js.map +0 -1
- package/dist/utils/__tests__/serverDetection.test.js +0 -151
- package/dist/utils/__tests__/serverDetection.test.js.map +0 -1
- package/dist/utils/errorHandling.js +0 -336
- package/dist/utils/errorHandling.js.map +0 -1
- package/dist/utils/processManager.js +0 -172
- package/dist/utils/processManager.js.map +0 -1
- package/dist/utils/reliability.js +0 -263
- package/dist/utils/reliability.js.map +0 -1
- package/dist/utils/responseFormatter.js +0 -250
- package/dist/utils/responseFormatter.js.map +0 -1
- package/dist/utils/serverDetection.js +0 -133
- package/dist/utils/serverDetection.js.map +0 -1
- package/dist/utils/specMigration.js +0 -105
- package/dist/utils/specMigration.js.map +0 -1
- package/dist/validation/schemas.js +0 -299
- package/dist/validation/schemas.js.map +0 -1
- package/public/.well-known/mcp/manifest.json +0 -473
- package/public/index.html +0 -3157
- package/public/index.html.backup +0 -2805
- package/public/index.html.backup2 +0 -1292
- package/scripts/cleanup-system-logs.ts +0 -121
- package/scripts/init-workspace.js +0 -63
- package/scripts/install-search-tools.js +0 -116
|
@@ -1,541 +0,0 @@
|
|
|
1
|
-
// src/services/tmuxManager.ts
|
|
2
|
-
import { exec } from "child_process";
|
|
3
|
-
import { promisify } from "util";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import fs from "fs-extra";
|
|
6
|
-
import { claudeOrchestrator } from "./claudeOrchestrator.js";
|
|
7
|
-
import { liveMonitor } from "./liveMonitor.js";
|
|
8
|
-
const execAsync = promisify(exec);
|
|
9
|
-
export class TmuxManager {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.isAvailable = null;
|
|
12
|
-
this.metadataPath = path.resolve(process.cwd(), ".bob/tmux-sessions.json");
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Check if tmux is available on the system
|
|
16
|
-
*/
|
|
17
|
-
async checkAvailability() {
|
|
18
|
-
if (this.isAvailable !== null) {
|
|
19
|
-
return this.isAvailable;
|
|
20
|
-
}
|
|
21
|
-
try {
|
|
22
|
-
await execAsync("which tmux");
|
|
23
|
-
this.isAvailable = true;
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
27
|
-
this.isAvailable = false;
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Get session name following convention: mcp-<manual_name> or mcp-<worktree_name>
|
|
33
|
-
* Note: tmux doesn't allow colons or slashes, so we use hyphens and underscores
|
|
34
|
-
*/
|
|
35
|
-
getSessionName(worktree_id, manual_name) {
|
|
36
|
-
// Use manual name if provided, otherwise use worktree_id
|
|
37
|
-
const baseName = manual_name || worktree_id;
|
|
38
|
-
// Sanitize for tmux compatibility - keep alphanumeric, hyphens, underscores
|
|
39
|
-
const sanitized = baseName
|
|
40
|
-
.toLowerCase()
|
|
41
|
-
.replace(/[^a-zA-Z0-9-_\s]/g, '') // Remove special chars except spaces
|
|
42
|
-
.replace(/\s+/g, '-') // Replace spaces with hyphens
|
|
43
|
-
.replace(/--+/g, '-') // Replace multiple hyphens with single
|
|
44
|
-
.replace(/^-|-$/g, '') // Remove leading/trailing hyphens
|
|
45
|
-
.substring(0, 30); // Limit length
|
|
46
|
-
return `mcp-${sanitized}`;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Validate session name follows our convention
|
|
50
|
-
*/
|
|
51
|
-
validateSessionName(session_name) {
|
|
52
|
-
// Allow mcp- prefix with alphanumeric, hyphens, underscores, colons, slashes, and dots
|
|
53
|
-
// This matches the actual session names we see in practice
|
|
54
|
-
return /^mcp[-:]?[a-zA-Z0-9-_:/\.]+$/.test(session_name);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Load session metadata from disk
|
|
58
|
-
*/
|
|
59
|
-
async loadMetadata() {
|
|
60
|
-
try {
|
|
61
|
-
if (await fs.pathExists(this.metadataPath)) {
|
|
62
|
-
return await fs.readJson(this.metadataPath);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
console.warn("Failed to load tmux session metadata:", error);
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
sessions: {},
|
|
70
|
-
last_updated: new Date().toISOString()
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Save session metadata to disk
|
|
75
|
-
*/
|
|
76
|
-
async saveMetadata(metadata) {
|
|
77
|
-
try {
|
|
78
|
-
await fs.ensureDir(path.dirname(this.metadataPath));
|
|
79
|
-
metadata.last_updated = new Date().toISOString();
|
|
80
|
-
await fs.writeJson(this.metadataPath, metadata, { spaces: 2 });
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
console.error("Failed to save tmux session metadata:", error);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Create a new tmux session for a worktree
|
|
88
|
-
*/
|
|
89
|
-
async createSession(spec_id, worktree_id, worktree_path, claude_prompt, manual_name) {
|
|
90
|
-
if (!await this.checkAvailability()) {
|
|
91
|
-
throw new Error("tmux is not available on this system");
|
|
92
|
-
}
|
|
93
|
-
const session_name = this.getSessionName(worktree_id, manual_name);
|
|
94
|
-
const absolutePath = path.resolve(process.cwd(), worktree_path);
|
|
95
|
-
// Check if session already exists - kill it and recreate for fresh start
|
|
96
|
-
if (await this.sessionExists(session_name)) {
|
|
97
|
-
console.log(`Session ${session_name} already exists, killing it for fresh start`);
|
|
98
|
-
try {
|
|
99
|
-
await this.killSession(session_name);
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
console.warn(`Failed to kill existing session ${session_name}:`, error);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
// Create tmux session without Claude (claudeOrchestrator will handle Claude startup)
|
|
107
|
-
const command = `tmux new-session -d -s "${session_name}" -c "${absolutePath}"`;
|
|
108
|
-
await execAsync(command);
|
|
109
|
-
const session = {
|
|
110
|
-
session_name,
|
|
111
|
-
spec_id,
|
|
112
|
-
worktree_id,
|
|
113
|
-
worktree_path: absolutePath,
|
|
114
|
-
status: 'active',
|
|
115
|
-
created_at: new Date().toISOString(),
|
|
116
|
-
attached_clients: 0
|
|
117
|
-
};
|
|
118
|
-
// If Claude prompt provided, start Claude using the orchestrator
|
|
119
|
-
if (claude_prompt) {
|
|
120
|
-
await claudeOrchestrator.spawnClaudeInSession(session_name, claude_prompt, absolutePath);
|
|
121
|
-
}
|
|
122
|
-
// Save to metadata
|
|
123
|
-
const metadata = await this.loadMetadata();
|
|
124
|
-
metadata.sessions[session_name] = session;
|
|
125
|
-
await this.saveMetadata(metadata);
|
|
126
|
-
return session;
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
throw new Error(`Failed to create tmux session: ${error instanceof Error ? error.message : String(error)}`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Check if a tmux session exists
|
|
134
|
-
*/
|
|
135
|
-
async sessionExists(session_name) {
|
|
136
|
-
if (!await this.checkAvailability()) {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
try {
|
|
140
|
-
await execAsync(`tmux has-session -t "${session_name}"`);
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Kill a tmux session
|
|
149
|
-
*/
|
|
150
|
-
async killSession(session_name) {
|
|
151
|
-
if (!await this.checkAvailability()) {
|
|
152
|
-
throw new Error("tmux is not available on this system");
|
|
153
|
-
}
|
|
154
|
-
if (!this.validateSessionName(session_name)) {
|
|
155
|
-
throw new Error(`Invalid session name: ${session_name}`);
|
|
156
|
-
}
|
|
157
|
-
try {
|
|
158
|
-
// Escape the session name properly for shell execution
|
|
159
|
-
const escapedSessionName = session_name.replace(/'/g, "'\"'\"'");
|
|
160
|
-
await execAsync(`tmux kill-session -t '${escapedSessionName}'`);
|
|
161
|
-
// Remove from metadata
|
|
162
|
-
const metadata = await this.loadMetadata();
|
|
163
|
-
delete metadata.sessions[session_name];
|
|
164
|
-
await this.saveMetadata(metadata);
|
|
165
|
-
}
|
|
166
|
-
catch (error) {
|
|
167
|
-
throw new Error(`Failed to kill tmux session: ${error instanceof Error ? error.message : String(error)}`);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* List all tmux sessions with metadata
|
|
172
|
-
*/
|
|
173
|
-
async listSessions(filter_pattern) {
|
|
174
|
-
if (!await this.checkAvailability()) {
|
|
175
|
-
return [];
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
// Get live tmux session data
|
|
179
|
-
const { stdout } = await execAsync('tmux list-sessions -F "#{session_name}|#{session_attached}|#{session_created}" 2>/dev/null || echo ""');
|
|
180
|
-
const liveSessions = new Map();
|
|
181
|
-
if (stdout.trim()) {
|
|
182
|
-
stdout.trim().split('\n').forEach(line => {
|
|
183
|
-
const [name, attached, created] = line.split('|');
|
|
184
|
-
if (name && (name.startsWith('mcp-') || name.startsWith('mcp:'))) {
|
|
185
|
-
liveSessions.set(name, {
|
|
186
|
-
attached: parseInt(attached) || 0,
|
|
187
|
-
created
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
// Load metadata and sync with live sessions
|
|
193
|
-
const metadata = await this.loadMetadata();
|
|
194
|
-
const sessions = [];
|
|
195
|
-
// Process live sessions
|
|
196
|
-
for (const [session_name, liveData] of liveSessions) {
|
|
197
|
-
const storedSession = metadata.sessions[session_name];
|
|
198
|
-
if (storedSession) {
|
|
199
|
-
// Update stored session with live data
|
|
200
|
-
const session = {
|
|
201
|
-
...storedSession,
|
|
202
|
-
status: liveData.attached > 0 ? 'active' : 'detached',
|
|
203
|
-
attached_clients: liveData.attached
|
|
204
|
-
};
|
|
205
|
-
sessions.push(session);
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
// Live session not in metadata (created outside our system)
|
|
209
|
-
const session = {
|
|
210
|
-
session_name,
|
|
211
|
-
spec_id: 'unknown',
|
|
212
|
-
worktree_id: session_name.replace('mcp:', ''),
|
|
213
|
-
worktree_path: process.cwd(),
|
|
214
|
-
status: liveData.attached > 0 ? 'active' : 'detached',
|
|
215
|
-
created_at: new Date().toISOString(),
|
|
216
|
-
attached_clients: liveData.attached
|
|
217
|
-
};
|
|
218
|
-
sessions.push(session);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
// Mark stored sessions as inactive if not live
|
|
222
|
-
for (const [session_name, storedSession] of Object.entries(metadata.sessions)) {
|
|
223
|
-
if (!liveSessions.has(session_name)) {
|
|
224
|
-
const session = {
|
|
225
|
-
...storedSession,
|
|
226
|
-
status: 'inactive',
|
|
227
|
-
attached_clients: 0
|
|
228
|
-
};
|
|
229
|
-
sessions.push(session);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
// Clean up stale metadata entries (sessions that no longer exist in tmux)
|
|
233
|
-
let metadataUpdated = false;
|
|
234
|
-
for (const sessionName in metadata.sessions) {
|
|
235
|
-
if (!liveSessions.has(sessionName)) {
|
|
236
|
-
delete metadata.sessions[sessionName];
|
|
237
|
-
metadataUpdated = true;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
// Save cleaned metadata if any stale entries were removed
|
|
241
|
-
if (metadataUpdated) {
|
|
242
|
-
await this.saveMetadata(metadata);
|
|
243
|
-
}
|
|
244
|
-
// Apply filter if provided
|
|
245
|
-
let filteredSessions = sessions;
|
|
246
|
-
if (filter_pattern) {
|
|
247
|
-
const regex = new RegExp(filter_pattern, 'i');
|
|
248
|
-
filteredSessions = sessions.filter(s => regex.test(s.session_name) ||
|
|
249
|
-
regex.test(s.spec_id) ||
|
|
250
|
-
regex.test(s.worktree_id));
|
|
251
|
-
}
|
|
252
|
-
return filteredSessions.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
|
|
253
|
-
}
|
|
254
|
-
catch (error) {
|
|
255
|
-
console.error("Failed to list tmux sessions:", error);
|
|
256
|
-
return [];
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Get session by worktree ID
|
|
261
|
-
*/
|
|
262
|
-
async getSessionByWorktree(worktree_id) {
|
|
263
|
-
const sessions = await this.listSessions();
|
|
264
|
-
return sessions.find(s => s.worktree_id === worktree_id) || null;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Clean up orphaned sessions (sessions in metadata but not live)
|
|
268
|
-
*/
|
|
269
|
-
async cleanupOrphanedSessions() {
|
|
270
|
-
const metadata = await this.loadMetadata();
|
|
271
|
-
const liveSessions = new Set();
|
|
272
|
-
// Get live session names
|
|
273
|
-
try {
|
|
274
|
-
const { stdout } = await execAsync('tmux list-sessions -F "#{session_name}" 2>/dev/null || echo ""');
|
|
275
|
-
if (stdout.trim()) {
|
|
276
|
-
stdout.trim().split('\n').forEach(name => {
|
|
277
|
-
if (name.startsWith('mcp-')) {
|
|
278
|
-
liveSessions.add(name);
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
catch (error) {
|
|
284
|
-
console.warn("Failed to get live sessions for cleanup:", error);
|
|
285
|
-
return 0;
|
|
286
|
-
}
|
|
287
|
-
// Remove dead sessions from metadata
|
|
288
|
-
const originalCount = Object.keys(metadata.sessions).length;
|
|
289
|
-
const cleanedSessions = {};
|
|
290
|
-
for (const [session_name, session] of Object.entries(metadata.sessions)) {
|
|
291
|
-
if (liveSessions.has(session_name) || session.status === 'active') {
|
|
292
|
-
cleanedSessions[session_name] = session;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
metadata.sessions = cleanedSessions;
|
|
296
|
-
await this.saveMetadata(metadata);
|
|
297
|
-
return originalCount - Object.keys(cleanedSessions).length;
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Get attachment command for a session
|
|
301
|
-
*/
|
|
302
|
-
getAttachCommand(session_name) {
|
|
303
|
-
return `tmux attach -t "${session_name}"`;
|
|
304
|
-
}
|
|
305
|
-
// ===== Enhanced Methods for Claude-in-tmux Integration =====
|
|
306
|
-
/**
|
|
307
|
-
* Create enhanced session with auto-Claude injection and monitoring
|
|
308
|
-
*/
|
|
309
|
-
async createEnhancedSession(spec_id, worktree_id, worktree_path, claude_prompt, auto_monitor = true, manual_name) {
|
|
310
|
-
if (!await this.checkAvailability()) {
|
|
311
|
-
throw new Error("tmux is not available on this system");
|
|
312
|
-
}
|
|
313
|
-
const session_name = this.getSessionName(worktree_id, manual_name);
|
|
314
|
-
const absolutePath = path.resolve(process.cwd(), worktree_path);
|
|
315
|
-
// Check if session already exists - kill it and recreate for fresh start
|
|
316
|
-
if (await this.sessionExists(session_name)) {
|
|
317
|
-
console.log(`Session ${session_name} already exists, killing it for fresh start`);
|
|
318
|
-
try {
|
|
319
|
-
await this.killSession(session_name);
|
|
320
|
-
}
|
|
321
|
-
catch (error) {
|
|
322
|
-
console.warn(`Failed to kill existing session ${session_name}:`, error);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
try {
|
|
326
|
-
// Create tmux session without Claude initially
|
|
327
|
-
const command = `tmux new-session -d -s "${session_name}" -c "${absolutePath}"`;
|
|
328
|
-
await execAsync(command);
|
|
329
|
-
// Use ClaudeOrchestrator to spawn Claude process
|
|
330
|
-
const claudeProcess = await claudeOrchestrator.spawnClaudeInSession(session_name, claude_prompt, absolutePath);
|
|
331
|
-
// Start live monitoring if requested
|
|
332
|
-
if (auto_monitor) {
|
|
333
|
-
await liveMonitor.startMonitoring(session_name);
|
|
334
|
-
}
|
|
335
|
-
// Create enhanced session object
|
|
336
|
-
const session = {
|
|
337
|
-
session_name,
|
|
338
|
-
spec_id,
|
|
339
|
-
worktree_id,
|
|
340
|
-
worktree_path: absolutePath,
|
|
341
|
-
status: 'active',
|
|
342
|
-
created_at: new Date().toISOString(),
|
|
343
|
-
attached_clients: 0,
|
|
344
|
-
claude_process: claudeProcess,
|
|
345
|
-
claude_status: claudeProcess.status,
|
|
346
|
-
has_claude: true,
|
|
347
|
-
last_activity: new Date().toISOString()
|
|
348
|
-
};
|
|
349
|
-
// Save to metadata
|
|
350
|
-
const metadata = await this.loadMetadata();
|
|
351
|
-
metadata.sessions[session_name] = session;
|
|
352
|
-
await this.saveMetadata(metadata);
|
|
353
|
-
return session;
|
|
354
|
-
}
|
|
355
|
-
catch (error) {
|
|
356
|
-
throw new Error(`Failed to create enhanced tmux session: ${error instanceof Error ? error.message : String(error)}`);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Send command to Claude process in session
|
|
361
|
-
*/
|
|
362
|
-
async sendCommand(session_name, command) {
|
|
363
|
-
if (!await this.sessionExists(session_name)) {
|
|
364
|
-
throw new Error(`tmux session ${session_name} does not exist`);
|
|
365
|
-
}
|
|
366
|
-
// Use ClaudeOrchestrator to send command
|
|
367
|
-
await claudeOrchestrator.sendCommand(session_name, command);
|
|
368
|
-
// Update last activity
|
|
369
|
-
await this.updateSessionActivity(session_name);
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Capture pane output with options
|
|
373
|
-
*/
|
|
374
|
-
async capturePane(session_name, options) {
|
|
375
|
-
if (!await this.sessionExists(session_name)) {
|
|
376
|
-
throw new Error(`tmux session ${session_name} does not exist`);
|
|
377
|
-
}
|
|
378
|
-
return await liveMonitor.captureOutput(session_name, options);
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Get live logs buffer for session
|
|
382
|
-
*/
|
|
383
|
-
getLiveBuffer(session_name) {
|
|
384
|
-
return liveMonitor.getBufferedLogs(session_name);
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Start live monitoring for a session
|
|
388
|
-
*/
|
|
389
|
-
async startLiveMonitoring(session_name, maxLines) {
|
|
390
|
-
if (!await this.sessionExists(session_name)) {
|
|
391
|
-
throw new Error(`tmux session ${session_name} does not exist`);
|
|
392
|
-
}
|
|
393
|
-
await liveMonitor.startMonitoring(session_name, undefined, maxLines);
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Stop live monitoring for a session
|
|
397
|
-
*/
|
|
398
|
-
stopLiveMonitoring(session_name) {
|
|
399
|
-
liveMonitor.stopMonitoring(session_name);
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Stop Claude process in session
|
|
403
|
-
*/
|
|
404
|
-
async stopClaudeProcess(session_name) {
|
|
405
|
-
if (!await this.sessionExists(session_name)) {
|
|
406
|
-
throw new Error(`tmux session ${session_name} does not exist`);
|
|
407
|
-
}
|
|
408
|
-
await claudeOrchestrator.stopClaudeProcess(session_name);
|
|
409
|
-
await this.updateSessionActivity(session_name);
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Restart Claude process in session
|
|
413
|
-
*/
|
|
414
|
-
async restartClaudeProcess(session_name, newPrompt) {
|
|
415
|
-
if (!await this.sessionExists(session_name)) {
|
|
416
|
-
throw new Error(`tmux session ${session_name} does not exist`);
|
|
417
|
-
}
|
|
418
|
-
const claudeProcess = await claudeOrchestrator.restartProcess(session_name, newPrompt);
|
|
419
|
-
await this.updateSessionActivity(session_name);
|
|
420
|
-
return claudeProcess;
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Get Claude process status for session
|
|
424
|
-
*/
|
|
425
|
-
async getClaudeStatus(session_name) {
|
|
426
|
-
return await claudeOrchestrator.getProcessStatus(session_name);
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Get all sessions with enhanced Claude information
|
|
430
|
-
*/
|
|
431
|
-
async listEnhancedSessions(filter_pattern) {
|
|
432
|
-
const sessions = await this.listSessions(filter_pattern);
|
|
433
|
-
// Enhance sessions with Claude process information
|
|
434
|
-
const enhancedSessions = await Promise.all(sessions.map(async (session) => {
|
|
435
|
-
const claudeProcess = await claudeOrchestrator.getProcessStatus(session.session_name);
|
|
436
|
-
const logBuffer = liveMonitor.getBufferedLogs(session.session_name);
|
|
437
|
-
return {
|
|
438
|
-
...session,
|
|
439
|
-
claude_process: claudeProcess || undefined,
|
|
440
|
-
claude_status: claudeProcess?.status || undefined,
|
|
441
|
-
has_claude: !!claudeProcess,
|
|
442
|
-
last_activity: claudeProcess?.lastActivity || session.created_at
|
|
443
|
-
};
|
|
444
|
-
}));
|
|
445
|
-
return enhancedSessions;
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Get session processes information
|
|
449
|
-
*/
|
|
450
|
-
async getSessionProcesses(session_name) {
|
|
451
|
-
const sessions = await this.listSessions();
|
|
452
|
-
const tmuxSession = sessions.find(s => s.session_name === session_name) || null;
|
|
453
|
-
const claudeProcess = await claudeOrchestrator.getProcessStatus(session_name);
|
|
454
|
-
const logBuffer = liveMonitor.getBufferedLogs(session_name);
|
|
455
|
-
return {
|
|
456
|
-
tmux_session: tmuxSession,
|
|
457
|
-
claude_process: claudeProcess,
|
|
458
|
-
log_buffer: logBuffer
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Enhanced cleanup with Claude processes
|
|
463
|
-
*/
|
|
464
|
-
async enhancedCleanup() {
|
|
465
|
-
const tmuxCleanup = await this.cleanupOrphanedSessions();
|
|
466
|
-
const claudeCleanup = await claudeOrchestrator.cleanup();
|
|
467
|
-
const logCleanup = await liveMonitor.cleanup();
|
|
468
|
-
return {
|
|
469
|
-
tmux_sessions: tmuxCleanup,
|
|
470
|
-
claude_processes: claudeCleanup,
|
|
471
|
-
log_buffers: logCleanup
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Get monitoring statistics
|
|
476
|
-
*/
|
|
477
|
-
getMonitoringStats() {
|
|
478
|
-
const liveStats = liveMonitor.getStats();
|
|
479
|
-
const claudeProcesses = claudeOrchestrator.getAllProcesses();
|
|
480
|
-
return {
|
|
481
|
-
tmux_sessions: this.getSyncSessionCount(),
|
|
482
|
-
active_monitoring: liveStats.activeMonitoring,
|
|
483
|
-
total_buffers: liveStats.totalBuffers,
|
|
484
|
-
claude_processes: claudeProcesses.length,
|
|
485
|
-
memory_usage: liveStats.memoryUsage
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
/**
|
|
489
|
-
* Search logs across all monitored sessions
|
|
490
|
-
*/
|
|
491
|
-
searchAllLogs(pattern, caseSensitive = false) {
|
|
492
|
-
const results = {};
|
|
493
|
-
const monitoringSessions = liveMonitor.getMonitoringSessions();
|
|
494
|
-
for (const sessionName of monitoringSessions) {
|
|
495
|
-
const matches = liveMonitor.searchLogs(sessionName, pattern, caseSensitive);
|
|
496
|
-
if (matches.length > 0) {
|
|
497
|
-
results[sessionName] = matches;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
return results;
|
|
501
|
-
}
|
|
502
|
-
/**
|
|
503
|
-
* Export session data for debugging or backup
|
|
504
|
-
*/
|
|
505
|
-
async exportSessionData(session_name) {
|
|
506
|
-
const sessionData = await this.getSessionProcesses(session_name);
|
|
507
|
-
const logs = liveMonitor.exportLogs(session_name);
|
|
508
|
-
return {
|
|
509
|
-
session: sessionData.tmux_session,
|
|
510
|
-
claude_process: sessionData.claude_process,
|
|
511
|
-
logs,
|
|
512
|
-
export_time: new Date().toISOString()
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
/**
|
|
516
|
-
* Update session activity timestamp
|
|
517
|
-
*/
|
|
518
|
-
async updateSessionActivity(session_name) {
|
|
519
|
-
try {
|
|
520
|
-
const metadata = await this.loadMetadata();
|
|
521
|
-
const session = metadata.sessions[session_name];
|
|
522
|
-
if (session) {
|
|
523
|
-
session.last_activity = new Date().toISOString();
|
|
524
|
-
metadata.sessions[session_name] = session;
|
|
525
|
-
await this.saveMetadata(metadata);
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
catch (error) {
|
|
529
|
-
console.warn(`Failed to update activity for session ${session_name}:`, error);
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Get session count from current metadata (helper method)
|
|
534
|
-
*/
|
|
535
|
-
getSyncSessionCount() {
|
|
536
|
-
return Object.keys(this.buffers?.sessions || {}).length;
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
// Export singleton instance
|
|
540
|
-
export const tmuxManager = new TmuxManager();
|
|
541
|
-
//# sourceMappingURL=tmuxManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tmuxManager.js","sourceRoot":"","sources":["../../src/services/tmuxManager.ts"],"names":[],"mappings":"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"}
|