Add interactive mode with menu-driven resource editing

Running with no flags launches an interactive menu powered by @inquirer/prompts.
Supports chaining multiple actions (max resources, set crafted, geology, time)
before saving once to clipboard.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Julian Tabel
2026-02-25 16:58:25 +01:00
parent 1d0404cd36
commit 3a84335cda
4 changed files with 608 additions and 23 deletions

View File

@@ -12,7 +12,17 @@ npm install
## Usage ## Usage
The tool reads save data from your **clipboard** by default (or from stdin/argument), applies edits, and copies the result back to the clipboard. ### Interactive mode
Run with no flags to launch an interactive menu. It reads your save from the clipboard, lets you pick actions and select individual resources, then copies the result back.
```bash
node index.js
```
### CLI mode
Pass flags for non-interactive, scriptable usage. Reads save data from your **clipboard** by default (or from stdin/argument), applies edits, and copies the result back.
```bash ```bash
# List all resources and their current values # List all resources and their current values

207
index.js
View File

@@ -162,9 +162,11 @@ function main() {
const hasAction = flags.has("--max-resources") || flags.has("--max-time") || flags.has("--max-geology") || flags.has("--list") || craftedValue !== null; const hasAction = flags.has("--max-resources") || flags.has("--max-time") || flags.has("--max-geology") || flags.has("--list") || craftedValue !== null;
if (flags.has("--help") || !hasAction) { if (flags.has("--help")) {
console.log(`Usage: node index.js [options] [save-string] console.log(`Usage: node index.js [options] [save-string]
Running with no flags launches interactive mode.
Options: Options:
--list List all resources in the save with current values --list List all resources in the save with current values
--max-resources Set all capped resources to their max --max-resources Set all capped resources to their max
@@ -176,32 +178,19 @@ Options:
--help Show this help --help Show this help
Save string can be passed as argument, piped via stdin, or read from clipboard.`); Save string can be passed as argument, piped via stdin, or read from clipboard.`);
process.exit(flags.has("--help") ? 0 : 1); process.exit(0);
} }
let input; if (!hasAction && process.stdin.isTTY) {
if (positional.length > 0) { return interactiveMode();
input = positional[0].trim();
} else if (!process.stdin.isTTY) {
try {
input = require("fs").readFileSync("/dev/stdin", "utf-8").trim();
} catch {
// stdin not readable (e.g. piped but empty), fall through to clipboard
}
} }
if (!input) { if (!hasAction) {
const clip = readFromClipboard(); console.error("Error: No action specified. Use --help for usage or run without flags for interactive mode.");
if (clip) { process.exit(1);
console.log("Reading save data from clipboard...");
input = clip;
} else {
console.error("Error: No save data provided. Pass as argument, pipe via stdin, or copy to clipboard.");
process.exit(1);
}
} }
const data = decodeSave(input); const { data, noCopy } = loadSave(positional, flags.has("--no-copy"));
if (flags.has("--list")) { if (flags.has("--list")) {
listResources(data); listResources(data);
@@ -245,9 +234,39 @@ Save string can be passed as argument, piped via stdin, or read from clipboard.`
} }
} }
outputResult(data, noCopy);
}
function loadSave(positional, noCopy) {
let input;
if (positional.length > 0) {
input = positional[0].trim();
} else if (!process.stdin.isTTY) {
try {
input = require("fs").readFileSync("/dev/stdin", "utf-8").trim();
} catch {
// stdin not readable (e.g. piped but empty), fall through to clipboard
}
}
if (!input) {
const clip = readFromClipboard();
if (clip) {
console.log("Reading save data from clipboard...");
input = clip;
} else {
console.error("Error: No save data provided. Pass as argument, pipe via stdin, or copy to clipboard.");
process.exit(1);
}
}
return { data: decodeSave(input), noCopy };
}
function outputResult(data, noCopy) {
const result = encodeSave(data); const result = encodeSave(data);
if (flags.has("--no-copy")) { if (noCopy) {
console.log(result); console.log(result);
} else if (copyToClipboard(result)) { } else if (copyToClipboard(result)) {
console.log("Edited save copied to clipboard."); console.log("Edited save copied to clipboard.");
@@ -257,4 +276,148 @@ Save string can be passed as argument, piped via stdin, or read from clipboard.`
} }
} }
function getResourceChoices(data, type) {
const choices = [];
for (const [key, res] of Object.entries(data.resource || {})) {
const name = res.name || key;
const amount = res.amount ?? 0;
const max = res.max ?? 0;
if (type === "capped" && max > 0) {
const full = amount >= max;
choices.push({
value: key,
name: `${name} (${Math.floor(amount)} / ${max})${full ? " [full]" : ""}`,
checked: !full,
});
} else if (type === "crafted" && max === -1) {
choices.push({
value: key,
name: `${name} (${Math.floor(amount)})`,
checked: true,
});
}
}
return choices;
}
async function interactiveMode() {
const { select, checkbox, confirm, input } = require("@inquirer/prompts");
const { data } = loadSave([], false);
let modified = false;
while (true) {
const action = await select({
message: "What would you like to do?",
choices: [
{ value: "max-resources", name: "Max capped resources" },
{ value: "set-crafted", name: "Set crafted resources" },
{ value: "max-geology", name: "Max geology bonuses" },
{ value: "max-time", name: "Max accelerated time" },
{ value: "list", name: "List all resources" },
...(modified ? [{ value: "save", name: "Save & copy to clipboard" }] : []),
{ value: "exit", name: "Exit" },
],
});
if (action === "exit") {
if (modified) {
const discard = await confirm({ message: "Discard unsaved changes?", default: false });
if (!discard) continue;
}
break;
}
if (action === "save") {
outputResult(data, false);
break;
}
if (action === "list") {
listResources(data);
continue;
}
if (action === "max-time") {
const MAX_AT = 11520;
const old = data.settings?.at ?? 0;
if (old < MAX_AT) {
data.settings.at = MAX_AT;
console.log(`Accelerated time: ${old} -> ${MAX_AT} (adjusts to 8 hours on load)`);
modified = true;
} else {
console.log(`Accelerated time already at ${old} (>= max).`);
}
continue;
}
if (action === "max-geology") {
console.log(setGeology(data));
modified = true;
continue;
}
if (action === "max-resources") {
const choices = getResourceChoices(data, "capped");
if (choices.length === 0) {
console.log("No capped resources found.");
continue;
}
const selected = await checkbox({
message: "Select resources to max (space to toggle, enter to confirm)",
choices,
});
if (selected.length === 0) {
console.log("No resources selected.");
continue;
}
const filter = new Set(selected.map((s) => s.toLowerCase()));
const changed = maxResources(data, filter);
if (changed.length > 0) {
console.log(`Maxed ${changed.length} resources:`);
changed.forEach((line) => console.log(line));
modified = true;
} else {
console.log("Selected resources already at max.");
}
continue;
}
if (action === "set-crafted") {
const choices = getResourceChoices(data, "crafted");
if (choices.length === 0) {
console.log("No crafted resources found.");
continue;
}
const value = await input({
message: "Set crafted resources to what value?",
validate: (v) => {
const n = Number(v);
return !isNaN(n) && n >= 0 ? true : "Enter a non-negative number";
},
});
const selected = await checkbox({
message: "Select resources to set (space to toggle, enter to confirm)",
choices,
});
if (selected.length === 0) {
console.log("No resources selected.");
continue;
}
const filter = new Set(selected.map((s) => s.toLowerCase()));
const changed = setCraftedResources(data, Number(value), filter);
if (changed.length > 0) {
console.log(`Set ${changed.length} crafted resources to ${value}:`);
changed.forEach((line) => console.log(line));
modified = true;
} else {
console.log("Selected resources already at or above target.");
}
continue;
}
}
}
main(); main();

