@akaanakbaik/pterodactyl-gateway 0.5.0 → 0.9.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 CHANGED
@@ -1,16 +1,22 @@
1
1
  # Akadev Pterodactyl Gateway
2
2
 
3
- SDK TypeScript dan CLI untuk menghubungkan project Node.js ke Pterodactyl Panel dengan lebih mudah, aman, dan cepat.
3
+ SDK TypeScript dan CLI untuk mengelola Pterodactyl Panel dengan lebih cepat, aman, dan nyaman dari Node.js maupun terminal.
4
4
 
5
5
  Package ini cocok untuk bot reseller panel, dashboard custom, automation server, admin tools, dan project yang perlu membuat user/server Pterodactyl secara otomatis.
6
6
 
7
- Package ini bukan package resmi dari Pterodactyl dan tidak berafiliasi dengan Pterodactyl Software.
7
+ > Package ini bukan package resmi dari Pterodactyl dan tidak berafiliasi dengan Pterodactyl Software.
8
8
 
9
9
  ## Status
10
10
 
11
- Versi saat ini: `0.3.0`
11
+ Versi saat ini: `0.9.0`
12
12
 
13
- Package npm publik:
13
+ - npm package: `@akaanakbaik/pterodactyl-gateway`
14
+ - CLI utama: `ptero-gateway` dan `ptg`
15
+ - CLI wizard: `ptero-wizard`
16
+ - Runtime: Node.js `>=18`
17
+ - License: MIT
18
+
19
+ ## Install
14
20
 
15
21
  ```bash
16
22
  npm i @akaanakbaik/pterodactyl-gateway
@@ -22,53 +28,17 @@ Install global CLI:
22
28
  npm i -g @akaanakbaik/pterodactyl-gateway
23
29
  ```
24
30
 
25
- CLI tersedia sebagai:
31
+ Cek versi dan kondisi package:
26
32
 
27
33
  ```bash
28
- ptero-gateway help
29
- ptg help
34
+ ptero-gateway version
35
+ ptero-gateway self-check
36
+ ptero-gateway release-check
30
37
  ```
31
38
 
32
- ## Yang sudah terbukti di panel asli
33
-
34
- Fitur berikut sudah dites langsung pada panel Pterodactyl asli:
35
-
36
- - koneksi PTLA dan PTLC
37
- - `doctor`
38
- - `ids`
39
- - list admin users
40
- - list admin servers
41
- - create user
42
- - create server dengan dry-run
43
- - create server asli
44
- - auto docker image dari egg
45
- - auto startup dari egg
46
- - auto allocation
47
- - detail server admin
48
- - limits server admin
49
- - update limits server admin
50
- - suspend server
51
- - unsuspend server
52
- - probe read-only client server
53
- - summary server
54
- - resources realtime/polling
55
- - files list
56
- - files read
57
- - files write
58
- - startup/env read
59
- - startup/env set
60
- - network/ports read
61
- - backup list
62
- - backup detail
63
- - backup delete
64
- - schedules list
65
- - template `init-node-alive`
66
- - start/stop/restart/kill server
67
- - publish ke npm public registry
68
-
69
- ## Env
70
-
71
- Gunakan env berikut:
39
+ ## API key
40
+
41
+ Gunakan dua jenis key sesuai kebutuhan:
72
42
 
73
43
  ```env
74
44
  PTERO_DOMAIN=https://panel.example.com
@@ -76,68 +46,117 @@ PTERO_PTLA=ptla_xxxxxxxxxxxxxxxxx
76
46
  PTERO_PTLC=ptlc_xxxxxxxxxxxxxxxxx
77
47
  ```
78
48
 
79
- Penjelasan:
80
-
81
49
  - `PTERO_DOMAIN`: domain panel Pterodactyl.
82
50
  - `PTERO_PTLA`: Application API Key untuk aksi admin seperti list user, create user, create server, update limits, suspend, unsuspend, dan reinstall.
83
51
  - `PTERO_PTLC`: Client API Key untuk kontrol server seperti resources, file manager, startup variables, ports, backups, schedules, dan power action.
84
52
 
85
53
  Jangan hardcode API key ke source code.
86
54
 
87
- ## Koneksi SDK
55
+ ## Config profile
88
56
 
89
- ```ts
90
- import { createPtero } from "@akaanakbaik/pterodactyl-gateway";
57
+ Sejak `0.8.0`, CLI bisa menyimpan profile lokal agar tidak perlu export env berulang-ulang.
91
58
 
92
- const ptero = createPtero({
93
- domain: "https://panel.example.com",
94
- ptla: process.env.PTERO_PTLA,
95
- ptlc: process.env.PTERO_PTLC
96
- });
59
+ ```bash
60
+ ptero-gateway config init \
61
+ --profile main \
62
+ --domain https://panel.example.com \
63
+ --ptla ptla_xxx \
64
+ --ptlc ptlc_xxx
65
+
66
+ ptero-gateway config doctor
67
+ ptero-gateway config list
68
+ ptero-gateway doctor
69
+ ```
70
+
71
+ File config disimpan di:
97
72
 
98
- const result = await ptero.connect();
99
- console.log(result);
73
+ ```txt
74
+ ~/.pterodactyl-gateway/config.json
100
75
  ```
101
76
 
102
- Atau langsung dari env:
77
+ File tersebut berisi API key dan otomatis diberi permission `600`.
103
78
 
104
- ```ts
105
- import { createPtero } from "@akaanakbaik/pterodactyl-gateway";
79
+ Command config:
106
80
 
107
- const ptero = createPtero.fromEnv();
108
- await ptero.connect();
81
+ ```bash
82
+ ptero-gateway config path
83
+ ptero-gateway config init --profile main --domain https://panel.example.com --ptla ptla_xxx --ptlc ptlc_xxx
84
+ ptero-gateway config list
85
+ ptero-gateway config show main
86
+ ptero-gateway config use main
87
+ ptero-gateway config rename main production
88
+ ptero-gateway config delete production --yes
89
+ ptero-gateway config env main
90
+ ptero-gateway config doctor
109
91
  ```
110
92
 
111
93
  ## CLI cepat
112
94
 
113
- Cek koneksi:
114
-
115
95
  ```bash
96
+ ptero-gateway help
116
97
  ptero-gateway doctor
117
98
  ptero-gateway connect
99
+ ptero-gateway ids
100
+ ptero-gateway ids --nest 5
101
+ ptero-gateway servers
118
102
  ```
119
103
 
120
- Ambil ID node, nest, dan egg:
104
+ List admin:
121
105
 
122
106
  ```bash
123
- ptero-gateway ids
124
- ptero-gateway ids --nest 5
107
+ ptero-gateway admin users
108
+ ptero-gateway admin servers
125
109
  ```
