@atlas-world/cli 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/README.md +72 -0
- package/dist/client.js +15 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/admin.js +56 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/collect.js +37 -0
- package/dist/commands/collect.js.map +1 -0
- package/dist/commands/createWorld.js +159 -0
- package/dist/commands/createWorld.js.map +1 -0
- package/dist/commands/init.js +98 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/leaderboard.js +36 -0
- package/dist/commands/leaderboard.js.map +1 -0
- package/dist/commands/mintPlayer.js +44 -0
- package/dist/commands/mintPlayer.js.map +1 -0
- package/dist/commands/status.js +57 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.js +92 -0
- package/dist/config.js.map +1 -0
- package/dist/idl.json +2311 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# @atlas-world/cli
|
|
2
|
+
|
|
3
|
+
CLI interactivo para crear y administrar mundos persistentes en Solana con Atlas World Protocol.
|
|
4
|
+
|
|
5
|
+
## Instalación
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @atlas-world/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
O úsalo sin instalar:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx atlas-cli <comando>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quickstart
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 1. Configura tu wallet y red (una sola vez)
|
|
21
|
+
atlas-cli init
|
|
22
|
+
|
|
23
|
+
# 2. Crea un mundo (interactivo — elige GameFi, DAO, Marketplace o Custom)
|
|
24
|
+
atlas-cli create-world
|
|
25
|
+
|
|
26
|
+
# 3. Mintea tu player
|
|
27
|
+
atlas-cli mint-player --name "Hero"
|
|
28
|
+
|
|
29
|
+
# 4. Recolecta recursos
|
|
30
|
+
atlas-cli collect --type 0
|
|
31
|
+
|
|
32
|
+
# 5. Revisa tu progreso
|
|
33
|
+
atlas-cli status
|
|
34
|
+
|
|
35
|
+
# 6. Mira el leaderboard
|
|
36
|
+
atlas-cli leaderboard
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Eso es todo — un mundo persistente funcionando en Solana en menos de 2 minutos.
|
|
40
|
+
|
|
41
|
+
## Comandos
|
|
42
|
+
|
|
43
|
+
| Comando | Descripción |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `atlas-cli init` | Configura wallet y red (devnet/mainnet) |
|
|
46
|
+
| `atlas-cli create-world` | Crea un mundo nuevo, interactivo con templates |
|
|
47
|
+
| `atlas-cli mint-player -n <nombre>` | Mintea tu player en el mundo actual |
|
|
48
|
+
| `atlas-cli collect -t <tipo>` | Recolecta un recurso |
|
|
49
|
+
| `atlas-cli status` | Muestra el estado del mundo y tu progreso |
|
|
50
|
+
| `atlas-cli leaderboard` | Muestra el ranking del epoch actual |
|
|
51
|
+
| `atlas-cli advance-epoch` | [authority] Avanza al siguiente epoch tras un reset |
|
|
52
|
+
| `atlas-cli pause` / `unpause` | [protocol authority] Emergency stop |
|
|
53
|
+
|
|
54
|
+
Todos los comandos aceptan `-w, --world <id>` para especificar un mundo distinto al default.
|
|
55
|
+
|
|
56
|
+
## Configuración
|
|
57
|
+
|
|
58
|
+
`atlas-cli init` guarda tu configuración en `~/.atlas/config.json`:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"network": "devnet",
|
|
63
|
+
"walletPath": "~/.config/solana/id.json",
|
|
64
|
+
"defaultWorldId": 0
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
El `defaultWorldId` se actualiza automáticamente cada vez que creas un mundo con `create-world`.
|
|
69
|
+
|
|
70
|
+
## License
|
|
71
|
+
|
|
72
|
+
MIT
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAtlasClient = getAtlasClient;
|
|
4
|
+
const sdk_1 = require("@atlas-world/sdk");
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
function getAtlasClient() {
|
|
7
|
+
const config = (0, config_1.loadConfig)();
|
|
8
|
+
const wallet = (0, config_1.loadWallet)(config.walletPath);
|
|
9
|
+
return new sdk_1.AtlasClient({
|
|
10
|
+
network: config.network,
|
|
11
|
+
wallet,
|
|
12
|
+
programId: config.programId,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;AAGA,wCASC;AAZD,0CAA8C;AAC9C,qCAAiD;AAEjD,SAAgB,cAAc;IAC5B,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAE5C,OAAO,IAAI,iBAAW,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.advanceEpochCommand = advanceEpochCommand;
|
|
7
|
+
exports.pauseCommand = pauseCommand;
|
|
8
|
+
exports.unpauseCommand = unpauseCommand;
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const ora_1 = __importDefault(require("ora"));
|
|
11
|
+
const client_1 = require("../client");
|
|
12
|
+
const config_1 = require("../config");
|
|
13
|
+
async function advanceEpochCommand(options) {
|
|
14
|
+
const config = (0, config_1.loadConfig)();
|
|
15
|
+
const worldId = options.world ? parseInt(options.world, 10) : config.defaultWorldId;
|
|
16
|
+
if (worldId === undefined) {
|
|
17
|
+
console.log(chalk_1.default.red("\n❌ No hay un mundo por defecto. Usa --world <id>.\n"));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const spinner = (0, ora_1.default)("Avanzando epoch...").start();
|
|
21
|
+
try {
|
|
22
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
23
|
+
await atlas.world.advanceEpoch(worldId);
|
|
24
|
+
await atlas.world.createLeaderboard(worldId);
|
|
25
|
+
spinner.succeed(chalk_1.default.green("Epoch avanzado y leaderboard creado"));
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
spinner.fail(chalk_1.default.red("Error al avanzar epoch"));
|
|
29
|
+
console.error(chalk_1.default.red(err.message ?? err));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function pauseCommand() {
|
|
33
|
+
const spinner = (0, ora_1.default)("Pausando protocolo (emergency stop)...").start();
|
|
34
|
+
try {
|
|
35
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
36
|
+
await atlas.pauseProtocol();
|
|
37
|
+
spinner.succeed(chalk_1.default.yellow("⏸ Protocolo pausado — create_world, mint_player y collect_resource están bloqueados"));
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
spinner.fail(chalk_1.default.red("Error al pausar"));
|
|
41
|
+
console.error(chalk_1.default.red(err.message ?? err));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function unpauseCommand() {
|
|
45
|
+
const spinner = (0, ora_1.default)("Reactivando protocolo...").start();
|
|
46
|
+
try {
|
|
47
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
48
|
+
await atlas.unpauseProtocol();
|
|
49
|
+
spinner.succeed(chalk_1.default.green("▶️ Protocolo reactivado"));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
spinner.fail(chalk_1.default.red("Error al reactivar"));
|
|
53
|
+
console.error(chalk_1.default.red(err.message ?? err));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":";;;;;AASA,kDAmBC;AAED,oCAUC;AAED,wCAUC;AApDD,kDAAyB;AACzB,8CAAqB;AACrB,sCAA0C;AAC1C,sCAAsC;AAM/B,KAAK,UAAU,mBAAmB,CAAC,OAAqB;IAC7D,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAA;IAEnF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAA;QAC9E,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAA;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAA;QAC9B,MAAM,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC5C,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAA;IACrE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;QACjD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,wCAAwC,CAAC,CAAC,KAAK,EAAE,CAAA;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAA;QAC9B,MAAM,KAAK,CAAC,aAAa,EAAE,CAAA;QAC3B,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,MAAM,CAAC,sFAAsF,CAAC,CAAC,CAAA;IACvH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAA;IACvD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAA;QAC9B,MAAM,KAAK,CAAC,eAAe,EAAE,CAAA;QAC7B,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;IAC1D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAA;QAC7C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.collectCommand = collectCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const client_1 = require("../client");
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
async function collectCommand(options) {
|
|
12
|
+
const config = (0, config_1.loadConfig)();
|
|
13
|
+
const worldId = options.world ? parseInt(options.world, 10) : config.defaultWorldId;
|
|
14
|
+
if (worldId === undefined) {
|
|
15
|
+
console.log(chalk_1.default.red("\n❌ No hay un mundo por defecto. Usa --world <id>.\n"));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const resourceTypeId = options.type ? parseInt(options.type, 10) : 0;
|
|
19
|
+
console.log(chalk_1.default.bold.cyan(`\n⛏️ Recolectar recurso (mundo ${worldId})\n`));
|
|
20
|
+
const spinner = (0, ora_1.default)("Recolectando...").start();
|
|
21
|
+
try {
|
|
22
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
23
|
+
const result = await atlas.resource.collect({ worldId, resourceTypeId });
|
|
24
|
+
spinner.succeed(chalk_1.default.green(`+${result.points} pts (${result.resourceType.name}) — Nivel ${result.newLevel}`));
|
|
25
|
+
console.log(chalk_1.default.gray(`\nProgreso del mundo: ${result.worldProgress}`));
|
|
26
|
+
if (result.epochEnded) {
|
|
27
|
+
console.log(chalk_1.default.yellow("\n⚡ ¡El mundo se agotó! El epoch avanzará."));
|
|
28
|
+
console.log(chalk_1.default.gray("El authority debe correr advance-epoch y create-leaderboard."));
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk_1.default.gray(`\nSignature: ${result.signature}\n`));
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
spinner.fail(chalk_1.default.red("Error al recolectar"));
|
|
34
|
+
console.error(chalk_1.default.red(err.message ?? err));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/commands/collect.ts"],"names":[],"mappings":";;;;;AAUA,wCA+BC;AAzCD,kDAAyB;AACzB,8CAAqB;AACrB,sCAA0C;AAC1C,sCAAsC;AAO/B,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAA;IAEnF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAA;QAC9E,OAAM;IACR,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,OAAO,KAAK,CAAC,CAAC,CAAA;IAC7E,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAA;IAE9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAA;QAC9B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;QAExE,OAAO,CAAC,OAAO,CACb,eAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,YAAY,CAAC,IAAI,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAC9F,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;QACxE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAA;QACzF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,CAAA;IAC/D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAA;QAC9C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createWorldCommand = createWorldCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const core_1 = require("@atlas-world/core");
|
|
11
|
+
const client_1 = require("../client");
|
|
12
|
+
const config_1 = require("../config");
|
|
13
|
+
const TEMPLATES = {
|
|
14
|
+
gaming: {
|
|
15
|
+
epochDuration: "7d",
|
|
16
|
+
resourceTypes: [
|
|
17
|
+
{ id: 0, name: "common", points: 1, cooldownSeconds: 5 },
|
|
18
|
+
{ id: 1, name: "rare", points: 3, cooldownSeconds: 10 },
|
|
19
|
+
{ id: 2, name: "epic", points: 5, cooldownSeconds: 30 },
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
dao: {
|
|
23
|
+
epochDuration: "30d",
|
|
24
|
+
resourceTypes: [
|
|
25
|
+
{ id: 0, name: "vote", points: 1, cooldownSeconds: 86400 },
|
|
26
|
+
{ id: 1, name: "proposal", points: 10, cooldownSeconds: 604800 },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
marketplace: {
|
|
30
|
+
epochDuration: "1d",
|
|
31
|
+
resourceTypes: [
|
|
32
|
+
{ id: 0, name: "listing", points: 1, cooldownSeconds: 3600 },
|
|
33
|
+
{ id: 1, name: "featured", points: 5, cooldownSeconds: 86400 },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
custom: {
|
|
37
|
+
epochDuration: "7d",
|
|
38
|
+
resourceTypes: [],
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
async function createWorldCommand() {
|
|
42
|
+
console.log(chalk_1.default.bold.cyan("\n🌍 Crear un nuevo mundo en Atlas\n"));
|
|
43
|
+
const basics = await inquirer_1.default.prompt([
|
|
44
|
+
{
|
|
45
|
+
type: "input",
|
|
46
|
+
name: "name",
|
|
47
|
+
message: "Nombre del mundo:",
|
|
48
|
+
validate: (v) => (v.length > 0 && v.length <= 64) || "Debe tener entre 1 y 64 caracteres",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
type: "list",
|
|
52
|
+
name: "template",
|
|
53
|
+
message: "¿Qué tipo de mundo quieres crear?",
|
|
54
|
+
choices: [
|
|
55
|
+
{ name: "🎮 GameFi / Web3 Gaming", value: "gaming" },
|
|
56
|
+
{ name: "🏛️ DAO / Governance", value: "dao" },
|
|
57
|
+
{ name: "🛍️ Marketplace / Listings", value: "marketplace" },
|
|
58
|
+
{ name: "⚙️ Custom (defines tus propios recursos)", value: "custom" },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: "list",
|
|
63
|
+
name: "visibility",
|
|
64
|
+
message: "Visibilidad:",
|
|
65
|
+
choices: [
|
|
66
|
+
{ name: "Público — cualquier wallet puede participar, gratis", value: "public" },
|
|
67
|
+
{ name: "Privado — acceso por whitelist, cobra fee de creación", value: "private" },
|
|
68
|
+
],
|
|
69
|
+
default: "public",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: "number",
|
|
73
|
+
name: "totalResources",
|
|
74
|
+
message: "Total de recursos por epoch:",
|
|
75
|
+
default: 500,
|
|
76
|
+
validate: (v) => v > 0 || "Debe ser mayor a 0",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: "number",
|
|
80
|
+
name: "maxDailyCollects",
|
|
81
|
+
message: "Límite de recolectas por wallet al día (0 = sin límite):",
|
|
82
|
+
default: 0,
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
const template = TEMPLATES[basics.template];
|
|
86
|
+
let resourceTypes = template.resourceTypes;
|
|
87
|
+
if (basics.template === "custom") {
|
|
88
|
+
resourceTypes = [];
|
|
89
|
+
console.log(chalk_1.default.gray("\nDefine tus tipos de recurso (máximo 8). Deja el nombre vacío para terminar.\n"));
|
|
90
|
+
let id = 0;
|
|
91
|
+
while (id < 8) {
|
|
92
|
+
const { name } = await inquirer_1.default.prompt([
|
|
93
|
+
{ type: "input", name: "name", message: `Nombre del recurso #${id} (vacío para terminar):` },
|
|
94
|
+
]);
|
|
95
|
+
if (!name)
|
|
96
|
+
break;
|
|
97
|
+
const { points, cooldownSeconds } = await inquirer_1.default.prompt([
|
|
98
|
+
{ type: "number", name: "points", message: " Puntos que otorga:", default: 1 },
|
|
99
|
+
{ type: "number", name: "cooldownSeconds", message: " Cooldown en segundos:", default: 5 },
|
|
100
|
+
]);
|
|
101
|
+
resourceTypes.push({ id, name, points, cooldownSeconds });
|
|
102
|
+
id++;
|
|
103
|
+
}
|
|
104
|
+
if (resourceTypes.length === 0) {
|
|
105
|
+
console.log(chalk_1.default.red("\n❌ Necesitas al menos un tipo de recurso. Cancelado.\n"));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log(chalk_1.default.gray(`\nUsando template "${basics.template}":`));
|
|
111
|
+
resourceTypes.forEach((rt) => console.log(chalk_1.default.gray(` • ${rt.name} — ${rt.points} pts, cooldown ${rt.cooldownSeconds}s`)));
|
|
112
|
+
console.log();
|
|
113
|
+
}
|
|
114
|
+
const { confirm } = await inquirer_1.default.prompt([
|
|
115
|
+
{
|
|
116
|
+
type: "confirm",
|
|
117
|
+
name: "confirm",
|
|
118
|
+
message: `¿Crear el mundo "${basics.name}"?`,
|
|
119
|
+
default: true,
|
|
120
|
+
},
|
|
121
|
+
]);
|
|
122
|
+
if (!confirm) {
|
|
123
|
+
console.log(chalk_1.default.gray("Cancelado."));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const spinner = (0, ora_1.default)("Creando mundo en Solana...").start();
|
|
127
|
+
try {
|
|
128
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
129
|
+
const worldTypeMap = {
|
|
130
|
+
gaming: core_1.WorldType.Gaming,
|
|
131
|
+
dao: core_1.WorldType.Dao,
|
|
132
|
+
marketplace: core_1.WorldType.Marketplace,
|
|
133
|
+
custom: core_1.WorldType.Custom,
|
|
134
|
+
};
|
|
135
|
+
const { worldId, signature } = await atlas.world.create({
|
|
136
|
+
name: basics.name,
|
|
137
|
+
worldType: worldTypeMap[basics.template],
|
|
138
|
+
visibility: basics.visibility === "private" ? core_1.WorldVisibility.Private : core_1.WorldVisibility.Public,
|
|
139
|
+
totalResources: basics.totalResources,
|
|
140
|
+
epochDuration: template.epochDuration,
|
|
141
|
+
maxDailyCollects: basics.maxDailyCollects,
|
|
142
|
+
resourceTypes,
|
|
143
|
+
});
|
|
144
|
+
// Crear leaderboard del epoch 0 automáticamente
|
|
145
|
+
await atlas.world.createLeaderboard(worldId);
|
|
146
|
+
spinner.succeed(chalk_1.default.green(`Mundo creado — worldId: ${worldId}`));
|
|
147
|
+
console.log(chalk_1.default.gray(`\nSignature: ${signature}`));
|
|
148
|
+
console.log(chalk_1.default.gray(`Explorer: https://solscan.io/tx/${signature}?cluster=${atlas.network}\n`));
|
|
149
|
+
(0, config_1.saveConfig)({ defaultWorldId: worldId });
|
|
150
|
+
console.log(chalk_1.default.cyan(`Este mundo quedó guardado como default. Próximos comandos lo usarán automáticamente.\n`));
|
|
151
|
+
console.log(chalk_1.default.bold("Siguiente paso:"));
|
|
152
|
+
console.log(` atlas-cli mint-player --name "TuNombre"\n`);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
spinner.fail(chalk_1.default.red("Error al crear el mundo"));
|
|
156
|
+
console.error(chalk_1.default.red(err.message ?? err));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=createWorld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorld.js","sourceRoot":"","sources":["../../src/commands/createWorld.ts"],"names":[],"mappings":";;;;;AA2CA,gDAiIC;AA5KD,wDAA+B;AAC/B,kDAAyB;AACzB,8CAAqB;AACrB,4CAA8D;AAC9D,sCAA0C;AAC1C,sCAAsC;AAStC,MAAM,SAAS,GAAqF;IAClG,MAAM,EAAE;QACN,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE;YACb,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;YACxD,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;YACvD,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;SACxD;KACF;IACD,GAAG,EAAE;QACH,aAAa,EAAE,KAAK;QACpB,aAAa,EAAE;YACb,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE;YAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE;SACjE;KACF;IACD,WAAW,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE;YACb,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE;YAC5D,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE;SAC/D;KACF;IACD,MAAM,EAAE;QACN,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,EAAE;KAClB;CACF,CAAA;AAEM,KAAK,UAAU,kBAAkB;IACtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAA;IAEpE,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACnC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,mBAAmB;YAC5B,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,oCAAoC;SAClG;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACpD,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC/C,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,aAAa,EAAE;gBAC7D,EAAE,IAAI,EAAE,2CAA2C,EAAE,KAAK,EAAE,QAAQ,EAAE;aACvE;SACF;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,qDAAqD,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAChF,EAAE,IAAI,EAAE,uDAAuD,EAAE,KAAK,EAAE,SAAS,EAAE;aACpF;YACD,OAAO,EAAE,QAAQ;SAClB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,oBAAoB;SACvD;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,0DAA0D;YACnE,OAAO,EAAE,CAAC;SACX;KACF,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAA;IAE1C,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,aAAa,GAAG,EAAE,CAAA;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC,CAAA;QAC1G,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE;aAC7F,CAAC,CAAA;YACF,IAAI,CAAC,IAAI;gBAAE,MAAK;YAEhB,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACxD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC/E,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC,EAAE;aAC5F,CAAC,CAAA;YACF,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAA;YACzD,EAAE,EAAE,CAAA;QACN,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAA;YACjF,OAAM;QACR,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAA;QAClE,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,MAAM,kBAAkB,EAAE,CAAC,eAAe,GAAG,CAAC,CAAC,CAC9F,CAAA;QACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACxC;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,oBAAoB,MAAM,CAAC,IAAI,IAAI;YAC5C,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAA;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAA;IAEzD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAA;QAC9B,MAAM,YAAY,GAA8B;YAC9C,MAAM,EAAE,gBAAS,CAAC,MAAM;YACxB,GAAG,EAAE,gBAAS,CAAC,GAAG;YAClB,WAAW,EAAE,gBAAS,CAAC,WAAW;YAClC,MAAM,EAAE,gBAAS,CAAC,MAAM;SACzB,CAAA;QAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YACtD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,UAAU,EAAE,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAe,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAe,CAAC,MAAM;YAC9F,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,aAAa;SACd,CAAC,CAAA;QAEF,gDAAgD;QAChD,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAE5C,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,mCAAmC,SAAS,YAAY,KAAK,CAAC,OAAO,IAAI,CAAC,CACtF,CAAA;QAED,IAAA,mBAAU,EAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAA;QACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC,CAAA;QACjH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;IAC5D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAA;QAClD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.initCommand = initCommand;
|
|
40
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
const config_1 = require("../config");
|
|
45
|
+
async function initCommand() {
|
|
46
|
+
console.log(chalk_1.default.bold.cyan("\n🌍 Atlas World Protocol — Setup\n"));
|
|
47
|
+
if ((0, config_1.configExists)()) {
|
|
48
|
+
const current = (0, config_1.loadConfig)();
|
|
49
|
+
console.log(chalk_1.default.yellow("Ya existe una configuración:"));
|
|
50
|
+
console.log(` Red: ${current.network}`);
|
|
51
|
+
console.log(` Wallet: ${current.walletPath}\n`);
|
|
52
|
+
const { overwrite } = await inquirer_1.default.prompt([
|
|
53
|
+
{
|
|
54
|
+
type: "confirm",
|
|
55
|
+
name: "overwrite",
|
|
56
|
+
message: "¿Quieres sobreescribirla?",
|
|
57
|
+
default: false,
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
if (!overwrite) {
|
|
61
|
+
console.log(chalk_1.default.gray("Setup cancelado."));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const defaultWalletPath = `${os.homedir()}/.config/solana/id.json`;
|
|
66
|
+
const walletExists = fs.existsSync(defaultWalletPath);
|
|
67
|
+
const answers = await inquirer_1.default.prompt([
|
|
68
|
+
{
|
|
69
|
+
type: "list",
|
|
70
|
+
name: "network",
|
|
71
|
+
message: "¿En qué red vas a trabajar?",
|
|
72
|
+
choices: [
|
|
73
|
+
{ name: "Devnet (recomendado para desarrollo)", value: "devnet" },
|
|
74
|
+
{ name: "Mainnet-Beta", value: "mainnet-beta" },
|
|
75
|
+
],
|
|
76
|
+
default: "devnet",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: "input",
|
|
80
|
+
name: "walletPath",
|
|
81
|
+
message: "Ruta a tu keypair de Solana:",
|
|
82
|
+
default: defaultWalletPath,
|
|
83
|
+
validate: (input) => {
|
|
84
|
+
const resolved = input.replace(/^~/, os.homedir());
|
|
85
|
+
return fs.existsSync(resolved)
|
|
86
|
+
? true
|
|
87
|
+
: `No se encontró un keypair en ${resolved}. Genera uno con: solana-keygen new`;
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
]);
|
|
91
|
+
(0, config_1.saveConfig)({
|
|
92
|
+
network: answers.network,
|
|
93
|
+
walletPath: answers.walletPath,
|
|
94
|
+
});
|
|
95
|
+
console.log(chalk_1.default.green("\n✅ Configuración guardada en ~/.atlas/config.json"));
|
|
96
|
+
console.log(chalk_1.default.gray(`\nSiguiente paso: atlas-cli create-world\n`));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,kCA0DC;AAhED,wDAA+B;AAC/B,kDAAyB;AACzB,uCAAwB;AACxB,uCAAwB;AACxB,sCAAgE;AAEzD,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAA;IAEnE,IAAI,IAAA,qBAAY,GAAE,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAA,mBAAU,GAAE,CAAA;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACzD,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QACxC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,UAAU,IAAI,CAAC,CAAA;QAEhD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YAC1C;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,2BAA2B;gBACpC,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAA;YAC3C,OAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,yBAAyB,CAAA;IAClE,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAErD,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,sCAAsC,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACjE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;aAChD;YACD,OAAO,EAAE,QAAQ;SAClB;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;gBAClD,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAC5B,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,gCAAgC,QAAQ,qCAAqC,CAAA;YACnF,CAAC;SACF;KACF,CAAC,CAAA;IAEF,IAAA,mBAAU,EAAC;QACT,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAA;IAC9E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAA;AACvE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.leaderboardCommand = leaderboardCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const client_1 = require("../client");
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
const MEDALS = ["🥇", "🥈", "🥉"];
|
|
11
|
+
async function leaderboardCommand(options) {
|
|
12
|
+
const config = (0, config_1.loadConfig)();
|
|
13
|
+
const worldId = options.world ? parseInt(options.world, 10) : config.defaultWorldId;
|
|
14
|
+
if (worldId === undefined) {
|
|
15
|
+
console.log(chalk_1.default.red("\n❌ No hay un mundo por defecto. Usa --world <id>.\n"));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const epoch = options.epoch ? parseInt(options.epoch, 10) : undefined;
|
|
19
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
20
|
+
const lb = await atlas.leaderboard.get(worldId, { epoch });
|
|
21
|
+
if (!lb) {
|
|
22
|
+
console.log(chalk_1.default.red(`\n❌ Leaderboard no encontrado (¿ya se creó para este epoch?)\n`));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log(chalk_1.default.bold.cyan(`\n🏆 Leaderboard — mundo ${worldId}, epoch ${lb.epoch}\n`));
|
|
26
|
+
if (lb.entries.length === 0) {
|
|
27
|
+
console.log(chalk_1.default.gray(" Sin entradas todavía.\n"));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
lb.entries.forEach((entry, i) => {
|
|
31
|
+
const medal = MEDALS[i] ?? ` ${i + 1}.`;
|
|
32
|
+
console.log(` ${medal} ${entry.name.padEnd(20)} ${chalk_1.default.cyan(entry.resourcesCollected + " pts")} (Nivel ${entry.level})`);
|
|
33
|
+
});
|
|
34
|
+
console.log();
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=leaderboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.js","sourceRoot":"","sources":["../../src/commands/leaderboard.ts"],"names":[],"mappings":";;;;;AAWA,gDAiCC;AA5CD,kDAAyB;AACzB,sCAA0C;AAC1C,sCAAsC;AAOtC,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAE1B,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAA;IAEnF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAA;QAC9E,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAErE,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAA;IAC9B,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAE1D,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC,CAAA;QACxF,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,OAAO,WAAW,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;IAExF,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAA;QACpD,OAAM;IACR,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAA;QACxC,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,MAAM,CAAC,YAAY,KAAK,CAAC,KAAK,GAAG,CAC/G,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.mintPlayerCommand = mintPlayerCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const client_1 = require("../client");
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
async function mintPlayerCommand(options) {
|
|
12
|
+
const config = (0, config_1.loadConfig)();
|
|
13
|
+
const worldId = options.world ? parseInt(options.world, 10) : config.defaultWorldId;
|
|
14
|
+
if (worldId === undefined) {
|
|
15
|
+
console.log(chalk_1.default.red("\n❌ No hay un mundo por defecto. Usa --world <id> o corre `atlas-cli create-world` primero.\n"));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const name = options.name ?? `Explorer_${Date.now().toString().slice(-4)}`;
|
|
19
|
+
console.log(chalk_1.default.bold.cyan(`\n👤 Mint Player en mundo ${worldId}\n`));
|
|
20
|
+
const spinner = (0, ora_1.default)(`Minteando "${name}"...`).start();
|
|
21
|
+
try {
|
|
22
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
23
|
+
const alreadyExists = await atlas.player.exists(worldId);
|
|
24
|
+
if (alreadyExists) {
|
|
25
|
+
spinner.info(chalk_1.default.yellow("Ya tienes un player en este mundo."));
|
|
26
|
+
const player = await atlas.player.get(worldId);
|
|
27
|
+
console.log(`\n Nombre: ${player?.name}`);
|
|
28
|
+
console.log(` Nivel: ${player?.level}`);
|
|
29
|
+
console.log(` Puntos: ${player?.resourcesCollected}\n`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const { signature } = await atlas.player.mint({ worldId, name });
|
|
33
|
+
spinner.succeed(chalk_1.default.green(`Player "${name}" minteado`));
|
|
34
|
+
console.log(chalk_1.default.gray(`\nSignature: ${signature}`));
|
|
35
|
+
console.log(chalk_1.default.gray(`Explorer: https://solscan.io/tx/${signature}?cluster=${atlas.network}\n`));
|
|
36
|
+
console.log(chalk_1.default.bold("Siguiente paso:"));
|
|
37
|
+
console.log(` atlas-cli collect --type 0\n`);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
spinner.fail(chalk_1.default.red("Error al mintear player"));
|
|
41
|
+
console.error(chalk_1.default.red(err.message ?? err));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=mintPlayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintPlayer.js","sourceRoot":"","sources":["../../src/commands/mintPlayer.ts"],"names":[],"mappings":";;;;;AAUA,8CAuCC;AAjDD,kDAAyB;AACzB,8CAAqB;AACrB,sCAA0C;AAC1C,sCAAsC;AAO/B,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IAChE,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAA;IAEnF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,+FAA+F,CAAC,CAC3G,CAAA;QACD,OAAM;IACR,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAE1E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,OAAO,IAAI,CAAC,CAAC,CAAA;IACtE,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,cAAc,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;IAErD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAA;QAE9B,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACxD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAA;YAChE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YACxC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,kBAAkB,IAAI,CAAC,CAAA;YACxD,OAAM;QACR,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAChE,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,CAAC,CAAA;QACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,SAAS,YAAY,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAA;QAClG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAA;QAClD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.statusCommand = statusCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const client_1 = require("../client");
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
function bar(pct, width = 24) {
|
|
11
|
+
const filled = Math.round((pct / 100) * width);
|
|
12
|
+
return "█".repeat(filled) + "░".repeat(width - filled);
|
|
13
|
+
}
|
|
14
|
+
async function statusCommand(options) {
|
|
15
|
+
const config = (0, config_1.loadConfig)();
|
|
16
|
+
const worldId = options.world ? parseInt(options.world, 10) : config.defaultWorldId;
|
|
17
|
+
if (worldId === undefined) {
|
|
18
|
+
console.log(chalk_1.default.red("\n❌ No hay un mundo por defecto. Usa --world <id>.\n"));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const atlas = (0, client_1.getAtlasClient)();
|
|
22
|
+
const world = await atlas.world.get(worldId);
|
|
23
|
+
if (!world) {
|
|
24
|
+
console.log(chalk_1.default.red(`\n❌ No se encontró el mundo ${worldId}\n`));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const visibilityLabel = world.config.visibility === 0 ? "Público" : "Privado";
|
|
28
|
+
console.log(chalk_1.default.bold.cyan(`\n🌍 ${world.config.name}`) + chalk_1.default.gray(` (worldId: ${worldId})\n`));
|
|
29
|
+
console.log(` Visibilidad: ${visibilityLabel}`);
|
|
30
|
+
console.log(` Epoch actual: ${world.config.currentEpoch}`);
|
|
31
|
+
console.log(` Cooldown: ${world.config.globalCooldown}s`);
|
|
32
|
+
if (world.pendingAdvance) {
|
|
33
|
+
console.log(chalk_1.default.yellow(`\n ⚠️ El epoch avanzó pero falta correr advance-epoch\n`));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.log(`\n Progreso: ${chalk_1.default.cyan(bar(world.progress))} ${world.progress}% (${world.state.resourcesCollected}/${world.config.totalResources})`);
|
|
37
|
+
if (world.exhausted) {
|
|
38
|
+
console.log(chalk_1.default.yellow(` ⚡ Mundo agotado — esperando reset`));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
console.log(chalk_1.default.bold(`\n Tipos de recurso:`));
|
|
42
|
+
world.config.resourceTypes.forEach((rt) => {
|
|
43
|
+
console.log(` • ${rt.name} — ${rt.points} pts, cooldown ${rt.cooldownSeconds}s`);
|
|
44
|
+
});
|
|
45
|
+
const player = await atlas.player.get(worldId);
|
|
46
|
+
if (player) {
|
|
47
|
+
console.log(chalk_1.default.bold(`\n Tu player:`));
|
|
48
|
+
console.log(` Nombre: ${player.name}`);
|
|
49
|
+
console.log(` Nivel: ${player.level}`);
|
|
50
|
+
console.log(` Puntos: ${player.resourcesCollected}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(chalk_1.default.gray(`\n No tienes un player en este mundo. Corre: atlas-cli mint-player`));
|
|
54
|
+
}
|
|
55
|
+
console.log();
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|