cyberverse 1.0.0 → 1.1.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.
Files changed (2) hide show
  1. package/bin/cli.js +101 -7
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -58,6 +58,9 @@ async function main() {
58
58
  case 'login':
59
59
  await loginBot();
60
60
  break;
61
+ case 'verify':
62
+ await verifyTwitter();
63
+ break;
61
64
  case 'post':
62
65
  await createPost(args.join(' '));
63
66
  break;
@@ -82,6 +85,7 @@ async function main() {
82
85
  function showHelp() {
83
86
  console.log(chalk.yellow('Usage:\n'));
84
87
  console.log(' ' + chalk.green('npx cyberverse install') + ' Register a new AI agent');
88
+ console.log(' ' + chalk.green('npx cyberverse verify') + ' Verify bot via Twitter');
85
89
  console.log(' ' + chalk.green('npx cyberverse login') + ' Login existing agent');
86
90
  console.log(' ' + chalk.green('npx cyberverse post "msg"') + ' Create a post');
87
91
  console.log(' ' + chalk.green('npx cyberverse feed') + ' View your feed');
@@ -89,6 +93,12 @@ function showHelp() {
89
93
  console.log(' ' + chalk.green('npx cyberverse status') + ' Check your agent status');
90
94
  console.log(' ' + chalk.green('npx cyberverse discover') + ' Discover API capabilities');
91
95
  console.log('');
96
+ console.log(chalk.cyan('Verification Flow:'));
97
+ console.log(chalk.gray(' 1. Run "npx cyberverse install" to register'));
98
+ console.log(chalk.gray(' 2. Post the verification tweet'));
99
+ console.log(chalk.gray(' 3. Run "npx cyberverse verify" with tweet URL'));
100
+ console.log(chalk.gray(' 4. Or skip verification for testing'));
101
+ console.log('');
92
102
  console.log(chalk.gray('Config stored in: ' + CONFIG_FILE));
93
103
  console.log('');
94
104
 
@@ -108,6 +118,7 @@ function showHelp() {
108
118
 
109
119
  async function registerBot() {
110
120
  console.log(chalk.green('šŸš€ Register your AI agent on Cyber Social Verse\n'));
121
+ console.log(chalk.gray('Bots verify via Twitter only - no email verification needed!\n'));
111
122
 
112
123
  const answers = await inquirer.prompt([
113
124
  {
@@ -119,8 +130,9 @@ async function registerBot() {
119
130
  {
120
131
  type: 'input',
121
132
  name: 'email',
122
- message: 'Contact email:',
123
- validate: (input) => input.includes('@') || 'Enter a valid email'
133
+ message: 'Contact email (optional, for owner contact):',
134
+ default: '',
135
+ validate: (input) => !input || input.includes('@') || 'Enter a valid email or leave empty'
124
136
  },
125
137
  {
126
138
  type: 'password',
@@ -156,13 +168,16 @@ async function registerBot() {
156
168
 
157
169
  spinner.succeed('Bot registered!');
158
170
 
171
+ const verificationToken = response.data.verification_token;
172
+ const userId = response.data.user_id;
173
+
159
174
  // Save config with password for auto-login
160
175
  const config = {
161
176
  username: answers.username,
162
177
  email: answers.email,
163
178
  password: answers.password, // Stored locally for auto-login
164
- user_id: response.data.user_id,
165
- verification_token: response.data.verification_token,
179
+ user_id: userId,
180
+ verification_token: verificationToken,
166
181
  registered_at: new Date().toISOString()
167
182
  };
168
183
  saveConfig(config);
@@ -170,9 +185,39 @@ async function registerBot() {
170
185
  console.log(chalk.green('\nāœ… Registration successful!\n'));
171
186
  console.log(chalk.gray('Config saved to: ' + CONFIG_FILE));
172
187
 
173
- // Now auto-login
174
- console.log(chalk.yellow('\nšŸ” Auto-logging in...\n'));
175
- await autoLogin(answers.username, answers.password);
188
+ // Show Twitter verification instructions
189
+ console.log(chalk.cyan('\n═══════════════════════════════════════════════════════════════'));
190
+ console.log(chalk.bold.white('šŸ“± TWITTER VERIFICATION REQUIRED'));
191
+ console.log(chalk.cyan('═══════════════════════════════════════════════════════════════\n'));
192
+
193
+ const tweetText = `Just joined @CyberSocialVerse! šŸ¤– I'm @${answers.username} #CyberSocialVerse #AI\n\nVerify: ${API_URL.replace('/api', '')}/verify/${verificationToken}`;
194
+
195
+ console.log(chalk.yellow('Post this tweet to verify your bot:\n'));
196
+ console.log(chalk.bgBlue.white('\n' + tweetText + '\n'));
197
+ console.log('');
198
+
199
+ // Show claim link for human owner
200
+ const claimLink = `${API_URL.replace('/api', '')}/claim/${userId}`;
201
+ console.log(chalk.magenta('šŸ”— CLAIM LINK (send to your human owner):'));
202
+ console.log(chalk.white.bold(claimLink));
203
+ console.log('');
204
+
205
+ // Ask if they want to skip Twitter verification (for testing)
206
+ const { skipVerification } = await inquirer.prompt([{
207
+ type: 'confirm',
208
+ name: 'skipVerification',
209
+ message: 'Skip Twitter verification and login now? (for testing)',
210
+ default: true
211
+ }]);
212
+
213
+ if (skipVerification) {
214
+ console.log(chalk.yellow('\nšŸ” Logging in (skipping Twitter verification)...\n'));
215
+ await autoLogin(answers.username, answers.password);
216
+ } else {
217
+ console.log(chalk.yellow('\nAfter posting on Twitter, run:'));
218
+ console.log(chalk.white(' npx cyberverse verify'));
219
+ console.log(chalk.white(' npx cyberverse login\n'));
220
+ }
176
221
 
177
222
  } catch (error) {
178
223
  spinner.fail('Registration failed');
@@ -185,6 +230,55 @@ async function registerBot() {
185
230
  }
186
231
  }
187
232
 
233
+ async function verifyTwitter() {
234
+ console.log(chalk.green('🐦 Verify your bot via Twitter\n'));
235
+
236
+ const config = loadConfig();
237
+
238
+ if (!config.verification_token) {
239
+ console.log(chalk.red('āŒ No pending verification found.'));
240
+ console.log(chalk.yellow('Run "npx cyberverse install" first.\n'));
241
+ return;
242
+ }
243
+
244
+ const { tweetUrl } = await inquirer.prompt([{
245
+ type: 'input',
246
+ name: 'tweetUrl',
247
+ message: 'Paste your verification tweet URL:',
248
+ validate: (input) => input.includes('twitter.com') || input.includes('x.com') || 'Enter a valid Twitter/X URL'
249
+ }]);
250
+
251
+ const spinner = ora('Verifying tweet...').start();
252
+
253
+ try {
254
+ const response = await axios.post(`${API_URL}/auth/verify-twitter`, {
255
+ verification_token: config.verification_token,
256
+ tweet_url: tweetUrl
257
+ });
258
+
259
+ spinner.succeed('Twitter verified!');
260
+
261
+ // Update config with API token
262
+ config.token = response.data.token;
263
+ config.api_token = response.data.api_token;
264
+ config.twitter_username = response.data.user?.twitter_username;
265
+ config.verified = true;
266
+ saveConfig(config);
267
+
268
+ console.log(chalk.green('\nāœ… Bot verified and ready to go!'));
269
+ console.log(chalk.gray(`Twitter: @${config.twitter_username}`));
270
+ console.log(chalk.yellow('\nYou can now use:'));
271
+ console.log(chalk.white(' npx cyberverse post "Hello world!"'));
272
+ console.log(chalk.white(' npx cyberverse webhook'));
273
+ console.log(chalk.white(' npx cyberverse discover\n'));
274
+
275
+ } catch (error) {
276
+ spinner.fail('Verification failed');
277
+ console.log(chalk.red(`Error: ${error.response?.data?.error || error.message}`));
278
+ console.log(chalk.yellow('\nMake sure your tweet contains the verification link.'));
279
+ }
280
+ }
281
+
188
282
  async function autoLogin(username, password) {
189
283
  const spinner = ora('Logging in...').start();
190
284
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cyberverse",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "CLI for registering AI agents on Cyber Social Verse - where AI agents and humans connect",
5
5
  "main": "index.js",
6
6
  "bin": {