native-shortcuts-herd 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +212 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +219 -0
- package/dist/cli.js.map +1 -0
- package/dist/format.d.ts +5 -0
- package/dist/format.js +39 -0
- package/dist/format.js.map +1 -0
- package/dist/fs-utils.d.ts +22 -0
- package/dist/fs-utils.js +81 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/ghostty.d.ts +9 -0
- package/dist/ghostty.js +145 -0
- package/dist/ghostty.js.map +1 -0
- package/dist/herdr.d.ts +20 -0
- package/dist/herdr.js +197 -0
- package/dist/herdr.js.map +1 -0
- package/dist/installer.d.ts +6 -0
- package/dist/installer.js +121 -0
- package/dist/installer.js.map +1 -0
- package/dist/profiles.d.ts +15 -0
- package/dist/profiles.js +140 -0
- package/dist/profiles.js.map +1 -0
- package/dist/state.d.ts +3 -0
- package/dist/state.js +20 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -0
package/dist/ghostty.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { backupFile, configRoot, diffChange, ensureDir, homePath, readText, removeFile, runOptional, sortedUnique, writeText } from "./fs-utils.js";
|
|
4
|
+
const sidecarName = "ghostty.conf";
|
|
5
|
+
export function ghosttySidecarPath() {
|
|
6
|
+
return join(configRoot(), sidecarName);
|
|
7
|
+
}
|
|
8
|
+
export function discoverGhosttyConfigs(explicit) {
|
|
9
|
+
if (explicit?.length)
|
|
10
|
+
return sortedUnique(explicit.map(expandHome));
|
|
11
|
+
const candidates = [
|
|
12
|
+
homePath(".config", "ghostty", "config"),
|
|
13
|
+
homePath(".config", "ghostty", "config.ghostty"),
|
|
14
|
+
homePath("Library", "Application Support", "com.mitchellh.ghostty", "config"),
|
|
15
|
+
homePath("Library", "Application Support", "com.mitchellh.ghostty", "config.ghostty"),
|
|
16
|
+
homePath("Library", "Application Support", "com.cmuxterm.app", "config.ghostty")
|
|
17
|
+
];
|
|
18
|
+
const existing = candidates.filter((path) => existsSync(path));
|
|
19
|
+
return sortedUnique(existing.length ? existing : [homePath(".config", "ghostty", "config")]);
|
|
20
|
+
}
|
|
21
|
+
export function planGhosttyPatch(configPaths, lines) {
|
|
22
|
+
const sidecarPath = ghosttySidecarPath();
|
|
23
|
+
const sidecarContent = `${lines.join("\n").trimEnd()}\n`;
|
|
24
|
+
const changes = [diffChange(sidecarPath, existsSync(sidecarPath) ? readText(sidecarPath) : "", sidecarContent, "write ghostty sidecar")];
|
|
25
|
+
for (const configPath of configPaths) {
|
|
26
|
+
const before = existsSync(configPath) ? readText(configPath) : "";
|
|
27
|
+
const after = ensureInclude(before, sidecarPath);
|
|
28
|
+
changes.push(diffChange(configPath, before, after, "link ghostty sidecar"));
|
|
29
|
+
}
|
|
30
|
+
return changes;
|
|
31
|
+
}
|
|
32
|
+
export function applyGhosttyPatch(configPaths, lines, dryRun) {
|
|
33
|
+
const changes = planGhosttyPatch(configPaths, lines);
|
|
34
|
+
if (dryRun)
|
|
35
|
+
return changes;
|
|
36
|
+
ensureDir(configRoot());
|
|
37
|
+
for (const change of changes) {
|
|
38
|
+
if (change.kind === "noop" || change.kind === "warn")
|
|
39
|
+
continue;
|
|
40
|
+
backupFile(change.path, `ghostty-${basename(change.path)}`);
|
|
41
|
+
writeText(change.path, change.after ?? "");
|
|
42
|
+
}
|
|
43
|
+
return changes;
|
|
44
|
+
}
|
|
45
|
+
export function planGhosttyRevert(configPaths) {
|
|
46
|
+
const sidecarPath = ghosttySidecarPath();
|
|
47
|
+
const changes = [];
|
|
48
|
+
for (const configPath of configPaths) {
|
|
49
|
+
if (!existsSync(configPath))
|
|
50
|
+
continue;
|
|
51
|
+
const before = readText(configPath);
|
|
52
|
+
const after = removeInclude(before, sidecarPath);
|
|
53
|
+
changes.push(diffChange(configPath, before, after, "unlink ghostty sidecar"));
|
|
54
|
+
}
|
|
55
|
+
if (existsSync(sidecarPath)) {
|
|
56
|
+
changes.push({ path: sidecarPath, kind: "delete", message: "remove ghostty sidecar", before: readText(sidecarPath), after: "" });
|
|
57
|
+
}
|
|
58
|
+
return changes;
|
|
59
|
+
}
|
|
60
|
+
export function applyGhosttyRevert(configPaths, dryRun) {
|
|
61
|
+
const changes = planGhosttyRevert(configPaths);
|
|
62
|
+
if (dryRun)
|
|
63
|
+
return changes;
|
|
64
|
+
for (const change of changes) {
|
|
65
|
+
if (change.kind === "noop" || change.kind === "warn")
|
|
66
|
+
continue;
|
|
67
|
+
backupFile(change.path, `ghostty-revert-${basename(change.path)}`);
|
|
68
|
+
if (change.kind === "delete") {
|
|
69
|
+
removeFile(change.path);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
writeText(change.path, change.after ?? "");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return changes;
|
|
76
|
+
}
|
|
77
|
+
export function validateGhosttyConfigs(configPaths) {
|
|
78
|
+
const binary = findGhosttyBinary();
|
|
79
|
+
if (!binary)
|
|
80
|
+
return ["ghostty binary not found; skipped ghostty validation"];
|
|
81
|
+
const warnings = [];
|
|
82
|
+
for (const configPath of configPaths) {
|
|
83
|
+
const result = runOptional(binary, ["+validate-config", `--config-file=${configPath}`]);
|
|
84
|
+
if (!result.ok) {
|
|
85
|
+
warnings.push(`ghostty validation failed for ${configPath}: ${result.stderr || result.stdout || "unknown error"}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return warnings;
|
|
89
|
+
}
|
|
90
|
+
export function reloadGhosttyIfRunning() {
|
|
91
|
+
if (process.platform !== "darwin")
|
|
92
|
+
return;
|
|
93
|
+
const script = [
|
|
94
|
+
'tell application "System Events"',
|
|
95
|
+
' set appNames to {"Ghostty", "cmux"}',
|
|
96
|
+
" repeat with appName in appNames",
|
|
97
|
+
" if exists process appName then",
|
|
98
|
+
" tell application appName to activate",
|
|
99
|
+
" delay 0.1",
|
|
100
|
+
' keystroke "," using {command down, shift down}',
|
|
101
|
+
" end if",
|
|
102
|
+
" end repeat",
|
|
103
|
+
"end tell"
|
|
104
|
+
].join("\n");
|
|
105
|
+
runOptional("osascript", ["-e", script]);
|
|
106
|
+
}
|
|
107
|
+
function findGhosttyBinary() {
|
|
108
|
+
const candidates = [
|
|
109
|
+
"/Applications/Ghostty.app/Contents/MacOS/ghostty",
|
|
110
|
+
"/Applications/cmux.app/Contents/Resources/bin/ghostty",
|
|
111
|
+
"ghostty"
|
|
112
|
+
];
|
|
113
|
+
for (const candidate of candidates) {
|
|
114
|
+
if (candidate.includes("/") && !existsSync(candidate))
|
|
115
|
+
continue;
|
|
116
|
+
const result = runOptional(candidate, ["--version"]);
|
|
117
|
+
if (result.ok)
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function ensureInclude(content, sidecarPath) {
|
|
123
|
+
const includeLine = `config-file = ${sidecarPath}`;
|
|
124
|
+
const lines = content.split(/\r?\n/);
|
|
125
|
+
if (lines.some((line) => line.trim() === includeLine || line.includes(sidecarPath))) {
|
|
126
|
+
return normalizeFinalNewline(content);
|
|
127
|
+
}
|
|
128
|
+
const next = content.trimEnd() ? `${content.trimEnd()}\n\n${includeLine}\n` : `${includeLine}\n`;
|
|
129
|
+
return next;
|
|
130
|
+
}
|
|
131
|
+
function removeInclude(content, sidecarPath) {
|
|
132
|
+
const lines = content.split(/\r?\n/).filter((line) => !line.includes(sidecarPath));
|
|
133
|
+
return normalizeFinalNewline(lines.join("\n").replace(/\n{3,}/g, "\n\n"));
|
|
134
|
+
}
|
|
135
|
+
function normalizeFinalNewline(content) {
|
|
136
|
+
return content.endsWith("\n") ? content : `${content}\n`;
|
|
137
|
+
}
|
|
138
|
+
function expandHome(path) {
|
|
139
|
+
if (path === "~")
|
|
140
|
+
return homePath();
|
|
141
|
+
if (path.startsWith("~/"))
|
|
142
|
+
return homePath(path.slice(2));
|
|
143
|
+
return path;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=ghostty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghostty.js","sourceRoot":"","sources":["../src/ghostty.ts"],"names":[],"mappings":"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"}
|
package/dist/herdr.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Change } from "./types.js";
|
|
2
|
+
export declare const minimumHerdrVersion = "0.5.10";
|
|
3
|
+
export declare function discoverHerdrConfig(): string;
|
|
4
|
+
export declare function detectHerdr(): {
|
|
5
|
+
path: string | null;
|
|
6
|
+
version: string | null;
|
|
7
|
+
ok: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function planHerdrPatch(values: Record<string, string | boolean>, configPath?: string): {
|
|
10
|
+
changes: Change[];
|
|
11
|
+
previousValues: Record<string, string | null>;
|
|
12
|
+
};
|
|
13
|
+
export declare function applyHerdrPatch(values: Record<string, string | boolean>, dryRun: boolean, configPath?: string): {
|
|
14
|
+
changes: Change[];
|
|
15
|
+
previousValues: Record<string, string | null>;
|
|
16
|
+
};
|
|
17
|
+
export declare function planHerdrRevert(previousValues: Record<string, string | null>, configPath?: string): Change[];
|
|
18
|
+
export declare function applyHerdrRevert(previousValues: Record<string, string | null>, dryRun: boolean, configPath?: string): Change[];
|
|
19
|
+
export declare function reloadHerdr(): string | null;
|
|
20
|
+
export declare function installOrUpdateHerdr(): Promise<string>;
|
package/dist/herdr.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { chmodSync, existsSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { basename, dirname } from "node:path";
|
|
3
|
+
import { backupFile, diffChange, ensureDir, homePath, readText, runOptional, sha256, writeText } from "./fs-utils.js";
|
|
4
|
+
export const minimumHerdrVersion = "0.5.10";
|
|
5
|
+
const herdrConfigPath = homePath(".config", "herdr", "config.toml");
|
|
6
|
+
export function discoverHerdrConfig() {
|
|
7
|
+
return process.env.HERDR_CONFIG_PATH || herdrConfigPath;
|
|
8
|
+
}
|
|
9
|
+
export function detectHerdr() {
|
|
10
|
+
const candidates = [homePath(".local", "bin", "herdr"), "herdr"];
|
|
11
|
+
for (const candidate of candidates) {
|
|
12
|
+
if (candidate.includes("/") && !existsSync(candidate))
|
|
13
|
+
continue;
|
|
14
|
+
const result = runOptional(candidate, ["--version"]);
|
|
15
|
+
if (!result.ok)
|
|
16
|
+
continue;
|
|
17
|
+
const version = result.stdout.trim().match(/(\d+\.\d+\.\d+)/)?.[1] ?? null;
|
|
18
|
+
return { path: candidate, version, ok: version ? compareVersions(version, minimumHerdrVersion) >= 0 : false };
|
|
19
|
+
}
|
|
20
|
+
return { path: null, version: null, ok: false };
|
|
21
|
+
}
|
|
22
|
+
export function planHerdrPatch(values, configPath = discoverHerdrConfig()) {
|
|
23
|
+
const before = existsSync(configPath) ? readText(configPath) : "";
|
|
24
|
+
const previousValues = {};
|
|
25
|
+
let after = before;
|
|
26
|
+
for (const [path, value] of Object.entries(values)) {
|
|
27
|
+
previousValues[path] = readTomlValue(after, path);
|
|
28
|
+
after = upsertTomlValue(after, path, value);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
changes: [diffChange(configPath, before, after, "write herdr keymap")],
|
|
32
|
+
previousValues
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function applyHerdrPatch(values, dryRun, configPath = discoverHerdrConfig()) {
|
|
36
|
+
const plan = planHerdrPatch(values, configPath);
|
|
37
|
+
if (!dryRun) {
|
|
38
|
+
for (const change of plan.changes) {
|
|
39
|
+
if (change.kind === "noop" || change.kind === "warn")
|
|
40
|
+
continue;
|
|
41
|
+
backupFile(change.path, `herdr-${basename(change.path)}`);
|
|
42
|
+
ensureDir(dirname(change.path));
|
|
43
|
+
writeText(change.path, change.after ?? "");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return plan;
|
|
47
|
+
}
|
|
48
|
+
export function planHerdrRevert(previousValues, configPath = discoverHerdrConfig()) {
|
|
49
|
+
if (!existsSync(configPath))
|
|
50
|
+
return [];
|
|
51
|
+
const before = readText(configPath);
|
|
52
|
+
let after = before;
|
|
53
|
+
for (const [path, value] of Object.entries(previousValues)) {
|
|
54
|
+
after = value === null ? removeTomlValue(after, path) : upsertTomlRawValue(after, path, value);
|
|
55
|
+
}
|
|
56
|
+
return [diffChange(configPath, before, after, "restore herdr keymap")];
|
|
57
|
+
}
|
|
58
|
+
export function applyHerdrRevert(previousValues, dryRun, configPath = discoverHerdrConfig()) {
|
|
59
|
+
const changes = planHerdrRevert(previousValues, configPath);
|
|
60
|
+
if (!dryRun) {
|
|
61
|
+
for (const change of changes) {
|
|
62
|
+
if (change.kind === "noop" || change.kind === "warn")
|
|
63
|
+
continue;
|
|
64
|
+
backupFile(change.path, `herdr-revert-${basename(change.path)}`);
|
|
65
|
+
writeText(change.path, change.after ?? "");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return changes;
|
|
69
|
+
}
|
|
70
|
+
export function reloadHerdr() {
|
|
71
|
+
const herdr = detectHerdr();
|
|
72
|
+
if (!herdr.path)
|
|
73
|
+
return "herdr binary not found; skipped reload";
|
|
74
|
+
const result = runOptional(herdr.path, ["server", "reload-config"]);
|
|
75
|
+
if (!result.ok)
|
|
76
|
+
return result.stderr.trim() || result.stdout.trim() || "herdr server not running; restart herdr to apply config";
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
export async function installOrUpdateHerdr() {
|
|
80
|
+
const arch = process.arch === "arm64" ? "aarch64" : process.arch === "x64" ? "x86_64" : null;
|
|
81
|
+
const os = process.platform === "darwin" ? "macos" : process.platform === "linux" ? "linux" : null;
|
|
82
|
+
if (!arch || !os) {
|
|
83
|
+
throw new Error(`unsupported platform for automatic herdr install: ${process.platform}/${process.arch}`);
|
|
84
|
+
}
|
|
85
|
+
const release = (await fetchJson("https://api.github.com/repos/ogulcancelik/herdr/releases/latest"));
|
|
86
|
+
const assetName = `herdr-${os}-${arch}`;
|
|
87
|
+
const asset = release.assets.find((candidate) => candidate.name === assetName);
|
|
88
|
+
if (!asset)
|
|
89
|
+
throw new Error(`could not find herdr release asset ${assetName}`);
|
|
90
|
+
const response = await fetch(asset.browser_download_url);
|
|
91
|
+
if (!response.ok)
|
|
92
|
+
throw new Error(`failed to download ${asset.browser_download_url}: ${response.status}`);
|
|
93
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
94
|
+
if (asset.digest?.startsWith("sha256:")) {
|
|
95
|
+
const expected = asset.digest.slice("sha256:".length);
|
|
96
|
+
const actual = sha256(buffer);
|
|
97
|
+
if (actual !== expected)
|
|
98
|
+
throw new Error(`herdr checksum mismatch: expected ${expected}, got ${actual}`);
|
|
99
|
+
}
|
|
100
|
+
const target = homePath(".local", "bin", "herdr");
|
|
101
|
+
ensureDir(dirname(target));
|
|
102
|
+
writeFileSync(target, buffer);
|
|
103
|
+
chmodSync(target, 0o755);
|
|
104
|
+
return `${target} (${release.tag_name})`;
|
|
105
|
+
}
|
|
106
|
+
function compareVersions(a, b) {
|
|
107
|
+
const left = a.split(".").map(Number);
|
|
108
|
+
const right = b.split(".").map(Number);
|
|
109
|
+
for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
|
|
110
|
+
const diff = (left[index] ?? 0) - (right[index] ?? 0);
|
|
111
|
+
if (diff !== 0)
|
|
112
|
+
return diff;
|
|
113
|
+
}
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
function readTomlValue(content, path) {
|
|
117
|
+
const { section, key } = splitTomlPath(path);
|
|
118
|
+
const range = findSectionRange(content, section);
|
|
119
|
+
if (!range)
|
|
120
|
+
return null;
|
|
121
|
+
for (let index = range.start + 1; index < range.end; index += 1) {
|
|
122
|
+
const line = range.lines[index];
|
|
123
|
+
const match = line.match(/^(\s*)([A-Za-z0-9_-]+)(\s*=\s*)(.*)$/);
|
|
124
|
+
if (match?.[2] === key)
|
|
125
|
+
return match[4].trim();
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
function upsertTomlValue(content, path, value) {
|
|
130
|
+
return upsertTomlRawValue(content, path, tomlLiteral(value));
|
|
131
|
+
}
|
|
132
|
+
function upsertTomlRawValue(content, path, rawValue) {
|
|
133
|
+
const { section, key } = splitTomlPath(path);
|
|
134
|
+
const base = content.trimEnd() ? `${content.trimEnd()}\n` : "";
|
|
135
|
+
const range = findSectionRange(base, section);
|
|
136
|
+
const assignment = `${key} = ${rawValue}`;
|
|
137
|
+
if (!range) {
|
|
138
|
+
return `${base}\n[${section}]\n${assignment}\n`.replace(/^\n/, "");
|
|
139
|
+
}
|
|
140
|
+
const lines = [...range.lines];
|
|
141
|
+
for (let index = range.start + 1; index < range.end; index += 1) {
|
|
142
|
+
const match = lines[index].match(/^(\s*)([A-Za-z0-9_-]+)(\s*=\s*)(.*)$/);
|
|
143
|
+
if (match?.[2] === key) {
|
|
144
|
+
lines[index] = `${match[1]}${key}${match[3]}${rawValue}`;
|
|
145
|
+
return `${lines.join("\n").trimEnd()}\n`;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const insertAt = lines[range.end - 1] === "" ? range.end - 1 : range.end;
|
|
149
|
+
lines.splice(insertAt, 0, assignment);
|
|
150
|
+
return `${lines.join("\n").trimEnd()}\n`;
|
|
151
|
+
}
|
|
152
|
+
function removeTomlValue(content, path) {
|
|
153
|
+
const { section, key } = splitTomlPath(path);
|
|
154
|
+
const range = findSectionRange(content, section);
|
|
155
|
+
if (!range)
|
|
156
|
+
return content.endsWith("\n") ? content : `${content}\n`;
|
|
157
|
+
const lines = range.lines.filter((line, index) => {
|
|
158
|
+
if (index <= range.start || index >= range.end)
|
|
159
|
+
return true;
|
|
160
|
+
const match = line.match(/^(\s*)([A-Za-z0-9_-]+)(\s*=\s*)(.*)$/);
|
|
161
|
+
return match?.[2] !== key;
|
|
162
|
+
});
|
|
163
|
+
return `${lines.join("\n").trimEnd()}\n`;
|
|
164
|
+
}
|
|
165
|
+
function findSectionRange(content, section) {
|
|
166
|
+
const lines = content.split(/\r?\n/);
|
|
167
|
+
const header = `[${section}]`;
|
|
168
|
+
const start = lines.findIndex((line) => line.trim() === header);
|
|
169
|
+
if (start < 0)
|
|
170
|
+
return null;
|
|
171
|
+
let end = lines.length;
|
|
172
|
+
for (let index = start + 1; index < lines.length; index += 1) {
|
|
173
|
+
if (/^\s*\[[^\]]+\]\s*$/.test(lines[index])) {
|
|
174
|
+
end = index;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return { lines, start, end };
|
|
179
|
+
}
|
|
180
|
+
function splitTomlPath(path) {
|
|
181
|
+
const parts = path.split(".");
|
|
182
|
+
if (parts.length < 2)
|
|
183
|
+
throw new Error(`invalid toml path ${path}`);
|
|
184
|
+
return { section: parts.slice(0, -1).join("."), key: parts[parts.length - 1] };
|
|
185
|
+
}
|
|
186
|
+
function tomlLiteral(value) {
|
|
187
|
+
if (typeof value === "boolean")
|
|
188
|
+
return value ? "true" : "false";
|
|
189
|
+
return JSON.stringify(value);
|
|
190
|
+
}
|
|
191
|
+
async function fetchJson(url) {
|
|
192
|
+
const response = await fetch(url, { headers: { "user-agent": "native-shortcuts-herd" } });
|
|
193
|
+
if (!response.ok)
|
|
194
|
+
throw new Error(`failed to fetch ${url}: ${response.status}`);
|
|
195
|
+
return response.json();
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=herdr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"herdr.js","sourceRoot":"","sources":["../src/herdr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ApplyRequest, CommandResult, ShortcutChoices } from "./types.js";
|
|
2
|
+
export declare function applyConfig(request: ApplyRequest): Promise<CommandResult>;
|
|
3
|
+
export declare function diffConfig(choices: ShortcutChoices, ghosttyConfigPaths?: string[]): CommandResult;
|
|
4
|
+
export declare function revertConfig(dryRun: boolean): CommandResult;
|
|
5
|
+
export declare function diffRevert(): CommandResult;
|
|
6
|
+
export declare function doctor(): Record<string, unknown>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { generateConfig } from "./profiles.js";
|
|
3
|
+
import { applyGhosttyPatch, applyGhosttyRevert, discoverGhosttyConfigs, ghosttySidecarPath, planGhosttyPatch, planGhosttyRevert, reloadGhosttyIfRunning, validateGhosttyConfigs } from "./ghostty.js";
|
|
4
|
+
import { applyHerdrPatch, applyHerdrRevert, detectHerdr, discoverHerdrConfig, installOrUpdateHerdr, minimumHerdrVersion, planHerdrPatch, planHerdrRevert, reloadHerdr } from "./herdr.js";
|
|
5
|
+
import { readState, writeState } from "./state.js";
|
|
6
|
+
const packageVersion = "0.1.0";
|
|
7
|
+
export async function applyConfig(request) {
|
|
8
|
+
const generated = generateConfig(request.choices);
|
|
9
|
+
const warnings = [];
|
|
10
|
+
const changes = [];
|
|
11
|
+
const ghosttyConfigPaths = discoverGhosttyConfigs(request.ghosttyConfigPaths);
|
|
12
|
+
let previousValues = {};
|
|
13
|
+
if (!request.skipHerdr) {
|
|
14
|
+
const herdr = detectHerdr();
|
|
15
|
+
if (!herdr.ok) {
|
|
16
|
+
const message = herdr.path
|
|
17
|
+
? `herdr ${herdr.version ?? "unknown"} found, ${minimumHerdrVersion}+ recommended`
|
|
18
|
+
: "herdr not found";
|
|
19
|
+
if (!request.skipHerdrInstall && request.yes && !request.dryRun) {
|
|
20
|
+
const installed = await installOrUpdateHerdr();
|
|
21
|
+
warnings.push(`${message}; installed ${installed}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
warnings.push(`${message}; run with --yes to install/update automatically`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const herdrPlan = request.dryRun
|
|
28
|
+
? planHerdrPatch(generated.herdrValues)
|
|
29
|
+
: applyHerdrPatch(generated.herdrValues, false);
|
|
30
|
+
changes.push(...herdrPlan.changes);
|
|
31
|
+
previousValues = herdrPlan.previousValues;
|
|
32
|
+
if (!request.noReload && !request.dryRun) {
|
|
33
|
+
const reloadWarning = reloadHerdr();
|
|
34
|
+
if (reloadWarning)
|
|
35
|
+
warnings.push(reloadWarning);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!request.skipGhostty) {
|
|
39
|
+
const ghosttyChanges = request.dryRun
|
|
40
|
+
? planGhosttyPatch(ghosttyConfigPaths, generated.ghosttyLines)
|
|
41
|
+
: applyGhosttyPatch(ghosttyConfigPaths, generated.ghosttyLines, false);
|
|
42
|
+
changes.push(...ghosttyChanges);
|
|
43
|
+
if (!request.dryRun) {
|
|
44
|
+
warnings.push(...validateGhosttyConfigs(ghosttyConfigPaths));
|
|
45
|
+
if (!request.noReload)
|
|
46
|
+
reloadGhosttyIfRunning();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const state = {
|
|
50
|
+
schemaVersion: 1,
|
|
51
|
+
packageVersion,
|
|
52
|
+
installedAt: new Date().toISOString(),
|
|
53
|
+
choices: request.choices,
|
|
54
|
+
ghostty: {
|
|
55
|
+
sidecarPath: ghosttySidecarPath(),
|
|
56
|
+
configPaths: ghosttyConfigPaths
|
|
57
|
+
},
|
|
58
|
+
herdr: {
|
|
59
|
+
configPath: discoverHerdrConfig(),
|
|
60
|
+
previousValues
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
if (!request.dryRun)
|
|
64
|
+
writeState(state);
|
|
65
|
+
return { changes, warnings, state };
|
|
66
|
+
}
|
|
67
|
+
export function diffConfig(choices, ghosttyConfigPaths) {
|
|
68
|
+
const generated = generateConfig(choices);
|
|
69
|
+
const configPaths = discoverGhosttyConfigs(ghosttyConfigPaths);
|
|
70
|
+
const herdr = planHerdrPatch(generated.herdrValues);
|
|
71
|
+
const ghostty = planGhosttyPatch(configPaths, generated.ghosttyLines);
|
|
72
|
+
return { changes: [...herdr.changes, ...ghostty], warnings: [] };
|
|
73
|
+
}
|
|
74
|
+
export function revertConfig(dryRun) {
|
|
75
|
+
const state = readState();
|
|
76
|
+
const configPaths = state?.ghostty.configPaths ?? discoverGhosttyConfigs(undefined);
|
|
77
|
+
const previousValues = state?.herdr.previousValues ?? {};
|
|
78
|
+
const changes = [
|
|
79
|
+
...applyGhosttyRevert(configPaths, dryRun),
|
|
80
|
+
...applyHerdrRevert(previousValues, dryRun)
|
|
81
|
+
];
|
|
82
|
+
return {
|
|
83
|
+
changes,
|
|
84
|
+
warnings: state ? [] : ["no state file found; removed only discoverable managed ghostty include and sidecar"]
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function diffRevert() {
|
|
88
|
+
const state = readState();
|
|
89
|
+
const configPaths = state?.ghostty.configPaths ?? discoverGhosttyConfigs(undefined);
|
|
90
|
+
const previousValues = state?.herdr.previousValues ?? {};
|
|
91
|
+
const changes = [
|
|
92
|
+
...planGhosttyRevert(configPaths),
|
|
93
|
+
...planHerdrRevert(previousValues)
|
|
94
|
+
];
|
|
95
|
+
return {
|
|
96
|
+
changes,
|
|
97
|
+
warnings: state ? [] : ["no state file found; revert preview is best effort"]
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function doctor() {
|
|
101
|
+
const ghosttyConfigs = discoverGhosttyConfigs(undefined);
|
|
102
|
+
const herdr = detectHerdr();
|
|
103
|
+
const state = readState();
|
|
104
|
+
return {
|
|
105
|
+
platform: `${process.platform}/${process.arch}`,
|
|
106
|
+
ghostty: {
|
|
107
|
+
configs: ghosttyConfigs,
|
|
108
|
+
sidecar: ghosttySidecarPath(),
|
|
109
|
+
sidecar_exists: existsSync(ghosttySidecarPath()),
|
|
110
|
+
validation_warnings: validateGhosttyConfigs(ghosttyConfigs)
|
|
111
|
+
},
|
|
112
|
+
herdr: {
|
|
113
|
+
path: herdr.path,
|
|
114
|
+
version: herdr.version,
|
|
115
|
+
meets_minimum: herdr.ok,
|
|
116
|
+
config: discoverHerdrConfig()
|
|
117
|
+
},
|
|
118
|
+
state
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GeneratedConfig, KeyValue, ShortcutChoices, ShortcutProfile, ShortcutTarget } from "./types.js";
|
|
2
|
+
export declare const profiles: ShortcutProfile[];
|
|
3
|
+
export declare function getProfile(id: string | undefined): ShortcutProfile;
|
|
4
|
+
export declare function targetFrom(value: unknown, fallback: ShortcutTarget): ShortcutTarget;
|
|
5
|
+
export declare function choicesFromOptions(options: {
|
|
6
|
+
profile?: string;
|
|
7
|
+
cmdNumbers?: string;
|
|
8
|
+
ctrlTab?: string;
|
|
9
|
+
ctrlOptTab?: string;
|
|
10
|
+
promptNewTabName?: boolean;
|
|
11
|
+
ghosttyKey?: string[];
|
|
12
|
+
herdrKey?: string[];
|
|
13
|
+
}): ShortcutChoices;
|
|
14
|
+
export declare function parseKeyValues(values: string[]): KeyValue[];
|
|
15
|
+
export declare function generateConfig(choices: ShortcutChoices): GeneratedConfig;
|