@joytreesite/joytree 1.0.0 → 1.0.2
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 +1 -1
- package/bin/joytree.js +132 -209
- package/commands/auth.js +1 -1
- package/lib/config.js +2 -2
- package/lib/ui.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -146,7 +146,7 @@ Credentials are stored at `~/.joytree/credentials.json` (mode 600).
|
|
|
146
146
|
You can also use environment variables:
|
|
147
147
|
```bash
|
|
148
148
|
export JOYTREE_API_KEY=jtk_your_key_here
|
|
149
|
-
export JOYTREE_BASE_URL=https://joytree.
|
|
149
|
+
export JOYTREE_BASE_URL=https://joytree.site
|
|
150
150
|
```
|
|
151
151
|
|
|
152
152
|
---
|
package/bin/joytree.js
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
const { program } = require('commander');
|
|
5
5
|
const pkg = require('../package.json');
|
|
6
6
|
|
|
7
|
-
// Commands
|
|
8
7
|
const auth = require('../commands/auth');
|
|
9
8
|
const deploy = require('../commands/deploy');
|
|
10
9
|
const projects= require('../commands/projects');
|
|
@@ -19,117 +18,91 @@ const ssh = require('../commands/ssh');
|
|
|
19
18
|
const extras = require('../commands/extras');
|
|
20
19
|
const ui = require('../lib/ui');
|
|
21
20
|
|
|
22
|
-
// ── Custom help screen ────────────────────────────────────────────────
|
|
23
21
|
function showHelp() {
|
|
24
22
|
const c = ui.c;
|
|
25
23
|
ui.logo();
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
console.log(`${c.bold}${c.white}${icon} ${title}${c.reset}`);
|
|
25
|
+
// two-column row: left = cyan command, right = dim description
|
|
26
|
+
const row = (left, right) => {
|
|
27
|
+
const padded = left.padEnd(38);
|
|
28
|
+
console.log(` ${c.cyan}${padded}${c.reset}${c.dim}${right}${c.reset}`);
|
|
32
29
|
};
|
|
33
30
|
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
const argsCol = args ? ` ${c.dim}${args}${c.reset}` : '';
|
|
37
|
-
const pad = Math.max(0, 42 - name.length - (args ? args.length + 1 : 0));
|
|
38
|
-
console.log(`${nameCol}${argsCol}${' '.repeat(pad)}${c.dim}${desc}${c.reset}`);
|
|
31
|
+
const section = (title) => {
|
|
32
|
+
console.log(`\n${c.bold}${title}${c.reset}`);
|
|
39
33
|
};
|
|
40
34
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
section('
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
section('
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
console.log();
|
|
111
|
-
|
|
112
|
-
// ── WEBHOOK ──
|
|
113
|
-
section('Webhooks', '◆');
|
|
114
|
-
cmd('webhook secret', '', 'Show your global webhook secret');
|
|
115
|
-
cmd('webhook rotate', '', 'Regenerate your webhook secret');
|
|
116
|
-
console.log();
|
|
117
|
-
|
|
118
|
-
// ── SSH ──
|
|
119
|
-
section('SSH Keys', '◆');
|
|
120
|
-
cmd('ssh list', '', 'List all SSH keys');
|
|
121
|
-
cmd('ssh generate', '--name', 'Generate a new SSH key pair');
|
|
122
|
-
cmd('ssh delete', '<key-id>', 'Delete an SSH key');
|
|
123
|
-
console.log();
|
|
35
|
+
section('Account');
|
|
36
|
+
row('joytree login --api-key <key>', 'Validate and save a Joytree API key');
|
|
37
|
+
row('joytree logout', 'Remove local credentials');
|
|
38
|
+
row('joytree whoami', 'Show the active account and API key scope');
|
|
39
|
+
row('joytree status', 'Show account status and project overview');
|
|
40
|
+
|
|
41
|
+
section('API Key');
|
|
42
|
+
row('joytree apikey show', 'View your current API key and usage stats');
|
|
43
|
+
row('joytree apikey rotate', 'Revoke old key and generate a new one');
|
|
44
|
+
|
|
45
|
+
section('Deploy');
|
|
46
|
+
row('joytree deploy -r <repo>', 'Deploy a GitHub repo to Joytree');
|
|
47
|
+
row('joytree deploy -m "message"', 'Deploy with a custom commit message');
|
|
48
|
+
row('joytree redeploy <project-id>', 'Trigger a fresh redeployment');
|
|
49
|
+
row('joytree stop <deploy-id>', 'Cancel a currently running deployment');
|
|
50
|
+
row('joytree autodeploy <id> --enable', 'Enable GitHub push auto-deploy');
|
|
51
|
+
row('joytree autodeploy <id> --disable', 'Disable GitHub push auto-deploy');
|
|
52
|
+
row('joytree deployments [project-id]', 'Show recent deployments');
|
|
53
|
+
row('joytree open <project-id>', 'Open the live URL in your browser');
|
|
54
|
+
|
|
55
|
+
section('Projects');
|
|
56
|
+
row('joytree projects', 'List all your projects');
|
|
57
|
+
row('joytree inspect <project-id>', 'Show full project details');
|
|
58
|
+
row('joytree delete <project-id>', 'Delete a project (irreversible)');
|
|
59
|
+
|
|
60
|
+
section('Logs');
|
|
61
|
+
row('joytree logs <project-id>', 'Fetch recent runtime logs');
|
|
62
|
+
row('joytree logs <id> --follow', 'Stream live project logs');
|
|
63
|
+
row('joytree logs <id> --lines 100', 'Fetch logs by line count');
|
|
64
|
+
|
|
65
|
+
section('Project Config');
|
|
66
|
+
row('joytree env list <project-id>', 'List project env var keys');
|
|
67
|
+
row('joytree env set <id> KEY=VALUE', 'Set one or more env vars');
|
|
68
|
+
row('joytree env delete <id> <KEY>', 'Delete an env var');
|
|
69
|
+
row('joytree env push <project-id>', 'Push a local .env file to a project');
|
|
70
|
+
row('joytree env push <id> --force', 'Replace all existing env vars');
|
|
71
|
+
|
|
72
|
+
section('GitHub');
|
|
73
|
+
row('joytree pull repos', 'List your linked GitHub repositories');
|
|
74
|
+
row('joytree pull branches <repo-url>', 'List branches for a repository');
|
|
75
|
+
|
|
76
|
+
section('Domains');
|
|
77
|
+
row('joytree domains list', 'List your custom domains');
|
|
78
|
+
row('joytree domains attach <d> <id>', 'Attach a domain to a project');
|
|
79
|
+
row('joytree domains verify <domain>', 'Trigger DNS verification');
|
|
80
|
+
row('joytree domains remove <domain>', 'Remove a custom domain');
|
|
81
|
+
row('joytree domains check <domain>', 'Check domain availability');
|
|
82
|
+
|
|
83
|
+
section('Databases');
|
|
84
|
+
row('joytree db list', 'List all databases');
|
|
85
|
+
row('joytree db create --type <type>', 'Create a database (postgres/mysql/redis/mongo)');
|
|
86
|
+
row('joytree db start <db-id>', 'Start a stopped database');
|
|
87
|
+
row('joytree db stop <db-id>', 'Stop a running database');
|
|
88
|
+
row('joytree db restart <db-id>', 'Restart a database');
|
|
89
|
+
row('joytree db logs <db-id>', 'Fetch recent database logs');
|
|
90
|
+
row('joytree db delete <db-id>', 'Delete a database (irreversible)');
|
|
91
|
+
|
|
92
|
+
section('Webhooks');
|
|
93
|
+
row('joytree webhook secret', 'Show your global webhook secret');
|
|
94
|
+
row('joytree webhook rotate', 'Regenerate your webhook secret');
|
|
95
|
+
|
|
96
|
+
section('SSH Keys');
|
|
97
|
+
row('joytree ssh list', 'List all SSH keys');
|
|
98
|
+
row('joytree ssh generate --name <n>', 'Generate a new SSH key pair');
|
|
99
|
+
row('joytree ssh delete <key-id>', 'Delete an SSH key');
|
|
100
|
+
|
|
101
|
+
section('Activity');
|
|
102
|
+
row('joytree activity', 'Show recent platform activity feed');
|
|
103
|
+
row('joytree activity --limit <n>', 'Limit number of events shown');
|
|
124
104
|
|
|
125
|
-
// ── ACTIVITY ──
|
|
126
|
-
section('Activity', '◆');
|
|
127
|
-
cmd('activity', '--limit <n>', 'Show recent platform activity feed');
|
|
128
105
|
console.log();
|
|
129
|
-
|
|
130
|
-
// ── FOOTER ──
|
|
131
|
-
console.log(`${c.dim} Run ${c.cyan}joytree <command> --help${c.dim} for detailed options on any command.${c.reset}`);
|
|
132
|
-
console.log(`${c.dim} Docs: ${c.cyan}https://docs.joytree.app${c.reset}\n`);
|
|
133
106
|
}
|
|
134
107
|
|
|
135
108
|
program
|
|
@@ -137,139 +110,89 @@ program
|
|
|
137
110
|
.description('Joytree CLI — deploy and manage your projects from the terminal')
|
|
138
111
|
.version(pkg.version)
|
|
139
112
|
.helpOption(false)
|
|
140
|
-
.addHelpCommand(false)
|
|
141
|
-
.option('-h, --help', 'Show this help screen')
|
|
142
|
-
.hook('preAction', (thisCommand) => {
|
|
143
|
-
if (thisCommand.opts().help) { showHelp(); process.exit(0); }
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
// Override default --help
|
|
147
|
-
program.on('--help', showHelp);
|
|
148
|
-
|
|
149
|
-
// Show custom help when no args given
|
|
150
|
-
if (process.argv.length === 2) {
|
|
151
|
-
showHelp();
|
|
152
|
-
process.exit(0);
|
|
153
|
-
}
|
|
113
|
+
.addHelpCommand(false);
|
|
154
114
|
|
|
155
|
-
|
|
156
|
-
program
|
|
157
|
-
.command('login')
|
|
158
|
-
.description('Authenticate with your Joytree API key')
|
|
159
|
-
.option('--api-key <key>', 'Provide API key directly (skips prompt)')
|
|
160
|
-
.action(auth.login);
|
|
115
|
+
if (process.argv.length === 2) { showHelp(); process.exit(0); }
|
|
161
116
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
program
|
|
168
|
-
.command('whoami')
|
|
169
|
-
.description('Show the active account and API key scope')
|
|
170
|
-
.action(auth.whoami);
|
|
171
|
-
|
|
172
|
-
program
|
|
173
|
-
.command('status')
|
|
174
|
-
.description('Show account status, plan, and project count')
|
|
175
|
-
.action(account.status);
|
|
117
|
+
// ── Auth ──────────────────────────────────────────────────────────────
|
|
118
|
+
program.command('login').option('--api-key <key>').action(auth.login);
|
|
119
|
+
program.command('logout').action(auth.logout);
|
|
120
|
+
program.command('whoami').action(auth.whoami);
|
|
121
|
+
program.command('status').action(account.status);
|
|
176
122
|
|
|
177
123
|
// ── API Key ───────────────────────────────────────────────────────────
|
|
178
|
-
const apikeyGroup = program
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
apikeyGroup.command('show').description('Show your current API key and usage info').action(extras.apiKey);
|
|
183
|
-
apikeyGroup.command('rotate').description('Generate a new API key and revoke the old one').action(extras.rotateApiKey);
|
|
124
|
+
const apikeyGroup = program.command('apikey');
|
|
125
|
+
apikeyGroup.command('show').action(extras.apiKey);
|
|
126
|
+
apikeyGroup.command('rotate').action(extras.rotateApiKey);
|
|
184
127
|
|
|
185
128
|
// ── Activity ──────────────────────────────────────────────────────────
|
|
186
|
-
program
|
|
187
|
-
.command('activity')
|
|
188
|
-
.description('Show recent platform activity')
|
|
189
|
-
.option('--limit <n>', 'Number of events to show', '20')
|
|
190
|
-
.action(extras.activity);
|
|
129
|
+
program.command('activity').option('--limit <n>', '', '20').action(extras.activity);
|
|
191
130
|
|
|
192
131
|
// ── GitHub ────────────────────────────────────────────────────────────
|
|
193
|
-
const pullGroup = program.command('pull')
|
|
194
|
-
pullGroup.command('repos').
|
|
195
|
-
pullGroup.command('branches <repo-url>').
|
|
132
|
+
const pullGroup = program.command('pull');
|
|
133
|
+
pullGroup.command('repos').action(github.repos);
|
|
134
|
+
pullGroup.command('branches <repo-url>').action(github.branches);
|
|
196
135
|
|
|
197
136
|
// ── Deploy ────────────────────────────────────────────────────────────
|
|
198
|
-
program
|
|
199
|
-
.
|
|
200
|
-
.
|
|
201
|
-
.option('-
|
|
202
|
-
.option('
|
|
203
|
-
.option('
|
|
204
|
-
.option('--
|
|
205
|
-
.option('--
|
|
206
|
-
.option('--static', 'Mark as a static site')
|
|
207
|
-
.option('-m, --message <msg>', 'Deployment message')
|
|
137
|
+
program.command('deploy')
|
|
138
|
+
.option('-r, --repo <url>')
|
|
139
|
+
.option('-b, --branch <branch>', '', 'main')
|
|
140
|
+
.option('-n, --name <name>')
|
|
141
|
+
.option('--build <cmd>')
|
|
142
|
+
.option('--start <cmd>')
|
|
143
|
+
.option('--static')
|
|
144
|
+
.option('-m, --message <msg>')
|
|
208
145
|
.action(deploy.deployGit);
|
|
209
146
|
|
|
210
|
-
program.command('redeploy <project-id>').
|
|
211
|
-
program.command('stop <deploy-id>').
|
|
212
|
-
program
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
.option('--enable', 'Enable auto-deploy')
|
|
216
|
-
.option('--disable', 'Disable auto-deploy')
|
|
217
|
-
.action(extras.autodeploy);
|
|
218
|
-
program.command('open [project-id]').description('Open the live URL in your browser').action(deploy.open);
|
|
219
|
-
program
|
|
220
|
-
.command('deployments [project-id]')
|
|
221
|
-
.description('Show recent deployments')
|
|
222
|
-
.option('--limit <n>', 'Number to show', '10')
|
|
223
|
-
.action(deploy.listDeployments);
|
|
147
|
+
program.command('redeploy <project-id>').action(deploy.redeploy);
|
|
148
|
+
program.command('stop <deploy-id>').action(extras.stopDeploy);
|
|
149
|
+
program.command('autodeploy <project-id>').option('--enable').option('--disable').action(extras.autodeploy);
|
|
150
|
+
program.command('open [project-id]').action(deploy.open);
|
|
151
|
+
program.command('deployments [project-id]').option('--limit <n>', '', '10').action(deploy.listDeployments);
|
|
224
152
|
|
|
225
153
|
// ── Projects ──────────────────────────────────────────────────────────
|
|
226
|
-
program.command('projects').
|
|
227
|
-
program.command('inspect <project-id>').
|
|
228
|
-
program.command('delete <project-id>').
|
|
154
|
+
program.command('projects').option('--json').action(projects.list);
|
|
155
|
+
program.command('inspect <project-id>').action(projects.inspect);
|
|
156
|
+
program.command('delete <project-id>').option('-y, --yes').action(projects.deleteProject);
|
|
229
157
|
|
|
230
158
|
// ── Logs ──────────────────────────────────────────────────────────────
|
|
231
|
-
program
|
|
232
|
-
.command('logs <project-id>')
|
|
233
|
-
.description('Fetch runtime logs for a project')
|
|
234
|
-
.option('--lines <n>', 'Number of lines', '50')
|
|
235
|
-
.option('-f, --follow', 'Stream live logs')
|
|
236
|
-
.action(logs.fetchLogs);
|
|
159
|
+
program.command('logs <project-id>').option('--lines <n>', '', '50').option('-f, --follow').action(logs.fetchLogs);
|
|
237
160
|
|
|
238
161
|
// ── Env ───────────────────────────────────────────────────────────────
|
|
239
|
-
const envGroup = program.command('env')
|
|
240
|
-
envGroup.command('list <project-id>').
|
|
241
|
-
envGroup.command('set <project-id> <KEY=VALUE...>').
|
|
242
|
-
envGroup.command('delete <project-id> <KEY>').
|
|
243
|
-
envGroup.command('push <project-id>').
|
|
162
|
+
const envGroup = program.command('env');
|
|
163
|
+
envGroup.command('list <project-id>').action(envCmd.list);
|
|
164
|
+
envGroup.command('set <project-id> <KEY=VALUE...>').action(envCmd.set);
|
|
165
|
+
envGroup.command('delete <project-id> <KEY>').action(envCmd.del);
|
|
166
|
+
envGroup.command('push <project-id>').option('--file <path>', '', '.env').option('--force').action(envCmd.push);
|
|
244
167
|
|
|
245
168
|
// ── Domains ───────────────────────────────────────────────────────────
|
|
246
|
-
const domainGroup = program.command('domains')
|
|
247
|
-
domainGroup.command('list').
|
|
248
|
-
domainGroup.command('attach <domain> <project-id>').
|
|
249
|
-
domainGroup.command('verify <domain>').
|
|
250
|
-
domainGroup.command('remove <domain>').
|
|
251
|
-
domainGroup.command('check <domain>').
|
|
169
|
+
const domainGroup = program.command('domains');
|
|
170
|
+
domainGroup.command('list').action(domains.list);
|
|
171
|
+
domainGroup.command('attach <domain> <project-id>').action(domains.attach);
|
|
172
|
+
domainGroup.command('verify <domain>').action(domains.verify);
|
|
173
|
+
domainGroup.command('remove <domain>').action(domains.remove);
|
|
174
|
+
domainGroup.command('check <domain>').action(domains.check);
|
|
252
175
|
|
|
253
176
|
// ── Databases ─────────────────────────────────────────────────────────
|
|
254
|
-
const dbGroup = program.command('db')
|
|
255
|
-
dbGroup.command('list').
|
|
256
|
-
dbGroup.command('create').
|
|
257
|
-
dbGroup.command('start <db-id>').
|
|
258
|
-
dbGroup.command('stop <db-id>').
|
|
259
|
-
dbGroup.command('restart <db-id>').
|
|
260
|
-
dbGroup.command('logs <db-id>').
|
|
261
|
-
dbGroup.command('delete <db-id>').
|
|
177
|
+
const dbGroup = program.command('db');
|
|
178
|
+
dbGroup.command('list').action(db.list);
|
|
179
|
+
dbGroup.command('create').option('--type <type>', '', 'postgres').option('--name <name>').action(db.create);
|
|
180
|
+
dbGroup.command('start <db-id>').action(db.start);
|
|
181
|
+
dbGroup.command('stop <db-id>').action(db.stop);
|
|
182
|
+
dbGroup.command('restart <db-id>').action(db.restart);
|
|
183
|
+
dbGroup.command('logs <db-id>').action(db.fetchLogs);
|
|
184
|
+
dbGroup.command('delete <db-id>').option('-y, --yes').action(db.del);
|
|
262
185
|
|
|
263
186
|
// ── Webhook ───────────────────────────────────────────────────────────
|
|
264
|
-
const webhookGroup = program.command('webhook')
|
|
265
|
-
webhookGroup.command('secret').
|
|
266
|
-
webhookGroup.command('rotate').
|
|
187
|
+
const webhookGroup = program.command('webhook');
|
|
188
|
+
webhookGroup.command('secret').action(webhook.getSecret);
|
|
189
|
+
webhookGroup.command('rotate').action(webhook.rotateSecret);
|
|
267
190
|
|
|
268
191
|
// ── SSH ───────────────────────────────────────────────────────────────
|
|
269
|
-
const sshGroup = program.command('ssh')
|
|
270
|
-
sshGroup.command('list').
|
|
271
|
-
sshGroup.command('generate').
|
|
272
|
-
sshGroup.command('delete <key-id>').
|
|
192
|
+
const sshGroup = program.command('ssh');
|
|
193
|
+
sshGroup.command('list').action(ssh.list);
|
|
194
|
+
sshGroup.command('generate').option('--name <name>').action(ssh.generate);
|
|
195
|
+
sshGroup.command('delete <key-id>').option('-y, --yes').action(ssh.del);
|
|
273
196
|
|
|
274
197
|
program.parseAsync(process.argv).catch(err => {
|
|
275
198
|
console.error('Error:', err.message);
|
package/commands/auth.js
CHANGED
|
@@ -57,7 +57,7 @@ function whoami() {
|
|
|
57
57
|
ui.header('Current Session');
|
|
58
58
|
if (creds.email) ui.label('Email', creds.email);
|
|
59
59
|
ui.label('API Key', creds.apiKey.slice(0, 8) + '…' + creds.apiKey.slice(-4));
|
|
60
|
-
ui.label('Host', creds.baseUrl || 'https://joytree.
|
|
60
|
+
ui.label('Host', creds.baseUrl || 'https://joytree.site');
|
|
61
61
|
ui.label('Config', config.CONFIG_FILE);
|
|
62
62
|
console.log();
|
|
63
63
|
}
|
package/lib/config.js
CHANGED
|
@@ -28,12 +28,12 @@ function getApiKey() {
|
|
|
28
28
|
function getBaseUrl() {
|
|
29
29
|
return load().baseUrl
|
|
30
30
|
|| process.env.JOYTREE_BASE_URL
|
|
31
|
-
|| 'https://joytree.
|
|
31
|
+
|| 'https://joytree.site';
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
function setCredentials({ apiKey, baseUrl, email }) {
|
|
35
35
|
const existing = load();
|
|
36
|
-
save({ ...existing, apiKey, baseUrl: baseUrl || existing.baseUrl || 'https://joytree.
|
|
36
|
+
save({ ...existing, apiKey, baseUrl: baseUrl || existing.baseUrl || 'https://joytree.site', email });
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
function clearCredentials() {
|
package/lib/ui.js
CHANGED
|
@@ -27,8 +27,8 @@ function logo() {
|
|
|
27
27
|
console.log(`${c.bold}${c.white} ╚════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝${c.reset}`);
|
|
28
28
|
console.log('');
|
|
29
29
|
console.log(` Go live on Joytree in seconds! ${c.dim}v${pkg.version}${c.reset}`);
|
|
30
|
-
console.log(` Website ${c.cyan}https://joytree.
|
|
31
|
-
console.log(` Docs ${c.cyan}https://docs.joytree.
|
|
30
|
+
console.log(` Website ${c.cyan}https://joytree.site${c.reset}`);
|
|
31
|
+
console.log(` Docs ${c.cyan}https://docs.joytree.site${c.reset}`);
|
|
32
32
|
console.log('');
|
|
33
33
|
}
|
|
34
34
|
|