open source is social v-it.org
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 sol pbc
3
4import git from 'isomorphic-git';
5import http from 'isomorphic-git/http/node';
6import { memfs } from 'memfs';
7import { beaconToHttps } from '../lib/beacon.js';
8import { mark } from '../lib/brand.js';
9
10async function readTreeFile(fs, dir, treeOid, pathParts) {
11 for (let i = 0; i < pathParts.length; i++) {
12 const entries = (await git.readObject({ fs, dir, oid: treeOid, format: 'parsed' })).object;
13 const entry = entries.find(e => e.path === pathParts[i]);
14 if (!entry) return null;
15 if (i === pathParts.length - 1) {
16 const blob = await git.readObject({ fs, dir, oid: entry.oid, format: 'content' });
17 return new TextDecoder().decode(blob.object);
18 }
19 treeOid = entry.oid;
20 }
21 return null;
22}
23
24export default function register(program) {
25 program
26 .command('beacon')
27 .description('Probe a remote repo for its beacon')
28 .argument('<target>', 'vit: URI or git URL to probe')
29 .option('-v, --verbose', 'Show step-by-step details')
30 .action(async (target, opts) => {
31 try {
32 const { verbose } = opts;
33 const url = beaconToHttps(target);
34 if (verbose) console.log(`[verbose] Resolved URL: ${url}`);
35 const { fs } = memfs();
36 const dir = '/';
37
38 if (verbose) console.log(`[verbose] Cloning (depth=1)...`);
39 await git.clone({ fs, http, dir, url, depth: 1, singleBranch: true, noCheckout: true });
40
41 const head = await git.resolveRef({ fs, dir, ref: 'HEAD' });
42 if (verbose) console.log(`[verbose] HEAD resolved: ${head}`);
43 const commit = await git.readObject({ fs, dir, oid: head, format: 'parsed' });
44 const content = await readTreeFile(fs, dir, commit.object.tree, ['.vit', 'config.json']);
45 if (verbose) console.log(`[verbose] Read .vit/config.json: ${content ? 'found' : 'not found'}`);
46
47 let beacon;
48 try {
49 beacon = content && JSON.parse(content).beacon;
50 } catch {}
51
52 if (beacon) {
53 console.log(`${mark} beacon: lit ${beacon}`);
54 } else {
55 console.log(`${mark} beacon: unlit — this repo hasn't initialized vit yet.`);
56 console.log("the maintainer can light the beacon by running 'vit init' inside the repo.");
57 }
58 } catch (err) {
59 console.error(err instanceof Error ? err.message : String(err));
60 process.exitCode = 1;
61 }
62 });
63}