@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,44 @@
|
|
|
1
|
+
export declare const DEFAULT_REGISTRY_URL = "https://raw.githubusercontent.com/mvanhorn/printing-press-library/main/registry.json";
|
|
2
|
+
export interface MCPBlock {
|
|
3
|
+
binary: string;
|
|
4
|
+
transports: string[];
|
|
5
|
+
tool_count: number;
|
|
6
|
+
public_tool_count?: number;
|
|
7
|
+
auth_type: string;
|
|
8
|
+
env_vars: string[];
|
|
9
|
+
mcp_ready?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface RegistryEntry {
|
|
12
|
+
name: string;
|
|
13
|
+
category: string;
|
|
14
|
+
api: string;
|
|
15
|
+
description: string;
|
|
16
|
+
path: string;
|
|
17
|
+
mcp?: MCPBlock;
|
|
18
|
+
}
|
|
19
|
+
export interface Registry {
|
|
20
|
+
schema_version: number;
|
|
21
|
+
entries: RegistryEntry[];
|
|
22
|
+
}
|
|
23
|
+
type RegistryFetch = (url: string, init?: RequestInit) => Promise<Response>;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a raw registry payload into a typed Registry.
|
|
26
|
+
*
|
|
27
|
+
* Per-entry validation errors are surfaced as warnings to `warn` (defaulting to
|
|
28
|
+
* stderr) and the offending entry is skipped. The remainder of the registry is
|
|
29
|
+
* returned intact. This is the defense-in-depth that paired with the library-side
|
|
30
|
+
* `--validate` gate keeps a single malformed upstream entry from breaking every
|
|
31
|
+
* installer call (the original lawhub failure mode).
|
|
32
|
+
*
|
|
33
|
+
* Registry-level shape failures (non-object payload, unsupported schema_version,
|
|
34
|
+
* non-array entries) still throw because they signal a wrong-protocol payload
|
|
35
|
+
* the installer cannot recover from.
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseRegistry(value: unknown, warn?: (message: string) => void): Registry;
|
|
38
|
+
export declare function fetchRegistry(url?: string, fetchImpl?: RegistryFetch): Promise<Registry>;
|
|
39
|
+
export declare function fetchGoModulePath(entryPath: string, registryUrl?: string, fetchImpl?: RegistryFetch): Promise<string | null>;
|
|
40
|
+
export declare function lookupByName(registry: Registry, name: string): RegistryEntry | null;
|
|
41
|
+
export declare function cliSkillName(entry: RegistryEntry): string;
|
|
42
|
+
export declare function cliBinaryName(entry: RegistryEntry): string;
|
|
43
|
+
export declare function parseGoModulePath(goMod: string): string | null;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
export const DEFAULT_REGISTRY_URL = "https://raw.githubusercontent.com/mvanhorn/printing-press-library/main/registry.json";
|
|
2
|
+
/**
|
|
3
|
+
* Parse a raw registry payload into a typed Registry.
|
|
4
|
+
*
|
|
5
|
+
* Per-entry validation errors are surfaced as warnings to `warn` (defaulting to
|
|
6
|
+
* stderr) and the offending entry is skipped. The remainder of the registry is
|
|
7
|
+
* returned intact. This is the defense-in-depth that paired with the library-side
|
|
8
|
+
* `--validate` gate keeps a single malformed upstream entry from breaking every
|
|
9
|
+
* installer call (the original lawhub failure mode).
|
|
10
|
+
*
|
|
11
|
+
* Registry-level shape failures (non-object payload, unsupported schema_version,
|
|
12
|
+
* non-array entries) still throw because they signal a wrong-protocol payload
|
|
13
|
+
* the installer cannot recover from.
|
|
14
|
+
*/
|
|
15
|
+
export function parseRegistry(value, warn = defaultWarn) {
|
|
16
|
+
if (!isRecord(value)) {
|
|
17
|
+
throw new Error("registry payload must be an object");
|
|
18
|
+
}
|
|
19
|
+
if (value.schema_version !== 2) {
|
|
20
|
+
throw new Error(`unsupported registry schema_version: ${String(value.schema_version)}`);
|
|
21
|
+
}
|
|
22
|
+
if (!Array.isArray(value.entries)) {
|
|
23
|
+
throw new Error("registry entries must be an array");
|
|
24
|
+
}
|
|
25
|
+
const entries = [];
|
|
26
|
+
let skipped = 0;
|
|
27
|
+
for (let i = 0; i < value.entries.length; i++) {
|
|
28
|
+
const raw = value.entries[i];
|
|
29
|
+
try {
|
|
30
|
+
entries.push(parseRegistryEntry(raw));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const name = isRecord(raw) && typeof raw.name === "string" && raw.name.trim() !== ""
|
|
34
|
+
? raw.name
|
|
35
|
+
: `(unnamed at index ${i})`;
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
warn(`[printing-press-library] skipping malformed registry entry: ${name}: ${message}`);
|
|
38
|
+
skipped++;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (skipped > 0) {
|
|
42
|
+
const word = skipped === 1 ? "entry" : "entries";
|
|
43
|
+
warn(`[printing-press-library] skipped ${skipped} malformed registry ${word}; install/search may be missing items.`);
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
schema_version: 2,
|
|
47
|
+
entries,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function defaultWarn(message) {
|
|
51
|
+
process.stderr.write(message + "\n");
|
|
52
|
+
}
|
|
53
|
+
export async function fetchRegistry(url = DEFAULT_REGISTRY_URL, fetchImpl = fetch) {
|
|
54
|
+
const response = await fetchImpl(url, githubRequestInit(url));
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
const authHint = response.status === 404 || response.status === 401
|
|
57
|
+
? " If the catalog repository is private, set GITHUB_TOKEN or GH_TOKEN."
|
|
58
|
+
: "";
|
|
59
|
+
throw new Error(`failed to fetch registry: HTTP ${response.status}.${authHint}`);
|
|
60
|
+
}
|
|
61
|
+
return parseRegistry(await response.json());
|
|
62
|
+
}
|
|
63
|
+
export async function fetchGoModulePath(entryPath, registryUrl = DEFAULT_REGISTRY_URL, fetchImpl = fetch) {
|
|
64
|
+
const goModUrl = goModUrlForRegistryEntry(registryUrl, entryPath);
|
|
65
|
+
if (!goModUrl) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const response = await fetchImpl(goModUrl, githubRequestInit(goModUrl));
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const goMod = await response.text();
|
|
73
|
+
return parseGoModulePath(goMod);
|
|
74
|
+
}
|
|
75
|
+
export function lookupByName(registry, name) {
|
|
76
|
+
const normalized = normalizeName(name);
|
|
77
|
+
return (registry.entries.find((entry) => {
|
|
78
|
+
const entryName = normalizeName(entry.name);
|
|
79
|
+
return entryName === normalized || normalizeName(entry.api) === normalized;
|
|
80
|
+
}) ?? null);
|
|
81
|
+
}
|
|
82
|
+
export function cliSkillName(entry) {
|
|
83
|
+
return `pp-${entry.name.replace(/-pp-cli$/, "")}`;
|
|
84
|
+
}
|
|
85
|
+
export function cliBinaryName(entry) {
|
|
86
|
+
return entry.name.endsWith("-pp-cli") ? entry.name : `${entry.name}-pp-cli`;
|
|
87
|
+
}
|
|
88
|
+
function parseRegistryEntry(value) {
|
|
89
|
+
if (!isRecord(value)) {
|
|
90
|
+
throw new Error("registry entry must be an object");
|
|
91
|
+
}
|
|
92
|
+
const entry = {
|
|
93
|
+
name: requiredString(value, "name"),
|
|
94
|
+
category: requiredString(value, "category"),
|
|
95
|
+
api: requiredString(value, "api"),
|
|
96
|
+
description: requiredString(value, "description"),
|
|
97
|
+
path: requiredString(value, "path"),
|
|
98
|
+
};
|
|
99
|
+
return isRecord(value.mcp)
|
|
100
|
+
? {
|
|
101
|
+
...entry,
|
|
102
|
+
mcp: {
|
|
103
|
+
binary: requiredString(value.mcp, "binary"),
|
|
104
|
+
transports: requiredStringArray(value.mcp, "transports"),
|
|
105
|
+
tool_count: requiredNumber(value.mcp, "tool_count"),
|
|
106
|
+
public_tool_count: typeof value.mcp.public_tool_count === "number" ? value.mcp.public_tool_count : undefined,
|
|
107
|
+
auth_type: requiredString(value.mcp, "auth_type"),
|
|
108
|
+
env_vars: Array.isArray(value.mcp.env_vars) ? value.mcp.env_vars.map(String) : [],
|
|
109
|
+
mcp_ready: typeof value.mcp.mcp_ready === "string" ? value.mcp.mcp_ready : undefined,
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
: entry;
|
|
113
|
+
}
|
|
114
|
+
function normalizeName(value) {
|
|
115
|
+
return value.toLowerCase().replace(/^pp-/, "").replace(/-pp-cli$/, "").replace(/[^a-z0-9]+/g, "-");
|
|
116
|
+
}
|
|
117
|
+
function requiredString(value, key) {
|
|
118
|
+
if (typeof value[key] !== "string" || value[key].trim() === "") {
|
|
119
|
+
throw new Error(`registry entry missing string field: ${key}`);
|
|
120
|
+
}
|
|
121
|
+
return value[key];
|
|
122
|
+
}
|
|
123
|
+
function requiredNumber(value, key) {
|
|
124
|
+
if (typeof value[key] !== "number") {
|
|
125
|
+
throw new Error(`registry entry missing number field: ${key}`);
|
|
126
|
+
}
|
|
127
|
+
return value[key];
|
|
128
|
+
}
|
|
129
|
+
function requiredStringArray(value, key) {
|
|
130
|
+
const raw = value[key];
|
|
131
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
132
|
+
throw new Error(`registry entry missing non-empty string array field: ${key}`);
|
|
133
|
+
}
|
|
134
|
+
const out = [];
|
|
135
|
+
for (const item of raw) {
|
|
136
|
+
if (typeof item !== "string" || item.trim() === "") {
|
|
137
|
+
throw new Error(`registry entry has non-string value in array field: ${key}`);
|
|
138
|
+
}
|
|
139
|
+
out.push(item);
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
function isRecord(value) {
|
|
144
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
145
|
+
}
|
|
146
|
+
export function parseGoModulePath(goMod) {
|
|
147
|
+
for (const line of goMod.split(/\r?\n/)) {
|
|
148
|
+
const match = line.match(/^module\s+(\S+)/);
|
|
149
|
+
if (match) {
|
|
150
|
+
return match[1];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
function goModUrlForRegistryEntry(registryUrl, entryPath) {
|
|
156
|
+
let parsed;
|
|
157
|
+
try {
|
|
158
|
+
parsed = new URL(registryUrl);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
if (parsed.hostname !== "raw.githubusercontent.com") {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const parts = parsed.pathname.split("/").filter(Boolean);
|
|
167
|
+
if (parts.length < 4 || parts.at(-1) !== "registry.json") {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
parsed.pathname = `/${parts.slice(0, -1).join("/")}/${entryPath}/go.mod`;
|
|
171
|
+
return parsed.toString();
|
|
172
|
+
}
|
|
173
|
+
function githubRequestInit(url) {
|
|
174
|
+
const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
|
|
175
|
+
if (!token || !isTrustedGitHubUrl(url)) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
headers: {
|
|
180
|
+
Authorization: `Bearer ${token}`,
|
|
181
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function isTrustedGitHubUrl(url) {
|
|
186
|
+
try {
|
|
187
|
+
const parsed = new URL(url);
|
|
188
|
+
return parsed.hostname === "raw.githubusercontent.com" || parsed.hostname === "api.github.com";
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Runner } from "./process.js";
|
|
2
|
+
export interface InstallSkillOptions {
|
|
3
|
+
agents?: string[];
|
|
4
|
+
runner?: Runner;
|
|
5
|
+
}
|
|
6
|
+
export declare function skillSource(skillName: string): string;
|
|
7
|
+
export declare function skillsAddArgs(skillName: string, options?: InstallSkillOptions): string[];
|
|
8
|
+
export declare function installSkill(skillName: string, options?: InstallSkillOptions): Promise<import("./process.js").RunResult>;
|
|
9
|
+
export declare function skillsRemoveArgs(skillName: string, options?: InstallSkillOptions): string[];
|
|
10
|
+
export declare function removeSkill(skillName: string, options?: InstallSkillOptions): Promise<import("./process.js").RunResult>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { execFileRunner } from "./process.js";
|
|
2
|
+
const LIBRARY_SOURCE = "mvanhorn/printing-press-library";
|
|
3
|
+
export function skillSource(skillName) {
|
|
4
|
+
return `${LIBRARY_SOURCE}/cli-skills/${skillName}`;
|
|
5
|
+
}
|
|
6
|
+
export function skillsAddArgs(skillName, options = {}) {
|
|
7
|
+
const args = ["-y", "skills@latest", "add", skillSource(skillName), "-g", "-y"];
|
|
8
|
+
for (const agent of options.agents ?? []) {
|
|
9
|
+
args.push("-a", agent);
|
|
10
|
+
}
|
|
11
|
+
return args;
|
|
12
|
+
}
|
|
13
|
+
export async function installSkill(skillName, options = {}) {
|
|
14
|
+
const runner = options.runner ?? execFileRunner;
|
|
15
|
+
return runner("npx", skillsAddArgs(skillName, options));
|
|
16
|
+
}
|
|
17
|
+
export function skillsRemoveArgs(skillName, options = {}) {
|
|
18
|
+
const args = ["-y", "skills@latest", "remove", skillName, "-g", "-y"];
|
|
19
|
+
for (const agent of options.agents ?? []) {
|
|
20
|
+
args.push("-a", agent);
|
|
21
|
+
}
|
|
22
|
+
return args;
|
|
23
|
+
}
|
|
24
|
+
export async function removeSkill(skillName, options = {}) {
|
|
25
|
+
const runner = options.runner ?? execFileRunner;
|
|
26
|
+
return runner("npx", skillsRemoveArgs(skillName, options));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,cAAc,CAAC;AAE3D,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAOzD,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,GAAG,cAAc,eAAe,SAAS,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,UAA+B,EAAE;IAChF,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,UAA+B,EAAE;IACrF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAChD,OAAO,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,UAA+B,EAAE;IACnF,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,UAA+B,EAAE;IACpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAChD,OAAO,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mvanhorn/printing-press-library",
|
|
3
|
+
"version": "0.1.6",
|
|
4
|
+
"description": "Installer and catalog CLI for Printing Press-generated CLIs.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Matt Van Horn <mvanhorn@gmail.com>",
|
|
8
|
+
"contributors": [
|
|
9
|
+
"Trevin Chow <trevin@trevinchow.com>"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://printingpress.dev",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/mvanhorn/printing-press-library/issues"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/mvanhorn/printing-press-library.git",
|
|
18
|
+
"directory": "npm"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"cli",
|
|
22
|
+
"claude",
|
|
23
|
+
"agent",
|
|
24
|
+
"go",
|
|
25
|
+
"openapi",
|
|
26
|
+
"skills",
|
|
27
|
+
"printing-press",
|
|
28
|
+
"installer"
|
|
29
|
+
],
|
|
30
|
+
"bin": {
|
|
31
|
+
"printing-press-library": "bin/printing-press-library.mjs"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"bin/",
|
|
35
|
+
"CHANGELOG.md",
|
|
36
|
+
"dist/src/",
|
|
37
|
+
"LICENSE",
|
|
38
|
+
"README.md"
|
|
39
|
+
],
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc -p tsconfig.json",
|
|
45
|
+
"clean": "rm -rf dist",
|
|
46
|
+
"test": "npm run build && node --test \"dist/tests/**/*.test.js\"",
|
|
47
|
+
"prepublishOnly": "npm test && npm run build"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public",
|
|
51
|
+
"provenance": true
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/node": "^20.19.39",
|
|
55
|
+
"typescript": "^5.9.3"
|
|
56
|
+
}
|
|
57
|
+
}
|