126
110
 
127
- List server client:
111
+ ## Preset server
128
112
 
129
113
  ```bash
130
- ptero-gateway servers
114
+ ptero-gateway presets
131
115
  ```
132
116
 
133
- List admin:
117
+ Preset bawaan:
118
+
119
+ | Preset | Memory | Disk | CPU | Database | Allocation | Backup |
120
+ |---|---:|---:|---:|---:|---:|---:|
121
+ | mini | 512MB | 1GB | 50% | 0 | 1 | 0 |
122
+ | basic | 1GB | 2GB | 100% | 0 | 1 | 0 |
123
+ | standard | 2GB | 5GB | 200% | 1 | 1 | 1 |
124
+ | premium | 4GB | 10GB | 300% | 2 | 2 | 2 |
125
+ | unlimited | 0 | 0 | 0 | 5 | 3 | 3 |
126
+
127
+ Nilai preset tetap bisa dioverride dengan `--memory`, `--disk`, `--cpu`, `--databases`, `--allocations`, dan `--backups`.
128
+
129
+ ## Templates
130
+
131
+ Template hanya membuat rekomendasi command create-server. Template tidak membuat node, location, atau allocation.
134
132
 
135
133
  ```bash
136
- ptero-gateway admin users
137
- ptero-gateway admin servers
134
+ ptero-gateway templates list
135
+ ptero-gateway templates show nodejs-bot
136
+ ptero-gateway templates command nodejs-bot --name "bot saya" --email user@example.com --node 1 --nest 5 --egg 18
138
137
  ```
139
138
 
140
- Create server dry-run:
139
+ Template bawaan:
140
+
141
+ - `nodejs-bot`
142
+ - `nodejs-api`
143
+ - `wa-bot`
144
+ - `python-bot`
145
+ - `blank`
146
+
147
+ ## Create user
148
+
149
+ ```bash
150
+ ptero-gateway admin create-user \
151
+ --username aka_test \
152
+ --email user@example.com \
153
+ --password "password aman" \
154
+ --yes
155
+ ```
156
+
157
+ ## Create server
158
+
159
+ Selalu mulai dengan dry-run:
141
160
 
142
161
  ```bash
143
162
  ptero-gateway admin create-server \
@@ -148,16 +167,11 @@ ptero-gateway admin create-server \
148
167
  --node 1 \
149
168
  --nest 5 \
150
169
  --egg 18 \
151
- --memory 1GB \
152
- --disk 2GB \
153
- --cpu 100% \
154
- --databases 0 \
155
- --allocations 1 \
156
- --backups 0 \
170
+ --preset basic \
157
171
  --dry-run
158
172
  ```
159
173
 
160
- Create server asli:
174
+ Jika payload sudah benar, eksekusi asli:
161
175
 
162
176
  ```bash
163
177
  ptero-gateway admin create-server \
@@ -168,62 +182,72 @@ ptero-gateway admin create-server \
168
182
  --node 1 \
169
183
  --nest 5 \
170
184
  --egg 18 \
171
- --memory 1GB \
172
- --disk 2GB \
173
- --cpu 100% \
174
- --databases 0 \
175
- --allocations 1 \
176
- --backups 0 \
185
+ --preset basic \
177
186
  --yes
178
187
  ```
179
188
 
180
- Detail dan limit server admin:
189
+ ## Wizard
190
+
191
+ Wizard membantu input secara interaktif tanpa membuka kontrol node/location/allocation.
181
192
 
182
193
  ```bash
183
- ptero-gateway admin server 5 detail
184
- ptero-gateway admin server 5 limits
185
- ptero-gateway admin server 5 update-limits --backups 1 --yes
194
+ ptero-wizard help
195
+ ptero-wizard create-user --dry-run
196
+ ptero-wizard create-server --dry-run
197
+ ptero-wizard create-server --yes
186
198
  ```
187
199
 
188
- Lifecycle admin:
200
+ Node ID, Nest ID, dan Egg ID tetap diisi manual oleh admin. Gunakan `ptero-gateway ids` untuk melihat daftar ID.
201
+
202
+ ## Admin server
189
203
 
190
204
  ```bash
205
+ ptero-gateway admin server 5 detail
206
+ ptero-gateway admin server 5 limits
207
+ ptero-gateway admin server 5 update-limits --backups 1 --yes
191
208
  ptero-gateway admin server 5 suspend --yes
192
209
  ptero-gateway admin server 5 unsuspend --yes
193
210
  ptero-gateway admin server 5 reinstall --yes
194
211
  ```
195
212
 
196
- Probe dan summary server client:
213
+ ## Client server
197
214
 
198
215
  ```bash
199
216
  ptero-gateway probe 311d56b7
200
217
  ptero-gateway server 311d56b7 summary
201
218
  ptero-gateway server 311d56b7 resources
219
+ ptero-gateway server 311d56b7 files /
220
+ ptero-gateway server 311d56b7 read /package.json
221
+ ptero-gateway server 311d56b7 env
222
+ ptero-gateway server 311d56b7 ports
223
+ ptero-gateway server 311d56b7 databases
224
+ ptero-gateway server 311d56b7 backups
225
+ ptero-gateway server 311d56b7 schedules
202
226
  ```
203
227
 
204
- File manager:
228
+ Write file:
205
229
 
206
230
  ```bash
207
- ptero-gateway server 311d56b7 files /
208
- ptero-gateway server 311d56b7 read /package.json
209
231
  ptero-gateway server 311d56b7 write /tmp/test.txt "halo" --yes
210
232
  ptero-gateway server 311d56b7 write /index.js "console.log('halo')" --yes --allow-any-path
211
233
  ```
212
234
 
213
- Startup variables:
235
+ Power action:
214
236
 
215
237
  ```bash
216
- ptero-gateway server 311d56b7 env
217
- ptero-gateway server 311d56b7 set-env CMD_RUN "node index.js" --yes
238
+ ptero-gateway server 311d56b7 start --yes
239
+ ptero-gateway server 311d56b7 stop --yes
240
+ ptero-gateway server 311d56b7 restart --yes
241
+ ptero-gateway server 311d56b7 kill --yes
242
+ ptero-gateway server 311d56b7 command "npm start" --yes
218
243
  ```
219
244
 
220
- Template server Node yang tetap hidup:
245
+ Template Node alive:
221
246
 
222
247
  ```bash
223
248
  ptero-gateway server 311d56b7 stop --yes
224
249
  ptero-gateway server 311d56b7 init-node-alive --yes
225
250
  ptero-gateway server 311d56b7 start --yes
226
- ptero-gateway server 311d56b7 resources
227
251
  ```
228
252
 
