Select the types of activity you want to include in your feed.
Add init, setup, and doctor commands
Skeleton commands for local project detection (init), user-level config initialization (setup), and combined status reporting (doctor). All three reuse existing config.js and paths.js helpers.
···3344import { Command } from 'commander';
55import registerConfig from './cmd/config.js';
66+import registerDoctor from './cmd/doctor.js';
77+import registerInit from './cmd/init.js';
68import registerOauth from './cmd/oauth.js';
79import registerPlcRegister from './cmd/plc-register.js';
810import registerPlcVerify from './cmd/plc-verify.js';
911import registerFirehose from './cmd/firehose.js';
1012import registerPdsRecord from './cmd/pds-record.js';
1313+import registerSetup from './cmd/setup.js';
11141215const program = new Command();
1316program
···1619 .version('0.1.0');
17201821registerConfig(program);
2222+registerDoctor(program);
2323+registerInit(program);
1924registerOauth(program);
2025registerPlcRegister(program);
2126registerPlcVerify(program);
2227registerFirehose(program);
2328registerPdsRecord(program);
2929+registerSetup(program);
24302531export { program };
+33
src/cmd/doctor.js
···11+// SPDX-License-Identifier: AGPL-3.0-only
22+// Copyright (c) 2026 sol pbc
33+44+import { existsSync } from 'node:fs';
55+import { join } from 'node:path';
66+import { loadConfig } from '../lib/config.js';
77+88+export default function register(program) {
99+ program
1010+ .command('doctor')
1111+ .description('Check vit setup status')
1212+ .action(async () => {
1313+ try {
1414+ const config = loadConfig();
1515+ if (config.setup_at) {
1616+ const when = new Date(config.setup_at * 1000).toISOString();
1717+ console.log(`setup: ok (${when})`);
1818+ } else {
1919+ console.log('setup: not done (run vit setup)');
2020+ }
2121+2222+ const vitDir = join(process.cwd(), '.vit');
2323+ if (existsSync(vitDir)) {
2424+ console.log('.vit: found');
2525+ } else {
2626+ console.log('.vit: not found');
2727+ }
2828+ } catch (err) {
2929+ console.error(err.message);
3030+ process.exitCode = 1;
3131+ }
3232+ });
3333+}
+24
src/cmd/init.js
···11+// SPDX-License-Identifier: AGPL-3.0-only
22+// Copyright (c) 2026 sol pbc
33+44+import { existsSync } from 'node:fs';
55+import { join } from 'node:path';
66+77+export default function register(program) {
88+ program
99+ .command('init')
1010+ .description('Check for local .vit directory')
1111+ .action(async () => {
1212+ try {
1313+ const vitDir = join(process.cwd(), '.vit');
1414+ if (existsSync(vitDir)) {
1515+ console.log('.vit directory found');
1616+ } else {
1717+ console.log('.vit directory not found');
1818+ }
1919+ } catch (err) {
2020+ console.error(err.message);
2121+ process.exitCode = 1;
2222+ }
2323+ });
2424+}
+26
src/cmd/setup.js
···11+// SPDX-License-Identifier: AGPL-3.0-only
22+// Copyright (c) 2026 sol pbc
33+44+import { loadConfig, saveConfig } from '../lib/config.js';
55+66+export default function register(program) {
77+ program
88+ .command('setup')
99+ .description('Initialize user-level vit configuration')
1010+ .action(async () => {
1111+ try {
1212+ const config = loadConfig();
1313+ if (config.setup_at) {
1414+ const when = new Date(config.setup_at * 1000).toISOString();
1515+ console.log(`vit already set up (setup_at: ${when})`);
1616+ return;
1717+ }
1818+ config.setup_at = Math.floor(Date.now() / 1000);
1919+ saveConfig(config);
2020+ console.log('vit setup complete');
2121+ } catch (err) {
2222+ console.error(err.message);
2323+ process.exitCode = 1;
2424+ }
2525+ });
2626+}