Files
joshuaandClaude Opus 5.5 e72330893a Hub v1: install API, licences, health dashboard, alerts
- Protocol 1 (docs/hub-protocol.md): public key, register, signed heartbeats
- Ed25519 licence tokens (30-day validity, status, expiry, grace, limits)
- Dashboard: installs, install detail, customers and licences, alerts,
  settings and audit log; two-factor login required
- Alert checks every 5 minutes, emailed once; heartbeat roll-up after 30 days
- Unit tests for encryption, tokens, signatures, TOTP and alert rules

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012mt6TCv85T9VKRq3cV7rXq
2026-10-26 12:12:51 +02:00

39 lines
1.5 KiB
JavaScript

/**
* Create a Hub login (or reset its password and two-factor).
*
* npm run create-admin -- --email you@example.com --name "Your Name"
*
* Asks for the password on the terminal. Two-factor is set up at the first login.
*/
require('dotenv').config();
const readline = require('readline');
const bcrypt = require('bcryptjs');
const prisma = require('../src/config/db');
function arg(name) {
const i = process.argv.indexOf(`--${name}`);
return i > -1 ? process.argv[i + 1] : null;
}
function ask(question) {
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
return new Promise(resolve => rl.question(question, answer => { rl.close(); resolve(answer); }));
}
(async () => {
const email = String(arg('email') || '').trim().toLowerCase();
const name = arg('name') || email;
if (!email) throw new Error('Usage: npm run create-admin -- --email you@example.com --name "Your Name"');
const password = process.env.HUB_ADMIN_PASSWORD || await ask('Password (12+ characters): ');
if (String(password).length < 12) throw new Error('Use at least 12 characters.');
const hash = await bcrypt.hash(password, 12);
const admin = await prisma.adminUser.upsert({
where: { email },
update: { password: hash, name, totpEnabled: false, totpSecret: null, tokenVersion: { increment: 1 } },
create: { email, name, password: hash },
});
console.log(`Saved ${admin.email}. Log in to the Hub to set up two-factor.`);
process.exit(0);
})().catch(e => { console.error(e.message); process.exit(1); });