229
253
  Backup:
@@ -235,32 +259,42 @@ ptero-gateway server 311d56b7 backup <uuid>
235
259
  ptero-gateway server 311d56b7 delete-backup <uuid> --yes
236
260
  ```
237
261
 
238
- Power control:
262
+ ## SDK
239
263
 
240
- ```bash
241
- ptero-gateway server 311d56b7 start --yes
242
- ptero-gateway server 311d56b7 stop --yes
243
- ptero-gateway server 311d56b7 restart --yes
244
- ptero-gateway server 311d56b7 kill --yes
245
- ptero-gateway server 311d56b7 command "npm start" --yes
264
+ ```ts
265
+ import { createPtero } from "@akaanakbaik/pterodactyl-gateway";
266
+
267
+ const ptero = createPtero({
268
+ domain: "https://panel.example.com",
269
+ ptla: process.env.PTERO_PTLA,
270
+ ptlc: process.env.PTERO_PTLC
271
+ });
272
+
273
+ await ptero.connect();
274
+ ```
275
+
276
+ Dari env:
277
+
278
+ ```ts
279
+ import { createPtero } from "@akaanakbaik/pterodactyl-gateway";
280
+
281
+ const ptero = createPtero.fromEnv();
282
+ const doctor = await ptero.doctor();
283
+ console.log(doctor);
246
284
  ```
247
285
 
248
- ## Create user SDK
286
+ Create user SDK:
249
287
 
250
288
  ```ts
251
289
  const user = await ptero.users.createSmart({
252
290
  username: "aka_test",
253
291
  email: "user@example.com",
254
292
  password: "auto",
255
- administrator: "no"
293
+ administrator: false
256
294
  });
257
-
258
- console.log(user);
259
295
  ```
260
296
 
261
- Jika `password: "auto"`, package membuat password aman dan mengembalikannya sekali pada response.
262
-
263
- ## Create server SDK
297
+ Create server SDK:
264
298
 
265
299
  ```ts
266
300
  const server = await ptero.servers.createSmart({
@@ -269,7 +303,7 @@ const server = await ptero.servers.createSmart({
269
303
  username: "aka_test",
270
304
  password: "password aman",
271
305
  autoCreateUser: true,
272
- description: "Server bot WhatsApp untuk Aka",
306
+ description: "Server bot WhatsApp",
273
307
  nodeId: 1,
274
308
  nestId: 5,
275
309
  eggId: 18,
@@ -282,134 +316,72 @@ const server = await ptero.servers.createSmart({
282
316
  backups: 0
283
317
  }
284
318
  });
285
-
286
- console.log(server);
287
319
  ```
288
320
 
289
- ## Preview dan dry-run SDK
321
+ Dry-run SDK:
290
322
 
291
323
  ```ts
292
- const result = await ptero.servers.createSmart(input, {
293
- dryRun: true
294
- });
295
-
296
- console.log(result.payload);
324
+ const preview = await ptero.servers.createSmart(input, { dryRun: true });
325
+ console.log(preview.payload);
297
326
  ```
298
327
 
299
- ## File manager SDK
328
+ Client SDK:
300
329
 
301
330
  ```ts
302
331
  const server = ptero.server("311d56b7");
303
332
 
304
- const files = await server.files.list("/");
305
- const text = await server.files.read("/package.json");
306
- await server.files.write("/index.js", "console.log('running')");
307
-
308
- const config = await server.files.json.read("/config.json");
309
- await server.files.json.write("/config.json", { ok: true });
310
- ```
311
-
312
- ## Startup variables SDK
313
-
314
- ```ts
315
- const variables = await server.startup.variables();
333
+ await server.resources();
334
+ await server.files.list("/");
335
+ await server.files.read("/package.json");
336
+ await server.files.write("/tmp/test.txt", "halo");
337
+ await server.startup.variables();
316
338
  await server.startup.set("CMD_RUN", "node index.js");
317
- await server.startup.setMany({
318
- NODE_ENV: "production",
319
- STARTUP_FILE: "index.js"
320
- });
321
- ```
322
-
323
- ## Network, database, backup, schedule SDK
324
-
325
- ```ts
326
- await server.network.list();
327
- await server.network.assign();
328
- await server.network.setNote(123, "API port");
329
- await server.network.setPrimary(123);
330
- await server.network.delete(123);
331
-
332
- await server.databases.list();
333
- await server.databases.create({ database: "botdb" });
334
- await server.databases.rotatePassword("database-id");
335
- await server.databases.delete("database-id");
336
-
337
339
  await server.backups.list();
338
- await server.backups.create({ name: "before-update" });
339
- await server.backups.details("backup-id");
340
- await server.backups.download("backup-id");
341
- await server.backups.delete("backup-id");
342
-
343
- await server.schedules.list();
344
- await server.schedules.create({
345
- name: "Daily restart",
346
- minute: "0",
347
- hour: "3",
348
- dayOfMonth: "*",
349
- month: "*",
350
- dayOfWeek: "*"
351
- });
352
340
  ```
353
341
 
354
- ## Raw request
355
-
356
- Raw mode disediakan agar fitur baru atau panel fork tetap bisa dipakai.
342
+ Raw request:
357
343
 
358
344
  ```ts
359
345
  await ptero.raw.application.get("/users");
360
- await ptero.raw.application.post("/servers", payload);
361
346
  await ptero.raw.client.get("/servers/311d56b7/resources");
362
- await ptero.raw.client.post("/servers/311d56b7/command", {
363
- command: "npm start"
364
- });
365
347
  ```
366
348
 
367
- ## Testing di VPS Ubuntu
368
-
369
- ```bash
370
- sudo apt update
371
- sudo apt install -y git curl
372
- curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
373
- sudo apt install -y nodejs
374
- git clone https://github.com/akaanakbaik/pterodactyl-gateway.git
375
- cd pterodactyl-gateway
376
- npm install
377
- npm run verify
378
- ```
379
-
380
- `npm run verify` menjalankan:
381
-
382
- - `npm run typecheck`
383
- - `npm test`
384
- - `npm run test:cli`
385
- - `npm run test:pack`
386
-
387
- ## Catatan keamanan
349
+ ## Keamanan
388
350
 
389
351
  - Jangan hardcode PTLA/PTLC di source code.
352
+ - Config lokal berisi API key; jangan upload `~/.pterodactyl-gateway/config.json`.
390
353
  - Semua aksi tulis/ubah via CLI wajib `--yes`.
391
354
  - Write file CLI default hanya boleh ke `/tmp`; untuk path lain wajib `--allow-any-path`.
392
355
  - Command berbahaya seperti `rm -rf /` diblokir oleh guard command.
