open source is social v-it.org
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add vit config subcommand for reading/writing vit.json

Supports list (default), set, and delete operations on scalar
config values stored in the user's vit config directory.

+92
+2
src/cli.js
··· 2 2 // Copyright (c) 2026 sol pbc 3 3 4 4 import { Command } from 'commander'; 5 + import registerConfig from './cmd/config.js'; 5 6 import registerOauth from './cmd/oauth.js'; 6 7 import registerPlcRegister from './cmd/plc-register.js'; 7 8 import registerPlcVerify from './cmd/plc-verify.js'; ··· 14 15 .description('CLI toolkit for DID:PLC operations and Bluesky OAuth') 15 16 .version('0.1.0'); 16 17 18 + registerConfig(program); 17 19 registerOauth(program); 18 20 registerPlcRegister(program); 19 21 registerPlcVerify(program);
+63
src/cmd/config.js
··· 1 + // SPDX-License-Identifier: AGPL-3.0-only 2 + // Copyright (c) 2026 sol pbc 3 + 4 + import { loadConfig, saveConfig, getScalars } from '../lib/config.js'; 5 + 6 + function coerceValue(str) { 7 + if (str === 'true') return true; 8 + if (str === 'false') return false; 9 + const n = Number(str); 10 + if (str !== '' && !isNaN(n)) return n; 11 + return str; 12 + } 13 + 14 + export default function register(program) { 15 + program 16 + .command('config') 17 + .description('Read and write vit.json configuration') 18 + .argument('[action]', 'list (default), set, or delete') 19 + .argument('[key]', 'configuration key') 20 + .argument('[value]', 'value to set') 21 + .action(async (action, key, value) => { 22 + try { 23 + // Default to list when no action given 24 + if (!action || action === 'list') { 25 + const config = loadConfig(); 26 + for (const [k, v] of getScalars(config)) { 27 + console.log(`${k}=${v}`); 28 + } 29 + return; 30 + } 31 + 32 + if (action === 'set') { 33 + if (!key || value === undefined) { 34 + console.error('Usage: vit config set <key> <value>'); 35 + process.exitCode = 1; 36 + return; 37 + } 38 + const config = loadConfig(); 39 + config[key] = coerceValue(value); 40 + saveConfig(config); 41 + return; 42 + } 43 + 44 + if (action === 'delete') { 45 + if (!key) { 46 + console.error('Usage: vit config delete <key>'); 47 + process.exitCode = 1; 48 + return; 49 + } 50 + const config = loadConfig(); 51 + delete config[key]; 52 + saveConfig(config); 53 + return; 54 + } 55 + 56 + console.error(`Unknown action: ${action}`); 57 + process.exitCode = 1; 58 + } catch (err) { 59 + console.error(err instanceof Error ? err.message : String(err)); 60 + process.exitCode = 1; 61 + } 62 + }); 63 + }
+27
src/lib/config.js
··· 1 + // SPDX-License-Identifier: AGPL-3.0-only 2 + // Copyright (c) 2026 sol pbc 3 + 4 + import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'; 5 + import { configDir, configPath } from './paths.js'; 6 + 7 + const vitJsonPath = configPath('vit.json'); 8 + 9 + export function loadConfig() { 10 + if (!existsSync(vitJsonPath)) return {}; 11 + try { 12 + return JSON.parse(readFileSync(vitJsonPath, 'utf-8')); 13 + } catch { 14 + return {}; 15 + } 16 + } 17 + 18 + export function saveConfig(obj) { 19 + mkdirSync(configDir, { recursive: true }); 20 + writeFileSync(vitJsonPath, JSON.stringify(obj, null, 2) + '\n'); 21 + } 22 + 23 + export function getScalars(obj) { 24 + return Object.entries(obj).filter( 25 + ([, v]) => typeof v !== 'object' || v === null 26 + ); 27 + }