harnessbrew 0.4.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/CHANGELOG.md +83 -0
- package/LICENSE +21 -0
- package/README.md +266 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +242 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/bundle.d.ts +43 -0
- package/dist/core/bundle.d.ts.map +1 -0
- package/dist/core/bundle.js +195 -0
- package/dist/core/bundle.js.map +1 -0
- package/dist/core/errors.d.ts +4 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +7 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/formulas.d.ts +29 -0
- package/dist/core/formulas.d.ts.map +1 -0
- package/dist/core/formulas.js +185 -0
- package/dist/core/formulas.js.map +1 -0
- package/dist/core/git.d.ts +3 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +36 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/installations.d.ts +38 -0
- package/dist/core/installations.d.ts.map +1 -0
- package/dist/core/installations.js +250 -0
- package/dist/core/installations.js.map +1 -0
- package/dist/core/paths.d.ts +8 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +39 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/state.d.ts +16 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +43 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/taps.d.ts +16 -0
- package/dist/core/taps.d.ts.map +1 -0
- package/dist/core/taps.js +102 -0
- package/dist/core/taps.js.map +1 -0
- package/dist/core/targets.d.ts +11 -0
- package/dist/core/targets.d.ts.map +1 -0
- package/dist/core/targets.js +150 -0
- package/dist/core/targets.js.map +1 -0
- package/dist/core/upgrades.d.ts +14 -0
- package/dist/core/upgrades.d.ts.map +1 -0
- package/dist/core/upgrades.js +127 -0
- package/dist/core/upgrades.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { cp, lstat, mkdir, readFile, readdir, readlink, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { HarnessBrewError } from "./errors.js";
|
|
5
|
+
import { getFormula, loadCatalog } from "./formulas.js";
|
|
6
|
+
import { resolveCellarPath, resolveReceiptPath } from "./paths.js";
|
|
7
|
+
async function walkFiles(root, current = root) {
|
|
8
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
9
|
+
const files = [];
|
|
10
|
+
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
11
|
+
const entryPath = path.join(current, entry.name);
|
|
12
|
+
if (entry.isDirectory())
|
|
13
|
+
files.push(...await walkFiles(root, entryPath));
|
|
14
|
+
else if (entry.isFile())
|
|
15
|
+
files.push(path.relative(root, entryPath));
|
|
16
|
+
else
|
|
17
|
+
throw new HarnessBrewError(`Unsupported file type in formula: ${entryPath}`);
|
|
18
|
+
}
|
|
19
|
+
return files;
|
|
20
|
+
}
|
|
21
|
+
async function digestFile(filePath) {
|
|
22
|
+
return createHash("sha256").update(await readFile(filePath)).digest("hex");
|
|
23
|
+
}
|
|
24
|
+
async function inventory(root) {
|
|
25
|
+
const files = await walkFiles(root);
|
|
26
|
+
return Promise.all(files.map(async (relativePath) => ({
|
|
27
|
+
path: relativePath,
|
|
28
|
+
sha256: await digestFile(path.join(root, relativePath))
|
|
29
|
+
})));
|
|
30
|
+
}
|
|
31
|
+
async function pathExists(filePath) {
|
|
32
|
+
try {
|
|
33
|
+
await stat(filePath);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error.code === "ENOENT")
|
|
38
|
+
return false;
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function readReceipt(home, coordinate) {
|
|
43
|
+
const receiptPath = resolveReceiptPath(home, coordinate);
|
|
44
|
+
let content;
|
|
45
|
+
try {
|
|
46
|
+
content = await readFile(receiptPath, "utf8");
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error.code === "ENOENT")
|
|
50
|
+
return undefined;
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const receipt = JSON.parse(content);
|
|
55
|
+
if (receipt.schemaVersion !== 1 || receipt.coordinate !== coordinate)
|
|
56
|
+
throw new Error("invalid receipt");
|
|
57
|
+
return receipt;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new HarnessBrewError(`Invalid install receipt: ${receiptPath}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export async function writeReceipt(home, receipt) {
|
|
64
|
+
const receiptPath = resolveReceiptPath(home, receipt.coordinate);
|
|
65
|
+
await mkdir(path.dirname(receiptPath), { recursive: true });
|
|
66
|
+
const temporaryPath = `${receiptPath}.${process.pid}.tmp`;
|
|
67
|
+
await writeFile(temporaryPath, `${JSON.stringify(receipt, null, 2)}\n`, "utf8");
|
|
68
|
+
await rename(temporaryPath, receiptPath);
|
|
69
|
+
}
|
|
70
|
+
export async function listInstalled(home) {
|
|
71
|
+
const receiptsRoot = path.join(home, "receipts");
|
|
72
|
+
if (!(await pathExists(receiptsRoot)))
|
|
73
|
+
return [];
|
|
74
|
+
const receiptPaths = (await walkFiles(receiptsRoot)).filter((file) => file.endsWith(".json"));
|
|
75
|
+
const receipts = [];
|
|
76
|
+
for (const relativePath of receiptPaths) {
|
|
77
|
+
const content = await readFile(path.join(receiptsRoot, relativePath), "utf8");
|
|
78
|
+
const receipt = JSON.parse(content);
|
|
79
|
+
if (receipt.schemaVersion !== 1 || typeof receipt.coordinate !== "string") {
|
|
80
|
+
throw new HarnessBrewError(`Invalid install receipt: ${path.join(receiptsRoot, relativePath)}`);
|
|
81
|
+
}
|
|
82
|
+
receipts.push(receipt);
|
|
83
|
+
}
|
|
84
|
+
return receipts.sort((left, right) => left.coordinate.localeCompare(right.coordinate));
|
|
85
|
+
}
|
|
86
|
+
export async function resolveDependencies(home, root) {
|
|
87
|
+
const catalog = await loadCatalog(home);
|
|
88
|
+
const formulas = new Map(catalog.map((formula) => [formula.coordinate, formula]));
|
|
89
|
+
const visiting = new Set();
|
|
90
|
+
const visited = new Set();
|
|
91
|
+
const ordered = [];
|
|
92
|
+
function visit(formula, trail) {
|
|
93
|
+
if (visiting.has(formula.coordinate)) {
|
|
94
|
+
throw new HarnessBrewError(`Dependency cycle detected: ${[...trail, formula.coordinate].join(" -> ")}`);
|
|
95
|
+
}
|
|
96
|
+
if (visited.has(formula.coordinate))
|
|
97
|
+
return;
|
|
98
|
+
visiting.add(formula.coordinate);
|
|
99
|
+
for (const dependencyCoordinate of formula.dependencies) {
|
|
100
|
+
const dependency = formulas.get(dependencyCoordinate);
|
|
101
|
+
if (dependency === undefined) {
|
|
102
|
+
throw new HarnessBrewError(`Dependency not found: ${formula.coordinate} -> ${dependencyCoordinate}`);
|
|
103
|
+
}
|
|
104
|
+
visit(dependency, [...trail, formula.coordinate]);
|
|
105
|
+
}
|
|
106
|
+
visiting.delete(formula.coordinate);
|
|
107
|
+
visited.add(formula.coordinate);
|
|
108
|
+
ordered.push(formula);
|
|
109
|
+
}
|
|
110
|
+
visit(root, []);
|
|
111
|
+
return ordered;
|
|
112
|
+
}
|
|
113
|
+
function assertNoConflicts(formulas, installed) {
|
|
114
|
+
const requested = new Set(formulas.map((formula) => formula.coordinate));
|
|
115
|
+
const installedCoordinates = new Set(installed.map((receipt) => receipt.coordinate));
|
|
116
|
+
for (const formula of formulas) {
|
|
117
|
+
for (const conflict of formula.conflicts) {
|
|
118
|
+
if (requested.has(conflict) || installedCoordinates.has(conflict)) {
|
|
119
|
+
throw new HarnessBrewError(`Formula conflict: ${formula.coordinate} conflicts with ${conflict}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const reciprocal = installed.find((receipt) => receipt.conflicts.includes(formula.coordinate));
|
|
123
|
+
if (reciprocal !== undefined) {
|
|
124
|
+
throw new HarnessBrewError(`Formula conflict: ${reciprocal.coordinate} conflicts with ${formula.coordinate}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export async function installCatalogFormula(home, formula, requested) {
|
|
129
|
+
const existing = await readReceipt(home, formula.coordinate);
|
|
130
|
+
if (existing !== undefined) {
|
|
131
|
+
if (requested && !existing.requested) {
|
|
132
|
+
existing.requested = true;
|
|
133
|
+
await writeReceipt(home, existing);
|
|
134
|
+
}
|
|
135
|
+
return existing;
|
|
136
|
+
}
|
|
137
|
+
const cellarPath = resolveCellarPath(home, formula.coordinate, formula.commit);
|
|
138
|
+
const temporaryPath = `${cellarPath}.${process.pid}.tmp`;
|
|
139
|
+
await mkdir(path.dirname(cellarPath), { recursive: true });
|
|
140
|
+
await rm(temporaryPath, { recursive: true, force: true });
|
|
141
|
+
try {
|
|
142
|
+
await cp(formula.directory, temporaryPath, { recursive: true, errorOnExist: true });
|
|
143
|
+
await rename(temporaryPath, cellarPath);
|
|
144
|
+
const receipt = {
|
|
145
|
+
schemaVersion: 1,
|
|
146
|
+
coordinate: formula.coordinate,
|
|
147
|
+
kind: formula.kind,
|
|
148
|
+
tap: formula.tap,
|
|
149
|
+
commit: formula.commit,
|
|
150
|
+
cellarPath,
|
|
151
|
+
entry: formula.entry,
|
|
152
|
+
dependencies: formula.dependencies,
|
|
153
|
+
conflicts: formula.conflicts,
|
|
154
|
+
requested,
|
|
155
|
+
files: await inventory(cellarPath),
|
|
156
|
+
supportedTargets: formula.targets,
|
|
157
|
+
targets: [],
|
|
158
|
+
links: [],
|
|
159
|
+
installedAt: new Date().toISOString()
|
|
160
|
+
};
|
|
161
|
+
await writeReceipt(home, receipt);
|
|
162
|
+
return receipt;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
await rm(temporaryPath, { recursive: true, force: true });
|
|
166
|
+
await rm(cellarPath, { recursive: true, force: true });
|
|
167
|
+
await rm(resolveReceiptPath(home, formula.coordinate), { force: true });
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export async function installFormula(home, nameOrCoordinate) {
|
|
172
|
+
const root = await getFormula(home, nameOrCoordinate);
|
|
173
|
+
if (root.deprecated !== undefined) {
|
|
174
|
+
throw new HarnessBrewError(`Formula is deprecated: ${root.coordinate}: ${root.deprecated}`);
|
|
175
|
+
}
|
|
176
|
+
const formulas = await resolveDependencies(home, root);
|
|
177
|
+
const installed = await listInstalled(home);
|
|
178
|
+
assertNoConflicts(formulas, installed);
|
|
179
|
+
const receipts = [];
|
|
180
|
+
const created = [];
|
|
181
|
+
try {
|
|
182
|
+
for (const formula of formulas) {
|
|
183
|
+
const existed = await readReceipt(home, formula.coordinate) !== undefined;
|
|
184
|
+
const receipt = await installCatalogFormula(home, formula, formula.coordinate === root.coordinate);
|
|
185
|
+
receipts.push(receipt);
|
|
186
|
+
if (!existed)
|
|
187
|
+
created.push(receipt);
|
|
188
|
+
}
|
|
189
|
+
return receipts;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
for (const receipt of created.reverse()) {
|
|
193
|
+
await rm(receipt.cellarPath, { recursive: true, force: true });
|
|
194
|
+
await rm(resolveReceiptPath(home, receipt.coordinate), { force: true });
|
|
195
|
+
}
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function verifyReceiptFiles(receipt) {
|
|
200
|
+
for (const file of receipt.files) {
|
|
201
|
+
const filePath = path.join(receipt.cellarPath, file.path);
|
|
202
|
+
if (!(await pathExists(filePath)) || await digestFile(filePath) !== file.sha256) {
|
|
203
|
+
throw new HarnessBrewError(`Installed files were modified for ${receipt.coordinate}: ${file.path}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function verifyReceiptLinks(receipt) {
|
|
208
|
+
for (const link of receipt.links) {
|
|
209
|
+
try {
|
|
210
|
+
const metadata = await lstat(link.path);
|
|
211
|
+
if (!metadata.isSymbolicLink() || path.resolve(path.dirname(link.path), await readlink(link.path)) !== link.source) {
|
|
212
|
+
throw new Error("link target changed");
|
|
213
|
+
}
|
|
214
|
+
if (await digestFile(link.source) !== link.sha256)
|
|
215
|
+
throw new Error("source changed");
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
throw new HarnessBrewError(`Installed target was modified for ${receipt.coordinate}: ${link.path}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
export async function verifyReceiptIntegrity(receipt) {
|
|
223
|
+
await verifyReceiptFiles(receipt);
|
|
224
|
+
await verifyReceiptLinks(receipt);
|
|
225
|
+
}
|
|
226
|
+
export async function uninstallFormula(home, nameOrCoordinate, options = {}) {
|
|
227
|
+
const installed = await listInstalled(home);
|
|
228
|
+
const matches = nameOrCoordinate.split("/").length === 3
|
|
229
|
+
? installed.filter((receipt) => receipt.coordinate === nameOrCoordinate)
|
|
230
|
+
: installed.filter((receipt) => receipt.coordinate.endsWith(`/${nameOrCoordinate}`));
|
|
231
|
+
if (matches.length === 0)
|
|
232
|
+
throw new HarnessBrewError(`Formula is not installed: ${nameOrCoordinate}`);
|
|
233
|
+
if (matches.length > 1)
|
|
234
|
+
throw new HarnessBrewError(`Installed formula name is ambiguous: ${nameOrCoordinate}`);
|
|
235
|
+
const receipt = matches[0];
|
|
236
|
+
const dependents = installed.filter((candidate) => candidate.dependencies.includes(receipt.coordinate));
|
|
237
|
+
if (dependents.length > 0 && options.force !== true) {
|
|
238
|
+
throw new HarnessBrewError(`Cannot uninstall ${receipt.coordinate}; required by ${dependents.map((item) => item.coordinate).join(", ")}`);
|
|
239
|
+
}
|
|
240
|
+
if (options.force !== true) {
|
|
241
|
+
await verifyReceiptIntegrity(receipt);
|
|
242
|
+
}
|
|
243
|
+
for (const link of receipt.links) {
|
|
244
|
+
await rm(link.path, { force: true });
|
|
245
|
+
}
|
|
246
|
+
await rm(receipt.cellarPath, { recursive: true, force: true });
|
|
247
|
+
await rm(resolveReceiptPath(home, receipt.coordinate), { force: true });
|
|
248
|
+
return receipt;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=installations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installations.js","sourceRoot":"","sources":["../../src/core/installations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function resolveHarnessHome(override?: string): string;
|
|
2
|
+
export declare function assertTapName(name: string): void;
|
|
3
|
+
export declare function resolveTapPath(home: string, name: string): string;
|
|
4
|
+
export declare function resolveStatePath(home: string): string;
|
|
5
|
+
export declare function parseCoordinate(coordinate: string): [string, string, string];
|
|
6
|
+
export declare function resolveCellarPath(home: string, coordinate: string, commit: string): string;
|
|
7
|
+
export declare function resolveReceiptPath(home: string, coordinate: string): string;
|
|
8
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAM5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM1F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAG3E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { HarnessBrewError } from "./errors.js";
|
|
4
|
+
const tapNamePattern = /^[a-z0-9][a-z0-9-]*\/[a-z0-9][a-z0-9-]*$/;
|
|
5
|
+
export function resolveHarnessHome(override) {
|
|
6
|
+
return path.resolve(override ?? process.env.HARNESSBREW_HOME ?? path.join(homedir(), ".harnessbrew"));
|
|
7
|
+
}
|
|
8
|
+
export function assertTapName(name) {
|
|
9
|
+
if (!tapNamePattern.test(name)) {
|
|
10
|
+
throw new HarnessBrewError(`Invalid tap name: ${name}. Expected <owner>/<name>.`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function resolveTapPath(home, name) {
|
|
14
|
+
assertTapName(name);
|
|
15
|
+
const [owner, tap] = name.split("/");
|
|
16
|
+
return path.join(home, "taps", owner, tap);
|
|
17
|
+
}
|
|
18
|
+
export function resolveStatePath(home) {
|
|
19
|
+
return path.join(home, "state.json");
|
|
20
|
+
}
|
|
21
|
+
export function parseCoordinate(coordinate) {
|
|
22
|
+
const parts = coordinate.split("/");
|
|
23
|
+
if (parts.length !== 3 || parts.some((part) => !/^[a-z0-9][a-z0-9-]*$/u.test(part))) {
|
|
24
|
+
throw new HarnessBrewError(`Invalid formula coordinate: ${coordinate}`);
|
|
25
|
+
}
|
|
26
|
+
return parts;
|
|
27
|
+
}
|
|
28
|
+
export function resolveCellarPath(home, coordinate, commit) {
|
|
29
|
+
const [owner, tap, formula] = parseCoordinate(coordinate);
|
|
30
|
+
if (!/^[0-9a-f]{40}$/u.test(commit)) {
|
|
31
|
+
throw new HarnessBrewError(`Invalid Git commit for ${coordinate}: ${commit}`);
|
|
32
|
+
}
|
|
33
|
+
return path.join(home, "cellar", owner, tap, formula, commit);
|
|
34
|
+
}
|
|
35
|
+
export function resolveReceiptPath(home, coordinate) {
|
|
36
|
+
const [owner, tap, formula] = parseCoordinate(coordinate);
|
|
37
|
+
return path.join(home, "receipts", owner, tap, `${formula}.json`);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAElE,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,gBAAgB,CAAC,qBAAqB,IAAI,4BAA4B,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY;IACvD,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,gBAAgB,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAiC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,UAAkB,EAAE,MAAc;IAChF,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,gBAAgB,CAAC,0BAA0B,UAAU,KAAK,MAAM,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAkB;IACjE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface TapRecord {
|
|
2
|
+
name: string;
|
|
3
|
+
url: string;
|
|
4
|
+
commit: string;
|
|
5
|
+
addedAt: string;
|
|
6
|
+
updatedAt: string;
|
|
7
|
+
ref?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface HarnessState {
|
|
10
|
+
schemaVersion: 1;
|
|
11
|
+
taps: Record<string, TapRecord>;
|
|
12
|
+
}
|
|
13
|
+
export declare function emptyState(): HarnessState;
|
|
14
|
+
export declare function readState(home: string): Promise<HarnessState>;
|
|
15
|
+
export declare function writeState(home: string, state: HarnessState): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACjC;AAED,wBAAgB,UAAU,IAAI,YAAY,CAEzC;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BnE;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { HarnessBrewError } from "./errors.js";
|
|
4
|
+
import { resolveStatePath } from "./paths.js";
|
|
5
|
+
export function emptyState() {
|
|
6
|
+
return { schemaVersion: 1, taps: {} };
|
|
7
|
+
}
|
|
8
|
+
export async function readState(home) {
|
|
9
|
+
const statePath = resolveStatePath(home);
|
|
10
|
+
let content;
|
|
11
|
+
try {
|
|
12
|
+
content = await readFile(statePath, "utf8");
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error.code === "ENOENT") {
|
|
16
|
+
return emptyState();
|
|
17
|
+
}
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(content);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new HarnessBrewError(`Invalid HarnessBrew state file: ${statePath}`);
|
|
26
|
+
}
|
|
27
|
+
if (typeof parsed !== "object" ||
|
|
28
|
+
parsed === null ||
|
|
29
|
+
parsed.schemaVersion !== 1 ||
|
|
30
|
+
typeof parsed.taps !== "object" ||
|
|
31
|
+
parsed.taps === null) {
|
|
32
|
+
throw new HarnessBrewError(`Unsupported HarnessBrew state file: ${statePath}`);
|
|
33
|
+
}
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
36
|
+
export async function writeState(home, state) {
|
|
37
|
+
const statePath = resolveStatePath(home);
|
|
38
|
+
await mkdir(path.dirname(statePath), { recursive: true });
|
|
39
|
+
const temporaryPath = `${statePath}.${process.pid}.tmp`;
|
|
40
|
+
await writeFile(temporaryPath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
41
|
+
await rename(temporaryPath, statePath);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgB9C,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,UAAU,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gBAAgB,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACd,MAAsC,CAAC,aAAa,KAAK,CAAC;QAC3D,OAAQ,MAA6B,CAAC,IAAI,KAAK,QAAQ;QACtD,MAA6B,CAAC,IAAI,KAAK,IAAI,EAC5C,CAAC;QACD,MAAM,IAAI,gBAAgB,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,MAAsB,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,KAAmB;IAChE,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACxD,MAAM,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type TapRecord } from "./state.js";
|
|
2
|
+
export interface AddTapOptions {
|
|
3
|
+
ref?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface TapUpdate {
|
|
6
|
+
name: string;
|
|
7
|
+
before: string;
|
|
8
|
+
after: string;
|
|
9
|
+
changed: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function listTaps(home: string): Promise<TapRecord[]>;
|
|
12
|
+
export declare function addTap(home: string, name: string, url: string, options?: AddTapOptions): Promise<TapRecord>;
|
|
13
|
+
export declare function updateTaps(home: string, requestedName?: string): Promise<TapUpdate[]>;
|
|
14
|
+
export declare function removeTap(home: string, name: string): Promise<TapRecord>;
|
|
15
|
+
export declare function checkoutTap(home: string, name: string, commit: string): Promise<TapRecord>;
|
|
16
|
+
//# sourceMappingURL=taps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taps.d.ts","sourceRoot":"","sources":["../../src/core/taps.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,KAAK,SAAS,EAAc,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGjE;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,SAAS,CAAC,CAmCpB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA4B3F;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAY9E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAehG"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { mkdir, rm } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { HarnessBrewError } from "./errors.js";
|
|
4
|
+
import { resolveGitCommit, runGit } from "./git.js";
|
|
5
|
+
import { validateTapRepository } from "./formulas.js";
|
|
6
|
+
import { assertTapName, resolveTapPath } from "./paths.js";
|
|
7
|
+
import { readState, writeState } from "./state.js";
|
|
8
|
+
export async function listTaps(home) {
|
|
9
|
+
const state = await readState(home);
|
|
10
|
+
return Object.values(state.taps).sort((left, right) => left.name.localeCompare(right.name));
|
|
11
|
+
}
|
|
12
|
+
export async function addTap(home, name, url, options = {}) {
|
|
13
|
+
assertTapName(name);
|
|
14
|
+
if (url.trim() === "") {
|
|
15
|
+
throw new HarnessBrewError("Tap Git URL must not be empty.");
|
|
16
|
+
}
|
|
17
|
+
const state = await readState(home);
|
|
18
|
+
if (state.taps[name] !== undefined) {
|
|
19
|
+
throw new HarnessBrewError(`Tap already exists: ${name}`);
|
|
20
|
+
}
|
|
21
|
+
const destination = resolveTapPath(home, name);
|
|
22
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
23
|
+
try {
|
|
24
|
+
await runGit(["clone", "--quiet", "--", url, destination]);
|
|
25
|
+
const commit = await resolveGitCommit(destination, options.ref);
|
|
26
|
+
await runGit(["checkout", "--quiet", "--detach", commit], destination);
|
|
27
|
+
await validateTapRepository(destination);
|
|
28
|
+
const timestamp = new Date().toISOString();
|
|
29
|
+
const record = {
|
|
30
|
+
name,
|
|
31
|
+
url,
|
|
32
|
+
commit,
|
|
33
|
+
addedAt: timestamp,
|
|
34
|
+
updatedAt: timestamp,
|
|
35
|
+
...(options.ref === undefined ? {} : { ref: options.ref })
|
|
36
|
+
};
|
|
37
|
+
state.taps[name] = record;
|
|
38
|
+
await writeState(home, state);
|
|
39
|
+
return record;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
await rm(destination, { recursive: true, force: true });
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function updateTaps(home, requestedName) {
|
|
47
|
+
if (requestedName !== undefined) {
|
|
48
|
+
assertTapName(requestedName);
|
|
49
|
+
}
|
|
50
|
+
const state = await readState(home);
|
|
51
|
+
const records = requestedName === undefined
|
|
52
|
+
? Object.values(state.taps)
|
|
53
|
+
: [state.taps[requestedName]].filter((record) => record !== undefined);
|
|
54
|
+
if (requestedName !== undefined && records.length === 0) {
|
|
55
|
+
throw new HarnessBrewError(`Tap not found: ${requestedName}`);
|
|
56
|
+
}
|
|
57
|
+
const updates = [];
|
|
58
|
+
for (const record of records.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
59
|
+
const repositoryPath = resolveTapPath(home, record.name);
|
|
60
|
+
await runGit(["fetch", "--quiet", "--prune", "--tags", "origin"], repositoryPath);
|
|
61
|
+
const commit = await resolveGitCommit(repositoryPath, record.ref);
|
|
62
|
+
await runGit(["checkout", "--quiet", "--detach", commit], repositoryPath);
|
|
63
|
+
await validateTapRepository(repositoryPath);
|
|
64
|
+
const before = record.commit;
|
|
65
|
+
record.commit = commit;
|
|
66
|
+
record.updatedAt = new Date().toISOString();
|
|
67
|
+
updates.push({ name: record.name, before, after: commit, changed: before !== commit });
|
|
68
|
+
}
|
|
69
|
+
await writeState(home, state);
|
|
70
|
+
return updates;
|
|
71
|
+
}
|
|
72
|
+
export async function removeTap(home, name) {
|
|
73
|
+
assertTapName(name);
|
|
74
|
+
const state = await readState(home);
|
|
75
|
+
const record = state.taps[name];
|
|
76
|
+
if (record === undefined) {
|
|
77
|
+
throw new HarnessBrewError(`Tap not found: ${name}`);
|
|
78
|
+
}
|
|
79
|
+
await rm(resolveTapPath(home, name), { recursive: true, force: true });
|
|
80
|
+
delete state.taps[name];
|
|
81
|
+
await writeState(home, state);
|
|
82
|
+
return record;
|
|
83
|
+
}
|
|
84
|
+
export async function checkoutTap(home, name, commit) {
|
|
85
|
+
assertTapName(name);
|
|
86
|
+
if (!/^[0-9a-f]{40}$/u.test(commit))
|
|
87
|
+
throw new HarnessBrewError(`Invalid Git commit: ${commit}`);
|
|
88
|
+
const state = await readState(home);
|
|
89
|
+
const record = state.taps[name];
|
|
90
|
+
if (record === undefined)
|
|
91
|
+
throw new HarnessBrewError(`Tap not found: ${name}`);
|
|
92
|
+
const repositoryPath = resolveTapPath(home, name);
|
|
93
|
+
await runGit(["fetch", "--quiet", "--prune", "--tags", "origin"], repositoryPath);
|
|
94
|
+
const resolved = await resolveGitCommit(repositoryPath, commit);
|
|
95
|
+
await runGit(["checkout", "--quiet", "--detach", resolved], repositoryPath);
|
|
96
|
+
await validateTapRepository(repositoryPath);
|
|
97
|
+
record.commit = resolved;
|
|
98
|
+
record.updatedAt = new Date().toISOString();
|
|
99
|
+
await writeState(home, state);
|
|
100
|
+
return record;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=taps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taps.js","sourceRoot":"","sources":["../../src/core/taps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type InstallReceipt } from "./installations.js";
|
|
2
|
+
export declare const builtinTargets: readonly ["openai-codex", "claude-code"];
|
|
3
|
+
export type BuiltinTarget = (typeof builtinTargets)[number];
|
|
4
|
+
export interface LinkOptions {
|
|
5
|
+
root?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function targetDestination(receipt: InstallReceipt, target: BuiltinTarget, root?: string): string;
|
|
8
|
+
export declare function linkFormula(home: string, nameOrCoordinate: string, target: BuiltinTarget, options?: LinkOptions): Promise<InstallReceipt>;
|
|
9
|
+
export declare function unlinkFormula(home: string, nameOrCoordinate: string, target: BuiltinTarget, force?: boolean): Promise<InstallReceipt>;
|
|
10
|
+
export declare function installForTarget(home: string, nameOrCoordinate: string, target: BuiltinTarget, options?: LinkOptions): Promise<InstallReceipt[]>;
|
|
11
|
+
//# sourceMappingURL=targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/core/targets.ts"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;AAG5B,eAAO,MAAM,cAAc,YAAI,cAAc,EAAE,aAAa,CAAU,CAAC;AACvE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBvG;AA+BD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,cAAc,CAAC,CAwCzB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,aAAa,EACrB,KAAK,UAAQ,GACZ,OAAO,CAAC,cAAc,CAAC,CAuBzB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAkB3B"}
|