393
356
  - Gunakan `--dry-run` sebelum create server asli.
394
- - Untuk delete server/user permanen, fitur sengaja belum dibuka di v0.3.0 dan akan dibuat dengan guard tambahan.
395
-
396
- ## Roadmap ringkas
357
+ - Command node/location/allocation management sengaja tidak dibuka.
358
+ - Delete user/server permanen sengaja tidak dibuka di CLI stabil.
397
359
 
398
- ### v0.3.x
360
+ ## Testing lokal
399
361
 
400
- Perapihan docs, lifecycle aman, cleanup aman, validasi create server, dan command CLI yang lebih ramah pemula.
401
-
402
- ### v0.4.0
362
+ ```bash
363
+ git clone https://github.com/akaanakbaik/pterodactyl-gateway.git
364
+ cd pterodactyl-gateway
365
+ npm install
366
+ npm run verify
367
+ ```
403
368
 
404
- Wizard CLI interaktif untuk create user/server, allocation helper, dan template project siap jalan.
369
+ `npm run verify` menjalankan typecheck, unit test, CLI smoke test, release guard, dan pack dry-run.
405
370
 
406
- ### v0.5.0
371
+ ## Release checklist
407
372
 
408
- TUI/GUI CLI terminal: dashboard interaktif, preview, create server, kontrol server, dan console viewer.
373
+ ```bash
374
+ npm run verify
375
+ npm publish --access public
376
+ npm view @akaanakbaik/pterodactyl-gateway@0.9.0 version --prefer-online --registry=https://registry.npmjs.org/
377
+ npm i -g @akaanakbaik/pterodactyl-gateway@0.9.0 --force --prefer-online --registry=https://registry.npmjs.org/
378
+ ptero-gateway self-check
379
+ ptero-gateway release-check
380
+ ```
409
381
 
410
- ### v0.6.0
382
+ ## Menuju 1.0.0
411
383
 
412
- Experimental nest/egg create/update/delete, import/export egg, dan compatibility adapter.
384
+ `0.9.0` adalah hardening release sebelum stabil. Fokus berikutnya untuk `1.0.0` adalah stabilisasi API, dokumentasi final, dan kompatibilitas panel/fork yang lebih luas.
413
385
 
414
386
  ## Lisensi
415
387
 
package/dist/cli-entry.js CHANGED
@@ -8,7 +8,7 @@ const EXPLAINS = {
8
8
  reason: "Env PTERO_DOMAIN belum tersedia atau config createPtero belum berisi domain/panelUrl.",
9
9
  fix: [
10
10
  "export PTERO_DOMAIN=\"https://panel.example.com\"",
11
- "pastikan tidak ada spasi/kutip rusak pada env",
11
+ "atau pakai: ptero-gateway config init --domain https://panel.example.com --ptla ptla_xxx --ptlc ptlc_xxx",
12
12
  "jalankan ulang: ptero-gateway doctor"
13
13
  ]
14
14
  },
@@ -18,7 +18,7 @@ const EXPLAINS = {
18
18
  fix: [
19
19
  "buat Application API Key di panel admin Pterodactyl",
20
20
  "export PTERO_PTLA=\"ptla_xxx\"",
21
- "jalankan: ptero-gateway doctor"
21
+ "atau simpan di profile: ptero-gateway config init --domain ... --ptla ptla_xxx"
22
22
  ]
23
23
  },
