@askexenow/exe-os 0.8.88 → 0.8.89
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/dist/assets/ghostty.conf +83 -0
- package/dist/bin/cli.js +43 -0
- package/dist/bin/exe-new-employee.js +43 -0
- package/dist/bin/install.js +43 -0
- package/package.json +3 -3
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Exe OS — Ghostty defaults
|
|
2
|
+
# Optimized for tmux + Claude Code agent workflows
|
|
3
|
+
|
|
4
|
+
font-size = 11
|
|
5
|
+
|
|
6
|
+
# ─── Theme: warm light background ───────────────────────────
|
|
7
|
+
background = #fff8f0
|
|
8
|
+
foreground = #000000
|
|
9
|
+
cursor-color = #000000
|
|
10
|
+
selection-background = #b4d5fe
|
|
11
|
+
|
|
12
|
+
# ANSI palette (0-15)
|
|
13
|
+
palette = 0=#000000
|
|
14
|
+
palette = 1=#c91b00
|
|
15
|
+
palette = 2=#00c200
|
|
16
|
+
palette = 3=#c7c400
|
|
17
|
+
palette = 4=#0225c7
|
|
18
|
+
palette = 5=#c930c7
|
|
19
|
+
palette = 6=#00c5c7
|
|
20
|
+
palette = 7=#c7c7c7
|
|
21
|
+
palette = 8=#686868
|
|
22
|
+
palette = 9=#ff6e67
|
|
23
|
+
palette = 10=#5ffa68
|
|
24
|
+
palette = 11=#e5daab
|
|
25
|
+
palette = 12=#6871ff
|
|
26
|
+
palette = 13=#ff77ff
|
|
27
|
+
palette = 14=#60fdff
|
|
28
|
+
palette = 15=#ffffff
|
|
29
|
+
|
|
30
|
+
# ─── Ghostty → tmux keybindings ─────────────────────────────
|
|
31
|
+
# Forward Cmd+key combos to tmux as prefix sequences.
|
|
32
|
+
# Tmux prefix is Ctrl+B (\x02).
|
|
33
|
+
|
|
34
|
+
# Splits (native Ghostty splits)
|
|
35
|
+
keybind = super+d=new_split:right
|
|
36
|
+
keybind = super+shift+d=new_split:down
|
|
37
|
+
|
|
38
|
+
# Close pane/tab
|
|
39
|
+
keybind = super+w=close_surface
|
|
40
|
+
|
|
41
|
+
# New tab
|
|
42
|
+
keybind = super+t=text:\x02t
|
|
43
|
+
|
|
44
|
+
# Tab navigation: Cmd+Shift+[ / ]
|
|
45
|
+
keybind = super+shift+[=text:\x02[
|
|
46
|
+
keybind = super+shift+]=text:\x02]
|
|
47
|
+
|
|
48
|
+
# Go to tab by number: Cmd+1..9
|
|
49
|
+
keybind = super+1=text:\x021
|
|
50
|
+
keybind = super+digit_1=text:\x021
|
|
51
|
+
keybind = super+2=text:\x022
|
|
52
|
+
keybind = super+digit_2=text:\x022
|
|
53
|
+
keybind = super+3=text:\x023
|
|
54
|
+
keybind = super+digit_3=text:\x023
|
|
55
|
+
keybind = super+4=text:\x024
|
|
56
|
+
keybind = super+digit_4=text:\x024
|
|
57
|
+
keybind = super+5=text:\x025
|
|
58
|
+
keybind = super+digit_5=text:\x025
|
|
59
|
+
keybind = super+6=text:\x026
|
|
60
|
+
keybind = super+digit_6=text:\x026
|
|
61
|
+
keybind = super+7=text:\x027
|
|
62
|
+
keybind = super+digit_7=text:\x027
|
|
63
|
+
keybind = super+8=text:\x028
|
|
64
|
+
keybind = super+digit_8=text:\x028
|
|
65
|
+
keybind = super+9=text:\x029
|
|
66
|
+
|
|
67
|
+
# Zoom pane (fullscreen): Cmd+Shift+Enter
|
|
68
|
+
keybind = super+shift+enter=text:\x02z
|
|
69
|
+
|
|
70
|
+
# Clear screen: Cmd+K
|
|
71
|
+
keybind = super+k=text:\x02k
|
|
72
|
+
|
|
73
|
+
# Search: Cmd+F
|
|
74
|
+
keybind = super+f=text:\x02f
|
|
75
|
+
|
|
76
|
+
# Resize splits: Cmd+Ctrl+Arrow
|
|
77
|
+
keybind = super+ctrl+arrow_up=text:\x02\x1b[A
|
|
78
|
+
keybind = super+ctrl+arrow_down=text:\x02\x1b[B
|
|
79
|
+
keybind = super+ctrl+arrow_right=text:\x02\x1b[C
|
|
80
|
+
keybind = super+ctrl+arrow_left=text:\x02\x1b[D
|
|
81
|
+
|
|
82
|
+
# Equalize splits: Cmd+Ctrl+=
|
|
83
|
+
keybind = super+ctrl+=text:\x02=
|
package/dist/bin/cli.js
CHANGED
|
@@ -572,6 +572,7 @@ __export(installer_exports, {
|
|
|
572
572
|
registerMcpServer: () => registerMcpServer,
|
|
573
573
|
resolvePackageRoot: () => resolvePackageRoot,
|
|
574
574
|
runInstaller: () => runInstaller,
|
|
575
|
+
setupGhostty: () => setupGhostty,
|
|
575
576
|
setupTmux: () => setupTmux
|
|
576
577
|
});
|
|
577
578
|
import { readFile as readFile3, writeFile as writeFile3, mkdir as mkdir3, readdir } from "fs/promises";
|
|
@@ -1085,6 +1086,48 @@ ${sourceLine}
|
|
|
1085
1086
|
}
|
|
1086
1087
|
process.stderr.write("exe-os: tmux config installed\n");
|
|
1087
1088
|
}
|
|
1089
|
+
function setupGhostty(home) {
|
|
1090
|
+
const homeDir = home ?? os4.homedir();
|
|
1091
|
+
const xdgConfig = path4.join(homeDir, ".config", "ghostty");
|
|
1092
|
+
const macConfig = path4.join(homeDir, "Library", "Application Support", "com.mitchellh.ghostty");
|
|
1093
|
+
const ghosttyInstalled = existsSync4(xdgConfig) || existsSync4(macConfig) || (() => {
|
|
1094
|
+
try {
|
|
1095
|
+
execSync2("which ghostty 2>/dev/null");
|
|
1096
|
+
return true;
|
|
1097
|
+
} catch {
|
|
1098
|
+
return false;
|
|
1099
|
+
}
|
|
1100
|
+
})();
|
|
1101
|
+
if (!ghosttyInstalled) {
|
|
1102
|
+
return;
|
|
1103
|
+
}
|
|
1104
|
+
const pkgRoot = resolvePackageRoot();
|
|
1105
|
+
const assetPath = path4.join(pkgRoot, "dist", "assets", "ghostty.conf");
|
|
1106
|
+
if (!existsSync4(assetPath)) {
|
|
1107
|
+
process.stderr.write("exe-os: ghostty.conf asset not found \u2014 skipping Ghostty setup\n");
|
|
1108
|
+
return;
|
|
1109
|
+
}
|
|
1110
|
+
const configDir = xdgConfig;
|
|
1111
|
+
const configPath = path4.join(configDir, "config");
|
|
1112
|
+
const backupPath = path4.join(configDir, "config.backup");
|
|
1113
|
+
mkdirSync2(configDir, { recursive: true });
|
|
1114
|
+
if (existsSync4(configPath)) {
|
|
1115
|
+
const existing = readFileSync3(configPath, "utf8");
|
|
1116
|
+
if (existing.includes("Exe OS")) {
|
|
1117
|
+
copyFileSync(assetPath, configPath);
|
|
1118
|
+
} else {
|
|
1119
|
+
if (!existsSync4(backupPath)) {
|
|
1120
|
+
copyFileSync(configPath, backupPath);
|
|
1121
|
+
process.stderr.write(`exe-os: backed up existing Ghostty config to ${backupPath}
|
|
1122
|
+
`);
|
|
1123
|
+
}
|
|
1124
|
+
copyFileSync(assetPath, configPath);
|
|
1125
|
+
}
|
|
1126
|
+
} else {
|
|
1127
|
+
copyFileSync(assetPath, configPath);
|
|
1128
|
+
}
|
|
1129
|
+
process.stderr.write("exe-os: Ghostty config installed\n");
|
|
1130
|
+
}
|
|
1088
1131
|
function summarizeSymlinkResults(results) {
|
|
1089
1132
|
if (results.length === 0) return "no employees in roster";
|
|
1090
1133
|
const created = results.filter((r) => r.action === "created").length;
|
|
@@ -994,6 +994,7 @@ __export(installer_exports, {
|
|
|
994
994
|
registerMcpServer: () => registerMcpServer,
|
|
995
995
|
resolvePackageRoot: () => resolvePackageRoot,
|
|
996
996
|
runInstaller: () => runInstaller,
|
|
997
|
+
setupGhostty: () => setupGhostty,
|
|
997
998
|
setupTmux: () => setupTmux
|
|
998
999
|
});
|
|
999
1000
|
import { readFile as readFile3, writeFile as writeFile3, mkdir as mkdir3, readdir } from "fs/promises";
|
|
@@ -1507,6 +1508,48 @@ ${sourceLine}
|
|
|
1507
1508
|
}
|
|
1508
1509
|
process.stderr.write("exe-os: tmux config installed\n");
|
|
1509
1510
|
}
|
|
1511
|
+
function setupGhostty(home) {
|
|
1512
|
+
const homeDir = home ?? os4.homedir();
|
|
1513
|
+
const xdgConfig = path8.join(homeDir, ".config", "ghostty");
|
|
1514
|
+
const macConfig = path8.join(homeDir, "Library", "Application Support", "com.mitchellh.ghostty");
|
|
1515
|
+
const ghosttyInstalled = existsSync8(xdgConfig) || existsSync8(macConfig) || (() => {
|
|
1516
|
+
try {
|
|
1517
|
+
execSync2("which ghostty 2>/dev/null");
|
|
1518
|
+
return true;
|
|
1519
|
+
} catch {
|
|
1520
|
+
return false;
|
|
1521
|
+
}
|
|
1522
|
+
})();
|
|
1523
|
+
if (!ghosttyInstalled) {
|
|
1524
|
+
return;
|
|
1525
|
+
}
|
|
1526
|
+
const pkgRoot = resolvePackageRoot();
|
|
1527
|
+
const assetPath = path8.join(pkgRoot, "dist", "assets", "ghostty.conf");
|
|
1528
|
+
if (!existsSync8(assetPath)) {
|
|
1529
|
+
process.stderr.write("exe-os: ghostty.conf asset not found \u2014 skipping Ghostty setup\n");
|
|
1530
|
+
return;
|
|
1531
|
+
}
|
|
1532
|
+
const configDir = xdgConfig;
|
|
1533
|
+
const configPath = path8.join(configDir, "config");
|
|
1534
|
+
const backupPath = path8.join(configDir, "config.backup");
|
|
1535
|
+
mkdirSync5(configDir, { recursive: true });
|
|
1536
|
+
if (existsSync8(configPath)) {
|
|
1537
|
+
const existing = readFileSync7(configPath, "utf8");
|
|
1538
|
+
if (existing.includes("Exe OS")) {
|
|
1539
|
+
copyFileSync(assetPath, configPath);
|
|
1540
|
+
} else {
|
|
1541
|
+
if (!existsSync8(backupPath)) {
|
|
1542
|
+
copyFileSync(configPath, backupPath);
|
|
1543
|
+
process.stderr.write(`exe-os: backed up existing Ghostty config to ${backupPath}
|
|
1544
|
+
`);
|
|
1545
|
+
}
|
|
1546
|
+
copyFileSync(assetPath, configPath);
|
|
1547
|
+
}
|
|
1548
|
+
} else {
|
|
1549
|
+
copyFileSync(assetPath, configPath);
|
|
1550
|
+
}
|
|
1551
|
+
process.stderr.write("exe-os: Ghostty config installed\n");
|
|
1552
|
+
}
|
|
1510
1553
|
function summarizeSymlinkResults(results) {
|
|
1511
1554
|
if (results.length === 0) return "no employees in roster";
|
|
1512
1555
|
const created = results.filter((r) => r.action === "created").length;
|
package/dist/bin/install.js
CHANGED
|
@@ -914,6 +914,48 @@ ${sourceLine}
|
|
|
914
914
|
}
|
|
915
915
|
process.stderr.write("exe-os: tmux config installed\n");
|
|
916
916
|
}
|
|
917
|
+
function setupGhostty(home) {
|
|
918
|
+
const homeDir = home ?? os4.homedir();
|
|
919
|
+
const xdgConfig = path4.join(homeDir, ".config", "ghostty");
|
|
920
|
+
const macConfig = path4.join(homeDir, "Library", "Application Support", "com.mitchellh.ghostty");
|
|
921
|
+
const ghosttyInstalled = existsSync4(xdgConfig) || existsSync4(macConfig) || (() => {
|
|
922
|
+
try {
|
|
923
|
+
execSync2("which ghostty 2>/dev/null");
|
|
924
|
+
return true;
|
|
925
|
+
} catch {
|
|
926
|
+
return false;
|
|
927
|
+
}
|
|
928
|
+
})();
|
|
929
|
+
if (!ghosttyInstalled) {
|
|
930
|
+
return;
|
|
931
|
+
}
|
|
932
|
+
const pkgRoot = resolvePackageRoot();
|
|
933
|
+
const assetPath = path4.join(pkgRoot, "dist", "assets", "ghostty.conf");
|
|
934
|
+
if (!existsSync4(assetPath)) {
|
|
935
|
+
process.stderr.write("exe-os: ghostty.conf asset not found \u2014 skipping Ghostty setup\n");
|
|
936
|
+
return;
|
|
937
|
+
}
|
|
938
|
+
const configDir = xdgConfig;
|
|
939
|
+
const configPath = path4.join(configDir, "config");
|
|
940
|
+
const backupPath = path4.join(configDir, "config.backup");
|
|
941
|
+
mkdirSync2(configDir, { recursive: true });
|
|
942
|
+
if (existsSync4(configPath)) {
|
|
943
|
+
const existing = readFileSync3(configPath, "utf8");
|
|
944
|
+
if (existing.includes("Exe OS")) {
|
|
945
|
+
copyFileSync(assetPath, configPath);
|
|
946
|
+
} else {
|
|
947
|
+
if (!existsSync4(backupPath)) {
|
|
948
|
+
copyFileSync(configPath, backupPath);
|
|
949
|
+
process.stderr.write(`exe-os: backed up existing Ghostty config to ${backupPath}
|
|
950
|
+
`);
|
|
951
|
+
}
|
|
952
|
+
copyFileSync(assetPath, configPath);
|
|
953
|
+
}
|
|
954
|
+
} else {
|
|
955
|
+
copyFileSync(assetPath, configPath);
|
|
956
|
+
}
|
|
957
|
+
process.stderr.write("exe-os: Ghostty config installed\n");
|
|
958
|
+
}
|
|
917
959
|
function summarizeSymlinkResults(results) {
|
|
918
960
|
if (results.length === 0) return "no employees in roster";
|
|
919
961
|
const created = results.filter((r) => r.action === "created").length;
|
|
@@ -1183,6 +1225,7 @@ if (args.includes("--commands-only")) {
|
|
|
1183
1225
|
try {
|
|
1184
1226
|
await runInstaller();
|
|
1185
1227
|
setupTmux();
|
|
1228
|
+
setupGhostty();
|
|
1186
1229
|
try {
|
|
1187
1230
|
const { normalizeRosterCase: normalizeRosterCase2 } = await Promise.resolve().then(() => (init_employees(), employees_exports));
|
|
1188
1231
|
const changed = await normalizeRosterCase2();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.89",
|
|
4
4
|
"description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
|
|
5
5
|
"license": "CC-BY-NC-4.0",
|
|
6
6
|
"type": "module",
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
"test": "vitest run",
|
|
62
62
|
"test:watch": "vitest",
|
|
63
63
|
"typecheck": "tsc --noEmit",
|
|
64
|
-
"build": "tsup && mkdir -p dist/assets && cp src/assets/tmux.conf dist/assets/ && cp src/bin/exe-start.sh dist/bin/exe-start.sh",
|
|
65
|
-
"deploy": "node dist/bin/pre-build-guard.js 2>/dev/null; tsup && mkdir -p dist/assets && cp src/assets/tmux.conf dist/assets/ && cp src/bin/exe-start.sh dist/bin/exe-start.sh && npm install -g . && node dist/bin/install.js --global && echo '[exe-os] Deploy complete. MCP servers will auto-reconnect on next tool call.'",
|
|
64
|
+
"build": "tsup && mkdir -p dist/assets && cp src/assets/tmux.conf dist/assets/ && cp src/assets/ghostty.conf dist/assets/ && cp src/bin/exe-start.sh dist/bin/exe-start.sh",
|
|
65
|
+
"deploy": "node dist/bin/pre-build-guard.js 2>/dev/null; tsup && mkdir -p dist/assets && cp src/assets/tmux.conf dist/assets/ && cp src/assets/ghostty.conf dist/assets/ && cp src/bin/exe-start.sh dist/bin/exe-start.sh && npm install -g . && node dist/bin/install.js --global && echo '[exe-os] Deploy complete. MCP servers will auto-reconnect on next tool call.'",
|
|
66
66
|
"postinstall": "node dist/bin/install.js --global 2>/dev/null || true",
|
|
67
67
|
"prepublishOnly": "npm run typecheck && npm run build && node dist/bin/customer-readiness.js",
|
|
68
68
|
"test:publish": "npx vitest run --maxWorkers=4 --exclude 'tests/tui/**' --exclude 'tests/lib/tmux-routing.test.ts' --exclude 'tests/lib/intercom-routing.test.ts' --exclude 'tests/gateway/**' --exclude 'tests/installer/setup-wizard.test.ts' --exclude 'tests/mcp/ingest-document.test.ts' --exclude 'tests/lib/hybrid-search.test.ts' --exclude 'tests/lib/worker-gate.test.ts'",
|