411
package-lock.json generated
View File

@@ -9,9 +9,393 @@
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@inquirer/prompts": "^8.3.0",
"lz-string": "^1.5.0" "lz-string": "^1.5.0"
} }
}, },
"node_modules/@inquirer/ansi": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.3.tgz",
"integrity": "sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==",
"license": "MIT",
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
}
},
"node_modules/@inquirer/checkbox": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.0.tgz",
"integrity": "sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g==",
"license": "MIT",
"dependencies": {
"@inquirer/ansi": "^2.0.3",
"@inquirer/core": "^11.1.5",
"@inquirer/figures": "^2.0.3",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/confirm": {
"version": "6.0.8",
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.8.tgz",
"integrity": "sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^11.1.5",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/core": {
"version": "11.1.5",
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.5.tgz",
"integrity": "sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A==",
"license": "MIT",
"dependencies": {
"@inquirer/ansi": "^2.0.3",
"@inquirer/figures": "^2.0.3",
"@inquirer/type": "^4.0.3",
"cli-width": "^4.1.0",
"fast-wrap-ansi": "^0.2.0",
"mute-stream": "^3.0.0",
"signal-exit": "^4.1.0"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/editor": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.0.8.tgz",
"integrity": "sha512-sLcpbb9B3XqUEGrj1N66KwhDhEckzZ4nI/W6SvLXyBX8Wic3LDLENlWRvkOGpCPoserabe+MxQkpiMoI8irvyA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^11.1.5",
"@inquirer/external-editor": "^2.0.3",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/expand": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.8.tgz",
"integrity": "sha512-QieW3F1prNw3j+hxO7/NKkG1pk3oz7pOB6+5Upwu3OIwADfPX0oZVppsqlL+Vl/uBHHDSOBY0BirLctLnXwGGg==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^11.1.5",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/external-editor": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-2.0.3.tgz",
"integrity": "sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==",
"license": "MIT",
"dependencies": {
"chardet": "^2.1.1",
"iconv-lite": "^0.7.2"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/figures": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.3.tgz",
"integrity": "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==",
"license": "MIT",
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
}
},
"node_modules/@inquirer/input": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.8.tgz",
"integrity": "sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^11.1.5",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/number": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.8.tgz",
"integrity": "sha512-uGLiQah9A0F9UIvJBX52m0CnqtLaym0WpT9V4YZrjZ+YRDKZdwwoEPz06N6w8ChE2lrnsdyhY9sL+Y690Kh9gQ==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^11.1.5",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/password": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.8.tgz",
"integrity": "sha512-zt1sF4lYLdvPqvmvHdmjOzuUUjuCQ897pdUCO8RbXMUDKXJTTyOQgtn23le+jwcb+MpHl3VAFvzIdxRAf6aPlA==",
"license": "MIT",
"dependencies": {
"@inquirer/ansi": "^2.0.3",
"@inquirer/core": "^11.1.5",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/prompts": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.3.0.tgz",
"integrity": "sha512-JAj66kjdH/F1+B7LCigjARbwstt3SNUOSzMdjpsvwJmzunK88gJeXmcm95L9nw1KynvFVuY4SzXh/3Y0lvtgSg==",
"license": "MIT",
"dependencies": {
"@inquirer/checkbox": "^5.1.0",
"@inquirer/confirm": "^6.0.8",
"@inquirer/editor": "^5.0.8",
"@inquirer/expand": "^5.0.8",
"@inquirer/input": "^5.0.8",
"@inquirer/number": "^4.0.8",
"@inquirer/password": "^5.0.8",
"@inquirer/rawlist": "^5.2.4",
"@inquirer/search": "^4.1.4",
"@inquirer/select": "^5.1.0"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/rawlist": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.4.tgz",
"integrity": "sha512-fTuJ5Cq9W286isLxwj6GGyfTjx1Zdk4qppVEPexFuA6yioCCXS4V1zfKroQqw7QdbDPN73xs2DiIAlo55+kBqg==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^11.1.5",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/search": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.4.tgz",
"integrity": "sha512-9yPTxq7LPmYjrGn3DRuaPuPbmC6u3fiWcsE9ggfLcdgO/ICHYgxq7mEy1yJ39brVvgXhtOtvDVjDh9slJxE4LQ==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^11.1.5",
"@inquirer/figures": "^2.0.3",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/select": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.0.tgz",
"integrity": "sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q==",
"license": "MIT",
"dependencies": {
"@inquirer/ansi": "^2.0.3",
"@inquirer/core": "^11.1.5",
"@inquirer/figures": "^2.0.3",
"@inquirer/type": "^4.0.3"
},
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/type": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.3.tgz",
"integrity": "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==",
"license": "MIT",
"engines": {
"node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/chardet": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
"integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
"license": "MIT"
},
"node_modules/cli-width": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
"integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
"license": "ISC",
"engines": {
"node": ">= 12"
}
},
"node_modules/fast-string-truncated-width": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
"integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==",
"license": "MIT"
},
"node_modules/fast-string-width": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz",
"integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",
"license": "MIT",
"dependencies": {
"fast-string-truncated-width": "^3.0.2"
}
},
"node_modules/fast-wrap-ansi": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz",
"integrity": "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==",
"license": "MIT",
"dependencies": {
"fast-string-width": "^3.0.2"
}
},
"node_modules/iconv-lite": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
"integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/lz-string": { "node_modules/lz-string": {
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
@@ -20,6 +404,33 @@
"bin": { "bin": {
"lz-string": "bin/bin.js" "lz-string": "bin/bin.js"
} }
},
"node_modules/mute-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz",
"integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==",
"license": "ISC",
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"license": "ISC",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
} }
} }
} }

View File

@@ -11,6 +11,7 @@
"license": "ISC", "license": "ISC",
"type": "commonjs", "type": "commonjs",
"dependencies": { "dependencies": {
"@inquirer/prompts": "^8.3.0",
"lz-string": "^1.5.0" "lz-string": "^1.5.0"
} }
} }