From afac8163dc52e72b760efc2c706fc13e76ab8977 Mon Sep 17 00:00:00 2001 From: Jer Miller Date: Sun, 8 Mar 2026 12:58:45 -0600 Subject: [PATCH] complete vit branding across CLI and repo Extend brand mark/prefix to remaining commands (adopt, follow, remix, vet, vouch). Add SVG assets to docs/brand/ and docs/badge/ for hosting on v-it.org. Add vit-enabled and social-open-source badges to README. Generate .vit/README.md from brand template on init. Co-Authored-By: Claude Opus 4.6 --- README.md | 5 ++++- docs/badge/social-open-source.svg | 21 +++++++++++++++++++++ docs/badge/vit-enabled-flat.svg | 14 ++++++++++++++ docs/badge/vit-enabled.svg | 21 +++++++++++++++++++++ docs/badge/vit-icon-only.svg | 12 ++++++++++++ docs/brand/vit-mark-dark.svg | 5 +++++ docs/brand/vit-mark-white.svg | 5 +++++ docs/brand/vit-mark.svg | 5 +++++ docs/brand/vit-wordmark.svg | 15 +++++++++++++++ src/cmd/adopt.js | 9 +++++---- src/cmd/follow.js | 5 +++-- src/cmd/remix.js | 9 +++++---- src/cmd/vet.js | 9 +++++---- src/cmd/vouch.js | 5 +++-- test/init.test.js | 15 +++++++++++---- 15 files changed, 134 insertions(+), 21 deletions(-) create mode 100644 docs/badge/social-open-source.svg create mode 100644 docs/badge/vit-enabled-flat.svg create mode 100644 docs/badge/vit-enabled.svg create mode 100644 docs/badge/vit-icon-only.svg create mode 100644 docs/brand/vit-mark-dark.svg create mode 100644 docs/brand/vit-mark-white.svg create mode 100644 docs/brand/vit-mark.svg create mode 100644 docs/brand/vit-wordmark.svg diff --git a/README.md b/README.md index 954c873..6c461c9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# vit manifesto +[![v̇it](https://v-it.org/badge/vit-enabled.svg)](https://v-it.org) +[![open source is social](https://v-it.org/badge/social-open-source.svg)](https://v-it.org) + +# v̇it manifesto vit is a **social system for personalized software** where the unit of exchange is not pull requests, not screenshots, not diffs, not even git. diff --git a/docs/badge/social-open-source.svg b/docs/badge/social-open-source.svg new file mode 100644 index 0000000..f86cbde --- /dev/null +++ b/docs/badge/social-open-source.svg @@ -0,0 +1,21 @@ + + open source: social + + + + + + + + + + + + + + + open source + + social + + diff --git a/docs/badge/vit-enabled-flat.svg b/docs/badge/vit-enabled-flat.svg new file mode 100644 index 0000000..29a7ae3 --- /dev/null +++ b/docs/badge/vit-enabled-flat.svg @@ -0,0 +1,14 @@ + + vit: enabled + + + + + + + + + vit + enabled + + diff --git a/docs/badge/vit-enabled.svg b/docs/badge/vit-enabled.svg new file mode 100644 index 0000000..fbb914f --- /dev/null +++ b/docs/badge/vit-enabled.svg @@ -0,0 +1,21 @@ + + vit: enabled + + + + + + + + + + + + + + + vit + + enabled + + diff --git a/docs/badge/vit-icon-only.svg b/docs/badge/vit-icon-only.svg new file mode 100644 index 0000000..4fb8463 --- /dev/null +++ b/docs/badge/vit-icon-only.svg @@ -0,0 +1,12 @@ + + vit + + + + + + + + + + diff --git a/docs/brand/vit-mark-dark.svg b/docs/brand/vit-mark-dark.svg new file mode 100644 index 0000000..5643cac --- /dev/null +++ b/docs/brand/vit-mark-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/brand/vit-mark-white.svg b/docs/brand/vit-mark-white.svg new file mode 100644 index 0000000..7363027 --- /dev/null +++ b/docs/brand/vit-mark-white.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/brand/vit-mark.svg b/docs/brand/vit-mark.svg new file mode 100644 index 0000000..41c71c2 --- /dev/null +++ b/docs/brand/vit-mark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/brand/vit-wordmark.svg b/docs/brand/vit-wordmark.svg new file mode 100644 index 0000000..5bd3208 --- /dev/null +++ b/docs/brand/vit-wordmark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/cmd/adopt.js b/src/cmd/adopt.js index 28e2d04..af1b97a 100644 --- a/src/cmd/adopt.js +++ b/src/cmd/adopt.js @@ -7,6 +7,7 @@ import { execFileSync } from 'node:child_process'; import { parseGitUrl, toBeacon, beaconToHttps } from '../lib/beacon.js'; import { requireNotAgent } from '../lib/agent.js'; import { which } from '../lib/compat.js'; +import { mark, brand } from '../lib/brand.js'; export default function register(program) { program @@ -19,7 +20,7 @@ export default function register(program) { try { const gate = requireNotAgent(); if (!gate.ok) { - console.error('vit adopt must be run by a human. run it in your own terminal.'); + console.error(`${brand} adopt must be run by a human. run it in your own terminal.`); process.exitCode = 1; return; } @@ -78,11 +79,11 @@ export default function register(program) { } // success output - console.log(`beacon: ${beaconUri}`); - console.log(`directory: ${dirName}`); + console.log(`${mark} beacon: ${beaconUri}`); + console.log(`${mark} directory: ${dirName}`); console.log(`run: cd ${dirName}`); console.log(''); - console.log("next: start your agent and ask it to run 'vit init'"); + console.log(`next: start your agent and ask it to run '${brand} init'`); } catch (err) { console.error(err instanceof Error ? err.message : String(err)); process.exitCode = 1; diff --git a/src/cmd/follow.js b/src/cmd/follow.js index 0d34b7c..bc4ab7d 100644 --- a/src/cmd/follow.js +++ b/src/cmd/follow.js @@ -4,6 +4,7 @@ import { requireDid } from '../lib/config.js'; import { restoreAgent } from '../lib/oauth.js'; import { readFollowing, writeFollowing } from '../lib/vit-dir.js'; +import { mark } from '../lib/brand.js'; export default function register(program) { program @@ -37,7 +38,7 @@ export default function register(program) { list.push({ handle, did: targetDid, followedAt: new Date().toISOString() }); writeFollowing(list); - console.log(`following ${handle} (${targetDid})`); + console.log(`${mark} following ${handle} (${targetDid})`); } catch (err) { console.error(err instanceof Error ? err.message : String(err)); process.exitCode = 1; @@ -64,7 +65,7 @@ export default function register(program) { writeFollowing(filtered); if (verbose) console.log(`[verbose] removed ${handle} from following list`); - console.log(`unfollowed ${handle}`); + console.log(`${mark} unfollowed ${handle}`); } catch (err) { console.error(err instanceof Error ? err.message : String(err)); process.exitCode = 1; diff --git a/src/cmd/remix.js b/src/cmd/remix.js index b919a31..52c7cce 100644 --- a/src/cmd/remix.js +++ b/src/cmd/remix.js @@ -7,6 +7,7 @@ import { restoreAgent } from '../lib/oauth.js'; import { readProjectConfig, readFollowing, readLog } from '../lib/vit-dir.js'; import { requireAgent } from '../lib/agent.js'; import { resolveRef, REF_PATTERN } from '../lib/cap-ref.js'; +import { brand } from '../lib/brand.js'; export default function register(program) { program @@ -19,8 +20,8 @@ export default function register(program) { try { const gate = requireAgent(); if (!gate.ok) { - console.error('vit remix should be run by a coding agent (e.g. claude code, gemini cli).'); - console.error("open your agent and ask it to run 'vit remix' for you."); + console.error(`${brand} remix should be run by a coding agent (e.g. claude code, gemini cli).`); + console.error(`open your agent and ask it to run '${brand} remix' for you.`); process.exitCode = 1; return; } @@ -40,7 +41,7 @@ export default function register(program) { const projectConfig = readProjectConfig(); const beacon = projectConfig.beacon; if (!beacon) { - console.error("no beacon set. run 'vit init' in a project directory first."); + console.error(`no beacon set. run '${brand} init' in a project directory first.`); process.exitCode = 1; return; } @@ -103,7 +104,7 @@ export default function register(program) { const description = record.description || ''; const text = record.text || ''; - console.log(`# remix: ${title}`); + console.log(`# ${brand} remix: ${title}`); console.log(''); console.log(`ref: ${ref}`); console.log(`author: ${author}`); diff --git a/src/cmd/vet.js b/src/cmd/vet.js index fa6de46..a296a69 100644 --- a/src/cmd/vet.js +++ b/src/cmd/vet.js @@ -7,6 +7,7 @@ import { restoreAgent } from '../lib/oauth.js'; import { appendLog, readProjectConfig, readFollowing } from '../lib/vit-dir.js'; import { requireNotAgent } from '../lib/agent.js'; import { resolveRef, REF_PATTERN } from '../lib/cap-ref.js'; +import { mark, brand } from '../lib/brand.js'; export default function register(program) { program @@ -20,7 +21,7 @@ export default function register(program) { try { const gate = requireNotAgent(); if (!gate.ok) { - console.error('vit vet must be run by a human. run it in your own terminal.'); + console.error(`${brand} vet must be run by a human. run it in your own terminal.`); console.error(''); console.error('cap vetting requires human review for safety.'); console.error('ask your user to run this command in their terminal:'); @@ -51,7 +52,7 @@ export default function register(program) { const projectConfig = readProjectConfig(); const beacon = projectConfig.beacon; if (!beacon) { - console.error("no beacon set. run 'vit init' in a project directory first."); + console.error(`no beacon set. run '${brand} init' in a project directory first.`); process.exitCode = 1; return; } @@ -103,7 +104,7 @@ export default function register(program) { uri: match.uri, trustedAt: new Date().toISOString(), }); - console.log(`trusted: ${ref}`); + console.log(`${mark} trusted: ${ref}`); return; } @@ -112,7 +113,7 @@ export default function register(program) { const description = record.description || ''; const text = record.text || ''; - console.log('=== Cap Review ==='); + console.log(`=== ${brand} cap review ===`); console.log('Review this cap carefully before trusting it.'); console.log(''); console.log(` Ref: ${ref}`); diff --git a/src/cmd/vouch.js b/src/cmd/vouch.js index 455678b..5fcacf0 100644 --- a/src/cmd/vouch.js +++ b/src/cmd/vouch.js @@ -6,6 +6,7 @@ import { CAP_COLLECTION } from '../lib/constants.js'; import { restoreAgent } from '../lib/oauth.js'; import { appendLog, readProjectConfig, readFollowing, readLog } from '../lib/vit-dir.js'; import { resolveRef, REF_PATTERN } from '../lib/cap-ref.js'; +import { mark, brand } from '../lib/brand.js'; export default function register(program) { program @@ -31,7 +32,7 @@ export default function register(program) { const projectConfig = readProjectConfig(); const beacon = projectConfig.beacon; if (!beacon) { - console.error("no beacon set. run 'vit init' in a project directory first."); + console.error(`no beacon set. run '${brand} init' in a project directory first.`); process.exitCode = 1; return; } @@ -117,7 +118,7 @@ export default function register(program) { } if (verbose) console.log('[verbose] logged to vouched.jsonl'); - console.log(`vouched: ${ref} (${match.uri})`); + console.log(`${mark} vouched: ${ref} (${match.uri})`); } catch (err) { console.error(err instanceof Error ? err.message : String(err)); process.exitCode = 1; diff --git a/test/init.test.js b/test/init.test.js index 6daaacc..da6c799 100644 --- a/test/init.test.js +++ b/test/init.test.js @@ -23,7 +23,7 @@ describe('vit init', () => { test('writes beacon from HTTPS URL', () => { const result = run('init --beacon https://github.com/solpbc/vit.git', tmpDir, { CLAUDECODE: '1' }); expect(result.exitCode).toBe(0); - expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit'); + expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit'); const content = readFileSync(join(tmpDir, '.vit', 'config.json'), 'utf-8'); expect(JSON.parse(content).beacon).toBe('vit:github.com/solpbc/vit'); @@ -32,7 +32,7 @@ describe('vit init', () => { test('writes beacon from SSH URL', () => { const result = run('init --beacon git@github.com:solpbc/vit.git', tmpDir, { CLAUDECODE: '1' }); expect(result.exitCode).toBe(0); - expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit'); + expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit'); const content = readFileSync(join(tmpDir, '.vit', 'config.json'), 'utf-8'); expect(JSON.parse(content).beacon).toBe('vit:github.com/solpbc/vit'); @@ -44,6 +44,13 @@ describe('vit init', () => { expect(existsSync(join(tmpDir, '.vit'))).toBe(true); }); + test('generates .vit/README.md on init', () => { + run('init --beacon https://github.com/solpbc/vit.git', tmpDir, { CLAUDECODE: '1' }); + const readme = readFileSync(join(tmpDir, '.vit', 'README.md'), 'utf-8'); + expect(readme).toContain('social open source network'); + expect(readme).toContain('v-it.org'); + }); + test('overwrites existing beacon silently', () => { run('init --beacon https://github.com/old/repo.git', tmpDir, { CLAUDECODE: '1' }); run('init --beacon https://github.com/solpbc/vit.git', tmpDir, { CLAUDECODE: '1' }); @@ -59,7 +66,7 @@ describe('vit init', () => { const result = run('init --beacon .', tmpDir, { CLAUDECODE: '1' }); expect(result.exitCode).toBe(0); - expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit'); + expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit'); }); test('errors when --beacon . has no git remote', () => { @@ -150,7 +157,7 @@ describe('vit init', () => { const result = run('init --beacon .', tmpDir, { CLAUDECODE: '1' }); expect(result.exitCode).toBe(0); - expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit'); + expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit'); }); test('shows guidance for already initialized repo', () => { -- 2.51.2