open source is social v-it.org
at main 63 lines 2.4 kB view raw
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}