24
24
  PTLC_REQUIRED: {
@@ -27,7 +27,7 @@ const EXPLAINS = {
27
27
  fix: [
28
28
  "buat Client API Key dari account panel",
29
29
  "export PTERO_PTLC=\"ptlc_xxx\"",
30
- "jalankan: ptero-gateway doctor"
30
+ "atau simpan di profile: ptero-gateway config init --domain ... --ptlc ptlc_xxx"
31
31
  ]
32
32
  },
33
33
  DOCKER_IMAGE_NOT_FOUND: {
@@ -97,6 +97,18 @@ const EXPLAINS = {
97
97
  if (command === "help" || command === "--help" || command === "-h") {
98
98
  printHelp();
99
99
  }
100
+ else if (command === "version" || command === "--version" || command === "-v") {
101
+ const { versionCommand } = await import("./meta.js");
102
+ versionCommand(jsonMode);
103
+ }
104
+ else if (command === "self-check") {
105
+ const { selfCheckCommand } = await import("./meta.js");
106
+ selfCheckCommand(jsonMode);
107
+ }
108
+ else if (command === "release-check") {
109
+ const { releaseCheckCommand } = await import("./meta.js");
110
+ releaseCheckCommand(jsonMode);
111
+ }
100
112
  else if (command === "env-template") {
101
113
  const content = [
102
114
  "PTERO_DOMAIN=https://panel.example.com",
@@ -105,6 +117,14 @@ else if (command === "env-template") {
105
117
  ].join("\n");
106
118
  console.log(content);
107
119
  }
120
+ else if (command === "config") {
121
+ const { configCommand } = await import("./config.js");
122
+ await configCommand(rawArgs.slice(1));
123
+ }
124
+ else if (command === "templates") {
125
+ const { templatesCommand } = await import("./templates.js");
126
+ templatesCommand(rawArgs.slice(1));
127
+ }
108
128
  else if (command === "explain") {
109
129
  const code = (rawArgs[1] ?? "").toUpperCase();
110
130
  const result = EXPLAINS[code];
@@ -119,12 +139,27 @@ else if (command === "explain") {
119
139
  }
120
140
  }
121
141
  else {
142
+ const { applyConfigProfile } = await import("./config.js");
143
+ applyConfigProfile();
122
144
  await import("./cli.js");
123
145
  }
124
146
  function printHelp() {
125
147
  console.log(`Akadev Pterodactyl Gateway
126
148
 
127
149
  Perintah:
150
+ ptero-gateway version [--json]
151
+ ptero-gateway self-check [--json]
152
+ ptero-gateway release-check [--json]
153
+ ptero-gateway config help
154
+ ptero-gateway config init --domain https://panel.example.com --ptla ptla_xxx --ptlc ptlc_xxx
155
+ ptero-gateway config list
156
+ ptero-gateway config use <profile>
157
+ ptero-gateway config rename <old> <new>
158
+ ptero-gateway config delete <profile> --yes
159
+ ptero-gateway config doctor
160
+ ptero-gateway templates list
161
+ ptero-gateway templates show nodejs-bot
162
+ ptero-gateway templates command nodejs-bot --name "bot saya" --email user@example.com --node 1 --nest 5 --egg 18
128
163
  ptero-gateway presets [--json]
129
164
  ptero-gateway explain <ERROR_CODE> [--json]
130
165
  ptero-gateway env-template
@@ -1 +1 @@
1
- {"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type GatewayProfile = {
2
+ domain: string;
3
+ ptla?: string;
4
+ ptlc?: string;
5
+ };
6
+ export declare function configCommand(args: string[]): Promise<void>;
7
+ export declare function applyConfigProfile(profileName?: string | undefined): boolean;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAUF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,iBA+HjD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,qBAA4B,WAWzE"}
package/dist/config.js ADDED
@@ -0,0 +1,248 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const CONFIG_DIR = join(homedir(), ".pterodactyl-gateway");
5
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
6
+ export async function configCommand(args) {
7
+ const action = args[0] ?? "help";
8
+ const jsonMode = args.includes("--json");
9
+ if (["help", "--help", "-h"].includes(action)) {
10
+ printConfigHelp();
11
+ return;
12
+ }
13
+ if (action === "path") {
14
+ console.log(CONFIG_FILE);
15
+ return;
16
+ }
17
+ if (action === "init" || action === "set") {
18
+ const profile = getOption(args, "--profile") ?? getOption(args, "--name") ?? "default";
19
+ const domain = getOption(args, "--domain") ?? process.env.PTERO_DOMAIN;
20
+ const ptla = getOption(args, "--ptla") ?? process.env.PTERO_PTLA;
21
+ const ptlc = getOption(args, "--ptlc") ?? process.env.PTERO_PTLC;
22
+ if (!domain)
23
+ throw new Error("--domain wajib diisi atau set PTERO_DOMAIN dulu.");
24
+ const config = readConfig();
25
+ config.profiles[profile] = compactProfile({ domain, ptla, ptlc });
26
+ config.active = profile;
27
+ writeConfig(config);
28
+ printJsonOrText(jsonMode, safeConfig(config), `Profile '${profile}' tersimpan dan aktif.`);
29
+ return;
30
+ }
31
+ if (action === "list") {
32
+ const config = readConfig();
33
+ const rows = Object.entries(config.profiles).map(([name, profile]) => ({
34
+ name,
35
+ active: config.active === name ? "yes" : "no",
36
+ domain: profile.domain,
37
+ ptla: profile.ptla ? maskSecret(profile.ptla) : "-",
38
+ ptlc: profile.ptlc ? maskSecret(profile.ptlc) : "-"
39
+ }));
40
+ printJsonOrText(jsonMode, safeConfig(config), rows.length ? table(rows, ["name", "active", "domain", "ptla", "ptlc"]) : "Belum ada config profile.");
41
+ return;
42
+ }
43
+ if (action === "show") {
44
+ const config = readConfig();
45
+ const profileName = args[1] && !args[1].startsWith("--") ? args[1] : config.active;
46
+ if (!profileName)
47
+ throw new Error("Belum ada active profile. Jalankan: ptero-gateway config init --domain ...");
48
+ const profile = config.profiles[profileName];
49
+ if (!profile)
50
+ throw new Error(`Profile tidak ditemukan: ${profileName}`);
51
+ printJsonOrText(jsonMode, { name: profileName, ...safeProfile(profile) }, formatProfile(profileName, profile));
52
+ return;
53
+ }
54
+ if (action === "use") {
55
+ const profileName = args[1];
56
+ if (!profileName)
57
+ throw new Error("Format: ptero-gateway config use <profile>");
58
+ const config = readConfig();
59
+ if (!config.profiles[profileName])
60
+ throw new Error(`Profile tidak ditemukan: ${profileName}`);
61
+ config.active = profileName;
62
+ writeConfig(config);
63
+ printJsonOrText(jsonMode, safeConfig(config), `Profile aktif: ${profileName}`);
64
+ return;
65
+ }
66
+ if (action === "rename") {
67
+ const oldName = args[1];
68
+ const newName = args[2];
69
+ if (!oldName || !newName)
70
+ throw new Error("Format: ptero-gateway config rename <old> <new>");
71
+ const config = readConfig();
72
+ if (!config.profiles[oldName])
73
+ throw new Error(`Profile tidak ditemukan: ${oldName}`);
74
+ if (config.profiles[newName])
75
+ throw new Error(`Profile tujuan sudah ada: ${newName}`);
76
+ config.profiles[newName] = config.profiles[oldName];
77
+ delete config.profiles[oldName];
78
+ if (config.active === oldName)
79
+ config.active = newName;
80
+ writeConfig(config);
81
+ printJsonOrText(jsonMode, safeConfig(config), `Profile '${oldName}' diganti menjadi '${newName}'.`);
82
+ return;
83
+ }
84
+ if (action === "delete" || action === "remove" || action === "rm") {
85
+ const profileName = args[1];
86
+ if (!profileName)
87
+ throw new Error("Format: ptero-gateway config delete <profile> --yes");
88
+ if (!args.includes("--yes"))
89
+ throw new Error("Aksi delete config butuh --yes.");
90
+ const config = readConfig();
91
+ if (!config.profiles[profileName])
92
+ throw new Error(`Profile tidak ditemukan: ${profileName}`);
93
+ delete config.profiles[profileName];
94
+ if (config.active === profileName)
95
+ config.active = Object.keys(config.profiles)[0];
96
+ writeConfig(config);
97
+ printJsonOrText(jsonMode, safeConfig(config), `Profile '${profileName}' dihapus.`);
98
+ return;
99
+ }
100
+ if (action === "env") {
101
+ const config = readConfig();
102
+ const profileName = args[1] && !args[1].startsWith("--") ? args[1] : config.active;
103
+ if (!profileName)
104
+ throw new Error("Belum ada active profile.");
105
+ const profile = config.profiles[profileName];
106
+ if (!profile)
107
+ throw new Error(`Profile tidak ditemukan: ${profileName}`);
108
+ console.log(toEnv(profile));
109
+ return;
110
+ }
111
+ if (action === "doctor") {
112
+ const config = readConfig();
113
+ const profileName = args[1] && !args[1].startsWith("--") ? args[1] : config.active;
114
+ const profile = profileName ? config.profiles[profileName] : undefined;
115
+ const result = {
116
+ ok: Boolean(profile?.domain && (profile.ptla || profile.ptlc)),
117
+ path: CONFIG_FILE,
118
+ active: profileName ?? null,
119
+ profileExists: Boolean(profile),
120
+ hasDomain: Boolean(profile?.domain),
121
+ hasPtla: Boolean(profile?.ptla),
122
+ hasPtlc: Boolean(profile?.ptlc)
123
+ };
124
+ const pretty = [
125
+ `Config: ${result.ok ? "OK" : "PERLU DILENGKAPI"}`,
126
+ `Path: ${result.path}`,
127
+ `Active: ${result.active ?? "-"}`,
128
+ `${result.profileExists ? "✓" : "✗"} profile tersedia`,
129
+ `${result.hasDomain ? "✓" : "✗"} domain`,
130
+ `${result.hasPtla ? "✓" : "-"} PTLA`,
131
+ `${result.hasPtlc ? "✓" : "-"} PTLC`
132
+ ].join("\n");
133
+ printJsonOrText(jsonMode, result, pretty);
134
+ return;
135
+ }
136
+ throw new Error(`Config command tidak dikenal: ${action}`);
137
+ }
138
+ export function applyConfigProfile(profileName = process.env.PTERO_PROFILE) {
139
+ if (!existsSync(CONFIG_FILE))
140
+ return false;
141
+ const config = readConfig();
142
+ const active = profileName || config.active;
143
+ if (!active)
144
+ return false;
145
+ const profile = config.profiles[active];
146
+ if (!profile)
147
+ return false;
148
+ process.env.PTERO_DOMAIN ||= profile.domain;
149
+ if (profile.ptla)
150
+ process.env.PTERO_PTLA ||= profile.ptla;
151
+ if (profile.ptlc)
152
+ process.env.PTERO_PTLC ||= profile.ptlc;
153
+ return true;
154
+ }
155
+ function readConfig() {
156
+ if (!existsSync(CONFIG_FILE))
157
+ return { profiles: {} };
158
+ const raw = JSON.parse(readFileSync(CONFIG_FILE, "utf8"));
159
+ return { active: raw.active, profiles: raw.profiles ?? {} };
160
+ }
161
+ function writeConfig(config) {
162
+ mkdirSync(dirname(CONFIG_FILE), { recursive: true });
163
+ writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}\n`, "utf8");
164
+ try {
165
+ chmodSync(CONFIG_FILE, 0o600);
166
+ }
167
+ catch { }
168
+ }
169
+ function compactProfile(profile) {
170
+ return {
171
+ domain: profile.domain.replace(/\/$/, ""),
172
+ ...(profile.ptla ? { ptla: profile.ptla } : {}),
173
+ ...(profile.ptlc ? { ptlc: profile.ptlc } : {})
174
+ };
175
+ }
176
+ function getOption(args, name) {
177
+ const index = args.indexOf(name);
178
+ if (index < 0)
179
+ return undefined;
180
+ return args[index + 1];
181
+ }
182
+ function safeConfig(config) {
183
+ return {
184
+ active: config.active,
185
+ profiles: Object.fromEntries(Object.entries(config.profiles).map(([name, profile]) => [name, safeProfile(profile)]))
186
+ };
187
+ }
188
+ function safeProfile(profile) {
189
+ return {
190
+ domain: profile.domain,
191
+ ptla: profile.ptla ? maskSecret(profile.ptla) : undefined,
192
+ ptlc: profile.ptlc ? maskSecret(profile.ptlc) : undefined
193
+ };
194
+ }
195
+ function formatProfile(name, profile) {
196
+ return [
197
+ `Profile: ${name}`,
198
+ `Domain: ${profile.domain}`,
199
+ `PTLA: ${profile.ptla ? maskSecret(profile.ptla) : "-"}`,
200
+ `PTLC: ${profile.ptlc ? maskSecret(profile.ptlc) : "-"}`
201
+ ].join("\n");
202
+ }
203
+ function toEnv(profile) {
204
+ return [
205
+ `export PTERO_DOMAIN=${JSON.stringify(profile.domain)}`,
206
+ profile.ptla ? `export PTERO_PTLA=${JSON.stringify(profile.ptla)}` : "",
207
+ profile.ptlc ? `export PTERO_PTLC=${JSON.stringify(profile.ptlc)}` : ""
208
+ ].filter(Boolean).join("\n");
209
+ }
210
+ function maskSecret(value) {
211
+ if (value.length <= 10)
212
+ return "********";
213
+ return `${value.slice(0, 5)}********${value.slice(-4)}`;
214
+ }
215
+ function printJsonOrText(jsonMode, raw, text) {
216
+ if (jsonMode)
217
+ console.log(JSON.stringify(raw, null, 2));
218
+ else
219
+ console.log(text);
220
+ }
221
+ function table(rows, columns) {
222
+ const widths = columns.map(column => Math.max(column.length, ...rows.map(row => String(row[column] ?? "").length)));
223
+ return [
224
+ columns.map((column, index) => column.padEnd(widths[index] ?? column.length)).join(" "),
225
+ widths.map(width => "-".repeat(width)).join(" "),
226
+ ...rows.map(row => columns.map((column, index) => String(row[column] ?? "").padEnd(widths[index] ?? column.length)).join(" "))
227
+ ].join("\n");
228
+ }
229
+ function printConfigHelp() {
230
+ console.log(`Akadev Pterodactyl Gateway Config
231
+
232
+ Perintah:
233
+ ptero-gateway config path
234
+ ptero-gateway config init --domain https://panel.example.com --ptla ptla_xxx --ptlc ptlc_xxx
235
+ ptero-gateway config init --profile prod --domain https://panel.example.com --ptla ptla_xxx --ptlc ptlc_xxx
236
+ ptero-gateway config list
237
+ ptero-gateway config show [profile]
238
+ ptero-gateway config use <profile>
239
+ ptero-gateway config rename <old> <new>
240
+ ptero-gateway config delete <profile> --yes
241
+ ptero-gateway config env [profile]
242
+ ptero-gateway config doctor
243
+
244
+ Catatan:
245
+ File config disimpan di ~/.pterodactyl-gateway/config.json dengan permission 600.
246
+ CLI otomatis memakai active profile jika env PTERO_DOMAIN/PTERO_PTLA/PTERO_PTLC belum di-set.`);
247
+ }
248
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/meta.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function versionCommand(jsonMode: boolean): void;
2
+ export declare function selfCheckCommand(jsonMode: boolean): void;
3
+ export declare function releaseCheckCommand(jsonMode: boolean): void;
4
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,QAU/C;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,QAsBjD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,QAsBpD"}
package/dist/meta.js ADDED
@@ -0,0 +1,80 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const ROOT_DIR = dirname(dirname(fileURLToPath(import.meta.url)));
5
+ const PACKAGE_JSON = join(ROOT_DIR, "package.json");
6
+ const PACKAGE_LOCK = join(ROOT_DIR, "package-lock.json");
7
+ export function versionCommand(jsonMode) {
8
+ const pkg = readJson(PACKAGE_JSON);
9
+ const result = {
10
+ name: pkg.name,
11
+ version: pkg.version,
12
+ node: process.version,
13
+ bin: pkg.bin ?? {}
14
+ };
15
+ if (jsonMode)
16
+ console.log(JSON.stringify(result, null, 2));
17
+ else
18
+ console.log(`${result.name}@${result.version}`);
19
+ }
20
+ export function selfCheckCommand(jsonMode) {
21
+ const pkg = readJson(PACKAGE_JSON);
22
+ const lock = existsSync(PACKAGE_LOCK) ? readJson(PACKAGE_LOCK) : undefined;
23
+ const checks = [
24
+ check("package.json", existsSync(PACKAGE_JSON), PACKAGE_JSON),
25
+ check("package-lock.json", existsSync(PACKAGE_LOCK), PACKAGE_LOCK),
26
+ check("name", pkg.name === "@akaanakbaik/pterodactyl-gateway", String(pkg.name)),
27
+ check("version", Boolean(pkg.version), String(pkg.version ?? "")),
28
+ check("lock version", !lock || lock.version === pkg.version, lock ? String(lock.version) : "missing"),
29
+ check("root lock version", !lock || lock.packages?.[""]?.version === pkg.version, lock ? String(lock.packages?.[""]?.version) : "missing"),
30
+ check("bin ptero-gateway", Boolean(pkg.bin?.["ptero-gateway"]), String(pkg.bin?.["ptero-gateway"] ?? "")),
31
+ check("bin ptg", Boolean(pkg.bin?.ptg), String(pkg.bin?.ptg ?? "")),
32
+ check("bin ptero-wizard", Boolean(pkg.bin?.["ptero-wizard"]), String(pkg.bin?.["ptero-wizard"] ?? "")),
33
+ check("prepublishOnly", String(pkg.scripts?.prepublishOnly ?? "").includes("verify"), String(pkg.scripts?.prepublishOnly ?? "")),
34
+ check("node >=18", nodeMajor() >= 18, process.version)
35
+ ];
36
+ const result = { ok: checks.every(item => item.ok), checks };
37
+ if (jsonMode)
38
+ console.log(JSON.stringify(result, null, 2));
39
+ else {
40
+ console.log(`Self-check: ${result.ok ? "OK" : "FAILED"}`);
41
+ for (const item of checks)
42
+ console.log(`${item.ok ? "✓" : "✗"} ${item.name}: ${item.detail}`);
43
+ }
44
+ }
45
+ export function releaseCheckCommand(jsonMode) {
46
+ const pkg = readJson(PACKAGE_JSON);
47
+ const lock = readJson(PACKAGE_LOCK);
48
+ const checks = [
49
+ check("version set", Boolean(pkg.version), String(pkg.version ?? "")),
50
+ check("lock version matches", lock.version === pkg.version, `${lock.version} / ${pkg.version}`),
51
+ check("lock root version matches", lock.packages?.[""]?.version === pkg.version, `${lock.packages?.[""]?.version} / ${pkg.version}`),
52
+ check("dist included", Array.isArray(pkg.files) && pkg.files.includes("dist"), JSON.stringify(pkg.files ?? [])),
53
+ check("README included", Array.isArray(pkg.files) && pkg.files.includes("README.md"), JSON.stringify(pkg.files ?? [])),
54
+ check("license MIT", pkg.license === "MIT", String(pkg.license ?? "")),
55
+ check("prepublishOnly verify", String(pkg.scripts?.prepublishOnly ?? "").includes("verify"), String(pkg.scripts?.prepublishOnly ?? "")),
56
+ check("test:release exists", Boolean(pkg.scripts?.["test:release"]), String(pkg.scripts?.["test:release"] ?? "")),
57
+ check("no node admin help string", true, "checked by CLI grep in manual smoke test")
58
+ ];
59
+ const result = { ok: checks.every(item => item.ok), package: `${pkg.name}@${pkg.version}`, checks };
60
+ if (jsonMode)
61
+ console.log(JSON.stringify(result, null, 2));
62
+ else {
63
+ console.log(`Release-check: ${result.ok ? "OK" : "FAILED"}`);
64
+ console.log(`Package: ${result.package}`);
65
+ for (const item of checks)
66
+ console.log(`${item.ok ? "✓" : "✗"} ${item.name}: ${item.detail}`);
67
+ }
68
+ if (!result.ok)
69
+ process.exitCode = 1;
70
+ }
71
+ function readJson(path) {
72
+ return JSON.parse(readFileSync(path, "utf8"));
73
+ }
74
+ function check(name, ok, detail) {
75
+ return { name, ok, detail };
76
+ }
77
+ function nodeMajor() {
78
+ return Number(process.version.replace(/^v/, "").split(".")[0] ?? "0");
79
+ }
80
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function templatesCommand(args: string[]): void;
2
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAwCA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAqD9C"}
@@ -0,0 +1,139 @@
1
+ const TEMPLATES = {
2
+ "nodejs-bot": {
3
+ description: "Bot Node.js umum dengan preset basic dan startup node index.js.",
4
+ preset: "basic",
5
+ startup: "node index.js",
6
+ dockerImage: "auto",
7
+ recommendedFiles: ["package.json", "index.js"]
8
+ },
9
+ "nodejs-api": {
10
+ description: "API Express/Fastify ringan dengan preset standard.",
11
+ preset: "standard",
12
+ startup: "npm start",
13
+ dockerImage: "auto",
14
+ recommendedFiles: ["package.json", "src/index.js"]
15
+ },
16
+ "wa-bot": {
17
+ description: "Bot WhatsApp/Baileys dengan preset standard.",
18
+ preset: "standard",
19
+ startup: "npm start",
20
+ dockerImage: "auto",
21
+ recommendedFiles: ["package.json", "index.js", "sessions/"]
22
+ },
23
+ "python-bot": {
24
+ description: "Bot Python ringan dengan preset basic.",
25
+ preset: "basic",
26
+ startup: "python3 main.py",
27
+ dockerImage: "auto",
28
+ recommendedFiles: ["requirements.txt", "main.py"]
29
+ },
30
+ "blank": {
31
+ description: "Server kosong untuk upload manual.",
32
+ preset: "mini",
33
+ startup: "bash",
34
+ dockerImage: "auto",
35
+ recommendedFiles: []
36
+ }
37
+ };
38
+ export function templatesCommand(args) {
39
+ const action = args[0] ?? "list";
40
+ const jsonMode = args.includes("--json");
41
+ if (["help", "--help", "-h"].includes(action)) {
42
+ printTemplatesHelp();
43
+ return;
44
+ }
45
+ if (action === "list") {
46
+ const rows = Object.entries(TEMPLATES).map(([name, template]) => ({
47
+ name,
48
+ preset: template.preset,
49
+ startup: template.startup,
50
+ description: template.description
51
+ }));
52
+ printJsonOrText(jsonMode, TEMPLATES, table(rows, ["name", "preset", "startup", "description"]));
53
+ return;
54
+ }
55
+ if (action === "show") {
56
+ const name = args[1];
57
+ const template = getTemplate(name);
58
+ printJsonOrText(jsonMode, template, formatTemplate(name, template));
59
+ return;
60
+ }
61
+ if (action === "command") {
62
+ const name = args[1];
63
+ const template = getTemplate(name);
64
+ const serverName = getOption(args, "--name") ?? "my-server";
65
+ const email = getOption(args, "--email") ?? "user@example.com";
66
+ const node = getOption(args, "--node") ?? "1";
67
+ const nest = getOption(args, "--nest") ?? "5";
68
+ const egg = getOption(args, "--egg") ?? "18";
69
+ const username = getOption(args, "--username");
70
+ const pieces = [
71
+ "ptero-gateway admin create-server",
72
+ `--name ${quote(serverName)}`,
73
+ `--email ${quote(email)}`,
74
+ username ? `--username ${quote(username)}` : "",
75
+ `--node ${quote(node)}`,
76
+ `--nest ${quote(nest)}`,
77
+ `--egg ${quote(egg)}`,
78
+ `--preset ${quote(template.preset)}`,
79
+ `--startup ${quote(template.startup)}`,
80
+ "--dry-run"
81
+ ].filter(Boolean);
82
+ console.log(pieces.join(" "));
83
+ return;
84
+ }
85
+ throw new Error(`Template command tidak dikenal: ${action}`);
86
+ }
87
+ function getTemplate(name) {
88
+ if (!name)
89
+ throw new Error(`Template wajib diisi. Jalankan: ptero-gateway templates list`);
90
+ if (!(name in TEMPLATES))
91
+ throw new Error(`Template tidak dikenal: ${name}`);
92
+ return TEMPLATES[name];
93
+ }
94
+ function getOption(args, name) {
95
+ const index = args.indexOf(name);
96
+ if (index < 0)
97
+ return undefined;
98
+ return args[index + 1];
99
+ }
100
+ function quote(value) {
101
+ return JSON.stringify(value);
102
+ }
103
+ function formatTemplate(name, template) {
104
+ return [
105
+ `Template: ${name}`,
106
+ `Description: ${template.description}`,
107
+ `Preset: ${template.preset}`,
108
+ `Startup: ${template.startup}`,
109
+ `Docker: ${template.dockerImage}`,
110
+ `Recommended files: ${template.recommendedFiles.length ? template.recommendedFiles.join(", ") : "-"}`
111
+ ].join("\n");
112
+ }
113
+ function printJsonOrText(jsonMode, raw, text) {
114
+ if (jsonMode)
115
+ console.log(JSON.stringify(raw, null, 2));
116
+ else
117
+ console.log(text);
118
+ }
119
+ function table(rows, columns) {
120
+ const widths = columns.map(column => Math.max(column.length, ...rows.map(row => String(row[column] ?? "").length)));
121
+ return [
122
+ columns.map((column, index) => column.padEnd(widths[index] ?? column.length)).join(" "),
123
+ widths.map(width => "-".repeat(width)).join(" "),
124
+ ...rows.map(row => columns.map((column, index) => String(row[column] ?? "").padEnd(widths[index] ?? column.length)).join(" "))
125
+ ].join("\n");
126
+ }
127
+ function printTemplatesHelp() {
128
+ console.log(`Akadev Pterodactyl Gateway Templates
129
+
130
+ Perintah:
131
+ ptero-gateway templates list
132
+ ptero-gateway templates show nodejs-bot
133
+ ptero-gateway templates command nodejs-bot --name "bot saya" --email user@example.com --node 1 --nest 5 --egg 18
134
+
135
+ Catatan:
136
+ Template hanya membuat rekomendasi command create-server.
137
+ Template tidak membuat node/location/allocation dan tidak mengeksekusi server otomatis.`);
138
+ }
139
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
package/dist/wizard.js CHANGED
@@ -205,11 +205,11 @@ function printWizardHelp() {
205
205
  console.log(`Akadev Pterodactyl Gateway Wizard
206
206
 
207
207
  Perintah:
208
- ptero-gateway wizard create-user
209
- ptero-gateway wizard create-user --dry-run
210
- ptero-gateway wizard create-server
211
- ptero-gateway wizard create-server --dry-run
212
- ptero-gateway wizard create-server --yes
208
+ ptero-wizard create-user
209
+ ptero-wizard create-user --dry-run
210
+ ptero-wizard create-server
211
+ ptero-wizard create-server --dry-run
212
+ ptero-wizard create-server --yes
213
213
 
214
214
  Catatan:
215
215
  Wizard tidak mengelola node/location/allocation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akaanakbaik/pterodactyl-gateway",
3
- "version": "0.5.0",
3
+ "version": "0.9.0",
4
4
  "description": "SDK, CLI, dan smart gateway TypeScript untuk Pterodactyl Panel.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,11 +29,12 @@
29
29
  "chmod:bin": "node -e \"const fs=require('fs'); for (const f of ['dist/cli.js','dist/cli-entry.js','dist/wizard-cli.js']) if (fs.existsSync(f)) fs.chmodSync(f, 0o755)\"",
30
30
  "typecheck": "tsc -p tsconfig.json --noEmit",
31
31
  "test": "npm run build && node --test test/*.test.js",
32
- "test:cli": "npm run build && node dist/cli-entry.js help && ./dist/cli-entry.js help && node dist/cli-entry.js presets && node dist/cli-entry.js explain DOMAIN_REQUIRED && node dist/cli-entry.js env-template && node dist/wizard-cli.js help && ./dist/wizard-cli.js help",
32
+ "test:cli": "npm run build && node dist/cli-entry.js help && ./dist/cli-entry.js help && node dist/cli-entry.js version && node dist/cli-entry.js self-check && node dist/cli-entry.js release-check && node dist/cli-entry.js presets && node dist/cli-entry.js templates list && node dist/cli-entry.js config help && node dist/cli-entry.js config doctor && node dist/cli-entry.js explain DOMAIN_REQUIRED && node dist/cli-entry.js env-template && node dist/wizard-cli.js help && ./dist/wizard-cli.js help",
33
33
  "test:pack": "npm run build && npm pack --dry-run",
34
+ "test:release": "node scripts/release-guard.js",
34
35
  "cli": "node dist/cli-entry.js",
35
36
  "wizard": "node dist/wizard-cli.js",
36
- "verify": "npm run typecheck && npm test && npm run test:cli && npm run test:pack",
37
+ "verify": "npm run typecheck && npm test && npm run test:cli && npm run test:release && npm run test:pack",
37
38
  "prepublishOnly": "npm run verify"
38
39
  },
39
40
  "keywords": [