@mvanhorn/printing-press-library 0.1.6
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 +39 -0
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/bin/printing-press-library.mjs +8 -0
- package/dist/src/bundles.d.ts +2 -0
- package/dist/src/bundles.js +13 -0
- package/dist/src/bundles.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +91 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/install.d.ts +18 -0
- package/dist/src/commands/install.js +272 -0
- package/dist/src/commands/install.js.map +1 -0
- package/dist/src/commands/list.d.ts +12 -0
- package/dist/src/commands/list.js +109 -0
- package/dist/src/commands/list.js.map +1 -0
- package/dist/src/commands/search.d.ts +10 -0
- package/dist/src/commands/search.js +85 -0
- package/dist/src/commands/search.js.map +1 -0
- package/dist/src/commands/uninstall.d.ts +13 -0
- package/dist/src/commands/uninstall.js +101 -0
- package/dist/src/commands/uninstall.js.map +1 -0
- package/dist/src/commands/update.d.ts +11 -0
- package/dist/src/commands/update.js +80 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.js +2 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/format.d.ts +9 -0
- package/dist/src/format.js +44 -0
- package/dist/src/format.js.map +1 -0
- package/dist/src/go.d.ts +26 -0
- package/dist/src/go.js +44 -0
- package/dist/src/go.js.map +1 -0
- package/dist/src/process.d.ts +11 -0
- package/dist/src/process.js +27 -0
- package/dist/src/process.js.map +1 -0
- package/dist/src/registry.d.ts +44 -0
- package/dist/src/registry.js +194 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/skill.d.ts +10 -0
- package/dist/src/skill.js +28 -0
- package/dist/src/skill.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { commandOnPath, execFileRunner } from "../process.js";
|
|
2
|
+
import { cliBinaryName, DEFAULT_REGISTRY_URL, fetchRegistry, } from "../registry.js";
|
|
3
|
+
import { renderCatalogEntries, renderInstalledEntries } from "../format.js";
|
|
4
|
+
export function createListCommand(overrides = {}) {
|
|
5
|
+
const deps = {
|
|
6
|
+
fetchRegistry: (url) => fetchRegistry(url),
|
|
7
|
+
commandOnPath: (binary) => commandOnPath(binary),
|
|
8
|
+
runner: execFileRunner,
|
|
9
|
+
stdout: (message) => console.log(message),
|
|
10
|
+
stderr: (message) => console.error(message),
|
|
11
|
+
...overrides,
|
|
12
|
+
};
|
|
13
|
+
return async function listCommandWithDeps(args = []) {
|
|
14
|
+
const options = parseListArgs(args);
|
|
15
|
+
if ("error" in options) {
|
|
16
|
+
deps.stderr(options.error);
|
|
17
|
+
return 1;
|
|
18
|
+
}
|
|
19
|
+
const registry = await deps.fetchRegistry(options.registryUrl);
|
|
20
|
+
if (!options.installed) {
|
|
21
|
+
const entries = filterCatalogEntries(registry.entries, options.category);
|
|
22
|
+
if (options.json) {
|
|
23
|
+
deps.stdout(JSON.stringify(entries, null, 2));
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
if (entries.length === 0) {
|
|
27
|
+
const suffix = options.category ? ` in category "${options.category}"` : "";
|
|
28
|
+
deps.stdout(`No Printing Press CLIs found${suffix}.`);
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
for (const line of renderCatalogEntries(entries)) {
|
|
32
|
+
deps.stdout(line);
|
|
33
|
+
}
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
const installed = [];
|
|
37
|
+
for (const entry of filterCatalogEntries(registry.entries, options.category)) {
|
|
38
|
+
const binary = cliBinaryName(entry);
|
|
39
|
+
const binaryPath = await deps.commandOnPath(binary);
|
|
40
|
+
if (!binaryPath) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const version = await binaryVersion(binary, deps.runner);
|
|
44
|
+
installed.push({ name: entry.name, binary, version, description: entry.description });
|
|
45
|
+
}
|
|
46
|
+
if (options.json) {
|
|
47
|
+
deps.stdout(JSON.stringify(installed, null, 2));
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
if (installed.length === 0) {
|
|
51
|
+
const suffix = options.category ? ` in category "${options.category}"` : "";
|
|
52
|
+
deps.stdout(`No Printing Press CLIs installed${suffix}. Try \`printing-press-library search <query>\` or \`printing-press-library install <name>\`.`);
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
for (const line of renderInstalledEntries(installed)) {
|
|
56
|
+
deps.stdout(line);
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export const listCommand = createListCommand();
|
|
62
|
+
function parseListArgs(args) {
|
|
63
|
+
const options = {
|
|
64
|
+
json: false,
|
|
65
|
+
installed: false,
|
|
66
|
+
registryUrl: DEFAULT_REGISTRY_URL,
|
|
67
|
+
};
|
|
68
|
+
for (let i = 0; i < args.length; i++) {
|
|
69
|
+
const arg = args[i];
|
|
70
|
+
if (arg === "--json") {
|
|
71
|
+
options.json = true;
|
|
72
|
+
}
|
|
73
|
+
else if (arg === "--installed") {
|
|
74
|
+
options.installed = true;
|
|
75
|
+
}
|
|
76
|
+
else if (arg === "--category") {
|
|
77
|
+
const category = args[++i];
|
|
78
|
+
if (!category) {
|
|
79
|
+
return { error: "Missing value for --category" };
|
|
80
|
+
}
|
|
81
|
+
options.category = category;
|
|
82
|
+
}
|
|
83
|
+
else if (arg === "--registry-url") {
|
|
84
|
+
const registryUrl = args[++i];
|
|
85
|
+
if (!registryUrl) {
|
|
86
|
+
return { error: "Missing value for --registry-url" };
|
|
87
|
+
}
|
|
88
|
+
options.registryUrl = registryUrl;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
return { error: `Unknown list option: ${arg}` };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return options;
|
|
95
|
+
}
|
|
96
|
+
function filterCatalogEntries(entries, category) {
|
|
97
|
+
const filtered = category
|
|
98
|
+
? entries.filter((entry) => entry.category.toLowerCase() === category.toLowerCase())
|
|
99
|
+
: entries;
|
|
100
|
+
return [...filtered].sort((a, b) => a.category.localeCompare(b.category) || a.name.localeCompare(b.name));
|
|
101
|
+
}
|
|
102
|
+
async function binaryVersion(binary, runner) {
|
|
103
|
+
const result = await runner(binary, ["--version"]);
|
|
104
|
+
if (result.code !== 0) {
|
|
105
|
+
return "unknown";
|
|
106
|
+
}
|
|
107
|
+
return result.stdout.trim().split(/\r?\n/)[0] || "unknown";
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAe,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,aAAa,GAGd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAiB5E,MAAM,UAAU,iBAAiB,CAAC,YAA+B,EAAE;IACjE,MAAM,IAAI,GAAa;QACrB,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;QAC1C,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;QAChD,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACzC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3C,GAAG,SAAS;KACb,CAAC;IAEF,OAAO,KAAK,UAAU,mBAAmB,CAAC,OAAiB,EAAE;QAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,CAAC;YACX,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,IAAI,CAAC,MAAM,CAAC,+BAA+B,MAAM,GAAG,CAAC,CAAC;gBACtD,OAAO,CAAC,CAAC;YACX,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,oBAAoB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7E,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,mCAAmC,MAAM,+FAA+F,CAAC,CAAC;YACtJ,OAAO,CAAC,CAAC;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;AAE/C,SAAS,aAAa,CAAC,IAAc;IAGnC,MAAM,OAAO,GAAkF;QAC7F,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,oBAAoB;KAClC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACjC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;YACvD,CAAC;YACD,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,KAAK,EAAE,wBAAwB,GAAG,EAAE,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAwB,EAAE,QAAiB;IACvE,MAAM,QAAQ,GAAG,QAAQ;QACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;QACpF,CAAC,CAAC,OAAO,CAAC;IACZ,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,MAAc;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Registry, type RegistryEntry } from "../registry.js";
|
|
2
|
+
interface SearchDeps {
|
|
3
|
+
fetchRegistry: (url: string) => Promise<Registry>;
|
|
4
|
+
stdout: (message: string) => void;
|
|
5
|
+
stderr: (message: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSearchCommand(overrides?: Partial<SearchDeps>): (args: string[]) => Promise<number>;
|
|
8
|
+
export declare const searchCommand: (args: string[]) => Promise<number>;
|
|
9
|
+
export declare function searchRegistry(entries: RegistryEntry[], query: string): RegistryEntry[];
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { DEFAULT_REGISTRY_URL, fetchRegistry } from "../registry.js";
|
|
2
|
+
import { renderCatalogEntries } from "../format.js";
|
|
3
|
+
export function createSearchCommand(overrides = {}) {
|
|
4
|
+
const deps = {
|
|
5
|
+
fetchRegistry: (url) => fetchRegistry(url),
|
|
6
|
+
stdout: (message) => console.log(message),
|
|
7
|
+
stderr: (message) => console.error(message),
|
|
8
|
+
...overrides,
|
|
9
|
+
};
|
|
10
|
+
return async function searchCommandWithDeps(args) {
|
|
11
|
+
const parsed = parseSearchArgs(args);
|
|
12
|
+
if ("error" in parsed) {
|
|
13
|
+
deps.stderr(parsed.error);
|
|
14
|
+
deps.stderr("Usage: printing-press-library search <query> [--json]");
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
const registry = await deps.fetchRegistry(parsed.registryUrl);
|
|
18
|
+
const matches = searchRegistry(registry.entries, parsed.query);
|
|
19
|
+
if (parsed.json) {
|
|
20
|
+
deps.stdout(JSON.stringify(matches, null, 2));
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
if (matches.length === 0) {
|
|
24
|
+
deps.stdout(`No matches for "${parsed.query}".`);
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
for (const line of renderCatalogEntries(matches)) {
|
|
28
|
+
deps.stdout(line);
|
|
29
|
+
}
|
|
30
|
+
return 0;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export const searchCommand = createSearchCommand();
|
|
34
|
+
export function searchRegistry(entries, query) {
|
|
35
|
+
const q = query.toLowerCase();
|
|
36
|
+
return entries
|
|
37
|
+
.map((entry) => ({ entry, score: scoreEntry(entry, q) }))
|
|
38
|
+
.filter((result) => result.score > 0)
|
|
39
|
+
.sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name))
|
|
40
|
+
.map((result) => result.entry);
|
|
41
|
+
}
|
|
42
|
+
function scoreEntry(entry, query) {
|
|
43
|
+
const name = entry.name.toLowerCase();
|
|
44
|
+
const api = entry.api.toLowerCase();
|
|
45
|
+
const category = entry.category.toLowerCase();
|
|
46
|
+
const description = entry.description.toLowerCase();
|
|
47
|
+
if (name === query || api === query)
|
|
48
|
+
return 100;
|
|
49
|
+
if (name.includes(query))
|
|
50
|
+
return 80;
|
|
51
|
+
if (api.includes(query))
|
|
52
|
+
return 70;
|
|
53
|
+
if (category.includes(query))
|
|
54
|
+
return 50;
|
|
55
|
+
if (description.includes(query))
|
|
56
|
+
return 30;
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
function parseSearchArgs(args) {
|
|
60
|
+
const queryParts = [];
|
|
61
|
+
let json = false;
|
|
62
|
+
let registryUrl = DEFAULT_REGISTRY_URL;
|
|
63
|
+
for (let i = 0; i < args.length; i++) {
|
|
64
|
+
const arg = args[i];
|
|
65
|
+
if (arg === "--json") {
|
|
66
|
+
json = true;
|
|
67
|
+
}
|
|
68
|
+
else if (arg === "--registry-url") {
|
|
69
|
+
const value = args[++i];
|
|
70
|
+
if (!value) {
|
|
71
|
+
return { error: "Missing value for --registry-url" };
|
|
72
|
+
}
|
|
73
|
+
registryUrl = value;
|
|
74
|
+
}
|
|
75
|
+
else if (arg.startsWith("-")) {
|
|
76
|
+
return { error: `Unknown search option: ${arg}` };
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
queryParts.push(arg);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const query = queryParts.join(" ").trim();
|
|
83
|
+
return query ? { query, json, registryUrl } : { error: "Missing search query" };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAqC,MAAM,gBAAgB,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAQpD,MAAM,UAAU,mBAAmB,CAAC,YAAiC,EAAE;IACrE,MAAM,IAAI,GAAe;QACvB,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;QAC1C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACzC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3C,GAAG,SAAS;KACb,CAAC;IAEF,OAAO,KAAK,UAAU,qBAAqB,CAAC,IAAc;QACxD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,mBAAmB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YACjD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAEnD,MAAM,UAAU,cAAc,CAAC,OAAwB,EAAE,KAAa;IACpE,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;SACxD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC7E,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB,EAAE,KAAa;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,IAAc;IAGrC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,WAAW,GAAG,oBAAoB,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;YACvD,CAAC;YACD,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,KAAK,EAAE,0BAA0B,GAAG,EAAE,EAAE,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type RunResult } from "../process.js";
|
|
2
|
+
import { type Registry } from "../registry.js";
|
|
3
|
+
interface UninstallDeps {
|
|
4
|
+
fetchRegistry: (url: string) => Promise<Registry>;
|
|
5
|
+
commandOnPath: (binary: string) => Promise<string | null>;
|
|
6
|
+
removeFile: (path: string) => Promise<void>;
|
|
7
|
+
removeSkill: (skillName: string, agents: string[]) => Promise<RunResult>;
|
|
8
|
+
stdout: (message: string) => void;
|
|
9
|
+
stderr: (message: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function createUninstallCommand(overrides?: Partial<UninstallDeps>): (args: string[]) => Promise<number>;
|
|
12
|
+
export declare const uninstallCommand: (args: string[]) => Promise<number>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import { commandOnPath } from "../process.js";
|
|
3
|
+
import { cliBinaryName, cliSkillName, DEFAULT_REGISTRY_URL, fetchRegistry, lookupByName } from "../registry.js";
|
|
4
|
+
import { removeSkill } from "../skill.js";
|
|
5
|
+
export function createUninstallCommand(overrides = {}) {
|
|
6
|
+
const deps = {
|
|
7
|
+
fetchRegistry: (url) => fetchRegistry(url),
|
|
8
|
+
commandOnPath: (binary) => commandOnPath(binary),
|
|
9
|
+
removeFile: (path) => rm(path, { force: true }),
|
|
10
|
+
removeSkill: (skillName, agents) => removeSkill(skillName, { agents }),
|
|
11
|
+
stdout: (message) => console.log(message),
|
|
12
|
+
stderr: (message) => console.error(message),
|
|
13
|
+
...overrides,
|
|
14
|
+
};
|
|
15
|
+
return async function uninstallCommandWithDeps(args) {
|
|
16
|
+
const parsed = parseUninstallArgs(args);
|
|
17
|
+
if ("error" in parsed) {
|
|
18
|
+
deps.stderr(parsed.error);
|
|
19
|
+
deps.stderr("Usage: printing-press-library uninstall <name> --yes [--agent <agent>...]");
|
|
20
|
+
return 1;
|
|
21
|
+
}
|
|
22
|
+
if (!parsed.yes) {
|
|
23
|
+
deps.stderr("Refusing to uninstall without --yes.");
|
|
24
|
+
return 1;
|
|
25
|
+
}
|
|
26
|
+
const registry = await deps.fetchRegistry(parsed.registryUrl);
|
|
27
|
+
const entry = lookupByName(registry, parsed.name);
|
|
28
|
+
if (!entry) {
|
|
29
|
+
deps.stderr(`No Printing Press CLI found for "${parsed.name}".`);
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
const binary = cliBinaryName(entry);
|
|
33
|
+
const binaryPath = await deps.commandOnPath(binary);
|
|
34
|
+
if (binaryPath) {
|
|
35
|
+
await deps.removeFile(binaryPath);
|
|
36
|
+
}
|
|
37
|
+
const skillName = cliSkillName(entry);
|
|
38
|
+
const skill = await deps.removeSkill(skillName, parsed.agents);
|
|
39
|
+
if (skill.code !== 0) {
|
|
40
|
+
deps.stderr(`Failed to remove skill ${skillName}.`);
|
|
41
|
+
if (skill.stderr.trim()) {
|
|
42
|
+
deps.stderr(skill.stderr.trim());
|
|
43
|
+
}
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
if (parsed.json) {
|
|
47
|
+
deps.stdout(JSON.stringify({ ok: true, name: entry.name, binary, binaryPath, skill: skillName }, null, 2));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
deps.stdout(`Uninstalled ${entry.name}`);
|
|
51
|
+
if (binaryPath) {
|
|
52
|
+
deps.stdout(` removed binary: ${binaryPath}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
deps.stdout(` binary was not found on PATH: ${binary}`);
|
|
56
|
+
}
|
|
57
|
+
deps.stdout(` removed skill: ${skillName}`);
|
|
58
|
+
}
|
|
59
|
+
return 0;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export const uninstallCommand = createUninstallCommand();
|
|
63
|
+
function parseUninstallArgs(args) {
|
|
64
|
+
let name;
|
|
65
|
+
let yes = false;
|
|
66
|
+
let json = false;
|
|
67
|
+
let registryUrl = DEFAULT_REGISTRY_URL;
|
|
68
|
+
const agents = [];
|
|
69
|
+
for (let i = 0; i < args.length; i++) {
|
|
70
|
+
const arg = args[i];
|
|
71
|
+
if (arg === "--yes" || arg === "-y") {
|
|
72
|
+
yes = true;
|
|
73
|
+
}
|
|
74
|
+
else if (arg === "--json") {
|
|
75
|
+
json = true;
|
|
76
|
+
}
|
|
77
|
+
else if (arg === "--agent" || arg === "-a") {
|
|
78
|
+
const value = args[++i];
|
|
79
|
+
if (!value)
|
|
80
|
+
return { error: `Missing value for ${arg}` };
|
|
81
|
+
agents.push(value);
|
|
82
|
+
}
|
|
83
|
+
else if (arg === "--registry-url") {
|
|
84
|
+
const value = args[++i];
|
|
85
|
+
if (!value)
|
|
86
|
+
return { error: "Missing value for --registry-url" };
|
|
87
|
+
registryUrl = value;
|
|
88
|
+
}
|
|
89
|
+
else if (arg.startsWith("-")) {
|
|
90
|
+
return { error: `Unknown uninstall option: ${arg}` };
|
|
91
|
+
}
|
|
92
|
+
else if (!name) {
|
|
93
|
+
name = arg;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return { error: `Unexpected argument: ${arg}` };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return name ? { name, yes, json, agents, registryUrl } : { error: "Missing CLI name" };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Registry } from "../registry.js";
|
|
2
|
+
interface UpdateDeps {
|
|
3
|
+
fetchRegistry: (url: string) => Promise<Registry>;
|
|
4
|
+
commandOnPath: (binary: string) => Promise<string | null>;
|
|
5
|
+
install: (args: string[]) => Promise<number>;
|
|
6
|
+
stdout: (message: string) => void;
|
|
7
|
+
stderr: (message: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createUpdateCommand(overrides?: Partial<UpdateDeps>): (args: string[]) => Promise<number>;
|
|
10
|
+
export declare const updateCommand: (args: string[]) => Promise<number>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { installCommand } from "./install.js";
|
|
2
|
+
import { commandOnPath } from "../process.js";
|
|
3
|
+
import { cliBinaryName, DEFAULT_REGISTRY_URL, fetchRegistry } from "../registry.js";
|
|
4
|
+
export function createUpdateCommand(overrides = {}) {
|
|
5
|
+
const deps = {
|
|
6
|
+
fetchRegistry: (url) => fetchRegistry(url),
|
|
7
|
+
commandOnPath: (binary) => commandOnPath(binary),
|
|
8
|
+
install: installCommand,
|
|
9
|
+
stdout: (message) => console.log(message),
|
|
10
|
+
stderr: (message) => console.error(message),
|
|
11
|
+
...overrides,
|
|
12
|
+
};
|
|
13
|
+
return async function updateCommandWithDeps(args) {
|
|
14
|
+
const parsed = parseUpdateArgs(args);
|
|
15
|
+
if ("error" in parsed) {
|
|
16
|
+
deps.stderr(parsed.error);
|
|
17
|
+
return 1;
|
|
18
|
+
}
|
|
19
|
+
if (parsed.name) {
|
|
20
|
+
return deps.install([parsed.name, ...parsed.installArgs]);
|
|
21
|
+
}
|
|
22
|
+
const registry = await deps.fetchRegistry(parsed.registryUrl);
|
|
23
|
+
const installed = [];
|
|
24
|
+
for (const entry of registry.entries) {
|
|
25
|
+
if (await deps.commandOnPath(cliBinaryName(entry))) {
|
|
26
|
+
installed.push(entry.name);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (installed.length === 0) {
|
|
30
|
+
deps.stdout("Nothing to update; no Printing Press CLIs were found on PATH.");
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
let failures = 0;
|
|
34
|
+
for (const name of installed) {
|
|
35
|
+
const code = await deps.install([name, ...parsed.installArgs]);
|
|
36
|
+
if (code !== 0) {
|
|
37
|
+
failures++;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return failures === 0 ? 0 : 1;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export const updateCommand = createUpdateCommand();
|
|
44
|
+
function parseUpdateArgs(args) {
|
|
45
|
+
let name;
|
|
46
|
+
let registryUrl = DEFAULT_REGISTRY_URL;
|
|
47
|
+
const installArgs = [];
|
|
48
|
+
for (let i = 0; i < args.length; i++) {
|
|
49
|
+
const arg = args[i];
|
|
50
|
+
if (arg === "--registry-url") {
|
|
51
|
+
const value = args[++i];
|
|
52
|
+
if (!value) {
|
|
53
|
+
return { error: "Missing value for --registry-url" };
|
|
54
|
+
}
|
|
55
|
+
registryUrl = value;
|
|
56
|
+
installArgs.push("--registry-url", value);
|
|
57
|
+
}
|
|
58
|
+
else if (arg === "--json" || arg === "--agent" || arg === "-a") {
|
|
59
|
+
installArgs.push(arg);
|
|
60
|
+
if (arg === "--agent" || arg === "-a") {
|
|
61
|
+
const value = args[++i];
|
|
62
|
+
if (!value) {
|
|
63
|
+
return { error: `Missing value for ${arg}` };
|
|
64
|
+
}
|
|
65
|
+
installArgs.push(value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (arg.startsWith("-")) {
|
|
69
|
+
return { error: `Unknown update option: ${arg}` };
|
|
70
|
+
}
|
|
71
|
+
else if (!name) {
|
|
72
|
+
name = arg;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return { error: `Unexpected argument: ${arg}` };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { name, registryUrl, installArgs };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CLI_COMMAND_NAME = "printing-press-library";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type RegistryEntry } from "./registry.js";
|
|
2
|
+
export declare function renderCatalogEntries(entries: RegistryEntry[]): string[];
|
|
3
|
+
export interface InstalledDisplayEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
binary: string;
|
|
6
|
+
version: string;
|
|
7
|
+
description: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function renderInstalledEntries(entries: InstalledDisplayEntry[]): string[];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { cliBinaryName } from "./registry.js";
|
|
2
|
+
import { CLI_COMMAND_NAME } from "./constants.js";
|
|
3
|
+
const DEFAULT_WIDTH = 88;
|
|
4
|
+
const BODY_INDENT = " ";
|
|
5
|
+
export function renderCatalogEntries(entries) {
|
|
6
|
+
return entries.flatMap((entry, index) => {
|
|
7
|
+
const lines = [
|
|
8
|
+
`${entry.name} (${entry.category}) - ${cliBinaryName(entry)}`,
|
|
9
|
+
...wrapText(entry.description, DEFAULT_WIDTH, BODY_INDENT),
|
|
10
|
+
`${BODY_INDENT}install: ${CLI_COMMAND_NAME} install ${entry.name}`,
|
|
11
|
+
];
|
|
12
|
+
return index === entries.length - 1 ? lines : [...lines, ""];
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function renderInstalledEntries(entries) {
|
|
16
|
+
return entries.flatMap((entry, index) => {
|
|
17
|
+
const lines = [
|
|
18
|
+
`${entry.name} (${entry.version}) - ${entry.binary}`,
|
|
19
|
+
...wrapText(entry.description, DEFAULT_WIDTH, BODY_INDENT),
|
|
20
|
+
];
|
|
21
|
+
return index === entries.length - 1 ? lines : [...lines, ""];
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function wrapText(text, width, indent) {
|
|
25
|
+
const words = text.trim().split(/\s+/).filter(Boolean);
|
|
26
|
+
if (words.length === 0) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const lines = [];
|
|
30
|
+
let line = indent;
|
|
31
|
+
for (const word of words) {
|
|
32
|
+
const candidate = line === indent ? `${indent}${word}` : `${line} ${word}`;
|
|
33
|
+
if (candidate.length > width && line !== indent) {
|
|
34
|
+
lines.push(line);
|
|
35
|
+
line = `${indent}${word}`;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
line = candidate;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
lines.push(line);
|
|
42
|
+
return lines;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAsB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,MAAM,UAAU,oBAAoB,CAAC,OAAwB;IAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG;YACZ,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE;YAC7D,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC;YAC1D,GAAG,WAAW,YAAY,gBAAgB,YAAY,KAAK,CAAC,IAAI,EAAE;SACnE,CAAC;QACF,OAAO,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AASD,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG;YACZ,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE;YACpD,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC;SAC3D,CAAC;QACF,OAAO,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,MAAc;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QAC3E,IAAI,SAAS,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,GAAG,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/src/go.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Runner } from "./process.js";
|
|
2
|
+
export interface GoDetection {
|
|
3
|
+
installed: boolean;
|
|
4
|
+
version?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function detectGo(runner?: Runner): Promise<GoDetection>;
|
|
7
|
+
export interface GoInstallOptions {
|
|
8
|
+
ref?: string;
|
|
9
|
+
env?: NodeJS.ProcessEnv;
|
|
10
|
+
runner?: Runner;
|
|
11
|
+
}
|
|
12
|
+
export declare function goInstall(modulePath: string, options?: GoInstallOptions): Promise<import("./process.js").RunResult>;
|
|
13
|
+
export interface GoInstallDir {
|
|
14
|
+
/** Directory go install writes binaries to (GOBIN if set, otherwise GOPATH/bin). */
|
|
15
|
+
binDir: string | null;
|
|
16
|
+
/** Raw values for diagnostics. */
|
|
17
|
+
gobin: string;
|
|
18
|
+
gopath: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns the directory `go install` actually writes to. `go install` writes to
|
|
22
|
+
* `$GOBIN` when set, otherwise `$GOPATH/bin` (and `go env` resolves `GOPATH` to
|
|
23
|
+
* its default `~/go` when unset). We ask `go env` rather than reading the
|
|
24
|
+
* process environment directly so the same defaults Go uses are honored.
|
|
25
|
+
*/
|
|
26
|
+
export declare function goInstallDir(runner?: Runner, platform?: NodeJS.Platform): Promise<GoInstallDir>;
|
package/dist/src/go.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { execFileRunner } from "./process.js";
|
|
2
|
+
export async function detectGo(runner = execFileRunner) {
|
|
3
|
+
const result = await runner("go", ["version"]);
|
|
4
|
+
if (result.code !== 0) {
|
|
5
|
+
return { installed: false };
|
|
6
|
+
}
|
|
7
|
+
const match = result.stdout.match(/\bgo version go(\S+)/);
|
|
8
|
+
return {
|
|
9
|
+
installed: true,
|
|
10
|
+
version: match?.[1],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export async function goInstall(modulePath, options = {}) {
|
|
14
|
+
const runner = options.runner ?? execFileRunner;
|
|
15
|
+
const ref = options.ref ?? "latest";
|
|
16
|
+
return runner("go", ["install", `${modulePath}@${ref}`], { env: options.env });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Returns the directory `go install` actually writes to. `go install` writes to
|
|
20
|
+
* `$GOBIN` when set, otherwise `$GOPATH/bin` (and `go env` resolves `GOPATH` to
|
|
21
|
+
* its default `~/go` when unset). We ask `go env` rather than reading the
|
|
22
|
+
* process environment directly so the same defaults Go uses are honored.
|
|
23
|
+
*/
|
|
24
|
+
export async function goInstallDir(runner = execFileRunner, platform = process.platform) {
|
|
25
|
+
const result = await runner("go", ["env", "GOBIN", "GOPATH"]);
|
|
26
|
+
if (result.code !== 0) {
|
|
27
|
+
return { binDir: null, gobin: "", gopath: "" };
|
|
28
|
+
}
|
|
29
|
+
const lines = result.stdout.split(/\r?\n/).map((line) => line.trim());
|
|
30
|
+
const gobin = lines[0] ?? "";
|
|
31
|
+
const gopath = lines[1] ?? "";
|
|
32
|
+
const sep = platform === "win32" ? "\\" : "/";
|
|
33
|
+
// Strip trailing separators so a user with `GOBIN=/home/user/go/bin/` doesn't
|
|
34
|
+
// produce a double-slash path that fails to match what `which` resolves.
|
|
35
|
+
const stripTrailing = (p) => p.replace(/[\\/]+$/, "");
|
|
36
|
+
if (gobin) {
|
|
37
|
+
return { binDir: stripTrailing(gobin), gobin, gopath };
|
|
38
|
+
}
|
|
39
|
+
if (gopath) {
|
|
40
|
+
return { binDir: `${stripTrailing(gopath)}${sep}bin`, gobin, gopath };
|
|
41
|
+
}
|
|
42
|
+
return { binDir: null, gobin, gopath };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/go.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,cAAc,CAAC;AAO3D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAiB,cAAc;IAC5D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1D,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;KACpB,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,UAA4B,EAAE;IAChF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC;IACpC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACjF,CAAC;AAUD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,cAAc,EAC/B,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,8EAA8E;IAC9E,yEAAyE;IACzE,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9D,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface RunResult {
|
|
2
|
+
code: number;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RunOptions {
|
|
7
|
+
env?: NodeJS.ProcessEnv;
|
|
8
|
+
}
|
|
9
|
+
export type Runner = (command: string, args: string[], options?: RunOptions) => Promise<RunResult>;
|
|
10
|
+
export declare const execFileRunner: Runner;
|
|
11
|
+
export declare function commandOnPath(binary: string, runner?: Runner, platform?: NodeJS.Platform): Promise<string | null>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
export const execFileRunner = (command, args, options = {}) => {
|
|
3
|
+
return new Promise((resolve) => {
|
|
4
|
+
execFile(command, args, {
|
|
5
|
+
env: options.env ? { ...process.env, ...options.env } : process.env,
|
|
6
|
+
}, (error, stdout, stderr) => {
|
|
7
|
+
if (error && "code" in error && error.code === "ENOENT") {
|
|
8
|
+
resolve({ code: 127, stdout, stderr });
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
resolve({
|
|
12
|
+
code: typeof error?.code === "number" ? error.code : 0,
|
|
13
|
+
stdout,
|
|
14
|
+
stderr,
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
export async function commandOnPath(binary, runner = execFileRunner, platform = process.platform) {
|
|
20
|
+
const command = platform === "win32" ? "where" : "which";
|
|
21
|
+
const result = await runner(command, [binary]);
|
|
22
|
+
if (result.code !== 0) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return result.stdout.split(/\r?\n/).find((line) => line.trim() !== "")?.trim() ?? null;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAc9C,MAAM,CAAC,MAAM,cAAc,GAAW,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,OAAO,EACP,IAAI,EACJ;YACE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;SACpE,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,OAAO,CAAC;gBACN,IAAI,EAAE,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,SAAiB,cAAc,EAC/B,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AACzF,CAAC"}
|