clibuddy 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/adventure/adventureUI.d.ts +24 -0
- package/dist/adventure/adventureUI.js +290 -0
- package/dist/adventure/adventures.d.ts +4 -0
- package/dist/adventure/adventures.js +206 -0
- package/dist/adventure/biomes.d.ts +30 -0
- package/dist/adventure/biomes.js +80 -0
- package/dist/adventure/combat/combat.d.ts +14 -0
- package/dist/adventure/combat/combat.js +638 -0
- package/dist/adventure/combat/combatUI.d.ts +5 -0
- package/dist/adventure/combat/combatUI.js +116 -0
- package/dist/adventure/combat/conditions.d.ts +20 -0
- package/dist/adventure/combat/conditions.js +111 -0
- package/dist/adventure/combat/enemies.d.ts +4 -0
- package/dist/adventure/combat/enemies.js +430 -0
- package/dist/adventure/combat/gear.d.ts +3 -0
- package/dist/adventure/combat/gear.js +199 -0
- package/dist/adventure/combat/skills.d.ts +6 -0
- package/dist/adventure/combat/skills.js +197 -0
- package/dist/adventure/combat.d.ts +31 -0
- package/dist/adventure/combat.js +732 -0
- package/dist/adventure/combatUI.d.ts +5 -0
- package/dist/adventure/combatUI.js +116 -0
- package/dist/adventure/endless.d.ts +18 -0
- package/dist/adventure/endless.js +154 -0
- package/dist/adventure/enemies.d.ts +4 -0
- package/dist/adventure/enemies.js +320 -0
- package/dist/adventure/engine.d.ts +20 -0
- package/dist/adventure/engine.js +137 -0
- package/dist/adventure/gear.d.ts +3 -0
- package/dist/adventure/gear.js +149 -0
- package/dist/adventure/generation/biomes.d.ts +30 -0
- package/dist/adventure/generation/biomes.js +102 -0
- package/dist/adventure/generation/endless.d.ts +18 -0
- package/dist/adventure/generation/endless.js +154 -0
- package/dist/adventure/generation/generator.d.ts +9 -0
- package/dist/adventure/generation/generator.js +245 -0
- package/dist/adventure/generation/templates.d.ts +25 -0
- package/dist/adventure/generation/templates.js +228 -0
- package/dist/adventure/generator.d.ts +9 -0
- package/dist/adventure/generator.js +245 -0
- package/dist/adventure/skills.d.ts +6 -0
- package/dist/adventure/skills.js +197 -0
- package/dist/adventure/templates.d.ts +25 -0
- package/dist/adventure/templates.js +228 -0
- package/dist/adventure/types.d.ts +236 -0
- package/dist/adventure/types.js +97 -0
- package/dist/app/state.d.ts +49 -0
- package/dist/app/state.js +51 -0
- package/dist/buddy/activities.d.ts +16 -0
- package/dist/buddy/activities.js +90 -0
- package/dist/buddy/decay.d.ts +3 -0
- package/dist/buddy/decay.js +45 -0
- package/dist/buddy/leveling.d.ts +11 -0
- package/dist/buddy/leveling.js +25 -0
- package/dist/buddy/roll.d.ts +4 -0
- package/dist/buddy/roll.js +61 -0
- package/dist/buddy/species.d.ts +4 -0
- package/dist/buddy/species.js +592 -0
- package/dist/buddy/titles.d.ts +17 -0
- package/dist/buddy/titles.js +89 -0
- package/dist/buddy/types.d.ts +92 -0
- package/dist/buddy/types.js +21 -0
- package/dist/commands/actions.d.ts +2 -0
- package/dist/commands/actions.js +141 -0
- package/dist/commands/admin.d.ts +2 -0
- package/dist/commands/admin.js +202 -0
- package/dist/commands/registry.d.ts +25 -0
- package/dist/commands/registry.js +31 -0
- package/dist/commands/social.d.ts +2 -0
- package/dist/commands/social.js +92 -0
- package/dist/dialogue/engine.d.ts +7 -0
- package/dist/dialogue/engine.js +68 -0
- package/dist/dialogue/lines.d.ts +26 -0
- package/dist/dialogue/lines.js +294 -0
- package/dist/events/engine.d.ts +20 -0
- package/dist/events/engine.js +51 -0
- package/dist/events/events.d.ts +13 -0
- package/dist/events/events.js +149 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +1665 -0
- package/dist/inventory/finding.d.ts +11 -0
- package/dist/inventory/finding.js +99 -0
- package/dist/inventory/items.d.ts +31 -0
- package/dist/inventory/items.js +63 -0
- package/dist/minigames/copycat.d.ts +2 -0
- package/dist/minigames/copycat.js +153 -0
- package/dist/minigames/fetch.d.ts +2 -0
- package/dist/minigames/fetch.js +179 -0
- package/dist/minigames/moodmatch.d.ts +2 -0
- package/dist/minigames/moodmatch.js +144 -0
- package/dist/minigames/quickpaws.d.ts +2 -0
- package/dist/minigames/quickpaws.js +142 -0
- package/dist/minigames/registry.d.ts +5 -0
- package/dist/minigames/registry.js +16 -0
- package/dist/minigames/rpsplus.d.ts +2 -0
- package/dist/minigames/rpsplus.js +168 -0
- package/dist/minigames/treasurehunt.d.ts +2 -0
- package/dist/minigames/treasurehunt.js +146 -0
- package/dist/minigames/types.d.ts +30 -0
- package/dist/minigames/types.js +69 -0
- package/dist/rendering/commandPalette.d.ts +16 -0
- package/dist/rendering/commandPalette.js +77 -0
- package/dist/rendering/display.d.ts +9 -0
- package/dist/rendering/display.js +231 -0
- package/dist/rendering/inventoryUI.d.ts +14 -0
- package/dist/rendering/inventoryUI.js +99 -0
- package/dist/rendering/items.d.ts +7 -0
- package/dist/rendering/items.js +34 -0
- package/dist/rendering/listUtils.d.ts +3 -0
- package/dist/rendering/listUtils.js +24 -0
- package/dist/rendering/minigameUI.d.ts +11 -0
- package/dist/rendering/minigameUI.js +37 -0
- package/dist/rendering/overlayUI.d.ts +24 -0
- package/dist/rendering/overlayUI.js +184 -0
- package/dist/rendering/scene.d.ts +8 -0
- package/dist/rendering/scene.js +87 -0
- package/dist/rendering/screen.d.ts +43 -0
- package/dist/rendering/screen.js +97 -0
- package/dist/sound/sound.d.ts +11 -0
- package/dist/sound/sound.js +55 -0
- package/dist/state/save.d.ts +5 -0
- package/dist/state/save.js +100 -0
- package/dist/state/settings.d.ts +7 -0
- package/dist/state/settings.js +81 -0
- package/dist/story/mainStory.d.ts +4 -0
- package/dist/story/mainStory.js +3111 -0
- package/dist/story/npcs.d.ts +17 -0
- package/dist/story/npcs.js +137 -0
- package/dist/story/progress.d.ts +26 -0
- package/dist/story/progress.js +168 -0
- package/dist/story/seasonal.d.ts +6 -0
- package/dist/story/seasonal.js +96 -0
- package/dist/story/shop.d.ts +7 -0
- package/dist/story/shop.js +26 -0
- package/dist/story/sideQuests.d.ts +4 -0
- package/dist/story/sideQuests.js +151 -0
- package/dist/story/types.d.ts +61 -0
- package/dist/story/types.js +36 -0
- package/dist/updates.d.ts +23 -0
- package/dist/updates.js +142 -0
- package/package.json +53 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { AdventureDef } from "../adventure/types";
|
|
2
|
+
export interface QuestReward {
|
|
3
|
+
xp: number;
|
|
4
|
+
gold: number;
|
|
5
|
+
items?: string[];
|
|
6
|
+
titleId?: string;
|
|
7
|
+
}
|
|
8
|
+
export type ActType = "scene" | "exploration" | "dungeon";
|
|
9
|
+
export interface ActDef {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
type: ActType;
|
|
13
|
+
buildAdventure: () => AdventureDef;
|
|
14
|
+
}
|
|
15
|
+
export interface QuestChapter {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
prerequisites: string[];
|
|
20
|
+
levelRequired: number;
|
|
21
|
+
storyFlag: string;
|
|
22
|
+
rewards: QuestReward;
|
|
23
|
+
/** Sequence of acts that make up this chapter */
|
|
24
|
+
acts: ActDef[];
|
|
25
|
+
}
|
|
26
|
+
export interface QuestChain {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
type: "main" | "side" | "seasonal";
|
|
31
|
+
chapters: QuestChapter[];
|
|
32
|
+
}
|
|
33
|
+
export interface SavedAdventureState {
|
|
34
|
+
adventureId: string;
|
|
35
|
+
currentRoomId: string;
|
|
36
|
+
roomsVisited: string[];
|
|
37
|
+
morale: number;
|
|
38
|
+
lootCollected: string[];
|
|
39
|
+
xpEarned: number;
|
|
40
|
+
battlesWon: number;
|
|
41
|
+
battlesFled: number;
|
|
42
|
+
damageTaken: number;
|
|
43
|
+
}
|
|
44
|
+
export interface QuestProgress {
|
|
45
|
+
completedChapters: string[];
|
|
46
|
+
activeChain?: string;
|
|
47
|
+
activeChapter?: string;
|
|
48
|
+
activeActIndex?: number;
|
|
49
|
+
savedAdventure?: SavedAdventureState;
|
|
50
|
+
storyFlags: string[];
|
|
51
|
+
loreFragments: string[];
|
|
52
|
+
gold: number;
|
|
53
|
+
}
|
|
54
|
+
export declare function createDefaultQuestProgress(): QuestProgress;
|
|
55
|
+
/** Check if a chapter's prerequisites are met */
|
|
56
|
+
export declare function canStartChapter(chapter: QuestChapter, progress: QuestProgress, level: number): string | null;
|
|
57
|
+
/** Check if a chapter is completed */
|
|
58
|
+
export declare function isChapterComplete(chapterId: string, progress: QuestProgress): boolean;
|
|
59
|
+
/** Check if a story flag is set */
|
|
60
|
+
export declare function hasStoryFlag(flag: string, progress: QuestProgress): boolean;
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDefaultQuestProgress = createDefaultQuestProgress;
|
|
4
|
+
exports.canStartChapter = canStartChapter;
|
|
5
|
+
exports.isChapterComplete = isChapterComplete;
|
|
6
|
+
exports.hasStoryFlag = hasStoryFlag;
|
|
7
|
+
function createDefaultQuestProgress() {
|
|
8
|
+
return {
|
|
9
|
+
completedChapters: [],
|
|
10
|
+
storyFlags: [],
|
|
11
|
+
loreFragments: [],
|
|
12
|
+
gold: 0,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Check if a chapter's prerequisites are met */
|
|
16
|
+
function canStartChapter(chapter, progress, level) {
|
|
17
|
+
if (level < chapter.levelRequired)
|
|
18
|
+
return `Requires level ${chapter.levelRequired}`;
|
|
19
|
+
for (const prereq of chapter.prerequisites) {
|
|
20
|
+
if (!progress.completedChapters.includes(prereq)) {
|
|
21
|
+
return `Requires completing a previous chapter`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (progress.completedChapters.includes(chapter.id))
|
|
25
|
+
return "Already completed";
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/** Check if a chapter is completed */
|
|
29
|
+
function isChapterComplete(chapterId, progress) {
|
|
30
|
+
return progress.completedChapters.includes(chapterId);
|
|
31
|
+
}
|
|
32
|
+
/** Check if a story flag is set */
|
|
33
|
+
function hasStoryFlag(flag, progress) {
|
|
34
|
+
return progress.storyFlags.includes(flag);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version check and self-update for npm-published CLIBuddy.
|
|
3
|
+
* Checks the npm registry on startup (non-blocking) and caches the result.
|
|
4
|
+
*/
|
|
5
|
+
export declare const CURRENT_VERSION: string;
|
|
6
|
+
export declare const PACKAGE_NAME: string;
|
|
7
|
+
/**
|
|
8
|
+
* Non-blocking check against the npm registry.
|
|
9
|
+
* Resolves silently — never throws, never blocks the app.
|
|
10
|
+
*/
|
|
11
|
+
export declare function checkForUpdates(): void;
|
|
12
|
+
/** Returns an update banner string if an update is available, or null. */
|
|
13
|
+
export declare function getUpdateBanner(): string | null;
|
|
14
|
+
/** Check if an update is available (for use in commands). */
|
|
15
|
+
export declare function isUpdateAvailable(): boolean;
|
|
16
|
+
/** Get the latest version string, or null if not checked yet. */
|
|
17
|
+
export declare function getLatestVersion(): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Run the self-update. Returns a message describing what happened.
|
|
20
|
+
* This is synchronous and will block briefly while npm runs.
|
|
21
|
+
*/
|
|
22
|
+
export declare function runUpdate(): string;
|
|
23
|
+
//# sourceMappingURL=updates.d.ts.map
|
package/dist/updates.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Version check and self-update for npm-published CLIBuddy.
|
|
4
|
+
* Checks the npm registry on startup (non-blocking) and caches the result.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.PACKAGE_NAME = exports.CURRENT_VERSION = void 0;
|
|
41
|
+
exports.checkForUpdates = checkForUpdates;
|
|
42
|
+
exports.getUpdateBanner = getUpdateBanner;
|
|
43
|
+
exports.isUpdateAvailable = isUpdateAvailable;
|
|
44
|
+
exports.getLatestVersion = getLatestVersion;
|
|
45
|
+
exports.runUpdate = runUpdate;
|
|
46
|
+
const https = __importStar(require("https"));
|
|
47
|
+
const child_process_1 = require("child_process");
|
|
48
|
+
// Read version from package.json at build time
|
|
49
|
+
const PKG = require("../package.json");
|
|
50
|
+
exports.CURRENT_VERSION = PKG.version;
|
|
51
|
+
exports.PACKAGE_NAME = PKG.name;
|
|
52
|
+
let latestVersion = null;
|
|
53
|
+
let updateAvailable = false;
|
|
54
|
+
/**
|
|
55
|
+
* Non-blocking check against the npm registry.
|
|
56
|
+
* Resolves silently — never throws, never blocks the app.
|
|
57
|
+
*/
|
|
58
|
+
function checkForUpdates() {
|
|
59
|
+
const url = `https://registry.npmjs.org/${exports.PACKAGE_NAME}/latest`;
|
|
60
|
+
const req = https.get(url, { timeout: 3000 }, (res) => {
|
|
61
|
+
if (res.statusCode !== 200) {
|
|
62
|
+
res.resume(); // drain
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
let data = "";
|
|
66
|
+
res.on("data", (chunk) => { data += chunk; });
|
|
67
|
+
res.on("end", () => {
|
|
68
|
+
try {
|
|
69
|
+
const json = JSON.parse(data);
|
|
70
|
+
if (json.version && json.version !== exports.CURRENT_VERSION) {
|
|
71
|
+
latestVersion = json.version;
|
|
72
|
+
updateAvailable = isNewer(json.version, exports.CURRENT_VERSION);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Silently ignore parse errors
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
req.on("error", () => {
|
|
81
|
+
// Network error — offline, firewall, etc. Silently ignore.
|
|
82
|
+
});
|
|
83
|
+
req.on("timeout", () => {
|
|
84
|
+
req.destroy();
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Compare semver strings: is `a` newer than `b`? */
|
|
88
|
+
function isNewer(a, b) {
|
|
89
|
+
const pa = a.split(".").map(Number);
|
|
90
|
+
const pb = b.split(".").map(Number);
|
|
91
|
+
for (let i = 0; i < 3; i++) {
|
|
92
|
+
if ((pa[i] ?? 0) > (pb[i] ?? 0))
|
|
93
|
+
return true;
|
|
94
|
+
if ((pa[i] ?? 0) < (pb[i] ?? 0))
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
/** Returns an update banner string if an update is available, or null. */
|
|
100
|
+
function getUpdateBanner() {
|
|
101
|
+
if (!updateAvailable || !latestVersion)
|
|
102
|
+
return null;
|
|
103
|
+
return [
|
|
104
|
+
"",
|
|
105
|
+
" \x1b[33m╔══════════════════════════════════════════╗\x1b[0m",
|
|
106
|
+
` \x1b[33m║\x1b[0m CLIBuddy \x1b[1mv${latestVersion}\x1b[0m is available! \x1b[33m║\x1b[0m`,
|
|
107
|
+
` \x1b[33m║\x1b[0m Current: v${exports.CURRENT_VERSION} \x1b[33m║\x1b[0m`,
|
|
108
|
+
" \x1b[33m║\x1b[0m Run \x1b[1m/update\x1b[0m or: \x1b[33m║\x1b[0m",
|
|
109
|
+
` \x1b[33m║\x1b[0m \x1b[2mnpm update -g ${exports.PACKAGE_NAME}\x1b[0m \x1b[33m║\x1b[0m`,
|
|
110
|
+
" \x1b[33m╚══════════════════════════════════════════╝\x1b[0m",
|
|
111
|
+
"",
|
|
112
|
+
].join("\n");
|
|
113
|
+
}
|
|
114
|
+
/** Check if an update is available (for use in commands). */
|
|
115
|
+
function isUpdateAvailable() {
|
|
116
|
+
return updateAvailable;
|
|
117
|
+
}
|
|
118
|
+
/** Get the latest version string, or null if not checked yet. */
|
|
119
|
+
function getLatestVersion() {
|
|
120
|
+
return latestVersion;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Run the self-update. Returns a message describing what happened.
|
|
124
|
+
* This is synchronous and will block briefly while npm runs.
|
|
125
|
+
*/
|
|
126
|
+
function runUpdate() {
|
|
127
|
+
if (!updateAvailable) {
|
|
128
|
+
return `CLIBuddy v${exports.CURRENT_VERSION} is already up to date!`;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
(0, child_process_1.execSync)(`npm update -g ${exports.PACKAGE_NAME}`, { stdio: "pipe", timeout: 60000 });
|
|
132
|
+
return `Updated to v${latestVersion}! Restart CLIBuddy to use the new version.`;
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
136
|
+
if (msg.includes("EACCES") || msg.includes("permission")) {
|
|
137
|
+
return `Permission denied. Try: sudo npm update -g ${exports.PACKAGE_NAME}`;
|
|
138
|
+
}
|
|
139
|
+
return `Update failed: ${msg}\nTry manually: npm update -g ${exports.PACKAGE_NAME}`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=updates.js.map
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "clibuddy",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A tamagotchi-style virtual pet that lives in your terminal — feed, play, adventure, and battle!",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"clibuddy": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/**/*.js",
|
|
11
|
+
"dist/**/*.d.ts",
|
|
12
|
+
"!dist/tests/**",
|
|
13
|
+
"package.json",
|
|
14
|
+
"README.md",
|
|
15
|
+
"LICENSE"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"dev": "CLIBUDDY_DEV=1 tsx src/index.ts",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"sim": "tsx src/tests/combatSim.ts"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"cli",
|
|
26
|
+
"tamagotchi",
|
|
27
|
+
"virtual-pet",
|
|
28
|
+
"terminal",
|
|
29
|
+
"ascii-art",
|
|
30
|
+
"game",
|
|
31
|
+
"rpg",
|
|
32
|
+
"adventure"
|
|
33
|
+
],
|
|
34
|
+
"author": "Zippy",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"type": "commonjs",
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18.0.0"
|
|
39
|
+
},
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/ZippyDevlabs/CLIBuddy"
|
|
43
|
+
},
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/ZippyDevlabs/CLIBuddy/issues"
|
|
46
|
+
},
|
|
47
|
+
"homepage": "https://github.com/ZippyDevlabs/CLIBuddy#readme",
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^25.5.0",
|
|
50
|
+
"tsx": "^4.21.0",
|
|
51
|
+
"typescript": "^6.0.2"
|
|
52
|
+
}
|
|
53
|
+
}
|