@enruana/claude-orka 0.4.3 → 0.4.5
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/.tmux.orka.conf +127 -0
- package/README.md +61 -0
- package/dist/cli.js +98 -61
- package/dist/electron/main/main.js +84 -47
- package/dist/src/utils/tmux.d.ts +4 -0
- package/dist/src/utils/tmux.d.ts.map +1 -1
- package/dist/src/utils/tmux.js +43 -0
- package/dist/src/utils/tmux.js.map +1 -1
- package/package.json +2 -1
package/.tmux.orka.conf
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Claude-Orka Custom tmux Theme
|
|
2
|
+
# This configuration is automatically applied to all Claude-Orka sessions
|
|
3
|
+
|
|
4
|
+
# ============================================
|
|
5
|
+
# GENERAL SETTINGS
|
|
6
|
+
# ============================================
|
|
7
|
+
|
|
8
|
+
# Enable mouse support for easier pane navigation
|
|
9
|
+
set -g mouse on
|
|
10
|
+
|
|
11
|
+
# Start windows and panes at 1 (not 0)
|
|
12
|
+
set -g base-index 1
|
|
13
|
+
setw -g pane-base-index 1
|
|
14
|
+
|
|
15
|
+
# Increase scrollback buffer
|
|
16
|
+
set -g history-limit 10000
|
|
17
|
+
|
|
18
|
+
# Reduce escape time (better for vim users)
|
|
19
|
+
set -sg escape-time 0
|
|
20
|
+
|
|
21
|
+
# Enable focus events
|
|
22
|
+
set -g focus-events on
|
|
23
|
+
|
|
24
|
+
# Enable 256 colors
|
|
25
|
+
set -g default-terminal "screen-256color"
|
|
26
|
+
|
|
27
|
+
# ============================================
|
|
28
|
+
# STATUS BAR THEME
|
|
29
|
+
# ============================================
|
|
30
|
+
|
|
31
|
+
# Status bar position
|
|
32
|
+
set -g status-position top
|
|
33
|
+
|
|
34
|
+
# Status bar update interval
|
|
35
|
+
set -g status-interval 1
|
|
36
|
+
|
|
37
|
+
# Status bar colors
|
|
38
|
+
set -g status-style bg=colour234,fg=colour137
|
|
39
|
+
|
|
40
|
+
# Status bar length
|
|
41
|
+
set -g status-left-length 50
|
|
42
|
+
set -g status-right-length 100
|
|
43
|
+
|
|
44
|
+
# Left side: Session name with Orka branding
|
|
45
|
+
set -g status-left '#[fg=colour232,bg=colour208,bold] 🎭 ORKA #[fg=colour208,bg=colour236,nobold] #[fg=colour208,bg=colour236] #S #[fg=colour236,bg=colour234,nobold] '
|
|
46
|
+
|
|
47
|
+
# Right side: Project info and time
|
|
48
|
+
set -g status-right '#[fg=colour236,bg=colour234]#[fg=colour137,bg=colour236] #{pane_current_path} #[fg=colour240,bg=colour236]#[fg=colour250,bg=colour240] %Y-%m-%d #[fg=colour245,bg=colour240]#[fg=colour232,bg=colour245,bold] %H:%M:%S '
|
|
49
|
+
|
|
50
|
+
# Window status format
|
|
51
|
+
setw -g window-status-format '#[fg=colour234,bg=colour236]#[fg=colour137,bg=colour236] #I:#W #[fg=colour236,bg=colour234]'
|
|
52
|
+
|
|
53
|
+
# Current window status format (highlighted)
|
|
54
|
+
setw -g window-status-current-format '#[fg=colour234,bg=colour208]#[fg=colour232,bg=colour208,bold] #I:#W #[fg=colour208,bg=colour234,nobold]'
|
|
55
|
+
|
|
56
|
+
# Window with activity status
|
|
57
|
+
setw -g window-status-activity-style fg=colour166,bg=colour236
|
|
58
|
+
|
|
59
|
+
# ============================================
|
|
60
|
+
# PANE BORDERS
|
|
61
|
+
# ============================================
|
|
62
|
+
|
|
63
|
+
# Pane border colors
|
|
64
|
+
set -g pane-border-style fg=colour236
|
|
65
|
+
set -g pane-active-border-style fg=colour208
|
|
66
|
+
|
|
67
|
+
# Pane border format (show pane title)
|
|
68
|
+
set -g pane-border-format '#[fg=colour208,bg=colour234] #{pane_index} #{pane_current_command} '
|
|
69
|
+
set -g pane-border-status top
|
|
70
|
+
|
|
71
|
+
# ============================================
|
|
72
|
+
# MESSAGES & COMMAND PROMPT
|
|
73
|
+
# ============================================
|
|
74
|
+
|
|
75
|
+
# Command prompt style
|
|
76
|
+
set -g message-style fg=colour232,bg=colour208,bold
|
|
77
|
+
|
|
78
|
+
# Command prompt message style
|
|
79
|
+
set -g message-command-style fg=colour232,bg=colour166
|
|
80
|
+
|
|
81
|
+
# ============================================
|
|
82
|
+
# CLOCK MODE
|
|
83
|
+
# ============================================
|
|
84
|
+
|
|
85
|
+
# Clock color (prefix + t)
|
|
86
|
+
setw -g clock-mode-colour colour208
|
|
87
|
+
|
|
88
|
+
# ============================================
|
|
89
|
+
# WINDOW MODES
|
|
90
|
+
# ============================================
|
|
91
|
+
|
|
92
|
+
# Copy mode highlighting
|
|
93
|
+
setw -g mode-style fg=colour232,bg=colour208
|
|
94
|
+
|
|
95
|
+
# ============================================
|
|
96
|
+
# KEY BINDINGS (Optional enhancements)
|
|
97
|
+
# ============================================
|
|
98
|
+
|
|
99
|
+
# Reload config easily (prefix + r)
|
|
100
|
+
bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"
|
|
101
|
+
|
|
102
|
+
# Better pane splitting (keep current directory)
|
|
103
|
+
bind | split-window -h -c "#{pane_current_path}"
|
|
104
|
+
bind - split-window -v -c "#{pane_current_path}"
|
|
105
|
+
|
|
106
|
+
# Pane navigation with vim-like keys
|
|
107
|
+
bind h select-pane -L
|
|
108
|
+
bind j select-pane -D
|
|
109
|
+
bind k select-pane -U
|
|
110
|
+
bind l select-pane -R
|
|
111
|
+
|
|
112
|
+
# Resize panes with vim-like keys
|
|
113
|
+
bind -r H resize-pane -L 5
|
|
114
|
+
bind -r J resize-pane -D 5
|
|
115
|
+
bind -r K resize-pane -U 5
|
|
116
|
+
bind -r L resize-pane -R 5
|
|
117
|
+
|
|
118
|
+
# ============================================
|
|
119
|
+
# VISUAL INDICATORS
|
|
120
|
+
# ============================================
|
|
121
|
+
|
|
122
|
+
# Bell/Activity
|
|
123
|
+
set -g visual-activity off
|
|
124
|
+
set -g visual-bell off
|
|
125
|
+
set -g visual-silence off
|
|
126
|
+
setw -g monitor-activity on
|
|
127
|
+
set -g bell-action none
|
package/README.md
CHANGED
|
@@ -136,6 +136,41 @@ orka status
|
|
|
136
136
|
- **Fork management** - Create, export, merge, and close forks visually
|
|
137
137
|
- **Status indicators** - Visual distinction for active, saved, merged, and closed forks
|
|
138
138
|
|
|
139
|
+
### 🎨 Custom tmux Theme
|
|
140
|
+
|
|
141
|
+
- **Automatic branding** - Claude-Orka sessions get a custom orange theme
|
|
142
|
+
- **Enhanced status bar** - Shows session name, project path, and current time
|
|
143
|
+
- **Visual hierarchy** - Distinct colors for active/inactive panes and windows
|
|
144
|
+
- **Mouse support** - Click to select panes and windows
|
|
145
|
+
- **Vim-like navigation** - Optional h/j/k/l keys for pane movement
|
|
146
|
+
- **Persistent configuration** - Theme automatically applied to all new sessions
|
|
147
|
+
|
|
148
|
+
The custom theme makes it easy to distinguish Claude-Orka managed sessions from regular tmux sessions. The orange branding 🎭 appears in the status bar, with the session name and project information clearly visible.
|
|
149
|
+
|
|
150
|
+
**Customization:**
|
|
151
|
+
|
|
152
|
+
To modify the theme, edit `.tmux.orka.conf` in your Claude-Orka installation:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Find your global installation
|
|
156
|
+
npm root -g
|
|
157
|
+
# Edit the config
|
|
158
|
+
vim $(npm root -g)/@enruana/claude-orka/.tmux.orka.conf
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Or create your own theme file and source it manually:
|
|
162
|
+
```bash
|
|
163
|
+
# After creating a session
|
|
164
|
+
tmux source-file ~/.my-custom-theme.conf -t <session-name>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Key Features of the Theme:**
|
|
168
|
+
- **Orange highlights** (#208) for active windows and Orka branding
|
|
169
|
+
- **Top status bar** with session info
|
|
170
|
+
- **Pane borders** with titles showing current command
|
|
171
|
+
- **Enhanced readability** with high contrast colors
|
|
172
|
+
- **Powerline-style separators** for a modern look
|
|
173
|
+
|
|
139
174
|
---
|
|
140
175
|
|
|
141
176
|
## CLI Reference
|
|
@@ -1186,6 +1221,32 @@ interface ForkSummary {
|
|
|
1186
1221
|
|
|
1187
1222
|
The Electron UI provides a visual interface for managing Claude Code sessions and forks. It automatically launches when you create or resume a session.
|
|
1188
1223
|
|
|
1224
|
+
### Screenshots
|
|
1225
|
+
|
|
1226
|
+
**Active Fork with Visual Hierarchy**
|
|
1227
|
+
|
|
1228
|
+

|
|
1229
|
+
|
|
1230
|
+
*Visual session tree showing main branch and an active fork with parent-child relationship*
|
|
1231
|
+
|
|
1232
|
+
---
|
|
1233
|
+
|
|
1234
|
+
**Closed and Merged Forks**
|
|
1235
|
+
|
|
1236
|
+

|
|
1237
|
+
|
|
1238
|
+
*Compact visual representation: Red circles for closed forks, green circles for merged forks*
|
|
1239
|
+
|
|
1240
|
+
---
|
|
1241
|
+
|
|
1242
|
+
**Fork Info Modal**
|
|
1243
|
+
|
|
1244
|
+

|
|
1245
|
+
|
|
1246
|
+
*Detailed fork information modal with export file access for merged forks*
|
|
1247
|
+
|
|
1248
|
+
---
|
|
1249
|
+
|
|
1189
1250
|
### Features
|
|
1190
1251
|
|
|
1191
1252
|
#### Visual Session Tree
|
package/dist/cli.js
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
// src/cli/index.ts
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
import { readFileSync } from "fs";
|
|
6
|
-
import { fileURLToPath as
|
|
7
|
-
import { dirname as
|
|
6
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
7
|
+
import { dirname as dirname3, join as join2 } from "path";
|
|
8
8
|
|
|
9
9
|
// src/core/StateManager.ts
|
|
10
|
-
import
|
|
11
|
-
import
|
|
10
|
+
import path4 from "path";
|
|
11
|
+
import fs4 from "fs-extra";
|
|
12
12
|
|
|
13
13
|
// src/utils/tmux.ts
|
|
14
14
|
import execa from "execa";
|
|
@@ -68,6 +68,11 @@ var Logger = class {
|
|
|
68
68
|
var logger = new Logger();
|
|
69
69
|
|
|
70
70
|
// src/utils/tmux.ts
|
|
71
|
+
import * as path2 from "path";
|
|
72
|
+
import * as fs2 from "fs";
|
|
73
|
+
import { fileURLToPath } from "url";
|
|
74
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
75
|
+
var __dirname = path2.dirname(__filename);
|
|
71
76
|
var TmuxError = class extends Error {
|
|
72
77
|
constructor(message, command, originalError) {
|
|
73
78
|
super(message);
|
|
@@ -96,6 +101,7 @@ var TmuxCommands = class {
|
|
|
96
101
|
logger.debug(`Creating tmux session: ${name} at ${projectPath}`);
|
|
97
102
|
await execa("tmux", ["new-session", "-d", "-s", name, "-c", projectPath]);
|
|
98
103
|
logger.info(`Tmux session created: ${name}`);
|
|
104
|
+
await this.applyOrkaTheme(name);
|
|
99
105
|
} catch (error) {
|
|
100
106
|
throw new TmuxError(
|
|
101
107
|
`Failed to create tmux session: ${name}`,
|
|
@@ -104,6 +110,37 @@ var TmuxCommands = class {
|
|
|
104
110
|
);
|
|
105
111
|
}
|
|
106
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Apply Claude-Orka custom tmux theme to a session
|
|
115
|
+
*/
|
|
116
|
+
static async applyOrkaTheme(sessionName) {
|
|
117
|
+
try {
|
|
118
|
+
const possiblePaths = [
|
|
119
|
+
// When installed globally via npm
|
|
120
|
+
path2.join(__dirname, "../../.tmux.orka.conf"),
|
|
121
|
+
// When running from source
|
|
122
|
+
path2.join(process.cwd(), ".tmux.orka.conf"),
|
|
123
|
+
// Fallback: check in the module directory
|
|
124
|
+
path2.join(__dirname, "../../../.tmux.orka.conf")
|
|
125
|
+
];
|
|
126
|
+
let configPath = null;
|
|
127
|
+
for (const p of possiblePaths) {
|
|
128
|
+
if (fs2.existsSync(p)) {
|
|
129
|
+
configPath = p;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (!configPath) {
|
|
134
|
+
logger.warn("Claude-Orka tmux config not found, skipping theme application");
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
logger.debug(`Applying Orka theme from: ${configPath}`);
|
|
138
|
+
await execa("tmux", ["source-file", "-t", sessionName, configPath]);
|
|
139
|
+
logger.info("Claude-Orka theme applied successfully");
|
|
140
|
+
} catch (error) {
|
|
141
|
+
logger.warn("Failed to apply Orka theme, continuing with default tmux theme", error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
107
144
|
/**
|
|
108
145
|
* Abrir una terminal que se adjunte a una sesión tmux existente
|
|
109
146
|
* (Solo macOS por ahora)
|
|
@@ -386,18 +423,18 @@ var TmuxCommands = class {
|
|
|
386
423
|
};
|
|
387
424
|
|
|
388
425
|
// src/utils/claude-history.ts
|
|
389
|
-
import
|
|
426
|
+
import fs3 from "fs-extra";
|
|
390
427
|
import os from "os";
|
|
391
|
-
import
|
|
392
|
-
var CLAUDE_HISTORY_PATH =
|
|
428
|
+
import path3 from "path";
|
|
429
|
+
var CLAUDE_HISTORY_PATH = path3.join(os.homedir(), ".claude", "history.jsonl");
|
|
393
430
|
async function readClaudeHistory() {
|
|
394
431
|
try {
|
|
395
|
-
const exists = await
|
|
432
|
+
const exists = await fs3.pathExists(CLAUDE_HISTORY_PATH);
|
|
396
433
|
if (!exists) {
|
|
397
434
|
logger.warn(`Claude history file not found: ${CLAUDE_HISTORY_PATH}`);
|
|
398
435
|
return [];
|
|
399
436
|
}
|
|
400
|
-
const content = await
|
|
437
|
+
const content = await fs3.readFile(CLAUDE_HISTORY_PATH, "utf-8");
|
|
401
438
|
const lines = content.trim().split("\n").filter(Boolean);
|
|
402
439
|
const entries = [];
|
|
403
440
|
for (const line of lines) {
|
|
@@ -440,9 +477,9 @@ var StateManager = class {
|
|
|
440
477
|
orkaDir;
|
|
441
478
|
statePath;
|
|
442
479
|
constructor(projectPath) {
|
|
443
|
-
this.projectPath =
|
|
444
|
-
this.orkaDir =
|
|
445
|
-
this.statePath =
|
|
480
|
+
this.projectPath = path4.resolve(projectPath);
|
|
481
|
+
this.orkaDir = path4.join(this.projectPath, ".claude-orka");
|
|
482
|
+
this.statePath = path4.join(this.orkaDir, "state.json");
|
|
446
483
|
}
|
|
447
484
|
/**
|
|
448
485
|
* Initialize StateManager
|
|
@@ -451,7 +488,7 @@ var StateManager = class {
|
|
|
451
488
|
async initialize() {
|
|
452
489
|
logger.debug("Initializing StateManager");
|
|
453
490
|
await this.ensureDirectories();
|
|
454
|
-
if (!await
|
|
491
|
+
if (!await fs4.pathExists(this.statePath)) {
|
|
455
492
|
logger.info("Creating initial state.json");
|
|
456
493
|
const initialState = {
|
|
457
494
|
version: "1.0.0",
|
|
@@ -467,7 +504,7 @@ var StateManager = class {
|
|
|
467
504
|
* Create directory structure
|
|
468
505
|
*/
|
|
469
506
|
async ensureDirectories() {
|
|
470
|
-
await
|
|
507
|
+
await fs4.ensureDir(this.orkaDir);
|
|
471
508
|
logger.debug("Directories ensured");
|
|
472
509
|
}
|
|
473
510
|
/**
|
|
@@ -475,7 +512,7 @@ var StateManager = class {
|
|
|
475
512
|
*/
|
|
476
513
|
async read() {
|
|
477
514
|
try {
|
|
478
|
-
const content = await
|
|
515
|
+
const content = await fs4.readFile(this.statePath, "utf-8");
|
|
479
516
|
return JSON.parse(content);
|
|
480
517
|
} catch (error) {
|
|
481
518
|
logger.error("Failed to read state:", error);
|
|
@@ -488,7 +525,7 @@ var StateManager = class {
|
|
|
488
525
|
async save(state) {
|
|
489
526
|
try {
|
|
490
527
|
state.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
|
|
491
|
-
await
|
|
528
|
+
await fs4.writeFile(this.statePath, JSON.stringify(state, null, 2), "utf-8");
|
|
492
529
|
logger.debug("State saved");
|
|
493
530
|
} catch (error) {
|
|
494
531
|
logger.error("Failed to save state:", error);
|
|
@@ -704,8 +741,8 @@ var StateManager = class {
|
|
|
704
741
|
*/
|
|
705
742
|
async saveContext(type, id, content) {
|
|
706
743
|
const contextPath = type === "session" ? this.getSessionContextPath(id) : this.getForkContextPath(id);
|
|
707
|
-
const fullPath =
|
|
708
|
-
await
|
|
744
|
+
const fullPath = path4.join(this.projectPath, contextPath);
|
|
745
|
+
await fs4.writeFile(fullPath, content, "utf-8");
|
|
709
746
|
logger.info(`Context saved: ${contextPath}`);
|
|
710
747
|
return contextPath;
|
|
711
748
|
}
|
|
@@ -713,11 +750,11 @@ var StateManager = class {
|
|
|
713
750
|
* Leer un contexto desde archivo
|
|
714
751
|
*/
|
|
715
752
|
async readContext(contextPath) {
|
|
716
|
-
const fullPath =
|
|
717
|
-
if (!await
|
|
753
|
+
const fullPath = path4.join(this.projectPath, contextPath);
|
|
754
|
+
if (!await fs4.pathExists(fullPath)) {
|
|
718
755
|
throw new Error(`Context file not found: ${contextPath}`);
|
|
719
756
|
}
|
|
720
|
-
return await
|
|
757
|
+
return await fs4.readFile(fullPath, "utf-8");
|
|
721
758
|
}
|
|
722
759
|
// --- HELPERS ---
|
|
723
760
|
/**
|
|
@@ -742,15 +779,15 @@ var StateManager = class {
|
|
|
742
779
|
|
|
743
780
|
// src/core/SessionManager.ts
|
|
744
781
|
import { v4 as uuidv4 } from "uuid";
|
|
745
|
-
import
|
|
746
|
-
import { fileURLToPath } from "url";
|
|
747
|
-
import { dirname } from "path";
|
|
748
|
-
import
|
|
782
|
+
import path5 from "path";
|
|
783
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
784
|
+
import { dirname as dirname2 } from "path";
|
|
785
|
+
import fs5 from "fs-extra";
|
|
749
786
|
import { spawn } from "child_process";
|
|
750
787
|
import { createRequire } from "module";
|
|
751
788
|
var require2 = createRequire(import.meta.url);
|
|
752
|
-
var
|
|
753
|
-
var
|
|
789
|
+
var __filename2 = fileURLToPath2(import.meta.url);
|
|
790
|
+
var __dirname2 = dirname2(__filename2);
|
|
754
791
|
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
755
792
|
var SessionManager = class {
|
|
756
793
|
stateManager;
|
|
@@ -1127,12 +1164,12 @@ var SessionManager = class {
|
|
|
1127
1164
|
throw new Error(`Fork ${forkId} not found`);
|
|
1128
1165
|
}
|
|
1129
1166
|
logger.info(`Generating export for fork: ${fork.name}`);
|
|
1130
|
-
const exportsDir =
|
|
1131
|
-
await
|
|
1167
|
+
const exportsDir = path5.join(this.projectPath, ".claude-orka", "exports");
|
|
1168
|
+
await fs5.ensureDir(exportsDir);
|
|
1132
1169
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
1133
1170
|
const exportName = `fork-${fork.name}-${timestamp}.md`;
|
|
1134
1171
|
const relativeExportPath = `.claude-orka/exports/${exportName}`;
|
|
1135
|
-
const absoluteExportPath =
|
|
1172
|
+
const absoluteExportPath = path5.join(this.projectPath, relativeExportPath);
|
|
1136
1173
|
const prompt = `
|
|
1137
1174
|
Please generate a complete summary of this fork conversation "${fork.name}" and save it to the file:
|
|
1138
1175
|
\`${absoluteExportPath}\`
|
|
@@ -1208,17 +1245,17 @@ Write the summary in Markdown format and save it to the specified file.
|
|
|
1208
1245
|
throw new Error(`Parent ${parentName} is not active. Cannot send merge command.`);
|
|
1209
1246
|
}
|
|
1210
1247
|
let contextPath = fork.contextPath;
|
|
1211
|
-
let fullPath =
|
|
1212
|
-
let exists = await
|
|
1248
|
+
let fullPath = path5.join(this.projectPath, contextPath);
|
|
1249
|
+
let exists = await fs5.pathExists(fullPath);
|
|
1213
1250
|
if (!exists) {
|
|
1214
1251
|
logger.warn(`Export file not found: ${contextPath}. Looking for most recent export...`);
|
|
1215
|
-
const exportsDir =
|
|
1216
|
-
const files = await
|
|
1252
|
+
const exportsDir = path5.join(this.projectPath, ".claude-orka", "exports");
|
|
1253
|
+
const files = await fs5.readdir(exportsDir);
|
|
1217
1254
|
const forkExports = files.filter((f) => f.startsWith(`fork-${fork.name}-`) && f.endsWith(".md")).sort().reverse();
|
|
1218
1255
|
if (forkExports.length > 0) {
|
|
1219
1256
|
contextPath = `.claude-orka/exports/${forkExports[0]}`;
|
|
1220
|
-
fullPath =
|
|
1221
|
-
exists = await
|
|
1257
|
+
fullPath = path5.join(this.projectPath, contextPath);
|
|
1258
|
+
exists = await fs5.pathExists(fullPath);
|
|
1222
1259
|
logger.info(`Using most recent export: ${contextPath}`);
|
|
1223
1260
|
}
|
|
1224
1261
|
}
|
|
@@ -1298,11 +1335,11 @@ Analyze the content and help me integrate the changes and learnings from the for
|
|
|
1298
1335
|
logger.warn("Electron not available, skipping UI launch");
|
|
1299
1336
|
return;
|
|
1300
1337
|
}
|
|
1301
|
-
let mainPath =
|
|
1302
|
-
if (!
|
|
1303
|
-
mainPath =
|
|
1338
|
+
let mainPath = path5.join(__dirname2, "../../electron/main/main.js");
|
|
1339
|
+
if (!fs5.existsSync(mainPath)) {
|
|
1340
|
+
mainPath = path5.join(__dirname2, "../../dist/electron/main/main.js");
|
|
1304
1341
|
}
|
|
1305
|
-
if (!
|
|
1342
|
+
if (!fs5.existsSync(mainPath)) {
|
|
1306
1343
|
logger.warn(`Electron main.js not found at ${mainPath}, skipping UI launch`);
|
|
1307
1344
|
return;
|
|
1308
1345
|
}
|
|
@@ -1810,8 +1847,8 @@ ${statusEmoji} ${chalk.bold(session.name)}`);
|
|
|
1810
1847
|
|
|
1811
1848
|
// src/cli/utils/errors.ts
|
|
1812
1849
|
import chalk2 from "chalk";
|
|
1813
|
-
import
|
|
1814
|
-
import
|
|
1850
|
+
import fs6 from "fs";
|
|
1851
|
+
import path6 from "path";
|
|
1815
1852
|
var CLIError = class extends Error {
|
|
1816
1853
|
constructor(message, exitCode = 1) {
|
|
1817
1854
|
super(message);
|
|
@@ -1843,8 +1880,8 @@ function validateForkId(forkId) {
|
|
|
1843
1880
|
}
|
|
1844
1881
|
}
|
|
1845
1882
|
function validateInitialized(projectPath) {
|
|
1846
|
-
const orkaDir =
|
|
1847
|
-
if (!
|
|
1883
|
+
const orkaDir = path6.join(projectPath, ".claude-orka");
|
|
1884
|
+
if (!fs6.existsSync(orkaDir)) {
|
|
1848
1885
|
throw new CLIError(
|
|
1849
1886
|
'Project not initialized. Run "orka init" first.',
|
|
1850
1887
|
2
|
|
@@ -2237,8 +2274,8 @@ function mergeCommand(program2) {
|
|
|
2237
2274
|
|
|
2238
2275
|
// src/cli/commands/doctor.ts
|
|
2239
2276
|
import execa2 from "execa";
|
|
2240
|
-
import
|
|
2241
|
-
import
|
|
2277
|
+
import fs7 from "fs-extra";
|
|
2278
|
+
import path7 from "path";
|
|
2242
2279
|
import chalk4 from "chalk";
|
|
2243
2280
|
function doctorCommand(program2) {
|
|
2244
2281
|
program2.command("doctor").description("Check system dependencies and configuration").action(async () => {
|
|
@@ -2329,11 +2366,11 @@ async function checkClaude() {
|
|
|
2329
2366
|
}
|
|
2330
2367
|
async function checkProjectInit() {
|
|
2331
2368
|
const projectPath = process.cwd();
|
|
2332
|
-
const orkaDir =
|
|
2333
|
-
const stateFile =
|
|
2369
|
+
const orkaDir = path7.join(projectPath, ".claude-orka");
|
|
2370
|
+
const stateFile = path7.join(orkaDir, "state.json");
|
|
2334
2371
|
try {
|
|
2335
|
-
const dirExists = await
|
|
2336
|
-
const stateExists = await
|
|
2372
|
+
const dirExists = await fs7.pathExists(orkaDir);
|
|
2373
|
+
const stateExists = await fs7.pathExists(stateFile);
|
|
2337
2374
|
if (dirExists && stateExists) {
|
|
2338
2375
|
return {
|
|
2339
2376
|
name: "Project initialization",
|
|
@@ -2370,9 +2407,9 @@ async function checkProjectInit() {
|
|
|
2370
2407
|
async function checkWritePermissions() {
|
|
2371
2408
|
const projectPath = process.cwd();
|
|
2372
2409
|
try {
|
|
2373
|
-
const testFile =
|
|
2374
|
-
await
|
|
2375
|
-
await
|
|
2410
|
+
const testFile = path7.join(projectPath, ".claude-orka-write-test");
|
|
2411
|
+
await fs7.writeFile(testFile, "test");
|
|
2412
|
+
await fs7.remove(testFile);
|
|
2376
2413
|
return {
|
|
2377
2414
|
name: "Write permissions",
|
|
2378
2415
|
status: "pass",
|
|
@@ -2391,11 +2428,11 @@ async function checkWritePermissions() {
|
|
|
2391
2428
|
}
|
|
2392
2429
|
async function checkClaudeDir() {
|
|
2393
2430
|
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
2394
|
-
const claudeDir =
|
|
2395
|
-
const historyFile =
|
|
2431
|
+
const claudeDir = path7.join(homeDir, ".claude");
|
|
2432
|
+
const historyFile = path7.join(claudeDir, "history.jsonl");
|
|
2396
2433
|
try {
|
|
2397
|
-
const dirExists = await
|
|
2398
|
-
const historyExists = await
|
|
2434
|
+
const dirExists = await fs7.pathExists(claudeDir);
|
|
2435
|
+
const historyExists = await fs7.pathExists(historyFile);
|
|
2399
2436
|
if (dirExists && historyExists) {
|
|
2400
2437
|
return {
|
|
2401
2438
|
name: "Claude directory",
|
|
@@ -2612,13 +2649,13 @@ async function checkClaudeCLI() {
|
|
|
2612
2649
|
}
|
|
2613
2650
|
|
|
2614
2651
|
// src/cli/index.ts
|
|
2615
|
-
var
|
|
2616
|
-
var
|
|
2617
|
-
var packageJsonPath =
|
|
2652
|
+
var __filename3 = fileURLToPath3(import.meta.url);
|
|
2653
|
+
var __dirname3 = dirname3(__filename3);
|
|
2654
|
+
var packageJsonPath = join2(__dirname3, "../package.json");
|
|
2618
2655
|
try {
|
|
2619
2656
|
readFileSync(packageJsonPath, "utf-8");
|
|
2620
2657
|
} catch {
|
|
2621
|
-
packageJsonPath =
|
|
2658
|
+
packageJsonPath = join2(__dirname3, "../../package.json");
|
|
2622
2659
|
}
|
|
2623
2660
|
var packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
2624
2661
|
var version = packageJson.version;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// electron/main/main.ts
|
|
2
2
|
import { app, BrowserWindow, ipcMain, shell } from "electron";
|
|
3
|
-
import
|
|
4
|
-
import { fileURLToPath as
|
|
3
|
+
import path6 from "path";
|
|
4
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
5
5
|
|
|
6
6
|
// src/core/StateManager.ts
|
|
7
|
-
import
|
|
8
|
-
import
|
|
7
|
+
import path4 from "path";
|
|
8
|
+
import fs4 from "fs-extra";
|
|
9
9
|
|
|
10
10
|
// src/utils/tmux.ts
|
|
11
11
|
import execa from "execa";
|
|
@@ -65,6 +65,11 @@ var Logger = class {
|
|
|
65
65
|
var logger = new Logger();
|
|
66
66
|
|
|
67
67
|
// src/utils/tmux.ts
|
|
68
|
+
import * as path2 from "path";
|
|
69
|
+
import * as fs2 from "fs";
|
|
70
|
+
import { fileURLToPath } from "url";
|
|
71
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
72
|
+
var __dirname = path2.dirname(__filename);
|
|
68
73
|
var TmuxError = class extends Error {
|
|
69
74
|
constructor(message, command, originalError) {
|
|
70
75
|
super(message);
|
|
@@ -93,6 +98,7 @@ var TmuxCommands = class {
|
|
|
93
98
|
logger.debug(`Creating tmux session: ${name} at ${projectPath}`);
|
|
94
99
|
await execa("tmux", ["new-session", "-d", "-s", name, "-c", projectPath]);
|
|
95
100
|
logger.info(`Tmux session created: ${name}`);
|
|
101
|
+
await this.applyOrkaTheme(name);
|
|
96
102
|
} catch (error) {
|
|
97
103
|
throw new TmuxError(
|
|
98
104
|
`Failed to create tmux session: ${name}`,
|
|
@@ -101,6 +107,37 @@ var TmuxCommands = class {
|
|
|
101
107
|
);
|
|
102
108
|
}
|
|
103
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Apply Claude-Orka custom tmux theme to a session
|
|
112
|
+
*/
|
|
113
|
+
static async applyOrkaTheme(sessionName) {
|
|
114
|
+
try {
|
|
115
|
+
const possiblePaths = [
|
|
116
|
+
// When installed globally via npm
|
|
117
|
+
path2.join(__dirname, "../../.tmux.orka.conf"),
|
|
118
|
+
// When running from source
|
|
119
|
+
path2.join(process.cwd(), ".tmux.orka.conf"),
|
|
120
|
+
// Fallback: check in the module directory
|
|
121
|
+
path2.join(__dirname, "../../../.tmux.orka.conf")
|
|
122
|
+
];
|
|
123
|
+
let configPath = null;
|
|
124
|
+
for (const p of possiblePaths) {
|
|
125
|
+
if (fs2.existsSync(p)) {
|
|
126
|
+
configPath = p;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!configPath) {
|
|
131
|
+
logger.warn("Claude-Orka tmux config not found, skipping theme application");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
logger.debug(`Applying Orka theme from: ${configPath}`);
|
|
135
|
+
await execa("tmux", ["source-file", "-t", sessionName, configPath]);
|
|
136
|
+
logger.info("Claude-Orka theme applied successfully");
|
|
137
|
+
} catch (error) {
|
|
138
|
+
logger.warn("Failed to apply Orka theme, continuing with default tmux theme", error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
104
141
|
/**
|
|
105
142
|
* Abrir una terminal que se adjunte a una sesión tmux existente
|
|
106
143
|
* (Solo macOS por ahora)
|
|
@@ -383,18 +420,18 @@ var TmuxCommands = class {
|
|
|
383
420
|
};
|
|
384
421
|
|
|
385
422
|
// src/utils/claude-history.ts
|
|
386
|
-
import
|
|
423
|
+
import fs3 from "fs-extra";
|
|
387
424
|
import os from "os";
|
|
388
|
-
import
|
|
389
|
-
var CLAUDE_HISTORY_PATH =
|
|
425
|
+
import path3 from "path";
|
|
426
|
+
var CLAUDE_HISTORY_PATH = path3.join(os.homedir(), ".claude", "history.jsonl");
|
|
390
427
|
async function readClaudeHistory() {
|
|
391
428
|
try {
|
|
392
|
-
const exists = await
|
|
429
|
+
const exists = await fs3.pathExists(CLAUDE_HISTORY_PATH);
|
|
393
430
|
if (!exists) {
|
|
394
431
|
logger.warn(`Claude history file not found: ${CLAUDE_HISTORY_PATH}`);
|
|
395
432
|
return [];
|
|
396
433
|
}
|
|
397
|
-
const content = await
|
|
434
|
+
const content = await fs3.readFile(CLAUDE_HISTORY_PATH, "utf-8");
|
|
398
435
|
const lines = content.trim().split("\n").filter(Boolean);
|
|
399
436
|
const entries = [];
|
|
400
437
|
for (const line of lines) {
|
|
@@ -437,9 +474,9 @@ var StateManager = class {
|
|
|
437
474
|
orkaDir;
|
|
438
475
|
statePath;
|
|
439
476
|
constructor(projectPath) {
|
|
440
|
-
this.projectPath =
|
|
441
|
-
this.orkaDir =
|
|
442
|
-
this.statePath =
|
|
477
|
+
this.projectPath = path4.resolve(projectPath);
|
|
478
|
+
this.orkaDir = path4.join(this.projectPath, ".claude-orka");
|
|
479
|
+
this.statePath = path4.join(this.orkaDir, "state.json");
|
|
443
480
|
}
|
|
444
481
|
/**
|
|
445
482
|
* Initialize StateManager
|
|
@@ -448,7 +485,7 @@ var StateManager = class {
|
|
|
448
485
|
async initialize() {
|
|
449
486
|
logger.debug("Initializing StateManager");
|
|
450
487
|
await this.ensureDirectories();
|
|
451
|
-
if (!await
|
|
488
|
+
if (!await fs4.pathExists(this.statePath)) {
|
|
452
489
|
logger.info("Creating initial state.json");
|
|
453
490
|
const initialState = {
|
|
454
491
|
version: "1.0.0",
|
|
@@ -464,7 +501,7 @@ var StateManager = class {
|
|
|
464
501
|
* Create directory structure
|
|
465
502
|
*/
|
|
466
503
|
async ensureDirectories() {
|
|
467
|
-
await
|
|
504
|
+
await fs4.ensureDir(this.orkaDir);
|
|
468
505
|
logger.debug("Directories ensured");
|
|
469
506
|
}
|
|
470
507
|
/**
|
|
@@ -472,7 +509,7 @@ var StateManager = class {
|
|
|
472
509
|
*/
|
|
473
510
|
async read() {
|
|
474
511
|
try {
|
|
475
|
-
const content = await
|
|
512
|
+
const content = await fs4.readFile(this.statePath, "utf-8");
|
|
476
513
|
return JSON.parse(content);
|
|
477
514
|
} catch (error) {
|
|
478
515
|
logger.error("Failed to read state:", error);
|
|
@@ -485,7 +522,7 @@ var StateManager = class {
|
|
|
485
522
|
async save(state) {
|
|
486
523
|
try {
|
|
487
524
|
state.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
|
|
488
|
-
await
|
|
525
|
+
await fs4.writeFile(this.statePath, JSON.stringify(state, null, 2), "utf-8");
|
|
489
526
|
logger.debug("State saved");
|
|
490
527
|
} catch (error) {
|
|
491
528
|
logger.error("Failed to save state:", error);
|
|
@@ -701,8 +738,8 @@ var StateManager = class {
|
|
|
701
738
|
*/
|
|
702
739
|
async saveContext(type, id, content) {
|
|
703
740
|
const contextPath = type === "session" ? this.getSessionContextPath(id) : this.getForkContextPath(id);
|
|
704
|
-
const fullPath =
|
|
705
|
-
await
|
|
741
|
+
const fullPath = path4.join(this.projectPath, contextPath);
|
|
742
|
+
await fs4.writeFile(fullPath, content, "utf-8");
|
|
706
743
|
logger.info(`Context saved: ${contextPath}`);
|
|
707
744
|
return contextPath;
|
|
708
745
|
}
|
|
@@ -710,11 +747,11 @@ var StateManager = class {
|
|
|
710
747
|
* Leer un contexto desde archivo
|
|
711
748
|
*/
|
|
712
749
|
async readContext(contextPath) {
|
|
713
|
-
const fullPath =
|
|
714
|
-
if (!await
|
|
750
|
+
const fullPath = path4.join(this.projectPath, contextPath);
|
|
751
|
+
if (!await fs4.pathExists(fullPath)) {
|
|
715
752
|
throw new Error(`Context file not found: ${contextPath}`);
|
|
716
753
|
}
|
|
717
|
-
return await
|
|
754
|
+
return await fs4.readFile(fullPath, "utf-8");
|
|
718
755
|
}
|
|
719
756
|
// --- HELPERS ---
|
|
720
757
|
/**
|
|
@@ -739,15 +776,15 @@ var StateManager = class {
|
|
|
739
776
|
|
|
740
777
|
// src/core/SessionManager.ts
|
|
741
778
|
import { v4 as uuidv4 } from "uuid";
|
|
742
|
-
import
|
|
743
|
-
import { fileURLToPath } from "url";
|
|
744
|
-
import { dirname } from "path";
|
|
745
|
-
import
|
|
779
|
+
import path5 from "path";
|
|
780
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
781
|
+
import { dirname as dirname2 } from "path";
|
|
782
|
+
import fs5 from "fs-extra";
|
|
746
783
|
import { spawn } from "child_process";
|
|
747
784
|
import { createRequire } from "module";
|
|
748
785
|
var require2 = createRequire(import.meta.url);
|
|
749
|
-
var
|
|
750
|
-
var
|
|
786
|
+
var __filename2 = fileURLToPath2(import.meta.url);
|
|
787
|
+
var __dirname2 = dirname2(__filename2);
|
|
751
788
|
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
752
789
|
var SessionManager = class {
|
|
753
790
|
stateManager;
|
|
@@ -1124,12 +1161,12 @@ var SessionManager = class {
|
|
|
1124
1161
|
throw new Error(`Fork ${forkId} not found`);
|
|
1125
1162
|
}
|
|
1126
1163
|
logger.info(`Generating export for fork: ${fork.name}`);
|
|
1127
|
-
const exportsDir =
|
|
1128
|
-
await
|
|
1164
|
+
const exportsDir = path5.join(this.projectPath, ".claude-orka", "exports");
|
|
1165
|
+
await fs5.ensureDir(exportsDir);
|
|
1129
1166
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
1130
1167
|
const exportName = `fork-${fork.name}-${timestamp}.md`;
|
|
1131
1168
|
const relativeExportPath = `.claude-orka/exports/${exportName}`;
|
|
1132
|
-
const absoluteExportPath =
|
|
1169
|
+
const absoluteExportPath = path5.join(this.projectPath, relativeExportPath);
|
|
1133
1170
|
const prompt = `
|
|
1134
1171
|
Please generate a complete summary of this fork conversation "${fork.name}" and save it to the file:
|
|
1135
1172
|
\`${absoluteExportPath}\`
|
|
@@ -1205,17 +1242,17 @@ Write the summary in Markdown format and save it to the specified file.
|
|
|
1205
1242
|
throw new Error(`Parent ${parentName} is not active. Cannot send merge command.`);
|
|
1206
1243
|
}
|
|
1207
1244
|
let contextPath = fork.contextPath;
|
|
1208
|
-
let fullPath =
|
|
1209
|
-
let exists = await
|
|
1245
|
+
let fullPath = path5.join(this.projectPath, contextPath);
|
|
1246
|
+
let exists = await fs5.pathExists(fullPath);
|
|
1210
1247
|
if (!exists) {
|
|
1211
1248
|
logger.warn(`Export file not found: ${contextPath}. Looking for most recent export...`);
|
|
1212
|
-
const exportsDir =
|
|
1213
|
-
const files = await
|
|
1249
|
+
const exportsDir = path5.join(this.projectPath, ".claude-orka", "exports");
|
|
1250
|
+
const files = await fs5.readdir(exportsDir);
|
|
1214
1251
|
const forkExports = files.filter((f) => f.startsWith(`fork-${fork.name}-`) && f.endsWith(".md")).sort().reverse();
|
|
1215
1252
|
if (forkExports.length > 0) {
|
|
1216
1253
|
contextPath = `.claude-orka/exports/${forkExports[0]}`;
|
|
1217
|
-
fullPath =
|
|
1218
|
-
exists = await
|
|
1254
|
+
fullPath = path5.join(this.projectPath, contextPath);
|
|
1255
|
+
exists = await fs5.pathExists(fullPath);
|
|
1219
1256
|
logger.info(`Using most recent export: ${contextPath}`);
|
|
1220
1257
|
}
|
|
1221
1258
|
}
|
|
@@ -1295,11 +1332,11 @@ Analyze the content and help me integrate the changes and learnings from the for
|
|
|
1295
1332
|
logger.warn("Electron not available, skipping UI launch");
|
|
1296
1333
|
return;
|
|
1297
1334
|
}
|
|
1298
|
-
let mainPath =
|
|
1299
|
-
if (!
|
|
1300
|
-
mainPath =
|
|
1335
|
+
let mainPath = path5.join(__dirname2, "../../electron/main/main.js");
|
|
1336
|
+
if (!fs5.existsSync(mainPath)) {
|
|
1337
|
+
mainPath = path5.join(__dirname2, "../../dist/electron/main/main.js");
|
|
1301
1338
|
}
|
|
1302
|
-
if (!
|
|
1339
|
+
if (!fs5.existsSync(mainPath)) {
|
|
1303
1340
|
logger.warn(`Electron main.js not found at ${mainPath}, skipping UI launch`);
|
|
1304
1341
|
return;
|
|
1305
1342
|
}
|
|
@@ -1574,8 +1611,8 @@ var ClaudeOrka = class {
|
|
|
1574
1611
|
// electron/main/main.ts
|
|
1575
1612
|
import chokidar from "chokidar";
|
|
1576
1613
|
import execa2 from "execa";
|
|
1577
|
-
var
|
|
1578
|
-
var
|
|
1614
|
+
var __filename3 = fileURLToPath3(import.meta.url);
|
|
1615
|
+
var __dirname3 = path6.dirname(__filename3);
|
|
1579
1616
|
var windows = /* @__PURE__ */ new Map();
|
|
1580
1617
|
var currentSessionId = null;
|
|
1581
1618
|
var currentProjectPath = null;
|
|
@@ -1585,7 +1622,7 @@ function createWindow(sessionId, projectPath) {
|
|
|
1585
1622
|
existingWindow.focus();
|
|
1586
1623
|
return existingWindow;
|
|
1587
1624
|
}
|
|
1588
|
-
const projectName =
|
|
1625
|
+
const projectName = path6.basename(projectPath);
|
|
1589
1626
|
const mainWindow = new BrowserWindow({
|
|
1590
1627
|
width: 600,
|
|
1591
1628
|
height: 800,
|
|
@@ -1597,7 +1634,7 @@ function createWindow(sessionId, projectPath) {
|
|
|
1597
1634
|
resizable: true,
|
|
1598
1635
|
title: `Claude Orka - ${projectName}`,
|
|
1599
1636
|
webPreferences: {
|
|
1600
|
-
preload:
|
|
1637
|
+
preload: path6.join(__dirname3, "../preload/preload.js"),
|
|
1601
1638
|
contextIsolation: true,
|
|
1602
1639
|
nodeIntegration: false
|
|
1603
1640
|
}
|
|
@@ -1607,7 +1644,7 @@ function createWindow(sessionId, projectPath) {
|
|
|
1607
1644
|
if (process.env.NODE_ENV === "development") {
|
|
1608
1645
|
mainWindow.loadURL("http://localhost:5173");
|
|
1609
1646
|
} else {
|
|
1610
|
-
const indexPath =
|
|
1647
|
+
const indexPath = path6.join(__dirname3, "../renderer/index.html");
|
|
1611
1648
|
mainWindow.loadFile(indexPath);
|
|
1612
1649
|
}
|
|
1613
1650
|
watchStateFile(projectPath, mainWindow);
|
|
@@ -1618,7 +1655,7 @@ function createWindow(sessionId, projectPath) {
|
|
|
1618
1655
|
return mainWindow;
|
|
1619
1656
|
}
|
|
1620
1657
|
function watchStateFile(projectPath, window) {
|
|
1621
|
-
const statePath =
|
|
1658
|
+
const statePath = path6.join(projectPath, ".claude-orka/state.json");
|
|
1622
1659
|
const watcher = chokidar.watch(statePath, {
|
|
1623
1660
|
persistent: true,
|
|
1624
1661
|
ignoreInitial: true
|
|
@@ -1707,7 +1744,7 @@ ipcMain.handle("open-export-file", async (_, exportPath) => {
|
|
|
1707
1744
|
if (!currentProjectPath) {
|
|
1708
1745
|
throw new Error("No active project");
|
|
1709
1746
|
}
|
|
1710
|
-
const fullPath =
|
|
1747
|
+
const fullPath = path6.join(currentProjectPath, exportPath);
|
|
1711
1748
|
await shell.openPath(fullPath);
|
|
1712
1749
|
});
|
|
1713
1750
|
ipcMain.handle("open-project-folder", async () => {
|
package/dist/src/utils/tmux.d.ts
CHANGED
|
@@ -18,6 +18,10 @@ export declare class TmuxCommands {
|
|
|
18
18
|
* Crear una nueva sesión tmux en modo detached
|
|
19
19
|
*/
|
|
20
20
|
static createSession(name: string, projectPath: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Apply Claude-Orka custom tmux theme to a session
|
|
23
|
+
*/
|
|
24
|
+
private static applyOrkaTheme;
|
|
21
25
|
/**
|
|
22
26
|
* Abrir una terminal que se adjunte a una sesión tmux existente
|
|
23
27
|
* (Solo macOS por ahora)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../../src/utils/tmux.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../../src/utils/tmux.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;IACE,OAAO,EAAE,MAAM;IAAS,aAAa,CAAC,EAAE,GAAG;gBAAnE,OAAO,EAAE,MAAM,EAAS,OAAO,EAAE,MAAM,EAAS,aAAa,CAAC,EAAE,GAAG,YAAA;CAIhF;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS5C;;OAEG;WACU,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB5E;;OAEG;mBACkB,cAAc;IAqCnC;;;OAGG;WACU,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CnE;;OAEG;WACU,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D;;OAEG;WACU,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASjE;;OAEG;WACU,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBhE;;OAEG;WACU,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBlE;;;;;OAKG;WACU,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BvF;;;;OAIG;WACU,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB9D;;OAEG;WACU,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;OAGG;WACU,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE;;OAEG;WACU,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD;;;;OAIG;WACU,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavE;;;;;OAKG;WACU,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBnF;;OAEG;WACU,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAmB1E"}
|
package/dist/src/utils/tmux.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import execa from 'execa';
|
|
2
2
|
import { logger } from './logger';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
// Get __dirname equivalent in ES modules
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
3
9
|
/**
|
|
4
10
|
* Error personalizado para comandos tmux
|
|
5
11
|
*/
|
|
@@ -37,11 +43,48 @@ export class TmuxCommands {
|
|
|
37
43
|
logger.debug(`Creating tmux session: ${name} at ${projectPath}`);
|
|
38
44
|
await execa('tmux', ['new-session', '-d', '-s', name, '-c', projectPath]);
|
|
39
45
|
logger.info(`Tmux session created: ${name}`);
|
|
46
|
+
// Apply Claude-Orka custom theme
|
|
47
|
+
await this.applyOrkaTheme(name);
|
|
40
48
|
}
|
|
41
49
|
catch (error) {
|
|
42
50
|
throw new TmuxError(`Failed to create tmux session: ${name}`, `tmux new-session -d -s ${name} -c ${projectPath}`, error);
|
|
43
51
|
}
|
|
44
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Apply Claude-Orka custom tmux theme to a session
|
|
55
|
+
*/
|
|
56
|
+
static async applyOrkaTheme(sessionName) {
|
|
57
|
+
try {
|
|
58
|
+
// Find the config file (look for it in the package installation directory)
|
|
59
|
+
const possiblePaths = [
|
|
60
|
+
// When installed globally via npm
|
|
61
|
+
path.join(__dirname, '../../.tmux.orka.conf'),
|
|
62
|
+
// When running from source
|
|
63
|
+
path.join(process.cwd(), '.tmux.orka.conf'),
|
|
64
|
+
// Fallback: check in the module directory
|
|
65
|
+
path.join(__dirname, '../../../.tmux.orka.conf'),
|
|
66
|
+
];
|
|
67
|
+
let configPath = null;
|
|
68
|
+
for (const p of possiblePaths) {
|
|
69
|
+
if (fs.existsSync(p)) {
|
|
70
|
+
configPath = p;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!configPath) {
|
|
75
|
+
logger.warn('Claude-Orka tmux config not found, skipping theme application');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
logger.debug(`Applying Orka theme from: ${configPath}`);
|
|
79
|
+
// Source the config file for this specific session
|
|
80
|
+
await execa('tmux', ['source-file', '-t', sessionName, configPath]);
|
|
81
|
+
logger.info('Claude-Orka theme applied successfully');
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
// Don't fail the session creation if theme application fails
|
|
85
|
+
logger.warn('Failed to apply Orka theme, continuing with default tmux theme', error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
45
88
|
/**
|
|
46
89
|
* Abrir una terminal que se adjunte a una sesión tmux existente
|
|
47
90
|
* (Solo macOS por ahora)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../../src/utils/tmux.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../../src/utils/tmux.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enruana/claude-orka",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "SDK for orchestrating Claude Code sessions with tmux - Branch management for conversations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"files": [
|
|
55
55
|
"dist",
|
|
56
56
|
"bin",
|
|
57
|
+
".tmux.orka.conf",
|
|
57
58
|
"README.md",
|
|
58
59
|
"LICENSE"
|
|
59
60
|
],
|