vibemancer 0.1.3 → 0.1.5
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/README.md +2 -2
- package/dist/chunk-4DUS7IHW.js +101 -0
- package/dist/chunk-4DUS7IHW.js.map +1 -0
- package/dist/chunk-AA2UJPPN.js +14 -0
- package/dist/chunk-AA2UJPPN.js.map +1 -0
- package/dist/cli.js +258 -164
- package/dist/cli.js.map +1 -1
- package/dist/firebase-config-F6COE3NY.js +8 -0
- package/dist/firebase-config-F6COE3NY.js.map +1 -0
- package/dist/opponent-resolver-U2UK2QEJ.js +14 -0
- package/dist/opponent-resolver-U2UK2QEJ.js.map +1 -0
- package/package.json +11 -10
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# vibemancer
|
|
2
2
|
|
|
3
|
-
CLI devkit for [Vibemancer](https://vibemancer.com)
|
|
3
|
+
CLI devkit for [Vibemancer](https://vibemancer.com): develop, test, and upload wizard bots.
|
|
4
4
|
|
|
5
5
|
## Commands
|
|
6
6
|
|
|
@@ -19,7 +19,7 @@ vibemancer upload Upload to vibemancer.com for rated competition
|
|
|
19
19
|
|
|
20
20
|
## Getting started
|
|
21
21
|
|
|
22
|
-
You don't install this directly
|
|
22
|
+
You don't install this directly: `npm create vibemancer@latest my-wizard` sets up a project with the CLI as a dev dependency.
|
|
23
23
|
|
|
24
24
|
See the full walkthrough at [vibemancer.com](https://vibemancer.com) (Build a Bot tab).
|
|
25
25
|
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/opponent-resolver.ts
|
|
4
|
+
import path from "path";
|
|
5
|
+
import fs from "fs";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { BotBundle } from "@vibemancer/core";
|
|
8
|
+
function findCoreSourceDir() {
|
|
9
|
+
const monorepoCore = path.resolve(import.meta.dirname, "..", "..", "core", "src");
|
|
10
|
+
if (fs.existsSync(path.join(monorepoCore, "engine", "simulation.ts"))) {
|
|
11
|
+
return monorepoCore;
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const coreIndex = import.meta.resolve("@vibemancer/core");
|
|
15
|
+
const coreIndexPath = fileURLToPath(coreIndex);
|
|
16
|
+
const coreRoot = path.resolve(path.dirname(coreIndexPath), "..");
|
|
17
|
+
const srcDir = path.join(coreRoot, "src");
|
|
18
|
+
if (fs.existsSync(path.join(srcDir, "engine", "simulation.ts"))) {
|
|
19
|
+
return srcDir;
|
|
20
|
+
}
|
|
21
|
+
} catch {
|
|
22
|
+
}
|
|
23
|
+
throw new Error(
|
|
24
|
+
"Could not find @vibemancer/core source directory.\nEnsure @vibemancer/core is installed and includes its src/ directory."
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
var BUILTIN_BOTS = {
|
|
28
|
+
// Standalone
|
|
29
|
+
TargetDummy: "standalone/TargetDummy.ts",
|
|
30
|
+
Critter: "standalone/Critter.ts",
|
|
31
|
+
Rookie: "standalone/Rookie.ts",
|
|
32
|
+
Hogger: "standalone/Hogger.ts",
|
|
33
|
+
Doombringer: "standalone/Doombringer.ts",
|
|
34
|
+
// Defensive
|
|
35
|
+
Turtle: "defensive/01_Turtle.ts",
|
|
36
|
+
Sentinel: "defensive/02_Sentinel.ts",
|
|
37
|
+
Golem: "defensive/03_Golem.ts",
|
|
38
|
+
// Melee
|
|
39
|
+
Shadowblade: "melee/01_Shadowblade.ts",
|
|
40
|
+
Nightblade: "melee/02_Nightblade.ts",
|
|
41
|
+
Voidblade: "melee/03_Voidblade.ts",
|
|
42
|
+
// Homing
|
|
43
|
+
Bonemancer: "homing/01_Bonemancer.ts",
|
|
44
|
+
Lich: "homing/02_Lich.ts",
|
|
45
|
+
Archlich: "homing/03_Archlich.ts",
|
|
46
|
+
// Caster
|
|
47
|
+
Flamecaller: "caster/01_Flamecaller.ts",
|
|
48
|
+
Pyromancer: "caster/02_Pyromancer.ts",
|
|
49
|
+
Infernalist: "caster/03_Infernalist.ts",
|
|
50
|
+
// Sniper
|
|
51
|
+
Spellshot: "sniper/01_Spellshot.ts",
|
|
52
|
+
Spelltracer: "sniper/02_Spelltracer.ts",
|
|
53
|
+
Spellseeker: "sniper/03_Spellseeker.ts",
|
|
54
|
+
// Duelist
|
|
55
|
+
Battlemage: "duelist/01_Battlemage.ts",
|
|
56
|
+
Warmage: "duelist/02_Warmage.ts",
|
|
57
|
+
Archmage: "duelist/03_Archmage.ts",
|
|
58
|
+
// Berserker
|
|
59
|
+
Stormchaser: "berserker/01_Stormchaser.ts",
|
|
60
|
+
Stormcaller: "berserker/02_Stormcaller.ts",
|
|
61
|
+
Stormforger: "berserker/03_Stormforger.ts",
|
|
62
|
+
// Kiter
|
|
63
|
+
Spellspinner: "kiter/01_Spellspinner.ts",
|
|
64
|
+
Spellweaver: "kiter/02_Spellweaver.ts",
|
|
65
|
+
Spellbinder: "kiter/03_Spellbinder.ts"
|
|
66
|
+
};
|
|
67
|
+
function getCoreCompileOptions() {
|
|
68
|
+
const coreSourceDir = findCoreSourceDir();
|
|
69
|
+
return {
|
|
70
|
+
alias: {
|
|
71
|
+
"@vibemancer/core": coreSourceDir + "/index-browser.ts"
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function getBuiltinBotNames() {
|
|
76
|
+
return Object.keys(BUILTIN_BOTS);
|
|
77
|
+
}
|
|
78
|
+
function resolveOpponent(name) {
|
|
79
|
+
const relativePath = BUILTIN_BOTS[name];
|
|
80
|
+
if (!relativePath) {
|
|
81
|
+
const available = Object.keys(BUILTIN_BOTS).join(", ");
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Unknown opponent "${name}".
|
|
84
|
+
Available built-in bots: ${available}`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
const coreSourceDir = findCoreSourceDir();
|
|
88
|
+
const sourcePath = path.join(coreSourceDir, "bots", relativePath);
|
|
89
|
+
if (!fs.existsSync(sourcePath)) {
|
|
90
|
+
throw new Error(`Built-in bot source not found: ${sourcePath}`);
|
|
91
|
+
}
|
|
92
|
+
return new BotBundle(sourcePath, name);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export {
|
|
96
|
+
findCoreSourceDir,
|
|
97
|
+
getCoreCompileOptions,
|
|
98
|
+
getBuiltinBotNames,
|
|
99
|
+
resolveOpponent
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=chunk-4DUS7IHW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/opponent-resolver.ts"],"sourcesContent":["/**\r\n * Opponent Resolver\r\n *\r\n * Resolves an opponent name (e.g., \"Battlemage\", \"Turtle\") to a BotBundle\r\n * pointing at the built-in bot's TypeScript source file.\r\n */\r\n\r\nimport path from 'node:path';\r\nimport fs from 'node:fs';\r\nimport {fileURLToPath} from 'node:url';\r\nimport {BotBundle} from '@vibemancer/core';\r\nimport type {CompileOptions} from '@vibemancer/core';\r\n\r\n/**\r\n * Find the @vibemancer/core package's source directory.\r\n * The core package ships with both dist/ and src/ (TypeScript source).\r\n * esbuild needs the TypeScript source for compilation.\r\n */\r\nexport function findCoreSourceDir(): string\r\n{\r\n\t// When running from the monorepo (development), core is a sibling package\r\n\tconst monorepoCore = path.resolve(import.meta.dirname, '..', '..', 'core', 'src');\r\n\tif (fs.existsSync(path.join(monorepoCore, 'engine', 'simulation.ts')))\r\n\t{\r\n\t\treturn monorepoCore;\r\n\t}\r\n\r\n\t// When installed as a dependency, core is in node_modules\r\n\t// Use import.meta.resolve to find the package\r\n\ttry\r\n\t{\r\n\t\tconst coreIndex = import.meta.resolve('@vibemancer/core');\r\n\t\t// coreIndex = file:///path/to/node_modules/@vibemancer/core/dist/index.js\r\n\t\tconst coreIndexPath = fileURLToPath(coreIndex);\r\n\t\tconst coreRoot = path.resolve(path.dirname(coreIndexPath), '..');\r\n\t\tconst srcDir = path.join(coreRoot, 'src');\r\n\t\tif (fs.existsSync(path.join(srcDir, 'engine', 'simulation.ts')))\r\n\t\t{\r\n\t\t\treturn srcDir;\r\n\t\t}\r\n\t}\r\n\tcatch\r\n\t{\r\n\t\t// import.meta.resolve failed\r\n\t}\r\n\r\n\tthrow new Error(\r\n\t\t'Could not find @vibemancer/core source directory.\\n'\r\n\t\t+ 'Ensure @vibemancer/core is installed and includes its src/ directory.',\r\n\t);\r\n}\r\n\r\n/**\r\n * Built-in bot source file mapping.\r\n * Maps bot name → relative path from core's src/bots/ directory.\r\n *\r\n * Derived from the naming convention:\r\n * - Standalone: standalone/{Name}.ts\r\n * - Tiered: {group}/{nn}_{Name}.ts\r\n */\r\nconst BUILTIN_BOTS: Record<string, string> = {\r\n\t// Standalone\r\n\tTargetDummy: 'standalone/TargetDummy.ts',\r\n\tCritter: 'standalone/Critter.ts',\r\n\tRookie: 'standalone/Rookie.ts',\r\n\tHogger: 'standalone/Hogger.ts',\r\n\tDoombringer: 'standalone/Doombringer.ts',\r\n\t// Defensive\r\n\tTurtle: 'defensive/01_Turtle.ts',\r\n\tSentinel: 'defensive/02_Sentinel.ts',\r\n\tGolem: 'defensive/03_Golem.ts',\r\n\t// Melee\r\n\tShadowblade: 'melee/01_Shadowblade.ts',\r\n\tNightblade: 'melee/02_Nightblade.ts',\r\n\tVoidblade: 'melee/03_Voidblade.ts',\r\n\t// Homing\r\n\tBonemancer: 'homing/01_Bonemancer.ts',\r\n\tLich: 'homing/02_Lich.ts',\r\n\tArchlich: 'homing/03_Archlich.ts',\r\n\t// Caster\r\n\tFlamecaller: 'caster/01_Flamecaller.ts',\r\n\tPyromancer: 'caster/02_Pyromancer.ts',\r\n\tInfernalist: 'caster/03_Infernalist.ts',\r\n\t// Sniper\r\n\tSpellshot: 'sniper/01_Spellshot.ts',\r\n\tSpelltracer: 'sniper/02_Spelltracer.ts',\r\n\tSpellseeker: 'sniper/03_Spellseeker.ts',\r\n\t// Duelist\r\n\tBattlemage: 'duelist/01_Battlemage.ts',\r\n\tWarmage: 'duelist/02_Warmage.ts',\r\n\tArchmage: 'duelist/03_Archmage.ts',\r\n\t// Berserker\r\n\tStormchaser: 'berserker/01_Stormchaser.ts',\r\n\tStormcaller: 'berserker/02_Stormcaller.ts',\r\n\tStormforger: 'berserker/03_Stormforger.ts',\r\n\t// Kiter\r\n\tSpellspinner: 'kiter/01_Spellspinner.ts',\r\n\tSpellweaver: 'kiter/02_Spellweaver.ts',\r\n\tSpellbinder: 'kiter/03_Spellbinder.ts',\r\n};\r\n\r\n/**\r\n * Get CompileOptions that alias @vibemancer/core to the TypeScript source.\r\n * Required for compiling user bots that import from @vibemancer/core.\r\n */\r\nexport function getCoreCompileOptions(): CompileOptions\r\n{\r\n\tconst coreSourceDir = findCoreSourceDir();\r\n\treturn {\r\n\t\talias: {\r\n\t\t\t'@vibemancer/core': coreSourceDir + '/index-browser.ts',\r\n\t\t},\r\n\t};\r\n}\r\n\r\n/**\r\n * Get the list of all built-in bot names.\r\n */\r\nexport function getBuiltinBotNames(): string[]\r\n{\r\n\treturn Object.keys(BUILTIN_BOTS);\r\n}\r\n\r\n/**\r\n * Resolve an opponent name to a BotBundle.\r\n *\r\n * @param name - Built-in bot name (e.g., \"Battlemage\")\r\n * @returns BotBundle pointing at the bot's TypeScript source\r\n */\r\nexport function resolveOpponent(name: string): BotBundle\r\n{\r\n\tconst relativePath = BUILTIN_BOTS[name];\r\n\tif (!relativePath)\r\n\t{\r\n\t\tconst available = Object.keys(BUILTIN_BOTS).join(', ');\r\n\t\tthrow new Error(\r\n\t\t\t`Unknown opponent \"${name}\".\\n`\r\n\t\t\t+ `Available built-in bots: ${available}`,\r\n\t\t);\r\n\t}\r\n\r\n\tconst coreSourceDir = findCoreSourceDir();\r\n\tconst sourcePath = path.join(coreSourceDir, 'bots', relativePath);\r\n\r\n\tif (!fs.existsSync(sourcePath))\r\n\t{\r\n\t\tthrow new Error(`Built-in bot source not found: ${sourcePath}`);\r\n\t}\r\n\r\n\treturn new BotBundle(sourcePath, name);\r\n}\r\n"],"mappings":";;;AAOA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAQ,qBAAoB;AAC5B,SAAQ,iBAAgB;AAQjB,SAAS,oBAChB;AAEC,QAAM,eAAe,KAAK,QAAQ,YAAY,SAAS,MAAM,MAAM,QAAQ,KAAK;AAChF,MAAI,GAAG,WAAW,KAAK,KAAK,cAAc,UAAU,eAAe,CAAC,GACpE;AACC,WAAO;AAAA,EACR;AAIA,MACA;AACC,UAAM,YAAY,YAAY,QAAQ,kBAAkB;AAExD,UAAM,gBAAgB,cAAc,SAAS;AAC7C,UAAM,WAAW,KAAK,QAAQ,KAAK,QAAQ,aAAa,GAAG,IAAI;AAC/D,UAAM,SAAS,KAAK,KAAK,UAAU,KAAK;AACxC,QAAI,GAAG,WAAW,KAAK,KAAK,QAAQ,UAAU,eAAe,CAAC,GAC9D;AACC,aAAO;AAAA,IACR;AAAA,EACD,QAEA;AAAA,EAEA;AAEA,QAAM,IAAI;AAAA,IACT;AAAA,EAED;AACD;AAUA,IAAM,eAAuC;AAAA;AAAA,EAE5C,aAAa;AAAA,EACb,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA,EAEb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA;AAAA,EAEP,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA;AAAA,EAEX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA;AAAA,EAEV,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA;AAAA,EAEb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA;AAAA,EAEV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AACd;AAMO,SAAS,wBAChB;AACC,QAAM,gBAAgB,kBAAkB;AACxC,SAAO;AAAA,IACN,OAAO;AAAA,MACN,oBAAoB,gBAAgB;AAAA,IACrC;AAAA,EACD;AACD;AAKO,SAAS,qBAChB;AACC,SAAO,OAAO,KAAK,YAAY;AAChC;AAQO,SAAS,gBAAgB,MAChC;AACC,QAAM,eAAe,aAAa,IAAI;AACtC,MAAI,CAAC,cACL;AACC,UAAM,YAAY,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI;AACrD,UAAM,IAAI;AAAA,MACT,qBAAqB,IAAI;AAAA,2BACK,SAAS;AAAA,IACxC;AAAA,EACD;AAEA,QAAM,gBAAgB,kBAAkB;AACxC,QAAM,aAAa,KAAK,KAAK,eAAe,QAAQ,YAAY;AAEhE,MAAI,CAAC,GAAG,WAAW,UAAU,GAC7B;AACC,UAAM,IAAI,MAAM,kCAAkC,UAAU,EAAE;AAAA,EAC/D;AAEA,SAAO,IAAI,UAAU,YAAY,IAAI;AACtC;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/firebase-config.ts
|
|
4
|
+
var FIREBASE_CONFIG = {
|
|
5
|
+
apiKey: "AIzaSyDSUJ2jlk5_vlpGOypMtvqKjHhDmbgomIY",
|
|
6
|
+
authDomain: "le-vibemancer.firebaseapp.com",
|
|
7
|
+
projectId: "le-vibemancer",
|
|
8
|
+
storageBucket: "le-vibemancer.firebasestorage.app"
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
FIREBASE_CONFIG
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=chunk-AA2UJPPN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/firebase-config.ts"],"sourcesContent":["export const FIREBASE_CONFIG = {\n\tapiKey: 'AIzaSyDSUJ2jlk5_vlpGOypMtvqKjHhDmbgomIY',\n\tauthDomain: 'le-vibemancer.firebaseapp.com',\n\tprojectId: 'le-vibemancer',\n\tstorageBucket: 'le-vibemancer.firebasestorage.app',\n} as const;\n"],"mappings":";;;AAAO,IAAM,kBAAkB;AAAA,EAC9B,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAChB;","names":[]}
|